CrawlCheck
Open data · census, conduct, proof, datasets

How much of the web is ready for agents, and how do you know?

In one sentence

The CrawlCheck open data is everything the verification layer measures about the public web, published as it is measured: a daily signed snapshot of every public Resolve answer (the newest seven public, a ninety-day archive on the Data add-on), a census of the web’s most-visited domains on a frozen frame with every record public and every site named, four daily lanes of the measured web (SaaS, government and education, US local businesses, and everything else the corpus reaches) with grade, findings, platform and technologies per site, the conduct record of every verifiable agent and the monthly traffic index, the transparency log every signed answer is merged into, and the aggregate rate of every finding across every scan, which never names a scanned domain. All of it is CrawlCheck’s own measurement, recomputed or re-read on a schedule, and citable with the BibTeX and RIS records on the page.

Everything the verification layer measures about the public web, published as it is measured: a daily signed snapshot of every answer, a census of the most-visited sites, how named agents behave, and sealed proof for all of it — every figure printed with its denominator.

Nothing here is surveyed or self-reported. Each number is recomputed from records when the page is read, carries the count it was divided by, and is served as signed JSON an agent can verify offline. Domains are never named in the aggregates, and any operator can leave the dataset with one line of robots.txt.

Paying never changes a reading. Live figures · Datasets · The counts as JSON

Three paths down

Census. Conduct. Proof.

Census

The same sites, every day.

The top 1,000 frozen once and measured daily, the top 10,000 daily: crawler policy, machine files, capabilities and delivery parity, each edition sealed and comparable with the last.

Daily census · Daily 10,000 · The map

Conduct

How named agents behave.

What each named agent does on real sites, from verified requests: what it fetches, what it respects, what it ignores — and how many verified agent requests carry a receipt.

Agent conduct · Share of preflight · Traffic index

Proof

Sealed, signed, citable.

Every record is hashed into a daily root and anchored to Bitcoin; every published figure has a signed JSON twin and a permanent cite-as address. The verifier is one file.

Proof and timestamps · DOIs and mirrors · Datasets, CC BY · Signing keys

Measured, not surveyed

The state of the agentic web, every day.

The same thousand sites, measured daily from the same vantage. Refusals are read as “refused from here”, never “blocked” — the real crawlers’ addresses are not ours.

Census · top 1,000, dailyrun 44 · finished 8 hours ago · 991 sites
Homepage answers our census fetch51.5%510 of 991Homepage refuses our census fetch12.6%125 of 991Refuse at least one AI identity18.2%93 of 510robots.txt closes / to an AI agent25.4%103 of 405Serve an llms.txt22.4%114 of 510Carry a Content-Signal line4.4%18 of 405Declare an agent capability3.5%18 of 510

Each row states its own denominator. Every figure, every run, and the records they are counted from →

The catalogue

Every dataset the layer publishes, with its denominator.

Signed answers · daily

The Resolve snapshot

Every public signed answer about a measured site, once a day, as files a mirror can serve and verify with no call to us.

99,121 records in the newest · 7 newest public · 90-day archive on the Data add-on · CC BY 4.0

Index · How the files are laid out

Census · daily and weekly

The agentic-web census

The web’s most-visited domains on a fixed frame: crawler policy, machine files, declared capabilities, and whether AI crawlers get what a browser gets. Every record public, every site named.

991 sites daily · 9,776 sites daily

Latest run · Records

Four lanes · daily files

The measured web, one row per site

SaaS, government and education, US local businesses one state a day, and everything the corpus reaches: grade, findings, platform, technologies, 44 fields a row.

586,623 measurements over 43 days · sample free, files on a licence

The lanes · The October report

Conduct · continuous

Agent conduct and the traffic index

Which named agents really came from their operators’ ranges, what they fetched, how fast, and whether they kept to robots.txt; and the monthly index of agent arrivals across reporting sites.

signed · one property for conduct, every reporting site for the index

Conduct · Traffic index · Eight weeks, read

Findings · every scan

How often each defect occurs

Every scan run here, counted by finding: how common, how serious, and what share of sites carry one. Counts only; no scanned domain is ever named.

recomputed on every request · JSON at /api/public/counts

The table · What each finding means

Transparency · every batch

The Resolve log

Every signed answer’s leaf, merged into chained, signed batches with a witness we run on GitHub, so anyone can check that the answer they got is the answer everyone got.

516,254 leaves in 2,379 batches · RFC 9162 proofs

The log · Signing keys

Findings · every scan

How often each defect occurs

Every scan run through the checker is counted; the figures name no domain, only how often each defect occurs. Updated continuously.

7,144

full scans counted (the finding rates below are over these)

80

distinct finding codes seen

32%

carry the most common finding (NO_LLMS_TXT)

35.9%

carry a high or critical finding

Bar length is how common a finding is; bar colour is how serious — green is low severity, red is critical. The two are independent: the most common defect here is medium, and the critical ones are rare.

FindingSitesShare 
NO_LLMS_TXT2,31032.3%
PAGE_IS_MOSTLY_CODE2,02528.3%
MACHINE_CHAIN_HEAVY1,65523.2%
REDIRECT_CHAIN1,40019.6%
STALE_CACHE_SERVED1,07315.0%
HSTS_MISSING1,03414.5%
ROBOTS_RULES_SHADOWED94613.2%
UNIFORM_REFUSAL87712.3%
NO_SITEMAP_FOUND6769.5%
ROBOTS_NO_SITEMAP6208.7%
SITEMAP_NO_LASTMOD5477.7%
ENTITY_NO_COORDINATES4526.3%
ANSWER_ENGINE_REFUSED4396.1%
HOST_DUPLICATE_2004155.8%
HSTS_PRELOAD_INELIGIBLE3575.0%
ROBOTS_NOT_2003555.0%
NAP_UNDECLARED_LISTING3044.3%
HOMEPAGE_REDIRECTS_OFF_HOST2223.1%
ENTITY_COLLISION2052.9%
RENDER_RESOURCE_BLOCKED2042.9%
BROKEN_INTERNAL_LINK1962.7%
AI_OPTOUT_SET1632.3%
SITEMAP_DECLARES_NOTHING1361.9%
SITEMAP_BLOCKED1331.9%
CONTENT_NEEDS_JAVASCRIPT1311.8%
IMAGE_FORMAT_MISMATCH1131.6%
HOMEPAGE_REFUSED991.4%
FRONTIER_BLOAT911.3%
ROBOTS_DISALLOW_ALL761.1%
ARD_MANIFEST_INVALID681.0%
HSTS_PRELOAD_REMOVED630.9%
LLMS_LINK_BROKEN630.9%
DOMAIN_IS_ALIAS600.8%
DECLARED_SITEMAP_BROKEN600.8%
PHONE_SHARED_BY_OTHER_BUSINESSES590.8%
CRAWLER_SERVED_LESS580.8%
DECLARED_SITEMAP_REFUSED560.8%
CHANGED_DATE_STAYED550.8%
IMAGES_BLOCKED_GOOGLEBOT_IMAGE520.7%
SCANNER_REFUSED_BROWSER_READ500.7%
ROBOTS_GROUP_NAME_TYPO490.7%
NAP_NAME_DRIFT490.7%
CRAWLER_SERVED_EXTRA470.7%
GEO_COUNTRY_MISMATCH410.6%
DATE_MOVED_NO_CHANGE390.5%
INSTRUCTION_CONFLICT370.5%
ROBOTS_IS_CATCHALL370.5%
SITEMAP_UNREADABLE340.5%
MACHINE_FILE_CACHE_STALE340.5%
ROBOTS_BLOCKED310.4%
MOBILE_INTERSTITIAL310.4%
SECRETS_EXPOSED270.4%
SITEMAP_IS_HTML260.4%
HOMEPAGE_IS_INTERSTITIAL250.3%
CHALLENGE_SERVED_200220.3%
ARD_MANIFEST_WARNINGS220.3%
CSP_REPORTING_BROKEN210.3%
PLACEHOLDER_CONTENT200.3%
SITEMAP_ORIGIN_ERROR180.3%
SITEMAP_URL_OFF_HOST180.3%
ARD_LEGACY_PATH180.3%
BROKEN_EMBED180.3%
CHALLENGE_PINNED_AT_EDGE150.2%
ORIGIN_REFUSED_SCANNER140.2%
ROBOTS_LEGACY_AGENT_ONLY130.2%
ORIGIN_BLOCKED_BEHIND_CACHE130.2%
CRAWLER_REDIRECTED_AWAY120.2%
ROBOTS_CTYPE100.1%
SITEMAP_CHILD_BROKEN80.1%
ROBOTS_IS_HTML80.1%
FORM_ONLY_CONTENT80.1%
ROBOTS_SITEMAP_RELATIVE70.1%
PAGES_SNIPPET_RESTRICTED60.1%
ROBOTS_NOINDEX_LINE60.1%
SCRIPT_ONLY_LINKS40.1%
MACHINE_FILE_ACCEPT_DEPENDENT40.1%
SITEMAP_LASTMOD_INVALID40.1%
AD_DENSITY_HIGH30.0%
STAGING_LEAK30.0%
MACHINE_FILE_CACHE_SPLIT20.0%

What a single crawl cannot see

85.4% of measured sites carry a defect today. 100% carried one at least once between 2026-08-14 and 2026-11-14. 7 look clean now and did not for at least one day in that window.

Across 48 sites measured every dayShare
Carry a defect today85.4%
Carried one at least once in the window100%
The gap14.6 points
Look clean now and did not, at least once7

Both numbers describe the same sites over 93 days, 2026-08-14 to 2026-11-14. A one-off crawl at any budget can only ever produce the first row — the second needs the same sites to have been measured before the question was asked. Sites added after the window opened are excluded (1314) because they have had fewer chances to be seen broken. No scanned domain is named here or anywhere else on this site.

Arrivals across the network

Unlike everything else here, this is not a probe. These are visits nobody asked for, recorded at the origin on 12 participating sites over the last 7 days.

CrawlerVisitsVerifiedForgedUnverifiable
Googlebot2603154410590
meta-externalagent1995001995
Bingbot128911341550
GPTBot12673499180
AhrefsBot1260126000
Applebot123211321000
Bytespider1102001102
Amazonbot10348002340
OAI-SearchBot9908781120
ClaudeBot9527362160
PerplexityBot6945591350
SemrushBot63000630
CCBot2562718841
YouBot22300223
ChatGPT-User188801080
DuckAssistBot11600116
cohere-ai10000100
Claude-User966900
Perplexity-User850850

Verified means the source address sits inside the range that crawler’s operator publishes. Unverifiable means the operator publishes no range at all — that is not an accusation, and it is excluded from any forged rate rather than counted against the crawler.

Forged crawler identities

13.2% of the requests that named themselves as a known crawler here were not that crawler. 21499 of 163477 checkable claims came from an address outside the range the operator publishes.

Forged rate by claimed identity — share of checkable claims from outside the operator’s published range

Google-Extended100%Claude-SearchBot100%Storebot-Google100%Perplexity-User91.7%Claude-User55.1%Googlebot40.7%GoogleOther30.3%Amazonbot23.9%OAI-SearchBot21.6%ChatGPT-User17.6%Google-Extended100%Claude-SearchBot100%Storebot-Google100%Perplexity-User91.7%Claude-User55.1%Googlebot40.7%GoogleOther30.3%Amazonbot23.9%OAI-SearchBot21.6%ChatGPT-User17.6%
Claimed to beClaimsVerifiedForgedUnverifiableForged rate
Amazonbot823662842089044504423.9%
Meta-ExternalAgent719240071924no feed
PerplexityBot2578325478311—1.2%
SemrushBot235820023584—
Googlebot1909611244772113140.7%
AhrefsBot1653811895446400%
YandexBot15730132942024370.2%
Bytespider138340013834no feed
DataForSeoBot136520013652no feed
Applebot1197111692279—2.3%
ClaudeBot1121010908301—2.7%
OAI-SearchBot922872361992—21.6%

A user-agent is a claim, not an identity. Verified means the source IP sits inside a range the operator publishes — OpenAI, Anthropic, Google, Microsoft, Perplexity and Apple all publish one. Unverifiable is not forgery: some operators publish no range at all, so their requests can be neither confirmed nor accused, and they are excluded from the rate rather than counted against it. This is traffic to this site only, and this site is small — it is a floor on the problem, not a survey of the web.

Coverage

What is in the sample

Coverage matters as much as the counts: a defect rate measured entirely on one platform is a fact about that platform. CrawlCheck deliberately widens the sample rather than scanning the same kind of site repeatedly, and the queue below is what it has not reached yet.

Crawlers we have actually seen

Everything else on this page comes from probes — we send a request wearing a crawler’s name and record what comes back. This table is the opposite: visits nobody asked for, on 4 sites we operate, over 91 days. Verified means the request came from an address range that crawler’s operator publishes: flagged by Cloudflare or, from 20 September 2026, confirmed against the operator’s own published list when Cloudflare does not flag it. Cloudflare never flagged a PerplexityBot request here, although most came from Perplexity’s published ranges, so days before that date undercount operators Cloudflare does not flag.

CrawlerVisitsVerifiedUnverifiedMost-requested path
Amazonbot85897787007197/api/registry
meta-externalagent71744702211523/pricing
AhrefsBot276462762620/entitymap-sitemap.xml
SemrushBot256182559226/robots.txt
PerplexityBot23928192164712/pricing
Googlebot21186155915595/
Applebot20667189721695/pricing
ClaudeBot18492151713321/entitymap-sitemap.xml
Bingbot14073124261647/
Bytespider1373042213308/pricing
GPTBot13278104922786/
OAI-SearchBot12164103631801/robots.txt
CCBot35264233103/
ChatGPT-User320815831625/
YouBot2938412897/api/owner/me
Claude-User1355663692/mcp
DuckAssistBot1138861052/robots.txt
cohere-ai103101031/.env
Google-Extended7150715/.env
Perplexity-User6911690/.env
anthropic-ai505/
Applebot-Extended303/
Diffbot101/og.png

How to read this, and how not to. 363034 visits across a handful of sites is a sample, not a census — it says what reached these sites, not what the web receives. And unverified is not proof of an impostor: plenty of legitimate traffic arrives from ranges nobody publishes, and our own testing appears in these counts as unverified because it is. What the column does show is that the name in a user-agent string is a claim, and it is checkable.

DimensionObserved
Platformwordpress 115452 · unknown 294961 · nextjs 35592 · webflow 7904 · drupal 14199 · shopify 5031 · wix 13825 · squarespace 15394
Renderingserver 407809 · client 94549
Sizemedium 141564 · small 104640 · large 5946
Business typelocal-service 60549 · other 192631 · publisher 61211 · ecommerce 22947 · gov-edu 54413 · saas 48696 · docs 864 · directory 131 · health 14939 · food 23675 · nonprofit 2440 · finance 4246 · travel 5809 · real-estate 1765 · automotive 5560 · legal 2482
Languageen 341318 · non-en 111286
Queued, not yet scanned374,767 domains

Platform, rendering, size and business type are read from what each site discloses in its own response. Most sites now answer from behind a CDN, which replaces the origin identity in the headers, so unknown here means the site did not disclose one — not that we did not look. We would rather publish a large unknown than a confident guess.

Method

How to read these numbers

Each row counts sites, not pages, and a site is counted once per finding however many times it was scanned. A finding is recorded only when the check actually returned an answer: lookups that failed on our side are excluded rather than counted as clean, which is why the totals here can be smaller than the scan count. Domains are never named, in aggregate or individually, and any operator can exclude a domain from this dataset in one line of robots.txt — see the policy page.

Every figure on this page is recomputed when the page is requested, so a number quoted elsewhere is a snapshot of the moment it was read. The same counts are served as JSON at /api/public/counts with an at timestamp — no key, CORS open — so anyone quoting us can check the current value instead of taking ours. A record is only worth more than a single reading if the reading can be repeated.

Run a scan

Citable editions

DOIs and mirrors

A live page cannot be cited twice the same way. The sealed editions are deposited on Zenodo under a DOI that keeps resolving whether or not this site does, and the free datasets are mirrored on Hugging Face. Both are written by the same job that seals the edition.

Dataset · 9 editions mintedConcept DOINewest edition DOI
CrawlCheck agentic-web census, weekly edition4 editions · newest 2026-W45, minted 2026-11-09
Concept DOI, always the newest10.5281/zenodo.23538914
Newest edition, fixed forever10.5281/zenodo.24065253
CrawlCheck AI-use declarations, top 10,000 (rights feed edition)5 editions · newest rf-2026-11-11-d9a42a, minted 2026-11-11
Concept DOI, always the newest10.5281/zenodo.23538920
Newest edition, fixed forever10.5281/zenodo.24142696

On Hugging Face · 13 datasets under crawlcheck, last pushed 2026-11-14 17:20 UTCAI crawler catalogueFinding counts by problemTechnology countsGlossary of the agentic webVendor website benchmarkAI consent data (sample edition)Agentic-web census, weeklyAI-use declarations, top 10,000Agent safety benchmarkCrawler IP-range historyEmbeddings of the CrawlCheck cataloguesResolve snapshot (daily, signed)MCP tool changes, weekly

The status of both feeds is public: /api/v1/zenodo and /api/v1/hf-mirror.

The agentic-web census

A fixed frame of the web’s most-visited domains, measured on a schedule for what an AI agent meets first: crawler policy, machine files, declared capabilities, and whether AI crawlers are served what a browser is. Frame: the top 1000 of Tranco list Y83YG (created 2026-10-01), frozen 2026-10-02; 991 sites measured, 9 left out by the publish filter (adult and gambling hosts) and 0 opted out — counted, never named. Unlike the figures above, the census names its sites: every record is public at /api/census.

Run 44, 2026-11-14 08:00 → 2026-11-14 08:36 UTC, 991 sites. Change is against run 3 (2026-10-04), the same frame: percentage points, then the sites that gained and lost the property between the two runs.

AreaMeasuredShareSitesChangeGained / lost
ReachHomepage answers CrawlCheck's census fetch (2xx after redirects)51.5%510 / 9910 pt+21 / −21
ReachHomepage refuses CrawlCheck's census fetch (400, 401, 403 or 429): blocked or rate-limited, not down12.6%125 / 991——
ReachNo website answers at that name (5xx, 530, timeout or no answer)32.1%318 / 991——
Crawler policyServes a robots.txt (200, not HTML)79.4%405 / 510+0.8 pt+7 / −3
Crawler policyrobots.txt names a sitemap71.9%291 / 405+1.6 pt+8 / −2
Crawler policyrobots.txt carries a Content-Signal line4.4%18 / 405+0.8 pt+3 / −0
Crawler policyContent-Signal says ai-train=no3.2%13 / 405+0.8 pt+3 / −0
Crawler policyContent-Signal says ai-input=no or search=no1%4 / 4050 pt+0 / −0
Crawler policyrobots.txt names the AI-training policy token (__usage_ai-training, IETF AIPREF draft)1.2%5 / 405——
Crawler policyrobots.txt states a preference against AI training on / with that token1.2%5 / 405——
Crawler policyrobots.txt closes / to at least one of the 12 AI agents25.4%103 / 405+1 pt+4 / −0
Crawler policyrobots.txt closes / to GPTBot16.8%68 / 405+0.3 pt+2 / −1
Crawler policyrobots.txt closes / to OAI-SearchBot7.4%30 / 4050 pt+1 / −1
Crawler policyrobots.txt closes / to ChatGPT-User9.1%37 / 405-0.5 pt+0 / −2
Crawler policyrobots.txt closes / to ClaudeBot16%65 / 405+1 pt+4 / −0
Crawler policyrobots.txt closes / to Claude-SearchBot8.9%36 / 405+0.8 pt+3 / −0
Crawler policyrobots.txt closes / to PerplexityBot12.1%49 / 405+0.3 pt+1 / −0
Crawler policyrobots.txt closes / to Google-Extended13.8%56 / 4050 pt+2 / −2
Crawler policyrobots.txt closes / to Applebot-Extended13.1%53 / 405+0.8 pt+3 / −0
Crawler policyrobots.txt closes / to CCBot19.8%80 / 405+0.5 pt+2 / −0
Crawler policyrobots.txt closes / to Bytespider19.8%80 / 405+1 pt+4 / −0
Crawler policyrobots.txt closes / to Meta-ExternalAgent15.8%64 / 405+1 pt+4 / −0
Crawler policyrobots.txt closes / to Amazonbot13.6%55 / 405+0.8 pt+4 / −1
Machine filesServes /llms.txt22.4%114 / 510+2.7 pt+15 / −2
Machine filesServes /agents.md2.9%15 / 510+0.4 pt+3 / −1
CapabilitiesPublishes an agent-skills index2.5%13 / 510+0.4 pt+3 / −1
CapabilitiesPublishes an MCP server card2.5%13 / 510+0.2 pt+1 / −0
CapabilitiesPublishes an API catalog (RFC 9727)2.5%13 / 510+0.4 pt+2 / −0
CapabilitiesPublishes an A2A agent card0.6%3 / 510+0.2 pt+1 / −0
CapabilitiesDeclares any agent capability (any of the four above)3.5%18 / 510+0.6 pt+3 / −0
Delivery parityAt least one AI identity is refused (non-2xx) where the browser got 2xx18.2%93 / 510+1 pt+9 / −4
Delivery parityAt least one AI identity gets under 70% of the browser's bytes (both 2xx)3.7%19 / 510-0.4 pt+3 / −5
Endpoint ringsNames an MCP endpoint (server card, llms.txt, agents.md, a homepage link, or /mcp answers like one)11.2%57 / 510——
Endpoint ringsAn MCP endpoint completes the handshake (initialize and tools/list; no tool called)1.4%7 / 510——
Endpoint ringsOf sites naming an MCP endpoint, one completes the handshake or asks for credentials77.2%44 / 57——
Endpoint ringsThe A2A agent card names an endpoint url0.4%2 / 510——
Endpoint ringsOf A2A cards naming a url, the url answers (any non-5xx, not an HTML page)50%1 / 2——
Endpoint ringsHomepage carries WebMCP (navigator.modelContext, a WebMCP bridge, or an mcp+json block)0.2%1 / 510——
SafetyListed by Google Safe Browsing (all or some pages): browsers show a red warning0.6%2 / 315——
SafetyListed as malware or phishing by the Cloudflare security resolver0%0 / 524——
SafetyOn the browsers' HSTS preload list (HTTPS-only from the first visit)17.4%91 / 524——
SafetyHomepage loads scripts or styles from another domain61.8%324 / 524——
SafetyHomepage loads scripts or styles from 5 or more other domains6.5%34 / 524——
SafetyPins at least one outside script or style with integrity=9%29 / 324——
SafetyLoads a library from a public CDN without integrity=8.8%46 / 524——
SafetyStill loads scripts from a CDN taken over in 2024 (polyfill.io and its sister CDNs)0%0 / 524——
SafetyHomepage shows hidden spam links or cryptominer code0%0 / 524——
Delivery parityGPTBot refused where the browser got 2xx15.9%81 / 510+1.2 pt+8 / −2
Delivery parityClaudeBot refused where the browser got 2xx14.9%76 / 510+1 pt+9 / −4
Delivery parityOAI-SearchBot refused where the browser got 2xx10.4%53 / 510+0.6 pt+5 / −2
Delivery parityPerplexityBot refused where the browser got 2xx12.7%65 / 510+2.2 pt+13 / −2
Method
  • Homepage fetched once each as a mobile browser and as GPTBot, ClaudeBot, OAI-SearchBot and PerplexityBot, from CrawlCheck's network, following redirects. A refusal of a named crawler from this network may be identity verification (the crawler's real addresses are not ours), so delivery figures read 'refused from this vantage', not 'blocked'.
  • robots.txt read once; each of 12 AI agents' access to / is decided per RFC 9309 (the most specific matching group; longest-match rules). The text is kept in the record.
  • A file counts as present when it answers 200, is not an HTML page, is not empty, and (for the JSON ones) parses as a JSON object.
  • Endpoint rings (from run derive_v 3): MCP endpoints named by the server card, llms.txt, agents.md or a homepage link, plus GET /mcp on the site and on mcp.<domain> when the answer is the shape a streamable-HTTP server gives (405/406/415, an SSE stream, a JSON-RPC error, a Bearer challenge; never an HTML page or a 404). Up to three candidates get the MCP handshake - initialize and tools/list, never a tool call. The A2A card's url gets one GET. WebMCP is navigator.modelContext, a WebMCP bridge script or an application/mcp+json block in the homepage HTML.
  • Each figure states its own denominator: reach is over every frame member; machine files, capabilities and delivery are over sites a browser reached; robots figures are over sites serving a robots.txt.
  • Every figure is a count over the derived fields of the run's records. Page https://crawlcheck.io/api/census/records?run=N and count (or ask for one site with &domain=); each record also carries the raw readings (statuses, sizes, SHA-256 of what was served, the robots.txt text) the derived fields come from.
  • The top 1000 registrable domains of one Tranco list (a public ranking combining CrUX, Farsight, Majestic, Cloudflare Radar and Umbrella), frozen at the first run so every run measures the same sites. Hosts the publish filter refuses (adult, gambling) and opted-out domains leave the frame and are counted, never named. Infrastructure domains in the list (CDNs, API hosts) stay in: one that serves no homepage is counted as unreachable.

Summary JSON · run 44 records · the frame

The agentic-web census: top 10,000, daily

A fixed frame of the web’s most-visited domains, measured on a schedule for what an AI agent meets first: crawler policy, machine files, declared capabilities, and whether AI crawlers are served what a browser is. Frame: the top 10000 of Tranco list Y83YG (created 2026-10-01), frozen 2026-10-03; 9776 sites measured, 223 left out by the publish filter (adult and gambling hosts) and 0 opted out — counted, never named. Unlike the figures above, the census names its sites: every record is public at /api/census.

Run 18, 2026-11-13 18:46 → 2026-11-14 01:34 UTC, 9776 sites. Change is against run 1 (2026-10-03), the same frame: percentage points, then the sites that gained and lost the property between the two runs.

AreaMeasuredShareSitesChangeGained / lost
ReachHomepage answers CrawlCheck's census fetch (2xx after redirects)60.3%5895 / 9776+2.6 pt+531 / −279
ReachHomepage refuses CrawlCheck's census fetch (400, 401, 403 or 429): blocked or rate-limited, not down12%1174 / 9776——
ReachNo website answers at that name (5xx, 530, timeout or no answer)25.7%2512 / 9776——
Crawler policyServes a robots.txt (200, not HTML)79.7%4696 / 5895+0.9 pt+98 / −51
Crawler policyrobots.txt names a sitemap70.4%3306 / 4696+0.9 pt+60 / −23
Crawler policyrobots.txt carries a Content-Signal line6.5%303 / 4696+2.9 pt+125 / −2
Crawler policyContent-Signal says ai-train=no5%233 / 4696+2.6 pt+115 / −4
Crawler policyContent-Signal says ai-input=no or search=no0.4%21 / 46960 pt+0 / −1
Crawler policyrobots.txt names the AI-training policy token (__usage_ai-training, IETF AIPREF draft)0.4%18 / 4693——
Crawler policyrobots.txt states a preference against AI training on / with that token0.4%18 / 4693——
Crawler policyrobots.txt closes / to at least one of the 12 AI agents22.2%1043 / 4696+2.9 pt+131 / −8
Crawler policyrobots.txt closes / to GPTBot16.3%764 / 4696+2.3 pt+112 / −14
Crawler policyrobots.txt closes / to OAI-SearchBot6.3%294 / 4696-0.2 pt+10 / −17
Crawler policyrobots.txt closes / to ChatGPT-User8%376 / 4696-0.3 pt+13 / −27
Crawler policyrobots.txt closes / to ClaudeBot15.1%711 / 4696+2.5 pt+119 / −12
Crawler policyrobots.txt closes / to Claude-SearchBot6%280 / 46960 pt+13 / −12
Crawler policyrobots.txt closes / to PerplexityBot9.1%428 / 4696-0.3 pt+12 / −23
Crawler policyrobots.txt closes / to Google-Extended13.4%629 / 4696+2.5 pt+130 / −23
Crawler policyrobots.txt closes / to Applebot-Extended13.4%627 / 4696+2.9 pt+132 / −9
Crawler policyrobots.txt closes / to CCBot17.3%812 / 4696+2.1 pt+126 / −34
Crawler policyrobots.txt closes / to Bytespider17.2%807 / 4696+2.9 pt+130 / −6
Crawler policyrobots.txt closes / to Meta-ExternalAgent14.1%664 / 4696+2.6 pt+139 / −28
Crawler policyrobots.txt closes / to Amazonbot13.6%639 / 4696+3 pt+138 / −10
Machine filesServes /llms.txt16.7%983 / 5895+1.6 pt+108 / −21
Machine filesServes /agents.md1.4%81 / 5895+0.1 pt+14 / −6
CapabilitiesPublishes an agent-skills index1%61 / 5895+0.2 pt+12 / −3
CapabilitiesPublishes an MCP server card1.1%67 / 5895+0.3 pt+17 / −3
CapabilitiesPublishes an API catalog (RFC 9727)1.3%74 / 5895+0.2 pt+16 / −3
CapabilitiesPublishes an A2A agent card0.3%18 / 58950 pt+4 / −2
CapabilitiesDeclares any agent capability (any of the four above)1.5%89 / 5895+0.3 pt+17 / −3
Delivery parityAt least one AI identity is refused (non-2xx) where the browser got 2xx26.2%1546 / 5895+0.3 pt+104 / −89
Delivery parityAt least one AI identity gets under 70% of the browser's bytes (both 2xx)2.2%128 / 5895-0.6 pt+30 / −60
Endpoint ringsNames an MCP endpoint (server card, llms.txt, agents.md, a homepage link, or /mcp answers like one)5.7%335 / 5895——
Endpoint ringsAn MCP endpoint completes the handshake (initialize and tools/list; no tool called)0.9%55 / 5895——
Endpoint ringsOf sites naming an MCP endpoint, one completes the handshake or asks for credentials78.8%264 / 335——
Endpoint ringsThe A2A agent card names an endpoint url0.2%10 / 5895——
Endpoint ringsOf A2A cards naming a url, the url answers (any non-5xx, not an HTML page)40%4 / 10——
Endpoint ringsHomepage carries WebMCP (navigator.modelContext, a WebMCP bridge, or an mcp+json block)0.1%5 / 5895——
SafetyListed by Google Safe Browsing (all or some pages): browsers show a red warning0.8%40 / 4747——
SafetyListed as malware or phishing by the Cloudflare security resolver0.3%17 / 5910——
SafetyOn the browsers' HSTS preload list (HTTPS-only from the first visit)8.1%477 / 5909——
SafetyHomepage loads scripts or styles from another domain67.7%4002 / 5912——
SafetyHomepage loads scripts or styles from 5 or more other domains10.6%626 / 5912——
SafetyPins at least one outside script or style with integrity=9.7%387 / 4002——
SafetyLoads a library from a public CDN without integrity=13.1%772 / 5912——
SafetyStill loads scripts from a CDN taken over in 2024 (polyfill.io and its sister CDNs)0.1%4 / 5912——
SafetyHomepage shows hidden spam links or cryptominer code0%1 / 5912——
Delivery parityGPTBot refused where the browser got 2xx22.7%1338 / 5895+0.2 pt+83 / −72
Delivery parityClaudeBot refused where the browser got 2xx23.2%1365 / 5895+0.5 pt+97 / −72
Delivery parityOAI-SearchBot refused where the browser got 2xx16.1%948 / 5895+0.6 pt+73 / −42
Delivery parityPerplexityBot refused where the browser got 2xx19.3%1135 / 5895+3.5 pt+228 / −39
Method
  • Homepage fetched once each as a mobile browser and as GPTBot, ClaudeBot, OAI-SearchBot and PerplexityBot, from CrawlCheck's network, following redirects. A refusal of a named crawler from this network may be identity verification (the crawler's real addresses are not ours), so delivery figures read 'refused from this vantage', not 'blocked'.
  • robots.txt read once; each of 12 AI agents' access to / is decided per RFC 9309 (the most specific matching group; longest-match rules). The text is kept in the record.
  • A file counts as present when it answers 200, is not an HTML page, is not empty, and (for the JSON ones) parses as a JSON object.
  • Endpoint rings (from run derive_v 3): MCP endpoints named by the server card, llms.txt, agents.md or a homepage link, plus GET /mcp on the site and on mcp.<domain> when the answer is the shape a streamable-HTTP server gives (405/406/415, an SSE stream, a JSON-RPC error, a Bearer challenge; never an HTML page or a 404). Up to three candidates get the MCP handshake - initialize and tools/list, never a tool call. The A2A card's url gets one GET. WebMCP is navigator.modelContext, a WebMCP bridge script or an application/mcp+json block in the homepage HTML.
  • Each figure states its own denominator: reach is over every frame member; machine files, capabilities and delivery are over sites a browser reached; robots figures are over sites serving a robots.txt.
  • Every figure is a count over the derived fields of the run's records. Page https://crawlcheck.io/api/census/records?frame=top10k&run=N and count (or ask for one site with &domain=); each record also carries the raw readings (statuses, sizes, SHA-256 of what was served, the robots.txt text) the derived fields come from.
  • The top 10000 registrable domains of one Tranco list (a public ranking combining CrUX, Farsight, Majestic, Cloudflare Radar and Umbrella), frozen at the first run so every run measures the same sites. Hosts the publish filter refuses (adult, gambling) and opted-out domains leave the frame and are counted, never named. Infrastructure domains in the list (CDNs, API hosts) stay in: one that serves no homepage is counted as unreachable.

Summary JSON · run 18 records · the frame

Cite this dataset

Every figure here is recomputed from the record when you load the page, so a citation should carry the access date as well as the year. Both records below do. To cite a figure that will never change, cite a sealed edition by its DOI instead: 10.5281/zenodo.24065253, 10.5281/zenodo.24142696 (all editions).

BibTeX download

@online{crawlcheck_dataset_2026,
  author       = {{CrawlCheck}},
  organization = {CrawlCheck},
  type         = {Live dataset},
  language     = {english},
  keywords     = {AI crawlers, answer engines, llms.txt, robots.txt, machine readability},
  abstract     = {Aggregate measurements of what answer engines and AI crawlers receive from public websites - machine-file adoption, crawler access outcomes and payload composition, recomputed continuously across the scanned corpus.},
  title   = {Dataset --- {CrawlCheck}},
  year    = {2026},
  url     = {https://crawlcheck.io/data},
  urldate = {2026-11-14},
  note    = {Continuously updated; figures recomputed on each request}
}

RIS download

TY  - DATA
TI  - Dataset — CrawlCheck
AU  - CrawlCheck
PB  - CrawlCheck
KW  - AI crawlers
KW  - Answer engines
KW  - Machine readability
AB  - Aggregate measurements of what answer engines and AI crawlers receive from public websites - machine-file adoption, crawler access outcomes and payload composition, recomputed continuously across the scanned corpus.
PY  - 2026
UR  - https://crawlcheck.io/data
Y2  - 2026/11/14
N1  - Continuously updated; figures recomputed on each request
ER  - 

The RIS type is DATA rather than ELEC — this is a dataset, and reference managers file the two differently.

Questions about this page

QDoes the dataset name the sites it measured?
The aggregates on this page do not: the finding rates, the coverage table and the crawler figures carry counts and shares only. Three published sets do name sites, by design and in public: the census of the most-visited domains, the daily Resolve snapshot, and the dataset files. A domain owner can remove a site from all of it with one line in robots.txt.
QWhat is the most common finding across sites?
The table on this page is recomputed on every request, so read the current top row there rather than a number quoted elsewhere. Common findings are a stale cached copy served to crawlers, no llms.txt, and pages where almost none of the delivered bytes are readable text.
QCan I cite this dataset?
Yes. BibTeX and RIS records are on the page, and the figures carry the date they were computed, because they change as scans accrue. For a figure that must never change, cite a sealed edition by its Zenodo DOI; the editions are listed on the page and mirrored on Hugging Face.
QIs this a random sample of the web?
No. It is the set of sites people chose to scan plus a seeded corpus, which skews toward sites somebody already suspected. Percentiles here describe this corpus, not the web, and the page says so.

Keep reading