42 of 66 Ship llms.txt. 5 Declare Content Signals. Adoption Runs Backwards.
Two conventions for talking to AI systems. The category adopted the one with no demonstrated reader and skipped the one with a specification.
There are two things a site can do today to talk to AI systems. One is llms.txt, a proposed index file that nobody has demonstrated any assistant fetches. The other is Content Signals, a robots.txt directive that declares whether your content may be used for search, for answers and for training. Across the sixty-six vendors selling AI visibility, forty-two ship the first and five declare the second.
Adoption has gone to the file with no known reader and skipped the one with a specification behind it. We are in both counts, which is why this is an observation and not an accusation.
Disclosure: EchoWi is one of the sixty-six and sells AI visibility measurement. Both numbers include us, we ship both conventions, and the Content Signals count is one lower than the truth for a reason the method section explains and which is entirely our own fault. The counts are in our measurement register with the date.
The short version
- 42 of 66 serve a real llms.txt. A 200 that returns HTML is a catch-all route rather than a file, and those are excluded.
- 6 of those 42 are under 2 KB, which is present without being an index of anything.
- 9 of 66 also serve llms-full.txt, the version with the actual text in it.
- 5 of 66 declare Content Signals in robots.txt: Omnibound, KIME, Rankability, Cloudflare AEO and Airefs.
- All five permit rather than restrict, which matches what we found when we checked whether anybody blocks AI crawlers at all: nobody does.
- 11 of 66 announce llms.txt in robots.txt, so most of the forty-two who have the file never point at it.
The two conventions are not the same kind of thing
llms.txt is a proposed convention: a markdown index at a well-known path, listing a site’s pages so a model can find them without crawling. It is easy to generate, it looks like the right thing to do, and as far as we can establish nobody has published evidence of an assistant fetching it. We have not observed one fetching ours. We ship it anyway, and so do forty-one others.
Content Signals is a directive inside robots.txt with a specification behind it, expressing three separate permissions: search, ai-input and ai-train. It is a statement about how your content may be used, which is a licensing position rather than a discovery aid.
One is a hopeful index. The other is a rights declaration. The category has adopted the first at eight times the rate of the second.
The numbers
| Vendors | |
|---|---|
| Serve a real llms.txt | 42 of 66 |
| Of those, under 2 KB | 6 |
| Also serve llms-full.txt | 9 of 66 |
| Declare Content Signals | 5 of 66 |
| Announce llms.txt in robots.txt | 11 of 66 |
The five Content Signals declarations:
| Vendor | Declared |
|---|---|
| Cloudflare AEO | ai-train=yes, search=yes, ai-input=yes |
| Airefs | ai-train=yes, search=yes, ai-input=yes |
| KIME | search=yes, ai-input=yes, ai-train=yes |
| Rankability | ai-train=yes, search=yes |
| Omnibound | search=yes |
Two of the five leave signals unstated rather than denying them, which under the specification is silence and not refusal. Nobody in this sample declines anything.
Why the ordering is backwards, and what it costs
The common default that specifications and audit tools suggest is ai-train=no, search=yes, ai-input=no. That template is written for a publisher whose revenue comes from visits and who loses when an answer replaces the click. It is a sensible default for a newspaper.
For a company selling AI visibility it is close to self-harm. Declaring ai-input=no asks assistants not to use your pages when composing an answer, which is the outcome your product exists to help customers achieve. Five vendors have thought about this and all five said yes to everything they mentioned.
The other sixty-one have not made the declaration either way, which is not a failing. Silence means unstated, and unstated means an AI system applies its own default. The point is narrower: it is the only one of the two conventions that changes anything a system is obliged to respect, and it has one-eighth the adoption of the one that may change nothing.
The size distribution says something similar. Six of the forty-two llms.txt files are under 2 KB, one of them 387 bytes. A file that small is a gesture. Nine vendors ship llms-full.txt, which contains the actual body text and is the version that would be worth something to a model that read it.
Neither of these is enforcement, and that is worth being clear about
Both conventions are things you publish and hope are honoured. llms.txt is an index a model may or may not fetch. Content Signals is a line in robots.txt that binds whichever systems decide to respect it, which is the same standing the rest of that file has had for thirty years.
So neither is a control. That matters because the failure this site has documented in its own infrastructure lived somewhere else entirely: a crawler was being challenged at the CDN while robots.txt welcomed it by name. No amount of declaring fixes that, and no amount of declaring causes it.
The useful way to hold the three layers apart:
What you declare is robots.txt, Content Signals and llms.txt. It is cheap, it is public, and it is checkable by anybody including your competitors, which is how this article exists.
What your infrastructure does is your CDN’s bot management, your rate limits and your firewall. It is invisible from outside, it overrides everything in the first layer, and it is where our own problem was.
What the model does with it is not observable from either. A permissive declaration and a reachable server still leave the question of whether a page gets cited, which is what the rest of the research on this site measures.
A vendor selling you a score built from the first layer alone is selling you the layer that is cheapest to check and least likely to be the problem. Sixty-six of sixty-six pass the first layer. That number is available to anyone with an afternoon, and it is the reason we spent one on it rather than charging for it.
The measurement failed on our own site, and that is the useful part
Our robots.txt gained a Content Signals declaration the day before this sweep. It is not in the count of five.
The reason is a cache. Production serves our robots.txt with a one-year TTL, overriding what the repository commits, and the edge was still handing out the previous version. Fetching with a cache-busting parameter returns the new directives; fetching normally, as this sweep did and as a crawler would, returns the old file.
That is worth more than the count it corrupts. A measurement of what a site declares is a measurement of what its cache is serving, and a robots.txt behind a long TTL is a declaration that takes effect whenever somebody purges it. If you change yours today, check what the edge returns rather than what your repository contains, because those are different questions and only one of them reaches a crawler.
We are leaving our own number wrong in the table above rather than correcting it by hand, because the sweep saw what a crawler sees and that is the honest figure.
What this does not show
Not a quality judgement. Shipping llms.txt is cheap and harmless, and this article is not an argument against it. We publish one and a full-text one.
No evidence either way on whether llms.txt is read. We have not observed an assistant fetching ours and we do not have the CDN logs that would settle it. Absence of evidence here is genuinely that, and anyone with server logs showing the opposite has better data than this article.
One reading, one day. robots.txt and llms.txt both change, and five is a count from 11 August 2026.
The sample is one category. Sixty-six vendors selling AI visibility. Adoption of both conventions elsewhere on the web is a different question and one we have not measured.
And a 200 is not a file. Several sites return HTML for /llms.txt because of a catch-all route. Those are excluded here, and counting them would have inflated the forty-two.
Common Questions About llms.txt and Content Signals
Should I add llms.txt to my site?
It costs almost nothing and there is no demonstrated downside, so probably yes, and you should hold it loosely. Nobody has shown an assistant fetching one, including us, and forty-two of the sixty-six vendors selling AI visibility ship one anyway. Treat it as cheap insurance rather than as work that has been shown to pay.
What is the difference between llms.txt and llms-full.txt?
llms.txt is an index of your pages and llms-full.txt contains their text. Nine of the sixty-six ship the second. If a model ever does read these, the index tells it what exists and the full version is the only one that saves it a crawl, so shipping the index alone is the smaller half of the idea.
What should my Content-Signal say?
That depends on where your revenue comes from and it is a licensing decision, not a technical one. If visits pay for your business, the common ai-train=no, ai-input=no template is defensible. If being present in AI answers is the point, that template asks for the opposite of what you want. Nobody in this sample declines anything, which tells you what a category built around AI answers concluded.
Does declaring Content Signals actually stop anything?
It is a declaration in robots.txt, so it binds only systems that choose to respect it, exactly like the rest of that file. What it does have that llms.txt does not is a specification and an obvious consumer: it says how content may be used, which is a question AI companies have public positions on. Whether any given crawler honours it is not something this sweep measured.
Why do only 11 of 66 mention llms.txt in robots.txt when 42 have it?
Because the convention puts the file at a well-known path, so pointing at it is optional. It is still free, and a line in robots.txt is the one place a crawler is guaranteed to look. Thirty-one vendors have generated the file and not spent the line.
How do I check what my own site actually declares?
Fetch it with a cache-busting query and compare with a plain fetch. If they differ, your edge is serving an older file than your repository contains, which is what happened to us the day before this sweep and is the reason our own declaration is missing from the count of five. What the cache serves is what a crawler reads.
Ask an AI about this article
Opens your assistant with this page already loaded, so you can check the numbers, argue with the method or ask what it means for you.
- ChatGPT (opens in new tab. the question is pre-filled, press enter to send it)
- Claude (opens in new tab. the question is pre-filled, press enter to send it)
- Perplexity (opens in new tab)
- Google AI Mode (opens in new tab)
Perplexity and Google answer straight away. ChatGPT and Claude fill the box and wait for you to press enter, which is their behaviour and not something we can set.