How the checks work
Checked against llmstxt.org v2 (August 10, 2026). The spec itself is at llmstxt.org.
Two verdicts, not one number
Spec validity answers one question: is this a valid llms.txt? Five checks (E1, E2, E3, E4, E5): the file exists at its path, is served as text, has an H1, its file-list lines are well formed, and it is not an HTML page. A leading byte-order mark is fine. Fail any of them and the verdict is “invalid”.
Quality is Studio's set of recommendations (W1, W2, W3, W5, W6), graded 0–100: start at 100, subtract per hit up to a cap, letter by threshold (A ≥ 90 · B ≥ 75 · C ≥ 60 · D ≥ 40). None of these is required by the spec, and the report says so on every rule.
Information (I1, I2, I3, I4, I5, I6) records facts: robots.txt blocks, llms-full.txt presence, file age, whether pages declare rel="describedby", how many links resolve to markdown, and external links. They change neither verdict.
When nothing readable is served at all (E1 or E5) quality cannot be assessed, so the grade reads F with that reason.
All 16 rules and deductions
llms.txt Studio makes your file correct, current and easy to verify. Whether any AI system reads, uses or cites it is that system's decision — we do not guarantee AI inclusion, citations, rankings or traffic.
Is this a valid llms.txt at all? Any of these failing makes the verdict “invalid”. Nothing here moves the quality score.
| Rule | What it checks | Basis | Effect |
|---|---|---|---|
| E1 | No file at the given path | v2: the file lives at /llms.txt or at a subpath such as /docs/llms.txt and covers the pages under it. | spec invalid; quality not assessable |
| E2 | Not served as text, or larger than 1 MB | v2 says the file must stay small enough to fit in context and is markdown; the text/* content type and the 1 MB bound are Studio limits. | spec invalid |
| E3 | No H1 title | v2: an H1 with the project or site name is the only required section. A leading byte-order mark is allowed. | spec invalid |
| E4 | Line inside an H2 section is not a file-list entry | v2: H2 sections hold file lists — list items with a required [name](url) link and optional notes after a colon. Prose belongs above the first H2. | spec invalid |
| E5 | HTML page served instead of the file | The response is a web page, not a markdown file — usually a catch-all route or a soft 404. | spec invalid; quality not assessable |
Studio's recommendations, scored 0–100 from a start of 100. None of these is required by the spec.
| Rule | What it checks | Basis | Effect |
|---|---|---|---|
| W1 | No blockquote summary (recommended) | v2 describes a blockquote summary after the H1 but does not require it. Studio quality check. | −10 each, max −10 |
| W2 | No H2 sections (recommended) | v2 allows zero or more H2 file-list sections. Without any, the file gives an agent nothing to follow. Studio quality check. | −20 each, max −20 |
| W3 | Dead link | v2: links should point to LLM-friendly content. A link that does not resolve points nowhere. Sample of 20 links. | −4 each, max −24 |
| W5 | More than 200 links | v2 sets no count, only that the file stays small enough to fit in context. 200 is a Studio threshold. | −5 each, max −5 |
| W6 | Duplicate URL | Not in the spec. Duplicate entries waste the context the file is meant to save. Studio quality check. | −2 each, max −10 |
Facts worth knowing. They change neither verdict.
| Rule | What it checks | Basis | Effect |
|---|---|---|---|
| I1 | robots.txt blocks documented AI crawler tokens | Which documented crawler tokens, including control-only tokens like Applebot-Extended, robots.txt disallows at /. Blocking is a choice, never scored. | none |
| I2 | llms-full.txt presence | llms-full.txt is not part of the llmstxt.org proposal; it is a convention some sites use for inlined content. Reported, never scored. | none |
| I3 | File age (Last-Modified) | How old the served file is, from the Last-Modified header when present. | none |
| I4 | rel="describedby" discovery | v2 recommends a <link rel="describedby"> element or an HTTP Link header pointing pages at the llms.txt that covers them. | none |
| I5 | Share of links resolving to markdown | v2: links should point to LLM-friendly content such as .md / .html.md versions. Share of sampled links that resolve as text/markdown or use a .md URL. | none |
| I6 | External links noted | v2 explicitly welcomes links to other sites; its own example links to GitHub. Listed for awareness, never scored. | none |
Subpath files and path scope
v2 lets an llms.txt live at a subpath and cover the pages under it: /docs/llms.txt describes everything in /docs/, and the most specific file applies. The validator accepts a full URL such as example.com/docs/llms.txt and reports which prefix the file covers. The generator takes an optional path scope such as /docs: it only reads pages under that path and tells you to publish the result at /docs/llms.txt.
v2 also recommends that pages carry a markdown version at the same URL with .md appended or the extension replaced, announced with rel="alternate" type="text/markdown". When a page declares one, or a probed .md sibling answers as text/markdown, the generator links to that instead of the HTML page.
AI crawlers we recognise
Every entry below is taken from the vendor's own documentation, linked in the last column, and grouped by what the vendor says it is for. A user-agent string is self-declared and can be spoofed, so a match is evidence that a request presented that string, not proof of who sent it. If you see no fetch, that does not prove an AI system ignored your llms.txt.
| Vendor | User-agent / token | What the vendor says | Documentation |
|---|---|---|---|
| OpenAI | ChatGPT-User | Visits a page when a ChatGPT user asks a question. | platform.openai.com |
| Anthropic | Claude-User | Accesses websites when individuals ask Claude questions. | support.anthropic.com |
| Perplexity | Perplexity-User | Visits a page to answer a user's question and cites it. | docs.perplexity.ai |
| Meta | meta-externalfetcher | Fetches individual links at a user's request. | developers.facebook.com |
| Amazon | Amzn-User | Fetches live information on a user's behalf, e.g. for Alexa queries. | developer.amazon.com |
| Mistral | MistralAI-User | Visits a page to answer a user's question in Mistral's assistant and cites it. | docs.mistral.ai |
| DuckDuckGo | DuckAssistBot | Fetches pages in real time for DuckDuckGo's AI-assisted answers; not used for training. | duckduckgo.com |
| Vendor | User-agent / token | What the vendor says | Documentation |
|---|---|---|---|
| OpenAI | OAI-SearchBot | Surfaces websites in ChatGPT's search features. | platform.openai.com |
| Anthropic | Claude-SearchBot | Analyses content to improve search result quality for Claude users. | support.anthropic.com |
| Googlebot | Google Search's main crawler. | developers.google.com | |
| Perplexity | PerplexityBot | Surfaces and links websites in Perplexity search results; not used for training. | docs.perplexity.ai |
| Apple | Applebot | Powers search in Spotlight, Siri and Safari; data may also help train Apple models. | support.apple.com |
| Amazon | Amzn-SearchBot | Makes content eligible for search experiences such as Alexa. | developer.amazon.com |
| Vendor | User-agent / token | What the vendor says | Documentation |
|---|---|---|---|
| OpenAI | GPTBot | Crawls content that may be used in training OpenAI's generative AI foundation models. | platform.openai.com |
| Anthropic | ClaudeBot | Collects web content that could contribute to model training. | support.anthropic.com |
| Meta | meta-externalagent | Crawls the web for training foundation AI models or indexing content directly. | developers.facebook.com |
| Amazon | Amazonbot | Improves Amazon products and services; may be used to train Amazon AI models. | developer.amazon.com |
| Common Crawl | CCBot | Builds the open web archive widely used as AI training data. | commoncrawl.org |
| Vendor | User-agent / token | What the vendor says | Documentation |
|---|---|---|---|
| Apple | Applebot-Extendedrobots.txt only | robots.txt token to opt out of generative-model training; not a request user-agent. | support.apple.com |
Not listed, and why: Bytespider (ByteDance): No ByteDance documentation page names it; only third-party trackers do. Google-Extended (Google): Google's crawler documentation pages fetched today did not contain the token in their served HTML; add it when a citable page is confirmed. It is a robots.txt control token, not a request user-agent. Google-CloudVertexBot (Google): Same: not present in the served HTML of Google's crawler documentation pages fetched today.
Anything the canary sees that is not in this table is logged as “unrecognized” with its raw user-agent string. We never guess.
Monitoring
What page do I land on after paying? Straight onto the monitoring page for the domain you were setting up, with a “Subscription active” banner. If you haven't proven you control the domain yet, the verification card (a DNS TXT record or a meta tag, plus a “Check now” button) is the first thing on that page — monitoring starts the moment verification passes. If Stripe sends you back a second or two before we've received its confirmation, the page shows “Confirming your payment…” and updates itself; you don't need to refresh.
How do I get my monitoring updates? Three ways. First, an alert email whenever a weekly check finds something worth knowing: the file is missing, the grade dropped, a link died, your site drifted away from the file, the file itself changed (the email shows the lines that differ), or a documented AI crawler fetched your canary link. You get at most one alert email a day; several findings are bundled into it. Second, a monthly report that lists what we checked even if nothing changed, so you can see the checks are running. Third, your dashboard, where every check, diff and crawler fetch is kept and where the “Regenerate now” button lives.
Which email address do alerts go to? The email on your llms.txt Studio account — the one you signed up with, or your Google account if you used “Continue with Google”. Stripe receipts go to the same address; the email field on the payment page is fixed to it. Change it any time under Account.
Limits
- Free tools: 1 generate and 1 validate per day per network address, resetting at 00:00 UTC. No account.
- Generator: robots.txt honoured, up to 60 pages, 2 MB per response, 8 s timeout, 2 requests per second per host, 3 minutes per job.
- Validator: fetches the file, robots.txt and the covering page; probes a sample of 20 links; the file must be under 1 MB.
- Monitor: weekly checks per paid, verified domain; at most one alert email per domain per day; regeneration without the daily limit.
Platform specifics are in the guides (Next.js, WordPress, Webflow, Hugo, Docusaurus), the format itself in the knowledge base, and our own fetcher on /bot.