There is a great deal of advice about making websites work for AI assistants and almost no measurement. So on 2026-09-06 we scanned 292 well-known public websites — SaaS, retail, news, documentation, government and reference — exactly the way a crawling assistant reads them: one plain HTTP request each, no browser, no JavaScript, a hard timeout. This is what came back.
No site is named here and none ever will be. Publishing a league table of businesses that never asked to be measured is the thing our consent rules exist to prevent, and the useful claim needs the count rather than the names. Every number below is regenerated from the repository by scripts/ax-study.mjs, so it can be checked rather than trusted.
The headline
82 of 292 (28%) score below 58, which is the point at which an assistant starts getting a page materially wrong rather than merely reading it thinly. At the other end, 8 of 292 (3%) score 85 or above.
The distribution matters more than the average. These are not obscure sites — they are companies with design teams, SEO budgets and performance dashboards. Whatever is going wrong is not going wrong through neglect; it is going wrong because nobody is measuring this reader.
Where the points actually go
The ten checks that fail most often across the sample, out of the 70 in the specification:
| Check | Pillar | Failing |
|---|---|---|
| Provides a no-JavaScript fallback | comprehension | 100% |
| Prices are machine-readable | structure | 97% |
| Exposes an agent-callable manifest | contract | 91% |
| Tabular data is marked up as a table | structure | 88% |
| Declares what an agent can do here | actionability | 84% |
| Publishes an llms.txt | contract | 78% |
| Signal-to-markup ratio | comprehension | 71% |
| Identity is machine-verifiable | contract | 69% |
| Uses semantic elements, not div soup | comprehension | 56% |
| Ships structured data | structure | 54% |
The pattern in that list is worth sitting with. These are not aesthetic failures or performance failures. They are failures to *state* things: a page that has a price but does not declare one, a company that has an address but does not publish it in a form anything can read.
The questions a customer asks, and how often they can be answered
Every scan asks whether a page can answer the questions a person actually puts to an assistant. Stated means machine-readable and quotable verbatim. Implied means it is there in prose or one fetch away — findable, paraphrasable, often not worth the request.
| The question | Stated | Only implied | Missing |
|---|---|---|---|
| What is this company, and what does it do? | 33 (11%) | 169 (58%) | 90 (31%) |
| What do they sell? | 18 (6%) | 102 (35%) | 172 (59%) |
| What does it cost? | 9 (8%) | 99 (90%) | 2 (2%) |
| How do I get in touch with them? | 45 (15%) | 98 (34%) | 149 (51%) |
| Where are they? | 44 (15%) | 26 (9%) | 222 (76%) |
| Is it in stock? | 5 (45%) | 0 (0%) | 6 (55%) |
| What happens if I want to send it back? | 0 (0%) | 12 (100%) | 0 (0%) |
The gap between the first two columns is the single most useful finding in this study. On most of these sites the fact is there. A person reading the page can see the price, find the address, work out what is sold. It is simply not written in a form that survives being read by a machine — and the owner has no way of noticing, because to them the page looks complete.
Rendering: the failure with no error message
These sites ship an empty root element and assemble the page in the visitor's browser. Google Search has rendered JavaScript for years, so this costs them nothing in search and is invisible in every SEO tool they own. The crawlers behind AI assistants generally do not render, and so receive nothing.
Separately, 45 of 292 (15%) served something that looked like a bot wall rather than a page — a challenge from an edge product, delivered with a 200 status, logged nowhere as a failure.
What sites publish for agents
| File | Sites publishing it | Share |
|---|---|---|
robots.txt | 238 | 82% |
sitemap.xml | 196 | 67% |
/.well-known/security.txt | 111 | 38% |
llms.txt | 64 | 22% |
/.well-known/mcp.json | 25 | 9% |
The two at the bottom are the interesting ones, and not because they are important yet. They are the cheapest possible differentiators: a file each, no runtime cost, and at these rates almost nobody in your industry has one.
Which crawlers are being turned away
We resolved each site's robots.txt against every named AI crawler individually. Blocking a training crawler is a legitimate decision. Blocking an answer engine removes you from results that would have linked to you — and the numbers suggest a great many sites did not distinguish between the two.
| Crawler | Blocked by | Share |
|---|---|---|
CCBot | 55 | 19% |
Bytespider | 46 | 16% |
ClaudeBot | 43 | 15% |
GPTBot | 41 | 14% |
cohere-ai | 37 | 13% |
Google-Extended | 37 | 13% |
Applebot-Extended | 37 | 13% |
PerplexityBot | 36 | 12% |
What a page costs a model to read
A context window is a fixed budget. A site that spends a third of every page on a mega-menu is paying that on every page an assistant ever reads of it, and the content it wanted read competes for what is left.
What survives being cut into passages
An assistant is not handed your page. It is handed a passage of a few hundred tokens that a retrieval system cut out of it, next to passages from other sites, and the answer is written from that. So we ran the cut on every page in the sample and asked of each passage whether somebody who saw only it would know what it was about.
| Measure | Median across 261 pages |
|---|---|
| Passages one home page cuts into | 11 |
| Share of the content that stands alone in one passage | 100% |
| Share of what would be retrieved that is navigation | 1% |
The median page survives it, and that is worth saying even though it is the less interesting answer: these are front pages of well-known companies, which are short, heavily headed and written to be skimmed. The tail is where the finding is. 17 of 261 (7%) leave under three fifths of their content in a passage that could be quoted, 23 of 261 (9%) are more than half navigation once cut up, and 5 of 261 (2%) have no prose passages at all.
Pages that disagree with themselves
A page speaks twice: once in prose an assistant has to interpret, and once in structured data it can simply believe. Nobody proof-reads the second, because nobody can see it. 37 of 292 (13%) of the sites in this sample publish at least one fact in their structured data that the page itself does not support, and 3 of 292 (1%) state something that outright contradicts what a reader can see.
| What disagrees | Kind | Sites |
|---|---|---|
telephone | Unsupported claim | 22 |
email | Unsupported claim | 16 |
name | Unsupported claim | 6 |
url | Contradiction | 3 |
Most of these are contact details: a telephone number or an email address published in the structured data and printed nowhere a visitor could check it. That is the shape a stale copy-paste leaves behind, and it is the number an assistant reads out when somebody asks how to get in touch.
Structured data that resolves to nothing
A type name that is not in the schema.org vocabulary is not a slightly wrong type. It is no type at all: the consumer keys the node on it, fails to resolve it, and discards everything underneath. The page carries the maintenance cost of the block and gets none of the benefit, and nothing anywhere reports it — the JSON is valid, the context is right, and a browser shows the page exactly as intended.
That is a smaller number than the rest of this study, and the reason is worth saying: these are famous companies, and the thing this catches is a typo. 0 of 292 (0%) declare a type that is not in the vocabulary, which would cost them the whole block it is on. 10 of 292 (3%) use a property that is not, which costs them that one fact. It is the failure with the worst ratio of consequence to effort on the whole list — nothing reports it, a browser shows the page exactly as intended, and the fix is one character.
The pattern in what turns up is instructive. Most of them are a plural where the vocabulary is singular, or a capital letter where it is lower case — a name that reads correctly to a person and resolves to nothing at all:
| Name | Sites using it |
|---|---|
founders | 5 |
type | 1 |
LegalName | 1 |
awards | 1 |
SubOrganization | 1 |
pageType | 1 |
vertical | 1 |
subVertical | 1 |
The cheapest thing on this list, and half the web has not done it
Crawlers revisit. With one of those headers a crawler asks "has this changed?" and receives an empty 304; with neither it downloads the whole page again every time it wonders. It costs one line of server configuration, most static hosts do it already, and it is the single most effective thing a site complaining about AI crawler traffic could do about it.
By category
| Category | Sites | Median score | Client-rendered |
|---|---|---|---|
| saas | 70 | 78 | 3 (4%) |
| docs | 50 | 65 | 1 (2%) |
| news | 47 | 71 | 2 (4%) |
| ecommerce | 46 | 45 | 3 (7%) |
| government | 46 | 66 | 2 (4%) |
| reference | 33 | 58 | 0 (0%) |
What we would conclude from this
- The problem is under-declaration, not bad content. The dominant failure is a fact that exists on the page in a form only a person can use. That is cheap to fix and almost nobody is fixing it.
- The failure is silent by construction. No error, no alert, no dip in a dashboard. Every measurement tool most teams own is watching a different reader.
- The agent-facing files are an open goal. At these publication rates, doing the obvious things puts a site ahead of nearly everyone in its category, for an afternoon of work.
- Blocking is often accidental. The gap between training crawlers and answer engines is not widely understood, and one rule usually catches both.
- Almost nobody has thought about the passage. Getting the page fetched and understood is where every existing tool stops, and it is the first half. What happens after the cut decides whether any of it can be quoted, and the tail of that distribution is worse than the median suggests.
The full rubric behind every number here is published in full and generated from the scoring code, so it cannot drift from what was actually measured. The distribution is on the AX Index.
Find out where your own site sits in this distribution. One page, about two seconds, no account.