BlogFindings
Allow AI crawlers in robots.txt: 89 of 145 files ruled only on the whole site
Lantad requested /robots.txt once from each of 1,027 hostnames on 13 September 2026. 706 responses parsed into at least one group, and 145 of those name at least one of the 15 AI crawler tokens this scanner evaluates. On 89 of the 145, every rule in those groups governs the whole site. Fifty six write at least one path rule, and on 29 of the 145 deleting the AI rules entirely would have changed no verdict we tested.
One hundred and forty five of those 706 name at least one of the 15 AI crawler tokens this scanner evaluates. That much is a decision somebody made. What those 145 files actually say is less deliberate than the naming suggests: on 89 of them every rule inside the AI-named groups points at the site root, so the file says yes or no to the whole domain and nothing about any page in it. Fifty six write at least one rule that names a path. And when we deleted the AI-named groups from all 145 files and re-ran every named token against twelve paths, 29 files produced the identical set of verdicts without them, which is the more uncomfortable number of the two.
In short
- To allow AI crawlers in robots.txt for some pages and not others you need a path rule inside the crawler's own group, and most files do not have one: of the 145 files naming an AI crawler token on 13 September 2026, 89 carried only whole-site rules and 56 carried at least one path rule.
- The whole-site 89 split 68 files whose AI groups only disallow, 13 that only allow, 7 that do both on different tokens, and one whose named group carries no rule at all.
- Writing the rules is not the same as changing the answer. Deleting every AI-named group from each of the 145 files and re-evaluating 12 paths per named token changed at least one verdict on 116 files and changed nothing on 29, among them canonical.com, cloudflare.com, gov.uk, netlify.com and supabase.com.
- Where the AI groups did change a verdict the direction was overwhelmingly one way: 98 of the 116 files only ever restricted an AI crawler relative to their own wildcard group, 13 only relaxed it, and 5 did both depending on the path.
- 2,159 allow and disallow values across 156 of the 706 files are not valid path-patterns under the RFC 9309 ABNF, which requires a leading forward slash. 2,117 of them begin with an asterisk instead, and 266 of the 2,159 sit inside a group headed by an AI crawler token.
How do you allow AI crawlers in robots.txt for some pages and not others?
Three mechanics decide this, and two of them surprise people. The first is grouping. RFC 9309, the Robots Exclusion Protocol, defines a group as one or more user-agent lines followed by one or more rules, terminated by the next user-agent line or the end of the file. A crawler picks the group whose product token matches it and falls back to the group headed by an asterisk only if none does. The named group replaces the wildcard group rather than adding to it, so the moment you write a group for GPTBot that crawler stops reading the rules you wrote for everybody else.
The second is what happens when nothing matches. Section 2.2.2 is explicit: if no match is found amongst the rules in a group for a matching user-agent, or there are no rules in the group, the URI is allowed. That single sentence is why an Allow-only group is usually decoration. A group that lists ten Allow paths and no Disallow permits those ten paths and every other path on the site, because the paths you did not mention were never forbidden. An allow list in robots.txt only functions as a list when a Disallow sits beside it for the rest to fall through to.
The third is precedence, and it is the one worth checking before you edit a line. RFC 9309 says the most specific match found MUST be used, that the most specific match is the match that has the most octets, and that where an allow rule and a disallow rule are equivalent the allow rule SHOULD be used. Google's own robots.txt documentation, last updated 2026-08-31 UTC, states it as the most specific rule based on the length of the rule path, and adds that in case of conflicting rules, including those with wildcards, Google uses the least restrictive rule. Its worked examples show both halves operating: against /page.htm the pair Allow: /page and Disallow: /*.htm resolves to the disallow because the rule path is longer, while against /page.php5 the pair Allow: /page and Disallow: /*.ph resolves to the allow because the two are the same length and the least restrictive wins.
Pattern syntax is the smallest part of it. Only two characters do anything in a path: the asterisk for zero or more of any character and the dollar sign for the end of the match. Both are in section 2.2.3 as characters crawlers MUST support. Neither is as powerful as it looks, because a robots.txt pattern is already anchored at the start of the path, which is why we found that a trailing asterisk changed no verdict in 168 comparisons while a trailing dollar changed 36 of 112. If you want to see how your own file resolves for each token rather than reading it as a mood, the robots.txt tester evaluates one path against every token separately.
Flow: Crawler reads its product token (exact or prefix match) to A group names that token; Crawler reads its product token (no named group) to Only a wildcard group exists; Crawler reads its product token (no group at all) to No group matches: everything allowed; A group names that token to Use that group's rules only; Only a wildcard group exists to Use that group's rules only; Use that group's rules only (at least one matched) to Longest matching pattern wins; Use that group's rules only (nothing matched) to No rule matched: allowed; Longest matching pattern wins (allow wins an equal-length tie) to Allowed or disallowed.
What did 1,027 hostnames return for /robots.txt?
The frame is a committed file in this repository rather than a list assembled for this post, which matters because every figure below can be recomputed against the same 1,027 hostnames. It holds eight sectors of roughly equal size: government at 129 hosts, education at 130, healthcare at 123, news at 128, software at 130, ecommerce at 130, travel at 130 and finance at 127. It is not a random sample of the web and it is deliberately weighted toward large organisations, so a proportion measured here describes this frame and not the internet. The same frame produced the count behind GPTBot being disallowed at the root by 82 of 718 files the day before.
Nine hundred and eighty five hostnames answered and 42 did not, 23 of those timing out at fifteen seconds and 19 failing to connect at all. Of the responses, 743 were HTTP 200 and three were HTTP 202. One hundred and sixty eight returned 403, which is a bot defence rather than a robots policy, and 35 returned 503, which under the protocol is the one status that means the opposite of a 404: an unavailable robots.txt imposes no restrictions while a failing one is commonly treated as disallow-all, a distinction we set out in full when we established that a 404 on robots.txt allows every crawler and a 503 blocks them all. Twenty five returned 404 and four returned 429.
Twenty seven of the 2xx bodies were an HTML or XML document rather than a robots file, which is a 200 that means nothing, and those are excluded from every count that follows. That leaves 706 files. Between them they carry 6,296 user-agent groups and 67,873 allow and disallow rules. The median file holds 20 rules and one group; the largest holds 12,227 rules and another holds 642 separate groups. Thirty two of the 706 parsed with a group and no rules at all, which under section 2.2.2 allows everything. Seven hundred and one of the 706 carry a group headed by an asterisk, so the fallback almost always exists.
The five files without a wildcard group are worth a moment, because a file with no wildcard group and no group for your token imposes nothing on you: not a permission the site granted, just a gap. What this scan counts and what it refuses to infer is set out on the methodology page.
| Outcome | Hostnames | What it means for a crawler |
|---|---|---|
| HTTP 200 or 202 | 746 | A file to parse, if the body is really a file |
| HTTP 403 | 168 | Bot defence answering instead of the origin |
| HTTP 503 | 35 | Commonly read as disallow-all until it recovers |
| HTTP 404 | 25 | No restrictions at all under RFC 9309 |
| HTTP 429 | 4 | Rate limited on a single request |
| No response | 42 | 23 timed out at fifteen seconds, 19 never connected |
| Other 4xx and 5xx | 7 | 401, 405, 406, 418, 451, 498 and one more |
How many robots.txt files write a path rule for an AI crawler?
One hundred and forty five of the 706 files name at least one of the 15 tokens the scanner evaluates. The naming is lopsided in the way it always is: GPTBot appears in 113 of the 145 and ClaudeBot in 102, while OAI-SearchBot appears in 60 and Claude-SearchBot and Claude-User in 32 each. That gap is the same one behind our finding that 16 of 140 files named OAI-SearchBot while 25 named GPTBot, and it means a large share of these files have addressed the training crawler and said nothing to the crawlers that fetch a page to answer a question about it, which is the traffic a site actually wants if it wants any. The vendor pages behind each token are collected in the AI crawler reference.
Inside those 145 files, 89 write nothing but whole-site rules in the AI-named groups. Sixty eight of the 89 only disallow, which is a closed door and a coherent position. Thirteen only allow, which is usually an exemption from a restrictive wildcard group and occasionally nothing at all. Seven do both, allowing some tokens the whole site and refusing others. One names a token and writes no rule under it, which permits everything. Fifty six files write at least one rule naming a path, and those 56 hold 213 AI-named groups between them.
So on the narrow question this post asks, the answer is 56 of 145, or 8 percent of the 706 files that parsed. Everyone else who has thought about AI crawlers at all has thought about them as a single switch. That is a defensible way to answer a question about training. It is not a way to answer the question a site asks when it wants its documentation quoted and its faceted search left alone, and it is the shape that makes AI visibility hard to reason about from a robots file: a yes at the root tells you the crawler may fetch, and nothing about what it will find worth quoting.
The 15 tokens are not equally likely to be governed by a path rule, and the ordering inverts the naming. GPTBot is named in 113 files and sits in a group holding a path rule in 37 of them, a third. OAI-SearchBot is named in only 60 files and sits in a group holding a path rule in 36, which is 60 percent and the highest share of the fifteen. Bytespider, CCBot and Amazonbot are lowest at 26 percent each. Read together: a site that names the training crawler usually names it to close a door, and a site that names the search crawler is more often choosing where it may go. That second group is the one our guides on getting cited by ChatGPT and the Claude crawlers are written for.
| Token | Files naming it, of 145 | What it fetches for |
|---|---|---|
| GPTBot | 113 | OpenAI model training |
| ClaudeBot | 102 | Anthropic model training |
| Google-Extended | 94 | Google training and grounding, one token for both |
| CCBot | 94 | The Common Crawl archive |
| Bytespider | 81 | ByteDance model training |
| ChatGPT-User | 78 | A live fetch made on a user's behalf |
| PerplexityBot | 78 | Perplexity search index |
| Meta-ExternalAgent | 78 | Meta training and retrieval |
| OAI-SearchBot | 60 | The ChatGPT search index |
| Claude-SearchBot | 32 | The Claude search index |
| Claude-User | 32 | A live fetch made on a user's behalf |
Did writing the AI rules change any verdict?
A rule that names a crawler feels like an act. Whether it is one depends entirely on what the rest of the file already said, so we tested it directly. For each of the 145 files we removed every group headed by an AI crawler token, leaving the file otherwise intact, and evaluated each token the file had named against twelve paths in both versions: the root, an about page, a blog post, a documentation page, a search URL with a query string, a product URL with a tracking parameter, a PDF, a JPEG, a markdown file, /llms.txt, a markdown content negotiation URL, and a JSON API path. Every evaluation used the matcher that ships in this scanner, and the comparison is between two readings of the same file rather than between our reading and a crawler's.
On 116 of the 145 files at least one verdict moved, so the AI groups are doing work. On 29 they did not: every token the file names received exactly the same answer on all twelve paths with the AI groups deleted. Among those 29 are canonical.com, whose group headed by 14 tokens carries 16 Allow and 13 Disallow lines, cloudflare.com, gov.uk, netlify.com, redis.io, retool.com, supabase.com and sonarsource.com. In most of those cases the reason is simple and not a mistake: the named group repeats what the wildcard group already said, so a reader of the file learns the site's intent while a crawler learns nothing new.
The direction of the 116 that did move is the finding a site owner should sit with. Ninety eight of them only ever restricted an AI crawler relative to their own wildcard group, 13 only relaxed it, and 5 did both depending on the path. So among the files in this frame that bothered to write AI-specific rules and made a difference by doing it, the overwhelming use of the mechanism is to give an AI crawler less access than an ordinary crawler gets, not more. Whether that is right is a business decision. It is worth knowing that it is the default behaviour of the population, because the advice circulating about generative engine optimization assumes the opposite.
One file shows what a real allow list looks like. figma.com serves 384,745 bytes of robots.txt. Its groups for GPTBot, ClaudeBot and CCBot hold one rule each, Disallow: /. Its group headed by ChatGPT-User, OAI-SearchBot, PerplexityBot, Claude-SearchBot and Claude-User holds 8,848 rules: one Disallow and 8,847 Allow lines, 8,842 of them anchored with a trailing dollar sign, enumerating the exact pages those five crawlers may fetch. That is the shape the specification actually rewards, and it is 8,848 lines long because there is no shorter way to say it. Compare visitdubai.com, whose group headed by 26 tokens holds two rules, Allow: /*.md$ and Allow: /llms.txt, and permits every other path on the site as well, because nothing under that group forbids anything. Both files look like allow lists. Only one is.
What the AI groups changed
- 116 of 145 files moved at least one verdict
- 98 of the 116 only ever restricted an AI crawler
- 13 only relaxed access relative to the wildcard group
- 5 did both, depending on the path
- figma.com carries 8,847 Allow lines for five tokens
What they did not change
- 29 of 145 files gave identical verdicts without them
- canonical.com, 14 tokens, 29 rules, no verdict moved
- cloudflare.com, gov.uk, netlify.com, supabase.com among them
- 17 of the 145 write no Disallow in any AI group
- Twelve paths per token is a sample, not a proof
The 2,159 rule values that are not valid path-patterns
RFC 9309 gives the grammar for a rule value in its ABNF, and it is one line: path-pattern is a forward slash followed by any number of characters. A value with no leading slash does not fit that production. Across the 706 files, 2,159 allow and disallow values fail it, spread over 156 files. Two thousand one hundred and seventeen of them begin with an asterisk instead, which is somebody reaching for a substring match that robots.txt does not offer, because a pattern is already anchored at the front of the path. The remaining 42 begin with something else entirely: a query string, a bare filename, and on one ecommerce site the literal text of a User-agent line written as a Disallow value.
The specification does not say what a crawler must do with a value that fails the grammar, and that silence is the whole problem. Two readings are available and both are defensible. A lenient parser treats the value as a pattern anyway, which is what the matcher in this repository does. A strict parser discards the line as malformed, leaving the group with one fewer rule. On a file whose group is otherwise permissive the two readings give opposite verdicts, and the site owner has no way to know which behaviour any given crawler implements, because no AI crawler vendor publishes one. OpenAI's crawler documentation names four crawlers and their user agent strings and recommends allowing OAI-SearchBot, and says nothing at all about pattern syntax or which specification it follows.
Two hundred and sixty six of those 2,159 values sit inside a group headed by an AI crawler token, across 11 files, and confluent.io is the clearest case of intent defeated by syntax. Its wildcard group carries Disallow: *.pdf, and it then writes three separate groups, for GPTBot, Google-Extended and ClaudeBot, each holding the single rule Allow: *.pdf. The intent could not be plainer: PDFs are closed to crawlers in general and open to those three. All four values lack the leading slash, so under a strict reading all four vanish. It happens not to matter here, because a named group with no rules allows everything and the three crawlers end up permitted either way, but the file only works by accident.
Two further habits show up in the same 67,873 rules and neither is in the grammar. Character classes appear on one apparel site, which writes eight consecutive instances of a hexadecimal class inside a product path, 16 rules of that shape in total, and one of those lines runs straight into a Sitemap directive with no newline between them, producing a single 144 character pattern that matches nothing. Regular expression syntax appears on one marketplace, which writes the same rule twice as a digit class followed by a plus and a dollar sign in the middle of the path. And of all 67,873 values, not one uses the percent-encoded forms the specification recommends in section 2.2.3, %2A and %24, for matching a literal asterisk or dollar in a URL. Three rules in the corpus are a bare asterisk and nothing else, which is the same construction we found on a social network when a robots.txt named the wildcard and not the AI crawler.
confluent.io/robots.txt, four values without a leading slash
- User-agent: * wildcard group opens
- Disallow: *.pdf no leading slash, outside the RFC 9309 path-pattern grammar
- User-agent: GPTBot named group opens, wildcard group no longer applies
- Allow: *.pdf same malformed value, this time as a permission
- GET /doc.pdf as GPTBot allowed, matched Allow: *.pdf at line 24
- GET /doc.pdf as GPTBot, malformed lines discarded allowed, no rule in the group, so allowed by default
What to check in your own robots.txt
Four checks fall out of this scan, in the order they change an outcome. None needs a scanner and all four can be run against your own file in a few minutes.
First, check that every named group contains a Disallow. Seventeen of the 145 files here have AI-named groups with no Disallow anywhere in them, and a group of nothing but Allow lines permits every path on the site rather than only the ones listed. If the intent was a list, the list needs a Disallow for everything else to fall through to. If the intent was an exemption from a restrictive wildcard group, an Allow line is the right tool and the group is doing exactly what you meant.
Second, delete your AI groups on a copy and see whether anything changes. That is the test that separated 116 files from 29 here, and it takes one evaluation per path you care about. If the answers are identical, your file documents an intention to a human reader and communicates nothing to a crawler. That is not automatically wrong. It is worth knowing before you rely on it.
Third, check the leading slash on every value. Two thousand one hundred and fifty nine values in this corpus do not have one, and the specification does not say what happens next. A value like an asterisk followed by a file extension is the single most common form of this, and rewriting it with a leading slash and an internal asterisk costs one character and removes the ambiguity entirely. The same goes for character classes and regular expression fragments, which match themselves literally and nothing else.
Fourth, separate the fetch question from the content question. A permission in robots.txt says a crawler may make the request. What it receives when it does is a different measurement, and one that 32 of 44 documentation sites answered differently at /llms-full.txt than at /llms.txt shows can diverge sharply from what a browser sees. What GPTBot sees renders the crawler side of a single URL, llms.txt covers the file most often proposed as an alternative, and our guides for Perplexity and Google AI Overviews cover the platform-specific half.
What this post did not measure should be stated plainly. We requested one path from each of 1,027 hostnames on one day, 13 September 2026, from one network location, as the single user agent documented on our bot page. We observed no AI crawler requesting any of these sites, we read no access log, and no figure here reports what any crawler did. Every verdict is our matcher's reading of a file, and a reading is not a behaviour: the 29 files whose AI groups changed no verdict were tested on twelve paths, and a thirteenth path could separate them. The frame is a fixed list weighted toward large organisations in eight sectors, so no proportion here describes the web. Earlier scans against the same frame and its sibling are indexed on the research page.
- Any rule naming a path in an AI group 56 of 145. The other 89 rule only on the site root
- A Disallow present in every AI group 128 of 145. On 17 the AI groups carry no Disallow at all
- AI groups that change at least one verdict 116 of 145. On 29 the same answers came back without them
- An AI group that widens access 13 of the 116 only relaxed access; 98 only restricted it
- All rule values start with a slash Across all 706 files, 156 carry at least one that does not
- A wildcard group to fall back to 701 of the 706 files that parsed carry one
Lantad
Published .
A site that wants to be read by answer engines and still keep its search results and checkout pages out of them is asking for a partial permission, and robots.txt is the only file every crawler is obliged to read. So the question is narrow and answerable: do real sites write partial rules for AI crawlers, or do they throw one switch for the whole domain? On 13 September 2026 we asked each of the 1,027 hostnames in this repository's committed industry corpus frame for its robots.txt, once, over HTTPS, identifying as LantadBot, with redirects followed and a fifteen second timeout. Nine hundred and eighty five answered something. Seven hundred and six returned a body that parsed into at least one user-agent group.
Common questions
How do I allow AI crawlers in robots.txt for only some pages?
Write a group headed by the crawler's product token, put a Disallow in it for everything you want closed, and add Allow lines for the paths you want open. The Disallow is the part people leave out: RFC 9309 section 2.2.2 says that if no rule in the matching group matches, the URI is allowed, so a group containing only Allow lines permits the whole site. Of the 145 files naming an AI crawler token that we read on 13 September 2026, 17 had no Disallow in any AI-named group.
Does a named group for GPTBot replace the wildcard group or add to it?
It replaces it. Under RFC 9309 a crawler selects the most specific group whose token matches it and uses that group's rules only, falling back to the group headed by an asterisk when no named group matches. So rules you wrote under User-agent: * stop applying to GPTBot the moment a GPTBot group exists, and anything you still want enforced has to be repeated inside it.
How many sites write path-level rules for AI crawlers?
In this sample, 56 of 145. Lantad asked 1,027 hostnames for /robots.txt on 13 September 2026 and 706 responses parsed into at least one group. One hundred and forty five of the 706 name at least one of 15 AI crawler tokens, 56 of those write at least one rule naming a path inside an AI-named group, and 89 write only whole-site rules. The frame is a committed list weighted toward large organisations in eight sectors, not a random sample of the web.
Is Disallow: *.pdf the same as Disallow: /*.pdf?
Not under the grammar. RFC 9309 defines a rule value as path-pattern, which its ABNF gives as a forward slash followed by any number of characters, so a value beginning with an asterisk is not a valid path-pattern and the specification does not say what a crawler must do with it. A lenient parser treats it as a pattern anyway and a strict one discards the line, which are opposite outcomes on a permissive file. Across the 706 files read on 13 September 2026, 2,159 values on 156 sites had no leading slash and 2,117 of those began with an asterisk.
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.