BlogFindings

Crawler user agent: 1,004 robots.txt files named 2,209 tokens, and 120 name one Anthropic no longer documents

A user-agent line in robots.txt is an exact product token, and a token that matches nothing is a rule that does nothing. Lantad requested /robots.txt once from each of 1,419 hostnames on 17 September 2026. 1,004 files parsed into at least one group and named 2,209 distinct tokens between them, 1,098 of which appear in a single file, 813 of which contain a character RFC 9309 does not let a crawler put in its own name, and 120 of which name anthropic-ai or Claude-Web, neither of which appears on Anthropic's crawler page.

15 min read Lantad

That makes the contents of these lines worth counting rather than assuming. On 17 September 2026 we requested /robots.txt over HTTPS, once, from each of the 1,419 hostnames in this repository's two committed corpus frames, identifying ourselves as LantadBot/1.0, following redirects, with a twenty second timeout, from one network location. 29 requests failed at the transport layer, 301 answered a status other than 200 and 38 answered 200 with a content type that was not text/plain, leaving 1,051 usable responses of which 1,004 named at least one user agent. Every figure below is out of those 1,004. No crawler was observed doing anything: this is a census of what files say, not a measurement of what any bot does.

In short

  • A crawler user agent token is matched exactly and case-insensitively, not searched for: RFC 9309 section 2.2.1 states that the product token MUST contain only uppercase and lowercase letters, underscores and hyphens, and that crawlers MUST use case-insensitive matching to find the group that matches the product token.
  • Lantad requested /robots.txt once from each of the 1,419 hostnames in this repository's two committed corpus frames on 17 September 2026. 1,051 answered HTTP 200 with a text/plain content type and 1,004 of those parsed into at least one group, naming 2,209 distinct tokens between them.
  • 1,098 of the 2,209 tokens appear in exactly one file, 996 of the 1,004 files name the wildcard, and 566 name the wildcard and nothing else, so the median file names one token.
  • Anthropic's crawler page, dated 7 April 2026, names ClaudeBot, Claude-User and Claude-SearchBot and names neither anthropic-ai nor Claude-Web. 114 of the 1,004 files name anthropic-ai and 58 name Claude-Web, against 36 that name Claude-SearchBot.
  • 813 of the 2,209 tokens contain a character the specification does not permit in a crawler's own name, among them 425 containing a space and 187 containing a slash, and 189 of the 1,004 files name at least one of them.
  • Distinct tokens named, excluding the wildcard 2209 Compared case-insensitively
  • Tokens named by exactly one file 1098 49.7 percent of the 2,209
  • Files naming the wildcard 996 Of the 1,004 files
  • Files naming the wildcard and nothing else 566 No rule addressed to any crawler by name
  • Files naming at least one of the 15 AI crawler tokens 203 The registry at core/src/bots.ts
  • Files naming all 15 11 Every token the scanner evaluates
The shape of the user-agent lines across the 1,004 robots.txt files that named at least one, from one GET per hostname across 1,419 hostnames on 17 September 2026.

What is a crawler user agent token?

It is the name a crawler gives itself, and the specification is unusually strict about it. RFC 9309, the Standards Track document that defines the Robots Exclusion Protocol, opens section 2.2.1 with the sentence that decides everything else: crawlers set their own name, which is called a product token, to find relevant groups. The product token MUST contain only uppercase and lowercase letters, underscores and hyphens. Its ABNF is narrower still, admitting the hyphen, the underscore and the two letter ranges and nothing besides.

Two consequences follow and neither is obvious from reading a file. The first is that the token is the crawler's property rather than the site's. A site owner writing a name into robots.txt is guessing at a string a vendor published somewhere else, and nothing in the file can tell them whether the guess landed. The second is that matching is exact. The specification requires crawlers to use case-insensitive matching to find the group that matches the product token, and if no matching group exists, to obey the group with a user-agent line with the asterisk value, if present. Case is forgiven. Spelling is not.

Google's robots.txt documentation, carrying Last updated 2026-08-31 UTC, describes one refinement on top of that, which is that its crawlers find the group with the most specific user agent that matches, and that all non-matching text is ignored, so googlebot/1.2 and googlebot star are both equivalent to googlebot. That forgiveness is Google's implementation rather than a property of the protocol, and it applies to Google's crawlers. It is not a promise from anybody else.

The practical shape of the failure is quiet, which is why it needs counting rather than reasoning about. A group whose token matches no crawler is not an error. It costs nothing at parse time, it produces no warning anywhere, and the only way to see it is to compare the string against what the vendor publishes. If you want the per token verdicts for your own file before reading further, the robots.txt tester runs the same parser these figures came from, and the crawler registry lists the tokens each vendor documents.

How a conforming parser resolves a user-agent line, following RFC 9309 section 2.2.1. A description of the specification, not a measurement of any site.

How many names does a robots.txt file address?

Usually one, and occasionally hundreds. The median file in this sample names a single token, and that token is the wildcard: 996 of the 1,004 files name the asterisk and 566 name it and nothing else. For more than half of these sites, therefore, robots.txt addresses no crawler by name at all, which is a defensible position and worth recognising as one. An earlier count found that 89 of 145 files ruled only on the whole site rather than on any narrower path, and the same bluntness shows up here on the other axis.

The mean tells a different story from the median because the tail is very long. Across the 1,004 files there are 2,209 distinct non-wildcard tokens, and 1,098 of them, very nearly half, appear in exactly one file. 297 appear in two. Only 60 appear in more than twenty. A list of names that is half unique is not a vocabulary that site owners share; it is a pile of strings that arrived by different routes and mostly stopped being maintained.

At the top of the tail sit files that have become registers. museodelprado.es names 639 tokens in 25,344 bytes, bhf.org.uk names 553, who.int names 527 and n26.com names 481. Those four files are among the longest in the sample by token count and, between them, they name exactly three of the 15 AI crawler tokens this scanner evaluates, all three of them the same one, CCBot. n26.com names none. Length here is not diligence: the biggest files are the oldest ones, and what they are long with is a list nobody has revisited.

The contrast is instructive rather than embarrassing. nzherald.co.nz names 388 tokens and all 15 of the registry tokens. france24.com names 323 and eleven of the 15. Both are news sites, which is consistent with an earlier finding that the sites that block AI crawlers are the ones with editors. A long file maintained by somebody who reads crawler documentation looks entirely different from a long file that has merely accumulated, and the token count alone cannot tell them apart. That is the whole argument for reading the names rather than counting the lines, and it is what our methodology does with every file it parses.

HostTokens namedFile bytesOf the 15 AI crawler tokens
museodelprado.es63925,3441
bhf.org.uk55320,4811
who.int52718,9831
n26.com48114,5560
nzherald.co.nz38844,66515
france24.com32312,92911
healthline.com1628,8648
The files naming the most user agent tokens, with how many of the 15 AI crawler tokens the scanner evaluates appear in each. Read from one GET per hostname on 17 September 2026.

Do the names match a crawler the vendor still documents?

For the largest AI vendors this is checkable in a minute, because each publishes a page listing the tokens it uses, and we read all three on 17 September 2026. Anthropic's crawler page, which carries the date 7 April 2026, names three: ClaudeBot for collecting web content to improve its models, Claude-User for pages fetched because somebody asked Claude a question, and Claude-SearchBot for search result quality. It names neither anthropic-ai nor Claude-Web.

The files have not caught up. 114 of the 1,004 name anthropic-ai and 58 name Claude-Web, with 52 naming both and 120 naming at least one. Against that, 153 name ClaudeBot, 37 name Claude-User and 36 name Claude-SearchBot. So the two strings that do not appear on Anthropic's page are named in more files than the two that do, and 95 of the 120 files carrying a dropped token do not name Claude-SearchBot at all. This is the mechanism described in an earlier post, that a renamed crawler token leaves your robots.txt group matching nothing, showing up as a count rather than as an example.

The same gap runs the other way at OpenAI. OpenAI's crawler documentation names four tokens, GPTBot for training, OAI-SearchBot for surfacing sites in ChatGPT's search features, ChatGPT-User for user actions, and OAI-AdsBot for ads, and it carries no date on the page. 167 files name GPTBot, 98 name ChatGPT-User, 77 name OAI-SearchBot and four name OAI-AdsBot. 97 of the files that name GPTBot do not name OAI-SearchBot, so a site that wrote one rule about OpenAI has in most cases written a rule about training and said nothing about the crawler that decides whether it appears in an answer. Perplexity's documentation names two, PerplexityBot and Perplexity-User, which are named in 98 and 46 files here.

Being honest about our own position: this scanner's registry at core/src/bots.ts holds 15 tokens and anthropic-ai is one of them, kept deliberately with a comment marking it a legacy robots token with no published request user agent. Keeping it means a site that still writes that rule gets told what its rule does; it does not mean the token is current. The wider point is the one an earlier count made, that six of the nine AI vendors we track publish one crawler token and the separation between training and answering is newer than most of these files. A rule written before a vendor split its crawlers is not wrong so much as unaware, and what GPTBot sees on your own pages is the cheapest way to find out which side of that split you are on.

TokenVendorOn the vendor pageFiles naming it
ClaudeBotAnthropicYes153
anthropic-aiAnthropicNo114
Claude-WebAnthropicNo58
Claude-UserAnthropicYes37
Claude-SearchBotAnthropicYes36
GPTBotOpenAIYes167
ChatGPT-UserOpenAIYes98
OAI-SearchBotOpenAIYes77
OAI-AdsBotOpenAIYes4
PerplexityBotPerplexityYes98
Perplexity-UserPerplexityYes46
Tokens the three largest AI vendors name on their own crawler pages, read on 17 September 2026, against how many of the 1,004 robots.txt files name each. The two rows marked No are strings that appear in the files and not on the vendor page.

Tokens the specification does not let a crawler have

813 of the 2,209 tokens contain at least one character outside the letters, underscore and hyphen that RFC 9309 permits in a product token, and 189 of the 1,004 files name at least one of them. Counting each token once, by the first disqualifying character class it carries, 425 contain whitespace, 187 contain a slash, 81 contain a dot, 77 contain a digit and no whitespace, slash or dot, and 43 carry something else.

The whitespace group is the largest and the clearest. A token such as sogou web spider, named in 16 files, offline explorer in 11, or chatgpt agent in five, cannot be a conforming product token, because a crawler is not permitted to have a space in its name. The slash group is the same mistake in a different direction: linkscan/8.1a unix, moget/2.1, lwp-trivial/1.34 and chatgpt-user/2.0 are user agent header fragments rather than product tokens, copied out of a log line where the version number belonged. Google's parser would read chatgpt-user/2.0 as chatgpt-user, as its page says, but that is one vendor's leniency and not a guarantee, and the token was still written wrong.

The digit group is where the finding cuts against the specification rather than against the files. Digits are not in the ABNF, and yet AI2Bot, named in 63 files here, is the token the Allen Institute publishes on its own crawler page at allenai.org/crawler, with a user agent string reading Mozilla/5.0 (compatible) AI2Bot (+https://www.allenai.org/crawler). Ai2Bot-Dolma, img2dataset and MJ12bot are in the same position. Real crawlers carry names the standard says they may not have, so a file naming AI2Bot is doing the right thing by a rule the specification does not sanction, and treating the grammar as a validity test would flag the correct entries along with the broken ones. That is worth saying plainly rather than reporting 813 as a defect count.

The remaining 43 are neither. go!zilla appears in five files, lwp::simple and www::mechanize in three each, and then there is a group that misreads the field entirely: dotbot star, star aihitbot star, star mlbot star and, in one file, the string dollar-sign llm. Those are glob patterns written into a field that takes no patterns. As Google's page notes in passing, trailing wildcard text is simply ignored by its parser, which means a site writing star aihitbot star has written a rule that Google reads as one thing, that a strict parser reads as a name no crawler has, and that the author almost certainly believed was a pattern. The same misreading is why a wildcard in the path has no effect at the end of a rule, and it is a good reason to check the file against a parser rather than against intuition.

  • Contain whitespace 425 tokens Named in 67 files, e.g. sogou web spider
  • Contain a slash 187 tokens Named in 53 files, e.g. moget/2.1
  • Contain a dot 81 tokens Named in 42 files, e.g. archive.org_bot
  • Contain a digit only 77 tokens Named in 135 files, e.g. AI2Bot
  • Carry something else 43 tokens Named in 12 files, e.g. go!zilla
  • Use the underscore the grammar allows 27 tokens Conforming, e.g. ia_archiver in 21 files
The 813 tokens carrying a character RFC 9309 does not permit in a product token, each counted once by the first disqualifying class, across the 2,209 distinct tokens named on 17 September 2026.

Why unrelated sites name exactly the same tokens

Because the lists are copied, and the copying is visible in the data. 339 of the 1,004 files name three or more tokens, and 81 of those 339 fall into just nine sets that are identical, token for token, across two or more unrelated hosts. The largest single set covers 40 files that each name the same 29 tokens plus the wildcard, and the first line of every one of those files reads Squarespace Robots Txt, so the list is the platform's rather than the owner's. We measured what that particular list does to access separately: 61 of 66 Squarespace sites named 26 tokens and blocked none of them.

The older strata are easier to date. Eleven files name at least one of a set of tokens that belong to desktop site copiers and download managers rather than to any web crawler, and seven of the eleven name five or more of them. who.int is a clean example. Its 1,064 line file names Black Hole at line 91, Kenjin Spider at 423, Mata Hari at 501, Mister PiX at 523, The Intraformant at 857 and URLy Warning at 895. The one token in the file that belongs to a crawler in this scanner's registry is CCBot. A file can be 18,983 bytes long, address 527 names, and have almost nothing to say about the crawlers that read the web today.

That matters more than it sounds, because the new AI blocklists are being distributed the same way the old ones were. A list that arrives as a paste is a list that will not be revisited when a vendor renames a token, and the anthropic-ai and Claude-Web counts above are what that looks like eighteen months on. ChatGPT's own robots.txt disallows a token no crawler can match, which is a useful reminder that nobody is immune to this, and the per token census of which AI crawler is named and refused most often is a different cut of the same habit.

There is one thing the census cannot tell you, and it is the thing that matters most for AI visibility. Naming a token is not blocking it, and blocking it is not being obeyed. A file that names an AI crawler may put it in a group with no rules, as the Squarespace list does, and a site that refuses one in the file may still serve it: we found separately that 79 of 115 sites refused a crawler their robots.txt allows, because the edge and the file are different layers. On the other side, a user agent is a claim rather than an identity and three crawler tokens will never appear in your logs at all, because they are robots-only controls with no request user agent to observe. What this census establishes is narrower and still useful: before asking whether a rule is obeyed, check that it is addressed to somebody. The list of tokens that exist is short, it is published, and our own crawler documentation is the format the rest of them follow. Reading the vendor page beats pasting a list, and getting cited by Claude starts with spelling its crawler correctly.

who.int/robots.txt, 18,983 bytes, 1,064 lines, read 17 September 2026

  • 91 User-agent: Black Hole not in the registry
  • 423 User-agent: Kenjin Spider whitespace, not a valid token
  • 501 User-agent: Mata Hari whitespace, not a valid token
  • 523 User-agent: Mister PiX whitespace, not a valid token
  • 857 User-agent: The Intraformant whitespace, not a valid token
  • 895 User-agent: URLy Warning whitespace, not a valid token
  • 527 tokens named in total 1 is an AI crawler token: CCBot
Line numbers and verbatim user-agent values from the file served at who.int/robots.txt on 17 September 2026, with this repository's classification of each token. None of the six named tokens is a crawler any vendor in the registry documents.

Written by

Lantad

Published .

A robots.txt rule is addressed to a name. The crawler user agent token on the left of the group decides which crawler reads the Disallow lines under it, and the protocol gives that name no tolerance at all: it is compared, whole and case-insensitively, against the token the crawler set for itself. Get it right and the rule applies. Get it wrong by one character and the file still parses, the page still validates, and the group is simply never selected by anything.

Common questions

What is a crawler user agent token in robots.txt?

It is the name a crawler sets for itself, and it is the value on a user-agent line. RFC 9309 section 2.2.1 states that the product token MUST contain only uppercase and lowercase letters, underscores and hyphens, and that crawlers MUST use case-insensitive matching to find the group that matches it. Case does not matter; spelling does.

Does a misspelled user agent token cause an error?

No, and that is the problem. A group whose token matches no crawler parses normally, reports nothing, and is never selected. Across the 1,004 files measured on 17 September 2026, 813 of the 2,209 distinct tokens carried a character the specification does not permit in a crawler's name, and 189 files named at least one of them.

Is anthropic-ai still a valid token to block?

Anthropic's crawler page, dated 7 April 2026, names ClaudeBot, Claude-User and Claude-SearchBot, and names neither anthropic-ai nor Claude-Web. A rule naming anthropic-ai costs nothing and does nothing on current documentation. 114 of the 1,004 files measured still name it, against 36 that name Claude-SearchBot.

Should I copy an AI crawler blocklist into robots.txt?

A pasted list is what produces these figures: 81 of the 339 files naming three or more tokens carry one of nine identical token sets, and one set of 40 files came from a platform default. Read each vendor's own crawler page instead, since that is the only place the current token is published, and check the result with a parser.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.