Docket / Fix it / CDN blocking AI crawlers

When your CDN blocks AI crawlers your robots.txt allows

Your robots.txt can welcome every AI crawler in the world and your server can still refuse them at the door. The refusal happens before robots.txt is ever read, it produces no entry in any SEO tool's report, and the only way to find it is to ask your own server the same question twice.

Why robots.txt cannot tell you

robots.txt is a file a crawler fetches and chooses to obey. A bot rule at your CDN is a decision made about the request itself — before anything is served, before the crawler has read a word of your policy. The two live in different places and cannot see each other.

So a site can publish a robots.txt that explicitly allows GPTBot and ClaudeBot, mean it sincerely, and return 403 to both. Nothing in the robots.txt file is wrong. Nothing in any report that reads robots.txt will say otherwise.

The usual cause is not malice or even a decision: managed bot protection ships with a known-good list, anything not on it gets challenged or blocked, and the AI crawlers are newer than most of those lists. Cloudflare, Fastly and AWS WAF all expose this as a per-user-agent rule, and the default posture on several of them has moved toward blocking AI crawlers unless you say otherwise.

The test, and the trap inside it

Send your homepage two requests and compare.

curl -sS -D - -o /dev/null \
  -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.1; +https://openai.com/gptbot" \
  https://example.com/ | head -1

curl -sS -D - -o /dev/null \
  -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36" \
  https://example.com/ | head -1

Use a GET, not a HEAD. -D - -o /dev/null makes a real request and throws the body away. curl -I looks like the tidier way to ask for a status code and is the wrong tool here: measured on the same site on the same day, the blocked crawler got 403 on a GET and 200 on a HEAD, from the same machine a second apart. Bot rules are commonly scoped to the requests that actually serve content, so a HEAD can sail through a rule that stops every real visit. Check with the method a crawler uses.

The trap: a single 403 proves nothing. The same bot protection usually refuses curl whatever user-agent it sends. If you run only the first command, see 403 and conclude the crawler is blocked, you may simply have discovered that your CDN dislikes command-line tools.

Both requests, from the same machine, in the same minute. That is what makes it evidence:

Measured this way on one large developer platform in September 2026: a browser and an ordinary crawler both received 200, while seven AI crawlers received 403 — OAI-SearchBot, GPTBot, ChatGPT-User, PerplexityBot, Perplexity-User, ClaudeBot and Claude-SearchBot. Its robots.txt allowed every one of them, with a single User-agent: * group disallowing only a search path and an API path. Re-tested minutes later from the same address, so it was user-agent based rather than rate limiting. The site is not named here; the shape is the point.

Which refusals actually cost you

Not all of these bots do the same job, and a block does not cost the same thing in each case.

The defect is not "a bot was blocked". It is a bot being blocked in a way the site owner did not choose and cannot see, while their own robots.txt says the opposite.

Fixing it

Ask whoever runs your CDN or WAF to allow the specific user-agents you want, as an explicit rule rather than by relaxing bot protection generally. On Cloudflare, Fastly and AWS WAF this is a per-user-agent allow. Then re-run the two-request test rather than trusting the change — a rule that was added in the wrong order, or to the wrong hostname, looks identical to a rule that works until you ask the server.

If the block turns out to be deliberate, write it down somewhere the next person will find it. Most of the sites in this state are not making a choice; they inherited a default, and the second most common outcome after fixing it is doing the same work again in a year.

Where this sits in an audit

Docket checks this per crawler on your live server, by making the same comparison described above, and reports it against what your robots.txt claims — which is why it can say "your robots.txt allows these and your server refuses them" rather than either half alone. The robots.txt side of the question is fixing AI crawler access, and the wider surface is AI search visibility.

Worth pairing it with one other question, because they compound: a crawler that is let in still has to be able to read the page. If your content arrives after JavaScript runs, the crawlers that do not render see an empty page even with a 200 — the JavaScript SEO audit is how you check that, and a site with both problems is invisible twice over. The full list of what Docket looks at is what Docket checks, inside the technical audit.

Download Docket

Common questions

Why is GPTBot getting a 403 when my robots.txt allows it?

Because robots.txt and your CDN's bot rules are different systems that cannot see each other. robots.txt is a file a crawler fetches and obeys; a CDN bot rule is a decision about the request, made before anything is served. Managed bot protection ships with a known-good list, and AI crawlers are newer than most of those lists.

How do I check whether my CDN is blocking an AI crawler?

Request the same URL twice from the same machine — once with the crawler's user-agent, once with an ordinary browser's — and compare the status codes. Browser 200 with crawler 403 is the finding. Both 403 means your protection is refusing the tool rather than the crawler, and the answer has to come from your CDN's logs.

Does a 403 from curl prove the crawler is blocked?

No, and this is the most common mistake in checking it. Bot protection usually refuses curl whatever user-agent it sends, so a single 403 may only tell you that your CDN dislikes command-line tools. The comparison is the evidence, not the status code on its own.

Is blocking AI crawlers always a mistake?

No. Blocking training crawlers is a legitimate editorial decision. The defect is blocking search and live-fetch crawlers — the ones that decide whether you can be cited in an answer — without choosing to, while your robots.txt says the opposite.

Will an SEO tool that reads robots.txt find this?

No. Nothing in the robots.txt file is wrong, so nothing that reads it will report anything. Finding it requires asking your own server as each crawler and comparing the answer to an ordinary request.