Skip to content
What To Fix First

Your firewall is blocking AI crawlers

A browser gets your page; GPTBot, ClaudeBot and PerplexityBot get a 403. That is a CDN or WAF setting, not robots.txt. Where the toggles are in Cloudflare, Vercel, AWS and the rest, and how to verify the fix.

A browser request passes through a CDN or firewall wall to the server; an AI crawler request is stopped at the wall with a 403, never reaching the server or the robots.txt behind it.CDN / firewallyour serverthe pagerobots.txtbrowser200GPTBot / ClaudeBot403 — stopped hererobots.txt never consulted
This diagram is free to reuse with credit — all eighteen, as SVG or PNG.

How to tell it’s the firewall

Your robots.txt allows everyone, your page is public, and yet AI products never seem to see it. Run the AI visibility check and look at the first grid: the page fetched as a phone browser and as three AI crawlers. If the browser gets 200 and a crawler gets 403, 429, 503 or a bot challenge, something in front of your server is refusing requests by user-agent. The crawler never sees your page or your robots.txt — the diagram above is the whole story.

You can reproduce it from any terminal:

# as a browser
curl -sI -A "Mozilla/5.0 (Linux; Android 13) Chrome/126" https://example.com/ | head -1
# as ClaudeBot
curl -sI -A "Mozilla/5.0 (compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" https://example.com/ | head -1
# as GPTBot
curl -sI -A "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" https://example.com/ | head -1

Different status lines for the same URL means a user-agent rule. A cf-mitigated: challenge header means Cloudflare specifically.

Cloudflare

Four separate settings can produce this. Check them in order.

1. AI Crawl Control (previously “Block AI bots”)

Dashboard → your zone → AI Crawl Control (older dashboards: Security → Bots → Block AI bots). Each crawler is listed with an Allow/Block switch. Allow the fetchers that cite pages — OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot — and decide about the training bots separately. Do not flip the global toggle off if you want to keep blocking training.

2. Bot Fight Mode / Super Bot Fight Mode

Security → Settings → Bot fight mode. On free plans it challenges anything scored as automated, with no exceptions possible; the only options are off, or upgrading to a plan where verified bots can be allowed. Super Bot Fight Mode (Pro and up) has a “verified bots” allow setting — turn it on.

3. WAF custom rules and managed rulesets

Security → WAF. Look for custom rules matching http.user_agent with “bot”, and for managed ruleset overrides. Add an exception rule above them:

# Expression for a "Skip" rule, placed first
(http.user_agent contains "OAI-SearchBot") or
(http.user_agent contains "ChatGPT-User") or
(http.user_agent contains "Claude-User") or
(http.user_agent contains "Claude-SearchBot") or
(http.user_agent contains "PerplexityBot")

4. Managed robots.txt

Not a block, but related: AI Crawl Control can also prepend a training-crawler Disallow block to your robots.txt. It does not touch the answer fetchers, so it costs nothing — but it is worth knowing it is there, because your file on disk and the file the internet sees are different.

Other providers

  • Vercel — Firewall → Bot Protection. The “AI bots” managed rule blocks trainers and fetchers together; switch it to log-only or add a custom rule allowing the five fetchers.
  • AWS CloudFront / WAF — the Bot Control managed rule group’s CategoryAI label covers all of them. Add a rule that allows requests carrying that label when the user-agent matches a fetcher, placed before the block.
  • Akamai — Bot Manager → known bots → the “AI” category. Set the fetchers to monitor rather than deny.
  • Sucuri, Wordfence, and similar plugins — search their blocklists for “GPT”, “Claude” and “Perplexity” and remove the fetchers. Wordfence’s rate limiting can also 429 a crawler that fetches several pages quickly; raise the crawler threshold.
  • nginx / Apache on your own server — look for if ($http_user_agent ~* ...) blocks or a BrowserMatchNoCase deny list. Copy-pasted “bad bot” lists from 2023 nearly all include the AI fetchers.

Check it worked

Re-run the check. All four fetches should return 200. Then look at your firewall’s own bot analytics a day later — the genuine crawlers, with verified IP ranges, should appear as allowed. If robots.txt still shows a crawler as blocked once the firewall is fixed, that is the other guide.

Common questions

The check shows a 403 for ClaudeBot but I never blocked anything.
You didn't; your CDN did. Cloudflare's 'Block AI bots' setting has been on by default for new free-plan zones since 2025, and Bot Fight Mode challenges anything it scores as automated. Vercel's firewall, Akamai's bot manager and AWS WAF's bot control have equivalents. The page is refused before your server or your robots.txt is involved.
Can the check be wrong about a block?
Yes, in one direction. We send the crawler's user-agent string from our own server. A firewall that verifies crawler IP addresses (Cloudflare's 'verified bots' does this) may block us and let the genuine crawler through. So treat a 403 here as 'probably blocked', and confirm in the firewall's own logs or bot analytics — they show the real crawler's requests and their verdicts.
I want to block training but allow ChatGPT search. Can a firewall do that?
Yes, and it is the right tool for it. Firewall rules match the user-agent, so you can allow OAI-SearchBot, ChatGPT-User, Claude-User, Claude-SearchBot and PerplexityBot explicitly while leaving the training bots blocked. Cloudflare's AI Crawl Control lists them individually for exactly this reason.
Should I just turn all bot protection off?
No. Keep the protection and add exceptions for the crawlers you want. Bot management is doing useful work against scrapers and credential stuffing; the mistake is only that the AI fetchers landed in the same bucket.

Check a page against this

Free, no signup. Reads robots.txt and the page as a browser and as three AI crawlers. Takes about ten seconds; nothing is stored.

Enter any public URL. You’ll get the one thing stopping AI crawlers from reading the page (if anything is), then a crawler-by-crawler table and what the HTML actually tells a machine.

Other guides