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.
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 -1Different 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
CategoryAIlabel 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 aBrowserMatchNoCasedeny 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
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
- How to fix a slow LCP — Your main image or headline takes too long to appear.
- How to fix layout shift — Content jumps around while the page loads.
- How to fix slow INP — Taps and clicks take a moment to do anything.
- How to fix a slow server response — Your server is slow to start replying at all.
- How to eliminate render-blocking CSS and JS — CSS and JS files stop anything appearing on screen.
- Why you're seeing "no field data" — Google has no real-visitor data for your site yet.
- How to fix oversized and outdated images — Your images weigh far more than they need to.
- How to cut unused JavaScript — You ship JavaScript this page never runs.
- How to fix your cache headers — Returning visitors re-download files they already have.
- Why your score is different on every run — The score is different every time you test.
- Fast on desktop, slow on mobile — Desktop looks fine; the phone test says otherwise.
- Why Search Console still shows the old numbers — You fixed it weeks ago and Search Console hasn't noticed.
- How to stop plugins loading on every page — A form plugin's CSS on pages with no form — times every plugin.
- Which AI crawlers to allow in robots.txt — You block training bots and accidentally block the ones that cite you.
- Your content only exists after JavaScript runs — The server sends an empty shell and a script fills it in — AI crawlers see nothing.
- Structured data that AI crawlers actually use — The page is readable but nothing tells a machine what it is.
- llms.txt — what it is, what it isn't, and a template — A cheap bet, not a fix — here's the honest evidence and a template.