Research 19 min read
Robots.txt Says Yes, the Firewall Says No: AI Search-Bot Access on the Top 5,000 Websites (October 2026)
Most AI-crawler studies read robots.txt and stop there. We also requested each home page as OAI-SearchBot, PerplexityBot and Claude-SearchBot, then re-checked every refusal with two control requests to see which blocks are actually aimed at AI.

Founder, SEO·AEO·GEO
Builds SEO·AEO·GEO and writes the crawler, schema, and citation research published here.

Key takeaways
- In robots.txt, the top 5,000 sites block training crawlers about twice as often as AI search crawlers: 11.6% of live sites disallow GPTBot, 6.0% disallow OAI-SearchBot.
- Almost half of the sites that block GPTBot (48.7%) still allow OAI-SearchBot, and only 3 sites block an AI search crawler while allowing every training crawler.
- On 9.8% of sites whose robots.txt allows OAI-SearchBot, PerplexityBot and Claude-SearchBot, a request identifying as at least one of them was refused, challenged or asked to pay while a browser got the page; 98.7% of those blocks repeated on a second pass.
- Only about 3 in 10 of those edge blocks single out AI crawlers by name (2.9% of sites); the rest block any unknown bot or appear to check whether a claimed crawler is genuine, which a real, IP-verified crawler may pass.
- Content-Signal is still rare: 3.6% of robots.txt files on live sites carry it, and Cloudflare’s managed robots.txt block appeared in 7 of the 2,743 files we read.
On 13 October 2026 we checked the 5,000 most popular domains on the Tranco list. Among the 3,023 that served a home page, 11.6% disallow OpenAI’s training crawler GPTBot in robots.txt, but only 6.0% disallow OAI-SearchBot, the crawler behind ChatGPT search. The bigger gap is at the edge. On 9.8% of sites whose robots.txt allows OAI-SearchBot, PerplexityBot and Claude-SearchBot, a request identifying as at least one of them was refused, challenged or asked to pay, while a browser request got the page.
Not every edge block shuts out the real crawler. Our requests carry the crawler’s name but come from our own connection, not the vendor’s IP addresses. A second pass with two control requests suggests about 3 in 10 of these blocks target AI crawlers by name. The rest refuse any unknown bot or appear to check whether a claimed crawler is genuine. All figures below are from one run, from one network, on one day. The full per-site data is free to reuse: download the data (CSV).
Robots.txt says yes, the edge says no
robots.txt states a policy: crawlers read it and choose to comply. A CDN, web application firewall (WAF) or bot-management product enforces a policy, before robots.txt is ever consulted. When the two disagree, the firewall wins. We measured that disagreement only on sites where it means something. The browser request had to get a normal page, so sites that block every scripted client are left out. And robots.txt had to allow the crawler at “/”.
| Bot user agent | Sites tested | Refused, challenged or 402 | Challenge page | Refused | HTTP 402 | Of those: robots.txt names the bot and allows it |
|---|---|---|---|---|---|---|
| OAI-SearchBot | 2,758 | 8.2% (226) | 152 | 66 | 8 | 10 of 173 |
| PerplexityBot | 2,698 | 9.1% (245) | 151 | 86 | 8 | 12 of 176 |
| Claude-SearchBot | 2,771 | 7.2% (200) | 143 | 45 | 12 | 8 of 91 |
Taken together, 2,672 sites allow all three crawlers in robots.txt and answered all three requests. Of those, 263 (9.8%) turned at least one away and 166 (6.2%) turned away all three. Most refusals came as a challenge or block page: an HTTP 403 carrying bot-protection markup such as an “Access Denied” page or Cloudflare’s “Just a moment…” interstitial. Ten sites answered HTTP 402 Payment Required, the status Cloudflare’s pay per crawl returns to crawlers without a payment arrangement. The rate barely moves with popularity: 9.7% in the top 1,000 and 9.9% in ranks 1,001 to 5,000.
Some sites even name the crawler in robots.txt with an explicit Allow and still refuse it at the edge: 10 of the 173 sites that do this for OAI-SearchBot. That is the clearest sign that two teams, or two tools, set the policy and the enforcement separately.
Which of those blocks are actually aimed at AI?
A block on a request that claims to be OAI-SearchBot can mean three different things, and only one of them stops the real crawler for sure. So between 17:10 and 17:13 UTC, within an hour of the first pass, we requested every blocking site once more. We sent the browser and the three crawler user agents again, plus two controls. One was our own honest, unknown bot user agent (GEOAuditBot). The other was a spoofed Googlebot, which bot-management systems routinely refuse when it does not come from Google’s IPs. Of 667 site-and-crawler blocks, 658 (98.7%) repeated.
| What the controls showed | Sites | Share of the 263 | What it probably means for the real crawler |
|---|---|---|---|
| Also refused our honest unknown bot | 95 | 36% | Generic bot blocking. Real crawlers get through only if the site allow-lists verified bots, which we cannot see. |
| Served the unknown bot, refused a spoofed Googlebot too | 85 | 32% | The edge likely verifies that a claimed crawler comes from its vendor’s IPs. The real, verified crawler may well be served. |
| Served the unknown bot and the spoofed Googlebot, refused the AI crawler | 77 | 29% | A rule aimed at AI crawlers by name. The real crawler probably meets it too, unless the rule exempts verified IPs. |
| Block did not repeat, or no usable second answer | 6 | 2% | Transient: rate limiting or a flaky origin. |
The AI-specific group, 77 sites or 2.9% of the 2,672, is the floor of real AI-search blocking we can see from outside. PerplexityBot was singled out most often: it was refused on 61 of the 77, against 37 for OAI-SearchBot and 17 for Claude-SearchBot. Among 298 comparison sites that had served all three crawlers, a spoofed Googlebot was refused on 7.1%, so verification of that kind is common even where AI crawlers are welcome.
Who blocks which crawler in robots.txt
We read each robots.txt the way a compliant crawler does under RFC 9309 and counted a bot as blocked when its governing group disallows the root path “/”. “Named explicitly” means a User-agent line names that bot. The rest are caught by a blanket “User-agent: *” with “Disallow: /”, which 3.1% of live sites have. Partial blocks, such as Disallow: /search, are not counted.
| Bot | Vendor | Class | Live sites | Named explicitly (live) | All robots.txt files | Live + sites that refused our browser |
|---|---|---|---|---|---|---|
| PerplexityBot | Perplexity | AI search | 8.3% (246) | 6.0% | 11.8% | 9.5% |
| YouBot | You.com | AI search | 8.0% (237) | 5.2% | 11.0% | 8.8% |
| OAI-SearchBot | OpenAI | AI search | 6.0% (178) | 3.7% | 8.1% | 6.4% |
| Claude-SearchBot | Anthropic | AI search | 5.7% (169) | 3.1% | 8.3% | 6.5% |
| MistralAI-Index | Mistral | AI search | 3.3% (97) | 0.2% | 5.1% | 3.9% |
| Meta-WebIndexer | Meta | Search engine | 5.0% (150) | 2.0% | 7.1% | 5.5% |
| Amzn-SearchBot | Amazon | Search engine | 4.0% (120) | 1.0% | 5.9% | 4.5% |
| Bingbot | Microsoft | Search engine | 1.8% (55) | 0.3% | 2.8% | 2.0% |
| Googlebot | Search engine | 1.7% (51) | 0.2% | 2.6% | 1.8% | |
| ChatGPT-User | OpenAI | User fetch | 7.6% (225) | 5.3% | 10.2% | 8.2% |
| DuckAssistBot | DuckDuckGo | User fetch | 6.3% (188) | 3.6% | 8.8% | 7.0% |
| Meta-ExternalFetcher | Meta | User fetch | 6.3% (187) | 3.6% | 8.9% | 7.1% |
| Perplexity-User | Perplexity | User fetch | 6.0% (179) | 3.4% | 8.6% | 6.8% |
| Claude-User | Anthropic | User fetch | 5.9% (177) | 3.4% | 8.5% | 6.7% |
| MistralAI-User | Mistral | User fetch | 5.6% (168) | 2.8% | 8.2% | 6.4% |
| Amzn-User | Amazon | User fetch | 3.9% (115) | 0.8% | 5.7% | 4.4% |
| Google-GeminiNotebook | User fetch | 3.2% (94) | 0.0% | 4.7% | 3.5% | |
| Meta-ExternalAgent | Meta | Mixed | 9.8% (291) | 7.1% | 14.0% | 11.2% |
| Amazonbot | Amazon | Mixed | 7.9% (234) | 5.3% | 11.7% | 9.4% |
| Applebot | Apple | Mixed | 2.8% (83) | 1.3% | 3.8% | 2.9% |
| CCBot | Common Crawl | Training | 12.0% (357) | 9.4% | 17.0% | 13.8% |
| Bytespider | ByteDance | Training | 11.9% (354) | 9.2% | 16.7% | 13.5% |
| GPTBot | OpenAI | Training | 11.6% (345) | 9.3% | 15.9% | 12.9% |
| ClaudeBot | Anthropic | Training | 10.6% (316) | 8.2% | 15.2% | 12.3% |
| Google-Extended | Training | 9.3% (277) | 7.0% | 13.2% | 10.6% | |
| Applebot-Extended | Apple | Training | 8.4% (250) | 5.6% | 12.6% | 10.1% |
| MistralAI-Training | Mistral | Training | 3.3% (99) | 0.2% | 5.0% | 3.8% |
| Google-Agent | Agent | 3.4% (101) | 0.3% | 4.9% | 3.7% | |
| Google-CloudVertexBot | Other | 5.5% (163) | 2.7% | 8.1% | 6.4% | |
| OAI-AdsBot | OpenAI | Other | 3.2% (95) | 0.1% | 4.8% | 3.6% |
| Meta-ExternalAds | Meta | Other | 3.1% (92) | 0.1% | 4.5% | 3.4% |
Three things stand out. First, the crawlers sites name are the old, well-known training crawlers: CCBot, Bytespider, GPTBot, ClaudeBot and Google-Extended. Crawlers documented more recently, such as MistralAI-Index, Google-GeminiNotebook and OAI-AdsBot, are almost never named; nearly all their “blocks” come from blanket Disallow-everything rules. Second, Googlebot and Bingbot are almost never named in a Disallow (0.2% and 0.3%). Third, the 287 sites that refused our scripted browser request are much stricter: 26.8% of them disallow GPTBot and 10.5% OAI-SearchBot. They include large publishers and marketplaces, and 186 of them are behind Cloudflare. Leaving them out understates blocking among the biggest sites, which is why the last column is there.
| Class | Bots in class | Blocks at least one | Names and blocks at least one | Blocks all |
|---|---|---|---|---|
| Training | 7 | 15.5% | 12.9% | 2.8% |
| Mixed purpose | 3 | 11.1% | 8.5% | 2.5% |
| AI search | 5 | 10.0% | 7.3% | 2.5% |
| User fetch | 8 | 9.6% | 6.9% | 2.4% |
| Search engine | 4 | 5.9% | 3.1% | 1.5% |
| Agent | 1 | 3.4% | 0.3% | 3.4% |
| Other (ads, Vertex) | 3 | 5.7% | 2.9% | 2.9% |
A note on user-triggered fetchers: OpenAI says robots.txt rules “may not apply” to ChatGPT-User, and Perplexity says Perplexity-User generally ignores them. A Disallow for those agents states a preference that may change nothing. Anthropic documents Claude-User as honouring robots.txt.
Training-only blockers: the split is real
OpenAI and Anthropic each run a training crawler and a separate search crawler, and OpenAI says the two settings are independent. The data shows many sites now use that split on purpose.
Each setting is independent of the others – for example, a webmaster can allow OAI-SearchBot in order to appear in search results while disallowing GPTBot to indicate that crawled content should not be used for training OpenAI’s generative AI foundation models.
| Vendor | Blocks training bot | Blocks search bot | Training only | Both | Search only | Training blockers that still allow search |
|---|---|---|---|---|---|---|
| OpenAI (GPTBot / OAI-SearchBot) | 11.6% | 6.0% | 5.6% | 5.9% | 0.0% | 48.7% (168 of 345) |
| Anthropic (ClaudeBot / Claude-SearchBot) | 10.6% | 5.7% | 5.0% | 5.6% | 0.0% | 46.8% (148 of 316) |
| Mistral (MistralAI-Training / MistralAI-Index) | 3.3% | 3.3% | 0.2% | 3.2% | 0.1% | 5.1% (5 of 99) |
Across classes, 15.5% of live sites block at least one training crawler and 10.0% at least one AI search crawler. Of the training blockers, 36% allow all five AI search crawlers. The reverse almost never happens: 3 sites block an AI search crawler while allowing every training crawler. The Mistral row is the exception that proves the rule. Its crawlers are rarely named, so sites that block one usually block everything. If you want training opt-out without losing AI search, see GPTBot vs OAI-SearchBot for the exact lines.
By CDN: Cloudflare blocks AI crawlers by name, Akamai blocks unverified bots
We identified the CDN from home-page response headers, using the same check as our audit. Half the live sites send no header we recognise, so “none detected” includes CDNs that hide themselves and sites with no CDN at all.
| CDN | Live sites | robots.txt blocks GPTBot | robots.txt blocks OAI-SearchBot | Edge blocks ≥1 AI search UA despite robots allow | Of which aimed at AI by name |
|---|---|---|---|---|---|
| Cloudflare | 723 (23.9%) | 7.4% | 2.6% | 6.2% (42 of 675) | 31 of 42 |
| Akamai | 249 (8.2%) | 12.2% | 7.7% | 51.6% (97 of 188) | 3 of 97 |
| Amazon CloudFront | 436 (14.4%) | 17.5% | 8.5% | 5.9% (22 of 374) | 7 of 22 |
| Vercel | 57 (1.9%) | 5.3% | 1.8% | 1.9% (1 of 54) | 0 of 1 |
| None detected | 1,526 (50.5%) | 12.2% | 6.9% | 7.4% (100 of 1,349) | 36 of 100 |
Akamai-fronted sites turned away a simulated AI search crawler half the time, and almost never by name. Of the 97, 51 also refused our honest unknown bot and 42 served it but refused the spoofed Googlebot. In other words, they block bots in general or block bots that claim an identity they cannot prove. Most of these refusals were 403 “Access Denied” pages (85 of 97), usually with an AkamaiGHost server header. Whether the real, verified OAI-SearchBot gets through depends on how each site’s bot policy treats verified crawlers, which no outside test can see.
Cloudflare-fronted sites blocked less often, but when they did, the block was usually aimed at AI crawlers by name (31 of 42). That is consistent with Cloudflare’s own description of its free plan: “On the free plan, AI Crawl Control identifies AI crawlers based on their user agent strings.” Five of the ten HTTP 402 answers came from Cloudflare-fronted sites. Cloudflare changed its AI defaults on 15 September 2026; what each setting now does to Googlebot and the AI crawlers is in Is Cloudflare blocking Googlebot or ChatGPT?.
Content-Signal and Content-Usage: still rare
Content-Signal is Cloudflare’s robots.txt extension for stating how content may be used (search, ai-input, ai-train). Content-Usage is the IETF aipref working group’s draft equivalent (search, ai-use, train-ai). Neither binds a crawler. Adoption among the top sites is low.
Every site that publishes a Content-Signal line includes search=yes, and ai-input=yes outnumbers ai-input=no by 76 to 13. Seven files add Cloudflare’s experimental use=reference. Content-Signal is more common behind Cloudflare (42 of 638 robots.txt files on live Cloudflare sites, 6.6%) than elsewhere. Only 2 live sites sent a Content-Signal or Content-Usage HTTP response header on their home page. The near-absence of Cloudflare’s “BEGIN Cloudflare Managed content” block matches HasData’s September finding that it had disappeared from sites that carried it in summer. Our Content-Signal guide covers the syntax and who reads it.
No robots.txt, refusals and errors
- 79.9% of live sites publish a robots.txt file. Another 18.6% return a 404 or other 4xx (170), an HTML page at /robots.txt (239), an empty file (35) or a 401/403 to our crawler (117); RFC 9309 treats all of these as “allow everything”. The remaining 48 sites (1.6%) timed out, failed or answered with a 5xx or 429.
- Across all 5,000 domains, 54.9% served a robots.txt file. The list includes many hostnames with no website at the apex, such as CDN, DNS and telemetry domains: 902 did not resolve at all.
- 525 domains answered our browser request with HTTP 403 and are outside the “live sites” base. The 287 domains that refused it with a 4xx (mostly 403) but publish a robots.txt are discussed above.
- 3 live sites answered robots.txt with a 5xx or 429. RFC 9309 says a crawler must read a 5xx as “disallow everything”.
- Only 16 of 3,023 live sites challenged our browser request with a 200 interstitial; they are excluded from the edge figures.
- 1.7% of the 9,069 simulated crawler requests got no HTTP answer (timeouts and resets); those site-and-crawler pairs are excluded from edge rates.
How this compares with Ahrefs, Cloudflare Radar and HasData
Three earlier measurements are widely cited. Each answers a slightly different question, so the numbers are not directly comparable. The differences in method explain most of the gaps.
| Study | Sample and date | What it measured | Headline figure | Our closest figure |
|---|---|---|---|---|
| Ahrefs | About 140 million websites, main robots.txt; published 21 May 2025 | robots.txt only, explicit and general (wildcard) blocks; “doesn’t include any other block types such as firewalls or IP blocks” | GPTBot blocked by 5.89% of all websites (0.50% explicit); OAI-SearchBot 5.54% (0.08% explicit) | Top 5,000 only: GPTBot 11.6% (9.3% named); OAI-SearchBot 6.0% (3.7% named) |
| Cloudflare (Radar data, Cloudflare blog) | Top 10,000 domains; published 1 July 2025 | Whether a robots.txt exists; AI user agents disallowed in it | “only about 37% of the top 10,000 domains currently have a robots.txt file”; GPTBot “disallowed in 7.8% of the robots.txt files found for the top domains” | 54.9% of our 5,000 domains (79.9% of live sites) serve a robots.txt; GPTBot disallowed at “/” in 15.9% of all files |
| HasData | Tranco top 10,000 (list 46XLX, 9 July 2026) plus 1,148 news sites; July and 16 September 2026; last updated 29 September 2026 | robots.txt (a bot’s own group with Disallow: /; wildcards not counted) plus GPTBot and Chrome requests from a US datacenter IP on a 2,096-domain subset | GPTBot blocked by 7.9% of the top web; 115 sites (5.5% of the tested subset) blocked GPTBot even though robots.txt did not disallow it | GPTBot named and disallowed by 9.3% of live sites; 9.8% block an AI search crawler at the edge despite robots.txt allowing it |
- Popularity drives blocking. Top sites name AI crawlers far more often than the long tail Ahrefs’ 140 million sites are dominated by: 9.3% of our live sites name and block GPTBot, against Ahrefs’ 0.50% explicit rate. Within our sample the top 1,000 block GPTBot more often (14.2%) than ranks 1,001 to 5,000 (11.0%).
- Denominators differ. Cloudflare counts robots.txt files, and its 37% applies to its own top-10,000 ranking, which includes many non-website hostnames. Our 54.9% across all domains and 79.9% across live sites are both higher. The two rankings and the 15 months between measurements both matter, so we would not read this as robots.txt adoption rising.
- Training bot vs search bot. HasData’s edge test sends GPTBot, a training crawler, from a datacenter IP. Datacenter traffic is treated more harshly than a fixed-line connection, and many sites deliberately refuse training crawlers. Our test sends the three AI search crawlers from a fixed-line connection, so our edge-block rate is not a substitute for theirs, and theirs is not a measure of AI search access.
- Matching rules. We read robots.txt as RFC 9309 specifies, so a blanket “User-agent: *” Disallow counts as a block. That matches Ahrefs’ “general blocks” and differs from HasData, which counts only a bot’s own group. Our “named explicitly” column is the comparable figure for HasData.
- The other direction. HasData found that 39.5% of sites disallowing GPTBot still served it a 200. For AI search crawlers we saw more: 73% of live sites whose robots.txt disallows OAI-SearchBot served our simulated OAI-SearchBot the page anyway. That is not hypocrisy. robots.txt is a request to crawlers, not something servers are expected to enforce.
What to do with this on your own site
- Decide training and search separately. Blocking GPTBot, ClaudeBot or Google-Extended is a legitimate choice that does not affect AI search answers. Blocking OAI-SearchBot, Claude-SearchBot or PerplexityBot removes you from those vendors’ answers.
- Read your robots.txt per bot, not per file. Check which group each crawler actually obeys; a blanket “User-agent: *” Disallow catches every AI crawler you did not name.
- Test the edge, not just the file. Request your home page with each crawler’s user agent and compare it with a browser request (commands below), or use the free AI crawler checker, which runs the same probes as this study.
- If a crawler is refused, find out which layer did it. On Cloudflare, check AI Crawl Control and Security rules. On Akamai and other enterprise CDNs, check how bot-management policy treats verified and unverified crawlers. Then look in your server or CDN logs for requests from the vendor’s published IP ranges (openai.com/searchbot.json, perplexity.com/perplexitybot.json) and see what they received.
- Treat Content-Signal as a statement, not a control. It is cheap to add, but crawlers are not bound by it and almost nobody publishes it yet.
# Compare a browser request with requests that identify as AI search crawlers.
# These are simulated: they come from your IP, not the vendor's, so a CDN may treat the real crawler differently.
URL='https://example.com/'
BROWSER='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
OAI='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot'
PPLX='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)'
CLAUDE='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +https://www.anthropic.com/)'
for UA in "$BROWSER" "$OAI" "$PPLX" "$CLAUDE"; do
curl -s -o /dev/null -w '%{http_code} %{size_download} bytes\n' -A "$UA" "$URL"
doneA 403, a 402 or a much smaller response for the crawler lines than for the browser line means an edge rule is involved. For the full set of gates a page must pass (robots.txt, CDN, raw HTML without JavaScript, snippet controls, response health), see Can ChatGPT, Claude and Perplexity read your website?. Or run a free audit, which reports each gate with its evidence.
Methodology
Sample
We used Tranco list 64VKX, generated on 12 October 2026. Tranco is a research ranking that combines five popularity sources (Chrome UX Report, Farsight, Majestic, Cloudflare Radar and Cisco Umbrella) over 30 days, here 13 September to 12 October 2026, and keeps only registrable (pay-level) domains. We took ranks 1 to 5,000 exactly as listed, with no filtering. The list includes infrastructure domains that serve no website. They stay in the CSV, but rates are reported against “live sites”: the 3,023 domains whose home page returned a 2xx to a browser user agent. 2,976 of those also gave a readable robots.txt outcome, and that is the base for the robots.txt figures.
What we requested
- https://domain/robots.txt with our own user agent, GEOAuditBot/1.0 (+https://geo-audit-saas-eight.vercel.app).
- https://domain/ with a desktop Chrome user agent, following up to five redirects. If the host did not answer at all, we tried its www or bare sibling once.
- If the home page landed on another origin (example.com to www.example.com), robots.txt again on that origin, because that is the file a crawler of that page obeys.
- The final home-page URL three more times, identifying as OAI-SearchBot, PerplexityBot and Claude-SearchBot with the user-agent strings shown in the commands above. We sent these only if the browser request succeeded, as our audit does.
Each request had a 10-second timeout. robots.txt and the browser request were retried at most once, and only on a 5xx, a 429 or a network error. Crawler requests were never retried. At most 16 requests were in flight across all sites, and requests to any one site were strictly sequential. We fetched nothing beyond robots.txt and the home page. The crawl ran from 16:40 to 17:08 UTC on 13 October 2026, from a single fixed-line connection on an Indian ISP (not a datacenter or cloud IP). The Node.js HTTP client crashed natively several times. Each restart resumed after the last completed site and re-ran in-flight sites from scratch, so no site is counted twice. The second pass ran from 17:10 to 17:13 UTC.
All parsing and judging used our audit engine’s own code, unmodified. That covers the robots.txt parser and its 31-crawler registry, the fetcher, the edge-probe judge, CDN detection and the Content-Signal parser. The summary file documents every definition needed to reproduce each figure from the CSV.
How robots.txt was read
- Product tokens match exactly and case-insensitively, as RFC 9309 and Google’s reference parser do. “User-agent: Google” does not govern Googlebot, and Applebot-Extended does not govern Applebot.
- Groups that name the same token are combined, the longest matching rule wins, and Allow wins a tie. A crawler with no group of its own obeys “User-agent: *”. Applebot follows Googlebot’s group when it is not named, as Apple documents.
- “Blocked” means the governing group disallows “/”. A 4xx, an HTML page at /robots.txt or an empty file means everything is allowed (RFC 9309 §2.3.1.3). A 5xx means complete disallow (§2.3.1.4). We saw only 3 of those on live sites and kept them out of the block rates. Sites whose robots.txt timed out are excluded.
What “blocked at the edge” means
- Refused: any non-2xx answer without challenge markup (mostly 403; also 406, 410, 429, 5xx).
- Challenge: a non-2xx answer, or a near-empty 2xx, that carries bot-protection markup. Examples are a cf-mitigated: challenge header, “Just a moment…”, “Access Denied”, captcha-delivery, px-captcha, Incapsula or Sucuri pages. A 2xx counts only if it has fewer than 40 words, or under 30% of the words the browser received.
- Paywall: HTTP 402 Payment Required.
- Only sites where the browser request got a normal page count, and only crawlers that robots.txt allows at “/”.
Limitations
- Simulated user agent, not IP-verified. The crawler requests came from our connection. Sites that verify crawler IPs may serve the real crawler, or block it more. The second-pass controls narrow this down but cannot settle it for any single site.
- One vantage point, one run, one day. Sites geo-block, rate-limit and change rules. A datacenter IP, another country or another week could give different numbers. The 98.7% repeat rate covers minutes, not weeks.
- Home page only. A site can allow the home page and block /blog/ or /products/ in robots.txt or at the edge; partial blocks are not counted.
- Top 5,000 only. Popular sites lean towards large companies on enterprise CDNs, so these rates do not describe small business websites.
- Our “browser” is a plain HTTP client with a Chrome user agent, not a real browser. 525 domains refused it with a 403 and are outside the edge figures, which likely understates edge blocking among the most defended sites.
- We fetched robots.txt as GEOAuditBot. A site that refuses unknown bots may have served a real crawler a different file; 117 live sites answered 401 or 403, counted as “no rules” per RFC 9309.
- CDN detection relies on response headers, so “none detected” mixes self-hosted sites with CDNs that send no identifying header.
- We describe what sites served, not why. A CDN being present does not mean the CDN’s default caused a block; the site owner may have written the rule.
Download the data
Download the data (CSV) has one row per domain, 5,000 rows and 62 columns. It holds robots.txt status and size, the verdict at “/” for each of 31 crawlers, wildcard Disallow, Content-Signal and Content-Usage values, the detected CDN, browser status, size and word count, and status, size and verdict for each simulated crawler request. A second-pass class sits on each edge-blocking site. The summary file (JSON) documents every column, definition and aggregate in this post. It contains no personal data, only domains and the responses their servers gave.
Both files are licensed CC BY 4.0. Please credit “SEO·AEO·GEO, AI crawler access study, October 2026” and link to this page. The checks themselves are documented, with their evidence grades, on our methodology page.
FAQ
How many websites block GPTBot?+
In our 13 October 2026 test of the 5,000 most popular domains, 11.6% of the sites that served a home page disallow GPTBot at the root in robots.txt, and 9.3% name it explicitly. Counted across every robots.txt file in the sample, including infrastructure hosts and sites that refused our request, the figure is 15.9%. The wider web blocks less: Ahrefs measured 5.89% across about 140 million sites in May 2025.
Does blocking GPTBot remove my site from ChatGPT search?+
No. OpenAI documents GPTBot (training) and OAI-SearchBot (ChatGPT search) as independent settings. Sites that opt out of OAI-SearchBot are not shown in ChatGPT search answers, though they can still appear as navigational links. In our data, 48.7% of the sites that block GPTBot still allow OAI-SearchBot.
Can my firewall block ChatGPT search even if robots.txt allows it?+
Yes. robots.txt is a request that crawlers choose to read; a CDN or firewall rule decides what is actually served. On 9.8% of the top sites whose robots.txt allows the AI search crawlers, a request identifying as one of them was refused, challenged or answered with HTTP 402. Check your CDN’s bot rules and look for the crawler’s verified IP addresses in your server logs.
Why would a site block a fake OAI-SearchBot but let the real one in?+
Many bot-management systems check that a request claiming to be a known crawler comes from that crawler’s published IP ranges, and block impostors. Our test sends the user-agent string from our own connection, so to those systems it looks like an impostor. On about a third of the blocking sites a spoofed Googlebot was refused too, which points to this kind of verification.
Is Cloudflare blocking AI crawlers on my site?+
Only if a setting or rule on your zone does it. Among Cloudflare-fronted sites whose robots.txt allows the AI search crawlers, 6.2% turned at least one simulated crawler away, and most of those blocks were aimed at AI crawlers by name. Cloudflare says that on the free plan AI Crawl Control identifies AI crawlers by their user-agent strings, so check AI Crawl Control and your WAF custom rules.
Will this study be repeated?+
We intend to re-run it each quarter on the then-current Tranco top 5,000 with the same code and definitions, so the figures can be compared over time. The full per-site dataset for this edition is published as a CSV under CC BY 4.0.
Sources
- Tranco list 64VKX (top 1 million, generated 12 October 2026) — Tranco (2026-10-12)
- Tranco: A Research-Oriented Top Sites Ranking Hardened Against Manipulation — NDSS Symposium (Le Pochat et al.) (2019-02)
- RFC 9309: Robots Exclusion Protocol — IETF / RFC Editor (2022-09)
- The AI Bots That ~140 Million Websites Block the Most — Ahrefs (2025-05-21)
- Control content use for AI training with Cloudflare’s managed robots.txt and blocking for monetized content — Cloudflare Blog (2025-07-01)
- Expanded AI insights in Cloudflare Radar — Cloudflare Changelog (2025-02-04)
- The AI Crawler Block Index — HasData (2026-09-29)
- Overview of OpenAI Crawlers — OpenAI
- AI Crawl Control — Cloudflare Docs
- Managed robots.txt — Cloudflare Docs (2026-10-08)
- What is Pay Per Crawl? — Cloudflare Docs (2026-07-28)
- Content Signals — Cloudflare
- A Vocabulary For Expressing AI Usage Preferences (draft-ietf-aipref-vocab-08) — IETF AI Preferences Working Group (2026-09-14)
- Perplexity Crawlers — Perplexity
- Does Anthropic crawl data from the web, and how can site owners block the crawler? — Anthropic
Run it on your domain
See this lens as a finding, not a lecture.
Free technical GEO audit. Evidence-traced scores, LLM-ready export, no login.
Audit your website