crawlwise.
Original data · AI crawler access

The AI Crawler Access Report

39.2% of 102 domains block at least one AI crawler.

Sample of 102 domains, collected 2026-09-22.

Headline

Sample102 domains
Blocking at least one AI crawler40 (39.2%)
Blocking a retrieval crawler26 (25.5%)
Challenged rather than blocked41 (40.2%)

By crawler

CrawlerAllowedBlockedChallengedNot established
Bytespider28283016
Meta-ExternalAgent33253014
GPTBot35242914
CCBot35272614
ClaudeBot35252715
Google-Extended36242814
ChatGPT-User36173415
Perplexity-User37222815
Amazonbot38222814
PerplexityBot40222713
cohere-ai38222715
Diffbot38222715
OAI-SearchBot40153314
Claude-User40202814
Timpibot39222615
Applebot-Extended40212615
Claude-SearchBot41182815

By industry

IndustryDomainsBlocking anything
reference11 (100%)
news55 (100%)
food43 (75%)
entertainment43 (75%)
property43 (75%)
health42 (50%)
employment42 (50%)
industrial42 (50%)
consumer52 (40%)
technology166 (37.5%)
ecommerce62 (33.3%)
retail62 (33.3%)
automotive62 (33.3%)
software103 (30%)
education51 (20%)
travel111 (9.1%)
finance30 (0%)
logistics40 (0%)

What changed this quarter

No earlier run of a comparable sample exists to compare against, so nothing is claimed here.

Methodology, in full

Sample. This run probed 102 domains: a hand-assembled list of well-known sites, published at scripts/fixtures/crawler-report-sample.csv, with every industry label assigned by us. It is not a random sample of the web and it is not a top-sites ranking, so every share below describes these domains and not the web. A domain that fails to resolve is recorded as not established rather than dropped, because dropping failures is how a sample silently becomes favourable.

robots.txt. Fetched from the origin, verified to be a robots document rather than an HTML challenge page, then resolved with an RFC 9309 matcher against each crawler’s product token and the probed path. A file that could not be read as a robots file leaves that crawler not established.

Live fetch. The URL is fetched with that crawler’s user-agent. The response is classified by status, by challenge fingerprints (Cloudflare, Akamai, DataDome), and by body size against an ordinary fetch. A 403 or a challenge is a block. A 429 or a timeout is not established, not a block.

Verdicts. Allowed, blocked, challenged, or not established. A disallow in robots.txt for a training crawler is recorded as a deliberate opt-out, and it is counted separately from an accidental block everywhere on this page.

What this cannot tell you. One probe from one location at one moment: a CDN answering a crawler differently in another region is invisible here. A crawler that ignores robots.txt is not stopped by it, and this measures policy as much as enforcement. Rate limiting is only called a block when the response is a 403. And a domain blocking a training crawler while allowing the retrieval crawlers from the same owner is reported as exactly that, not as one number.

Crawlers probed

CrawlerOwnerCategoryUser agent sent
GPTBotOpenAItrainingMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.3; +https://openai.com/gptbot
OAI-SearchBotOpenAIretrievalMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.3; +https://openai.com/searchbot
ChatGPT-UserOpenAIretrievalMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot
ClaudeBotAnthropictrainingMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Claude-SearchBotAnthropicretrievalMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +Claude-SearchBot@anthropic.com)
Claude-UserAnthropicretrievalMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)
Google-ExtendedGoogletrainingMozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
PerplexityBotPerplexityretrievalMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)
Perplexity-UserPerplexityretrievalMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)
CCBotCommon CrawlresearchCCBot/2.0 (https://commoncrawl.org/faq/)
BytespiderByteDancetrainingMozilla/5.0 (compatible; Bytespider; +https://zhanzhang.toutiao.com/)
Applebot-ExtendedAppletrainingMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15 (Applebot/0.1; +http://www.apple.com/go/applebot)
Meta-ExternalAgentMetatrainingMozilla/5.0 (compatible; Meta-ExternalAgent/1.0; +https://developers.facebook.com/docs/sharing/webmasters/crawler)
AmazonbotAmazontrainingMozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot)
cohere-aiCohereretrievalMozilla/5.0 (compatible; cohere-ai/1.0; +https://cohere.com/bot)
DiffbotDiffbotresearchMozilla/5.0 (compatible; Diffbot/0.1; +http://www.diffbot.com)
TimpibotTimpiresearchMozilla/5.0 (compatible; Timpibot/0.1; +https://timpi.io)

Reproduce it

node scripts/crawler-report.mjs --list scripts/fixtures/crawler-report-sample.csv --limit 1000 --label "well-known"

A larger sample is the same command with a longer list, at roughly nineteen outbound requests per domain. 10,000 domains is about 190,000 requests and several hours; the page states whichever sample size it is reading, and nothing here is extrapolated from a smaller one.

Check one page yourself, free