Guides ยท llms.txt

llms.txt: What It Is, How to Write One, and Whether AI Actually Reads It

Last verified: October 2026 ยท About 9 minutes of reading

Most guides explain the syntax and stop there. This one also covers the part that decides whether the file does anything: what a crawler is actually obliged to do with it, which is nothing. You will get a complete, copyable example, the exact serving requirements, and a way to test your own file without guessing.

What llms.txt is

llms.txt is a plain-text Markdown file at /llms.txt that names the pages you want an AI system to read first.

Jeremy Howard of Answer.AI proposed it in September 2024 as a community convention. It is not a W3C recommendation, not an IETF RFC and not a requirement from any AI vendor. Nothing enforces it, and no company has to fetch it.

The file is small on purpose: a title, one line about the site, then a handful of links grouped by purpose. Being plain text, it costs almost nothing to serve and diffs cleanly between deploys.

What problem it was meant to solve

The proposal targets a real gap: HTML navigation is noisy, and a crawler has to guess which pages carry the substance.

A typical marketing site buries four useful pages under cookie banners, mega-menus, tag archives and paginated listings. A sitemap does not help much either: it lists every URL with equal weight and says nothing about which ones are worth a fetch. llms.txt states that judgement explicitly โ€” here are the ten pages that describe this product, in reading order.

It is a reading list, not an access-control list. The distinction matters later, when people expect the file to keep crawlers out.

The format, field by field

The format is one H1, an optional blockquote summary, then H2 sections holding Markdown links with optional notes.

There is no schema and no validator with authority. The proposal describes a shape, and every element below is a convention rather than a rule. In practice, these are the parts that matter:

A complete example you can adapt as-is:

# Example Site

> Example Site is a hosted API for invoice parsing. Docs, pricing and changelog below.

## Documentation
- [Getting started](https://example.com/docs/start): Install the SDK and send a first request
- [API reference](https://example.com/docs/api): Every endpoint, parameter and error code
- [Webhooks](https://example.com/docs/webhooks): Retries, signatures and delivery order

## Product
- [Pricing](https://example.com/pricing): Plans, quotas and overage rules
- [Changelog](https://example.com/changelog): Release notes, newest first

## Optional
- [Status page](https://example.com/status): Current availability and incident history
- [Security](https://example.com/security): Data retention and subprocessors

Two details are worth copying. Every link carries a short note, because a note is the only place the file can explain why the page matters. And the sections are ordered by what a newcomer needs first.

Where to put it and how to serve it

Serve it at the domain root as /llms.txt with HTTP 200 and the header text/plain; charset=utf-8.

The path is literal. https://example.com/llms.txt is the file; https://example.com/docs/llms.txt is a different URL that a root-only reader will never request. If you run several subdomains, each host needs its own copy, because there is no cross-host include mechanism.

The most common serving failure is a single-page app or catch-all route answering /llms.txt with 200 text/html and the app shell. The status code looks fine and the content is wrong. Two ways to prevent it:

# nginx โ€” serve the real file and never fall through to the SPA
location = /llms.txt {
    default_type "text/plain; charset=utf-8";
    add_header X-Content-Type-Options nosniff;
    try_files /llms.txt =404;
}

# Cloudflare Pages / Netlify โ€” public/_headers
/llms.txt
  Content-Type: text/plain; charset=utf-8

Then confirm what the network actually returns, not what your editor shows:

curl -sI https://example.com/llms.txt | head -n 5
# HTTP/2 200
# content-type: text/plain; charset=utf-8

curl -s https://example.com/llms.txt | head -n 3
# # Example Site

If the second command prints <!DOCTYPE html>, the file is not being served. Fix that before touching the content.

How it differs from robots.txt

robots.txt controls access and is obeyed by convention; llms.txt only suggests what is worth reading.

These two files are routinely confused, and the confusion produces bad advice. One of them can keep a crawler out. The other cannot.

Three discovery files, three different jobs.
Aspectrobots.txtsitemap.xmlllms.txt
First published19942005September 2024
StatusRFC 9309sitemaps.org protocolCommunity proposal
Can it block a fetch?YesNoNo
What it listsPaths and the agents allowed to fetch themEvery indexable URL10 to 50 pages worth reading
Typical sizeUnder 10 KBUp to 50,000 URLs per fileUnder 5 KB
If you get it wrongYou block the wrong agentStale URLs waste crawl budgetIt is ignored silently

So the rule is simple: policy goes in robots.txt, inventory goes in sitemap.xml, judgement goes in llms.txt. A file that tries to do the first job will fail, because readers treat it as advisory text.

Adoption in 2026

As of October 2026, no major AI vendor publicly commits to reading llms.txt, so adoption is intent rather than a guarantee.

The publishing side is active: CMS plugins generate the file, documentation themes ship one, and directories list sites that have it. Real requests for /llms.txt do appear in server logs, sometimes from AI-adjacent agents, sometimes from SEO crawlers collecting the file as a signal.

The consuming side is quieter. OpenAI, Anthropic, Google and Perplexity document robots.txt and their own user-agent rules; none of them documents llms.txt as a supported input or a requirement. A request in a log proves that something fetched the file. It does not prove that the file shaped an answer, and Pingory does not publish percentages it cannot verify.

Why a correctly formatted file can still be ignored

A valid file can be ignored because nothing obliges a crawler to fetch it, parse it, or prefer the links inside.

Five mechanisms explain most of the gap between "we published it" and "it did something":

  1. No enforcement layer. robots.txt is followed because crawler operators chose to follow it and said so publicly. llms.txt has no equivalent commitment, so a crawler that skips it is not violating anything.
  2. Crawlers already have sources. Sitemaps, internal links and rendered HTML give a retrieval system enough to work with. A second map is a convenience, not a necessity.
  3. Retrieval is query-driven. When a person asks a question, the system fetches pages that match the question. Your curated home page may never be the best match for that specific query.
  4. Serving errors. The file returns HTML, 404, a redirect chain, or plain text behind a bot challenge. Anything that is not a 200 with text is a silent failure.
  5. Policy beats preference. If robots.txt disallows the crawler, the reading list is irrelevant. Access control always wins over a suggestion.

None of this makes publishing pointless: a small one-time cost, an unmeasurable upside, and a file you can verify in ten seconds.

How to verify yours

Verify the file the way a crawler would: exact path, status 200, plain text, one H1 and at least one link.

Run these four checks after every deploy that touches routing:

If you would rather not do that by hand, the free llms.txt checker fetches the same files a crawler would and reports what is missing. It runs 12 checks, of which llms.txt is one worth 6 points; the crawler-access matrix is worth 22 and usually explains a low score. That checker is a single check with no account. Recurring monitoring is a different product, covered in AI readability.

Frequently asked questions

These five questions cover the parts readers ask about most: status, location, citation, policy and size.

Is llms.txt an official standard?

No. Jeremy Howard of Answer.AI proposed it in September 2024 as a community convention. There is no W3C recommendation, no IETF RFC and no vendor mandate, and no AI company is obliged to read the file.

Where exactly should llms.txt live?

At the root of the exact host you want covered, for example https://example.com/llms.txt. A copy under /docs/llms.txt or on a different subdomain is not the same location, and a checker that looks at the root will report it as missing.

Does adding llms.txt get my site cited by ChatGPT?

No tool can promise that. No major AI vendor has publicly committed to reading llms.txt, and citation depends on the model, the question, the language and the moment. A valid file is a cheap signal, not a ranking lever.

Should I block AI crawlers and still publish llms.txt?

Those are separate decisions. robots.txt decides who may fetch; llms.txt describes what is worth reading. Many sites in 2026 block training crawlers, allow retrieval crawlers and keep a valid llms.txt for the ones that do read it.

How many links should llms.txt contain?

Fewer than your sitemap, by a wide margin. A practical target is 10 to 50 links covering docs, pricing, API reference and changelog. If the file mirrors thousands of URLs it stops being curation and becomes a second sitemap.

Check any site free

See what a crawler actually receives from your domain.

llms.txt, robots.txt, sitemap, first-screen text and access for eight AI user agents. No account needed.

Last verified: October 2026. Facts on this page were checked against the original llms.txt proposal, RFC 9309 and vendor crawler documentation on 2026-10-24.