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.
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
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.
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.
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
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.
Each row states its own denominator. Every figure, every run, and the records they are counted from →
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
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
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
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
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
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
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.
| Finding | Sites | Share | |
|---|---|---|---|
NO_LLMS_TXT | 2,310 | 32.3% | |
PAGE_IS_MOSTLY_CODE | 2,025 | 28.3% | |
MACHINE_CHAIN_HEAVY | 1,655 | 23.2% | |
REDIRECT_CHAIN | 1,400 | 19.6% | |
STALE_CACHE_SERVED | 1,073 | 15.0% | |
HSTS_MISSING | 1,034 | 14.5% | |
ROBOTS_RULES_SHADOWED | 946 | 13.2% | |
UNIFORM_REFUSAL | 877 | 12.3% | |
NO_SITEMAP_FOUND | 676 | 9.5% | |
ROBOTS_NO_SITEMAP | 620 | 8.7% | |
SITEMAP_NO_LASTMOD | 547 | 7.7% | |
ENTITY_NO_COORDINATES | 452 | 6.3% | |
ANSWER_ENGINE_REFUSED | 439 | 6.1% | |
HOST_DUPLICATE_200 | 415 | 5.8% | |
HSTS_PRELOAD_INELIGIBLE | 357 | 5.0% | |
ROBOTS_NOT_200 | 355 | 5.0% | |
NAP_UNDECLARED_LISTING | 304 | 4.3% | |
HOMEPAGE_REDIRECTS_OFF_HOST | 222 | 3.1% | |
ENTITY_COLLISION | 205 | 2.9% | |
RENDER_RESOURCE_BLOCKED | 204 | 2.9% | |
BROKEN_INTERNAL_LINK | 196 | 2.7% | |
AI_OPTOUT_SET | 163 | 2.3% | |
SITEMAP_DECLARES_NOTHING | 136 | 1.9% | |
SITEMAP_BLOCKED | 133 | 1.9% | |
CONTENT_NEEDS_JAVASCRIPT | 131 | 1.8% | |
IMAGE_FORMAT_MISMATCH | 113 | 1.6% | |
HOMEPAGE_REFUSED | 99 | 1.4% | |
FRONTIER_BLOAT | 91 | 1.3% | |
ROBOTS_DISALLOW_ALL | 76 | 1.1% | |
ARD_MANIFEST_INVALID | 68 | 1.0% | |
HSTS_PRELOAD_REMOVED | 63 | 0.9% | |
LLMS_LINK_BROKEN | 63 | 0.9% | |
DOMAIN_IS_ALIAS | 60 | 0.8% | |
DECLARED_SITEMAP_BROKEN | 60 | 0.8% | |
PHONE_SHARED_BY_OTHER_BUSINESSES | 59 | 0.8% | |
CRAWLER_SERVED_LESS | 58 | 0.8% | |
DECLARED_SITEMAP_REFUSED | 56 | 0.8% | |
CHANGED_DATE_STAYED | 55 | 0.8% | |
IMAGES_BLOCKED_GOOGLEBOT_IMAGE | 52 | 0.7% | |
SCANNER_REFUSED_BROWSER_READ | 50 | 0.7% | |
ROBOTS_GROUP_NAME_TYPO | 49 | 0.7% | |
NAP_NAME_DRIFT | 49 | 0.7% | |
CRAWLER_SERVED_EXTRA | 47 | 0.7% | |
GEO_COUNTRY_MISMATCH | 41 | 0.6% | |
DATE_MOVED_NO_CHANGE | 39 | 0.5% | |
INSTRUCTION_CONFLICT | 37 | 0.5% | |
ROBOTS_IS_CATCHALL | 37 | 0.5% | |
SITEMAP_UNREADABLE | 34 | 0.5% | |
MACHINE_FILE_CACHE_STALE | 34 | 0.5% | |
ROBOTS_BLOCKED | 31 | 0.4% | |
MOBILE_INTERSTITIAL | 31 | 0.4% | |
SECRETS_EXPOSED | 27 | 0.4% | |
SITEMAP_IS_HTML | 26 | 0.4% | |
HOMEPAGE_IS_INTERSTITIAL | 25 | 0.3% | |
CHALLENGE_SERVED_200 | 22 | 0.3% | |
ARD_MANIFEST_WARNINGS | 22 | 0.3% | |
CSP_REPORTING_BROKEN | 21 | 0.3% | |
PLACEHOLDER_CONTENT | 20 | 0.3% | |
SITEMAP_ORIGIN_ERROR | 18 | 0.3% | |
SITEMAP_URL_OFF_HOST | 18 | 0.3% | |
ARD_LEGACY_PATH | 18 | 0.3% | |
BROKEN_EMBED | 18 | 0.3% | |
CHALLENGE_PINNED_AT_EDGE | 15 | 0.2% | |
ORIGIN_REFUSED_SCANNER | 14 | 0.2% | |
ROBOTS_LEGACY_AGENT_ONLY | 13 | 0.2% | |
ORIGIN_BLOCKED_BEHIND_CACHE | 13 | 0.2% | |
CRAWLER_REDIRECTED_AWAY | 12 | 0.2% | |
ROBOTS_CTYPE | 10 | 0.1% | |
SITEMAP_CHILD_BROKEN | 8 | 0.1% | |
ROBOTS_IS_HTML | 8 | 0.1% | |
FORM_ONLY_CONTENT | 8 | 0.1% | |
ROBOTS_SITEMAP_RELATIVE | 7 | 0.1% | |
PAGES_SNIPPET_RESTRICTED | 6 | 0.1% | |
ROBOTS_NOINDEX_LINE | 6 | 0.1% | |
SCRIPT_ONLY_LINKS | 4 | 0.1% | |
MACHINE_FILE_ACCEPT_DEPENDENT | 4 | 0.1% | |
SITEMAP_LASTMOD_INVALID | 4 | 0.1% | |
AD_DENSITY_HIGH | 3 | 0.0% | |
STAGING_LEAK | 3 | 0.0% | |
MACHINE_FILE_CACHE_SPLIT | 2 | 0.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 day | Share |
|---|---|
| Carry a defect today | 85.4% |
| Carried one at least once in the window | 100% |
| The gap | 14.6 points |
| Look clean now and did not, at least once | 7 |
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.
| Crawler | Visits | Verified | Forged | Unverifiable |
|---|---|---|---|---|
| Googlebot | 2603 | 1544 | 1059 | 0 |
| meta-externalagent | 1995 | 0 | 0 | 1995 |
| Bingbot | 1289 | 1134 | 155 | 0 |
| GPTBot | 1267 | 349 | 918 | 0 |
| AhrefsBot | 1260 | 1260 | 0 | 0 |
| Applebot | 1232 | 1132 | 100 | 0 |
| Bytespider | 1102 | 0 | 0 | 1102 |
| Amazonbot | 1034 | 800 | 234 | 0 |
| OAI-SearchBot | 990 | 878 | 112 | 0 |
| ClaudeBot | 952 | 736 | 216 | 0 |
| PerplexityBot | 694 | 559 | 135 | 0 |
| SemrushBot | 630 | 0 | 0 | 630 |
| CCBot | 256 | 27 | 188 | 41 |
| YouBot | 223 | 0 | 0 | 223 |
| ChatGPT-User | 188 | 80 | 108 | 0 |
| DuckAssistBot | 116 | 0 | 0 | 116 |
| cohere-ai | 100 | 0 | 0 | 100 |
| Claude-User | 96 | 6 | 90 | 0 |
| Perplexity-User | 85 | 0 | 85 | 0 |
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
| Claimed to be | Claims | Verified | Forged | Unverifiable | Forged rate |
|---|---|---|---|---|---|
| Amazonbot | 82366 | 28420 | 8904 | 45044 | 23.9% |
| Meta-ExternalAgent | 71924 | 0 | 0 | 71924 | no feed |
| PerplexityBot | 25783 | 25478 | 311 | — | 1.2% |
| SemrushBot | 23582 | 0 | 0 | 23584 | — |
| Googlebot | 19096 | 11244 | 7721 | 131 | 40.7% |
| AhrefsBot | 16538 | 11895 | 4 | 4640 | 0% |
| YandexBot | 15730 | 13294 | 20 | 2437 | 0.2% |
| Bytespider | 13834 | 0 | 0 | 13834 | no feed |
| DataForSeoBot | 13652 | 0 | 0 | 13652 | no feed |
| Applebot | 11971 | 11692 | 279 | — | 2.3% |
| ClaudeBot | 11210 | 10908 | 301 | — | 2.7% |
| OAI-SearchBot | 9228 | 7236 | 1992 | — | 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.
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.
| Crawler | Visits | Verified | Unverified | Most-requested path |
|---|---|---|---|---|
| Amazonbot | 85897 | 78700 | 7197 | /api/registry |
| meta-externalagent | 71744 | 70221 | 1523 | /pricing |
| AhrefsBot | 27646 | 27626 | 20 | /entitymap-sitemap.xml |
| SemrushBot | 25618 | 25592 | 26 | /robots.txt |
| PerplexityBot | 23928 | 19216 | 4712 | /pricing |
| Googlebot | 21186 | 15591 | 5595 | / |
| Applebot | 20667 | 18972 | 1695 | /pricing |
| ClaudeBot | 18492 | 15171 | 3321 | /entitymap-sitemap.xml |
| Bingbot | 14073 | 12426 | 1647 | / |
| Bytespider | 13730 | 422 | 13308 | /pricing |
| GPTBot | 13278 | 10492 | 2786 | / |
| OAI-SearchBot | 12164 | 10363 | 1801 | /robots.txt |
| CCBot | 3526 | 423 | 3103 | / |
| ChatGPT-User | 3208 | 1583 | 1625 | / |
| YouBot | 2938 | 41 | 2897 | /api/owner/me |
| Claude-User | 1355 | 663 | 692 | /mcp |
| DuckAssistBot | 1138 | 86 | 1052 | /robots.txt |
| cohere-ai | 1031 | 0 | 1031 | /.env |
| Google-Extended | 715 | 0 | 715 | /.env |
| Perplexity-User | 691 | 1 | 690 | /.env |
| anthropic-ai | 5 | 0 | 5 | / |
| Applebot-Extended | 3 | 0 | 3 | / |
| Diffbot | 1 | 0 | 1 | /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.
| Dimension | Observed |
|---|---|
| Platform | wordpress 115452 · unknown 294961 · nextjs 35592 · webflow 7904 · drupal 14199 · shopify 5031 · wix 13825 · squarespace 15394 |
| Rendering | server 407809 · client 94549 |
| Size | medium 141564 · small 104640 · large 5946 |
| Business type | local-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 |
| Language | en 341318 · non-en 111286 |
| Queued, not yet scanned | 374,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.
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.
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.
10.5281/zenodo.2353891410.5281/zenodo.2406525310.5281/zenodo.2353892010.5281/zenodo.24142696On 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.
| Area | Measured | Share | Sites | Change | Gained / lost |
|---|---|---|---|---|---|
| Reach | Homepage answers CrawlCheck's census fetch (2xx after redirects) | 51.5% | 510 / 991 | 0 pt | +21 / −21 |
| Reach | Homepage refuses CrawlCheck's census fetch (400, 401, 403 or 429): blocked or rate-limited, not down | 12.6% | 125 / 991 | — | — |
| Reach | No website answers at that name (5xx, 530, timeout or no answer) | 32.1% | 318 / 991 | — | — |
| Crawler policy | Serves a robots.txt (200, not HTML) | 79.4% | 405 / 510 | +0.8 pt | +7 / −3 |
| Crawler policy | robots.txt names a sitemap | 71.9% | 291 / 405 | +1.6 pt | +8 / −2 |
| Crawler policy | robots.txt carries a Content-Signal line | 4.4% | 18 / 405 | +0.8 pt | +3 / −0 |
| Crawler policy | Content-Signal says ai-train=no | 3.2% | 13 / 405 | +0.8 pt | +3 / −0 |
| Crawler policy | Content-Signal says ai-input=no or search=no | 1% | 4 / 405 | 0 pt | +0 / −0 |
| Crawler policy | robots.txt names the AI-training policy token (__usage_ai-training, IETF AIPREF draft) | 1.2% | 5 / 405 | — | — |
| Crawler policy | robots.txt states a preference against AI training on / with that token | 1.2% | 5 / 405 | — | — |
| Crawler policy | robots.txt closes / to at least one of the 12 AI agents | 25.4% | 103 / 405 | +1 pt | +4 / −0 |
| Crawler policy | robots.txt closes / to GPTBot | 16.8% | 68 / 405 | +0.3 pt | +2 / −1 |
| Crawler policy | robots.txt closes / to OAI-SearchBot | 7.4% | 30 / 405 | 0 pt | +1 / −1 |
| Crawler policy | robots.txt closes / to ChatGPT-User | 9.1% | 37 / 405 | -0.5 pt | +0 / −2 |
| Crawler policy | robots.txt closes / to ClaudeBot | 16% | 65 / 405 | +1 pt | +4 / −0 |
| Crawler policy | robots.txt closes / to Claude-SearchBot | 8.9% | 36 / 405 | +0.8 pt | +3 / −0 |
| Crawler policy | robots.txt closes / to PerplexityBot | 12.1% | 49 / 405 | +0.3 pt | +1 / −0 |
| Crawler policy | robots.txt closes / to Google-Extended | 13.8% | 56 / 405 | 0 pt | +2 / −2 |
| Crawler policy | robots.txt closes / to Applebot-Extended | 13.1% | 53 / 405 | +0.8 pt | +3 / −0 |
| Crawler policy | robots.txt closes / to CCBot | 19.8% | 80 / 405 | +0.5 pt | +2 / −0 |
| Crawler policy | robots.txt closes / to Bytespider | 19.8% | 80 / 405 | +1 pt | +4 / −0 |
| Crawler policy | robots.txt closes / to Meta-ExternalAgent | 15.8% | 64 / 405 | +1 pt | +4 / −0 |
| Crawler policy | robots.txt closes / to Amazonbot | 13.6% | 55 / 405 | +0.8 pt | +4 / −1 |
| Machine files | Serves /llms.txt | 22.4% | 114 / 510 | +2.7 pt | +15 / −2 |
| Machine files | Serves /agents.md | 2.9% | 15 / 510 | +0.4 pt | +3 / −1 |
| Capabilities | Publishes an agent-skills index | 2.5% | 13 / 510 | +0.4 pt | +3 / −1 |
| Capabilities | Publishes an MCP server card | 2.5% | 13 / 510 | +0.2 pt | +1 / −0 |
| Capabilities | Publishes an API catalog (RFC 9727) | 2.5% | 13 / 510 | +0.4 pt | +2 / −0 |
| Capabilities | Publishes an A2A agent card | 0.6% | 3 / 510 | +0.2 pt | +1 / −0 |
| Capabilities | Declares any agent capability (any of the four above) | 3.5% | 18 / 510 | +0.6 pt | +3 / −0 |
| Delivery parity | At least one AI identity is refused (non-2xx) where the browser got 2xx | 18.2% | 93 / 510 | +1 pt | +9 / −4 |
| Delivery parity | At least one AI identity gets under 70% of the browser's bytes (both 2xx) | 3.7% | 19 / 510 | -0.4 pt | +3 / −5 |
| Endpoint rings | Names an MCP endpoint (server card, llms.txt, agents.md, a homepage link, or /mcp answers like one) | 11.2% | 57 / 510 | — | — |
| Endpoint rings | An MCP endpoint completes the handshake (initialize and tools/list; no tool called) | 1.4% | 7 / 510 | — | — |
| Endpoint rings | Of sites naming an MCP endpoint, one completes the handshake or asks for credentials | 77.2% | 44 / 57 | — | — |
| Endpoint rings | The A2A agent card names an endpoint url | 0.4% | 2 / 510 | — | — |
| Endpoint rings | Of A2A cards naming a url, the url answers (any non-5xx, not an HTML page) | 50% | 1 / 2 | — | — |
| Endpoint rings | Homepage carries WebMCP (navigator.modelContext, a WebMCP bridge, or an mcp+json block) | 0.2% | 1 / 510 | — | — |
| Safety | Listed by Google Safe Browsing (all or some pages): browsers show a red warning | 0.6% | 2 / 315 | — | — |
| Safety | Listed as malware or phishing by the Cloudflare security resolver | 0% | 0 / 524 | — | — |
| Safety | On the browsers' HSTS preload list (HTTPS-only from the first visit) | 17.4% | 91 / 524 | — | — |
| Safety | Homepage loads scripts or styles from another domain | 61.8% | 324 / 524 | — | — |
| Safety | Homepage loads scripts or styles from 5 or more other domains | 6.5% | 34 / 524 | — | — |
| Safety | Pins at least one outside script or style with integrity= | 9% | 29 / 324 | — | — |
| Safety | Loads a library from a public CDN without integrity= | 8.8% | 46 / 524 | — | — |
| Safety | Still loads scripts from a CDN taken over in 2024 (polyfill.io and its sister CDNs) | 0% | 0 / 524 | — | — |
| Safety | Homepage shows hidden spam links or cryptominer code | 0% | 0 / 524 | — | — |
| Delivery parity | GPTBot refused where the browser got 2xx | 15.9% | 81 / 510 | +1.2 pt | +8 / −2 |
| Delivery parity | ClaudeBot refused where the browser got 2xx | 14.9% | 76 / 510 | +1 pt | +9 / −4 |
| Delivery parity | OAI-SearchBot refused where the browser got 2xx | 10.4% | 53 / 510 | +0.6 pt | +5 / −2 |
| Delivery parity | PerplexityBot refused where the browser got 2xx | 12.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.
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.
| Area | Measured | Share | Sites | Change | Gained / lost |
|---|---|---|---|---|---|
| Reach | Homepage answers CrawlCheck's census fetch (2xx after redirects) | 60.3% | 5895 / 9776 | +2.6 pt | +531 / −279 |
| Reach | Homepage refuses CrawlCheck's census fetch (400, 401, 403 or 429): blocked or rate-limited, not down | 12% | 1174 / 9776 | — | — |
| Reach | No website answers at that name (5xx, 530, timeout or no answer) | 25.7% | 2512 / 9776 | — | — |
| Crawler policy | Serves a robots.txt (200, not HTML) | 79.7% | 4696 / 5895 | +0.9 pt | +98 / −51 |
| Crawler policy | robots.txt names a sitemap | 70.4% | 3306 / 4696 | +0.9 pt | +60 / −23 |
| Crawler policy | robots.txt carries a Content-Signal line | 6.5% | 303 / 4696 | +2.9 pt | +125 / −2 |
| Crawler policy | Content-Signal says ai-train=no | 5% | 233 / 4696 | +2.6 pt | +115 / −4 |
| Crawler policy | Content-Signal says ai-input=no or search=no | 0.4% | 21 / 4696 | 0 pt | +0 / −1 |
| Crawler policy | robots.txt names the AI-training policy token (__usage_ai-training, IETF AIPREF draft) | 0.4% | 18 / 4693 | — | — |
| Crawler policy | robots.txt states a preference against AI training on / with that token | 0.4% | 18 / 4693 | — | — |
| Crawler policy | robots.txt closes / to at least one of the 12 AI agents | 22.2% | 1043 / 4696 | +2.9 pt | +131 / −8 |
| Crawler policy | robots.txt closes / to GPTBot | 16.3% | 764 / 4696 | +2.3 pt | +112 / −14 |
| Crawler policy | robots.txt closes / to OAI-SearchBot | 6.3% | 294 / 4696 | -0.2 pt | +10 / −17 |
| Crawler policy | robots.txt closes / to ChatGPT-User | 8% | 376 / 4696 | -0.3 pt | +13 / −27 |
| Crawler policy | robots.txt closes / to ClaudeBot | 15.1% | 711 / 4696 | +2.5 pt | +119 / −12 |
| Crawler policy | robots.txt closes / to Claude-SearchBot | 6% | 280 / 4696 | 0 pt | +13 / −12 |
| Crawler policy | robots.txt closes / to PerplexityBot | 9.1% | 428 / 4696 | -0.3 pt | +12 / −23 |
| Crawler policy | robots.txt closes / to Google-Extended | 13.4% | 629 / 4696 | +2.5 pt | +130 / −23 |
| Crawler policy | robots.txt closes / to Applebot-Extended | 13.4% | 627 / 4696 | +2.9 pt | +132 / −9 |
| Crawler policy | robots.txt closes / to CCBot | 17.3% | 812 / 4696 | +2.1 pt | +126 / −34 |
| Crawler policy | robots.txt closes / to Bytespider | 17.2% | 807 / 4696 | +2.9 pt | +130 / −6 |
| Crawler policy | robots.txt closes / to Meta-ExternalAgent | 14.1% | 664 / 4696 | +2.6 pt | +139 / −28 |
| Crawler policy | robots.txt closes / to Amazonbot | 13.6% | 639 / 4696 | +3 pt | +138 / −10 |
| Machine files | Serves /llms.txt | 16.7% | 983 / 5895 | +1.6 pt | +108 / −21 |
| Machine files | Serves /agents.md | 1.4% | 81 / 5895 | +0.1 pt | +14 / −6 |
| Capabilities | Publishes an agent-skills index | 1% | 61 / 5895 | +0.2 pt | +12 / −3 |
| Capabilities | Publishes an MCP server card | 1.1% | 67 / 5895 | +0.3 pt | +17 / −3 |
| Capabilities | Publishes an API catalog (RFC 9727) | 1.3% | 74 / 5895 | +0.2 pt | +16 / −3 |
| Capabilities | Publishes an A2A agent card | 0.3% | 18 / 5895 | 0 pt | +4 / −2 |
| Capabilities | Declares any agent capability (any of the four above) | 1.5% | 89 / 5895 | +0.3 pt | +17 / −3 |
| Delivery parity | At least one AI identity is refused (non-2xx) where the browser got 2xx | 26.2% | 1546 / 5895 | +0.3 pt | +104 / −89 |
| Delivery parity | At least one AI identity gets under 70% of the browser's bytes (both 2xx) | 2.2% | 128 / 5895 | -0.6 pt | +30 / −60 |
| Endpoint rings | Names an MCP endpoint (server card, llms.txt, agents.md, a homepage link, or /mcp answers like one) | 5.7% | 335 / 5895 | — | — |
| Endpoint rings | An MCP endpoint completes the handshake (initialize and tools/list; no tool called) | 0.9% | 55 / 5895 | — | — |
| Endpoint rings | Of sites naming an MCP endpoint, one completes the handshake or asks for credentials | 78.8% | 264 / 335 | — | — |
| Endpoint rings | The A2A agent card names an endpoint url | 0.2% | 10 / 5895 | — | — |
| Endpoint rings | Of A2A cards naming a url, the url answers (any non-5xx, not an HTML page) | 40% | 4 / 10 | — | — |
| Endpoint rings | Homepage carries WebMCP (navigator.modelContext, a WebMCP bridge, or an mcp+json block) | 0.1% | 5 / 5895 | — | — |
| Safety | Listed by Google Safe Browsing (all or some pages): browsers show a red warning | 0.8% | 40 / 4747 | — | — |
| Safety | Listed as malware or phishing by the Cloudflare security resolver | 0.3% | 17 / 5910 | — | — |
| Safety | On the browsers' HSTS preload list (HTTPS-only from the first visit) | 8.1% | 477 / 5909 | — | — |
| Safety | Homepage loads scripts or styles from another domain | 67.7% | 4002 / 5912 | — | — |
| Safety | Homepage loads scripts or styles from 5 or more other domains | 10.6% | 626 / 5912 | — | — |
| Safety | Pins at least one outside script or style with integrity= | 9.7% | 387 / 4002 | — | — |
| Safety | Loads a library from a public CDN without integrity= | 13.1% | 772 / 5912 | — | — |
| Safety | Still loads scripts from a CDN taken over in 2024 (polyfill.io and its sister CDNs) | 0.1% | 4 / 5912 | — | — |
| Safety | Homepage shows hidden spam links or cryptominer code | 0% | 1 / 5912 | — | — |
| Delivery parity | GPTBot refused where the browser got 2xx | 22.7% | 1338 / 5895 | +0.2 pt | +83 / −72 |
| Delivery parity | ClaudeBot refused where the browser got 2xx | 23.2% | 1365 / 5895 | +0.5 pt | +97 / −72 |
| Delivery parity | OAI-SearchBot refused where the browser got 2xx | 16.1% | 948 / 5895 | +0.6 pt | +73 / −42 |
| Delivery parity | PerplexityBot refused where the browser got 2xx | 19.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.
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.