Dataset & Analysis
The web wrote 605,000 robots files. It said far fewer things.
Not who is blocked, but what the files actually contain: the vocabulary, the boilerplate, the comments people leave for machines, and which rules travel together.
01 — The corpus
What 605,000 files add up to
Every robots.txt served by the Tranco top million, parsed line by line: 31,819,812 lines, 13,546,143 disallow rules, and 0.85 GB of plain text written almost entirely for machines to read.
The average file runs 52.6 lines. Of the disallow rules, 28.9% contain a wildcard and 8.0% end in a file extension — the web blocking individual files rather than directories.
/admin/, /search — dominates: the web blocks directories, not deep leaves.02 — Boilerplate
The web is a photocopy
Strip the comments, lowercase the directives, sort them, and hash the result. Two files with the same hash express exactly the same policy. What comes back is the single most striking fact in this corpus.
16.4% of every robots.txt on the web — 99,015 files — reduces to just 40 distinct signatures. The most common one alone accounts for 30,013 sites. And the signatures at the top are not elaborate: most are two lines long.
| # | Sites | Share | Rules | The shared policy |
|---|---|---|---|---|
| 1 | 30,013 | 5% | 21 | allow: / · content-signal: search=yes,ai-train=no,use=reference · disa … |
| 2 | 16,382 | 2.7% | 2 | disallow: · user-agent: * |
| 3 | 12,600 | 2.1% | 2 | disallow: / · user-agent: * |
| 4 | 8,771 | 1.4% | 2 | allow: / · user-agent: * |
| 5 | 3,754 | 0.6% | 1 | user-agent: * |
| 6 | 3,274 | 0.5% | 3 | allow: /wp-admin/admin-ajax.php · disallow: /wp-admin/ · user-agent: * |
| 7 | 2,507 | 0.4% | 53 | allow: /core/*.css$ · allow: /core/*.css? · allow: /core/*.gif … |
| 8 | 2,282 | 0.4% | 4 | allow: / · llm-policy: /llms.txt · sitemap: /sitemap.xml … |
| 9 | 1,807 | 0.3% | 80 | allow: / · allow: / · allow: / … |
| 10 | 1,603 | 0.3% | 2 | crawl-delay: 10 · user-agent: * |
Four of the ten most common robots.txt files on the internet say only “everyone, everything” or “everyone, nothing.” They are the two shortest possible opinions, and together they cover tens of thousands of sites.
Note what this does to the coverage report next door. When 16.4% of files are identical to some other file, most robots.txt “decisions” are not decisions at all. They are defaults, inherited from a CMS, a host or a CDN — which is exactly what the rank-independence of AI blocking implied from the other direction.
03 — A new directive
Something appeared that the standard has never heard of
The most common signature in the corpus is not a robots.txt in the traditional sense at all. It carries a directive that does not exist in RFC 9309.
allow: / content-signal: search=yes,ai-train=no,use=reference disallow: / disallow: / disallow: / disallow: /
Content-Signal appears in 58,034 files.
Rather than blocking a crawler by name, it declares what the content may be used for —
search=yes, ai-train=no — and leaves the crawling itself permitted. It
is a licence expressed in a file that has no licensing mechanism, aimed at companies under no
obligation to read it. A second contender, llm-policy, appears
in 2,314 more.
Content-Signal is the first widely-deployed
attempt to say you may read this, but you may not learn from it — a distinction the
protocol was never built to express, now sitting on 9.6% of
the web.04 — The comments
190 MB of prose nobody reads
46.4% of files carry at least one comment — 3,363,309 lines of natural language, addressed to an audience of parsers that discard them.
The largest category is the least human. Over half of all commented files mention a plugin, a generator, or an instruction not to edit — the comments are themselves machine output. Legal and rights language comes second, AI and training third.
Ranking the vocabulary makes the same point. These are the most frequent words across every comment in the corpus:
Not one of them is addressed to a person. content, signals,
corresponding, operator and rights are the vocabulary of
the Content Signals boilerplate; cloudflare, managed and
shopify name the machines that wrote the file. Only 396 files
in the entire corpus — 0.1% of commented ones — contain a
recruiting message, the classic robots.txt easter egg. It is effectively extinct.
05 — What relates to what
Crawlers travel in constellations
Site owners do not evaluate crawlers one at a time. Grouping user-agents by how often they are named together — connected components over a Jaccard overlap graph — recovers distinct blocks that get chosen as units.
- ccbot119,287
- bytespider112,269
- gptbot102,412
- claudebot93,580
- google-extended86,346
- amazonbot84,408
- meta-externalagent79,302
- applebot-extended76,643
- cloudflarebrowserrenderingcrawler55,100
- ahrefsbot69,836
- mj12bot67,310
- semrushbot59,584
- dotbot53,558
- petalbot49,836
- dataforseobot41,716
- applebot41,620
- yandexbot37,626
- rogerbot35,595
- serpstatbot32,943
- seokicks31,221
- googlebot69,422
- bingbot56,092
- chatgpt-user32,649
- perplexitybot31,283
- anthropic-ai26,444
- claude-web19,844
- cohere-ai19,579
- youbot16,709
- omgili16,372
- omgilibot16,048
- imagesiftbot15,147
- diffbot14,239
- timpibot10,189
- ai2bot9,583
- nutch11,906
- ahrefssiteaudit10,181
- pinterest8,704
None of these groups was defined in advance; they fell out of the co-occurrence structure. And
they map cleanly onto real artefacts. The largest is the modern AI blocklist shipped by CDNs and
CMS plugins. Another is the SEO-tool tier — AhrefsBot, SemrushBot,
MJ12bot, DotBot — a decade-old copy-paste block that predates the AI
ones entirely. A third is just Googlebot and Bingbot, the pair everyone
writes rules for on purpose.
You can date a robots.txt by which constellation it contains. The SEO block is the sediment of one era; the AI block is the sediment of the next.
| Crawler A | Crawler B | Co-named | Lift | A→B | B→A |
|---|---|---|---|---|---|
awariosmartbot | awariorssbot | 7,914 | 72.49 | 95.1% | 99.7% |
claude-searchbot | claude-user | 7,105 | 57.28 | 76.8% | 87.5% |
magpie-crawler | awariorssbot | 6,456 | 51.63 | 67.8% | 81.3% |
perplexity-user | claude-user | 5,947 | 51.61 | 69.2% | 73.3% |
magpie-crawler | awariosmartbot | 6,494 | 49.56 | 68.1% | 78.1% |
ahrefssiteaudit | pinterest | 7,163 | 48.91 | 70.4% | 82.3% |
timpibot | ai2bot | 7,219 | 44.73 | 70.9% | 75.3% |
nutch | pinterest | 7,641 | 44.61 | 64.2% | 87.8% |
claude-searchbot | perplexity-user | 5,799 | 44.17 | 62.7% | 67.5% |
timpibot | meta-externalfetcher | 5,560 | 43.4 | 54.6% | 73.1% |
ai2bot | meta-externalfetcher | 4,953 | 41.1 | 51.7% | 65.1% |
diffbot | timpibot | 9,393 | 39.17 | 66% | 92.2% |
Lift above 1 means the pair appears together more often than independence would predict. A→B is the share of sites naming A that also name B.
06 — Fingerprints
Paths that always arrive together
Run the same clustering over disallowed paths and something different emerges: not policy, but platform. Each cluster is a piece of software's default output.
- /checkout38,541
- /account35,467
- /orders33,229
- /checkouts/32,103
- /collections/*%2B*31,902
- /collections/*+*31,894
- /blogs/*+*31,859
- /collections/*%2b*31,857
- /blogs/*%2B*31,850
- /blogs/*%2b*31,826
- /collections/*sort_by*31,777
- /*/collections/*%2B*31,746
- /*/collections/*sort_by*31,740
- /*/collections/*%2b*31,730
- +7 more
- /cart/30,133
- /*/checkout25,245
- /*/cart/25,220
- /*/account25,202
- /services25,152
- /*/orders25,079
- /*/collections/*filter*&*filter*25,032
- /*/checkouts/25,015
- /cart.js25,003
- /collections/*filter*&*filter*24,999
- /sf_*24,992
- /*/cart.js24,984
- /profiles/12,466
- /comment/reply/12,117
- /node/add/12,011
- /core/10,610
- /index.php/admin/9,517
- /index.php/node/add/9,485
- /index.php/comment/reply/9,483
- /index.php/search/9,441
- /filter/tips9,293
- /index.php/filter/tips9,170
- /user/login7,898
- /user/register7,773
- /user/password7,717
- /user/logout7,695
- /index.php/user/logout7,557
- /index.php/user/login7,554
- /index.php/user/password7,552
- +14 more
- /wp-content/uploads/wc-logs/8,651
- /wp-content/uploads/woocommerce_uploads/8,629
- /wp-content/uploads/woocommerce_transient_files/8,617
These are identifiable on sight. Shopify ships /checkout, /cart/,
/orders and the /collections/*+* filter patterns. Drupal ships
/node/add/, /comment/reply/, /filter/tips and
/core/, each duplicated behind /index.php. WooCommerce ships the
/wp-content/uploads/wc-logs/ trio. The cohesion figures — most above 0.95 — mean the
paths are almost never seen apart.
A robots.txt is therefore a reliable fingerprint of the stack underneath it, whether or not the site meant to disclose that.
07 — Meaning
What the rules are actually about
Classifying all 13,546,143 disallow rules by what they refer to gives the web's blocking priorities in aggregate.
The shape agrees with the coverage report's finding that the web blocks infinite spaces and private surfaces. Search and filtering, accounts, and admin interfaces dominate. Blanket whole-site blocks are the second largest single category, driven by the parked and unlaunched tail.
Which paths each crawler is steered away from
Crossing agents against paths shows what sites are protecting when they name a specific crawler. Lift compares against that path's base rate across the whole corpus.
| Crawler | Files naming it | Most over-represented disallow paths |
|---|---|---|
ccbot | 119,287 | /admin/ ×2.69 / ×2.64 /account/ ×1.7 |
bytespider | 112,269 | /admin/ ×2.79 / ×2.68 /account/ ×1.73 |
gptbot | 102,412 | / ×2.47 /account/ ×2.1 /api/ ×1.67 |
claudebot | 93,580 | / ×2.46 /account/ ×2.31 /api/ ×1.65 |
google-extended | 86,346 | / ×2.48 /account/ ×2.29 /api/ ×1.66 |
amazonbot | 84,408 | / ×2.59 /account/ ×2.39 /api/ ×1.47 |
meta-externalagent | 79,302 | / ×2.59 /account/ ×2.38 /api/ ×1.54 |
applebot-extended | 76,643 | / ×2.58 /account/ ×1.9 /api/ ×1.56 |
ahrefsbot | 69,836 | /*/collections/*/products/*-[a-f0-9][a-f0-9][a-f0-9][a-f0-9] ×8.49 /collections/*/products/*-[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a ×8.49 /products/*-[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9] ×8.48 |
googlebot | 69,422 | /admin/ ×4.34 / ×2.1 /cgi-bin ×1.86 |
The AI crawlers cluster on the same three targets: the site root, account areas and admin paths. When a site singles out an AI crawler, it is usually not curating which sections may be read — it is closing the whole door, or the doors that were already shut to everyone.
08 — Language
An overwhelmingly English, overwhelmingly ASCII file
Despite covering a million domains across every country, the text is near-uniform.
| Script detected in comments | Files | Share of corpus |
|---|---|---|
| Cyrillic | 1,699 | 0.3% |
| Cjk | 1,120 | 0.2% |
| Korean | 403 | 0.1% |
| Arabic | 178 | 0% |
| Greek | 111 | 0% |
| Hebrew | 74 | 0% |
| Thai | 52 | 0% |
Non-Latin scripts appear in a fraction of a percent of files. robots.txt is a technical artefact written in the lingua franca of technical artefacts — and increasingly it is not written by hand at all, which makes the language question mostly moot.
Method
The source is the 605,046 parseable robots.txt files collected from the Tranco top-1M, the same corpus behind the coverage report. Analysis runs as two passes over the dataset. The first builds bounded vocabularies — the most frequent paths, agents and template signatures — with periodic trimming. The second recounts against those fixed vocabularies, so every figure here is an exact count rather than an artefact of when a rare key happened to be trimmed. Co-occurrence needs a fixed vocabulary in any case: pairs cannot be counted over a set that is still changing underneath you.
Template signatures strip comments and blank lines, lowercase and collapse whitespace, then sort the remaining directives before hashing. Two files match when they express the same policy regardless of ordering or commentary. The reported share covers the top 40 signatures only — the true proportion of duplicated files is higher, since the long tail of shared signatures is not counted here.
Clusters are connected components over a graph whose edges are pairs with a Jaccard overlap above a threshold — 0.55 for crawlers, 0.8 for paths. Cohesion is the mean pairwise Jaccard inside a group. The grouping is structural, not semantic: nothing tells the algorithm what a crawler is. Every interpretation offered above is read off the membership afterwards.
Intent categories are lexical probes. A file counts toward “AI mentioned” only if a comment literally contains one of the listed terms; they undercount paraphrase and cannot detect sentiment, so a comment welcoming AI crawlers counts identically to one refusing them. Path categories are ordered regular expressions, first match wins, and the uncategorised remainder is reported rather than hidden.