Content type
Content-type text/plain or text/markdown
In short: Serve /llms.txt as text/markdown or text/plain with charset=utf-8, never as an HTML page from a catch-all route.
What it checks
Whether the file is served as text/plain or text/markdown.
Why it matters
Clients decide how to parse a response from its content type. A file served as text/html is treated as a web page, and many clients reject it or strip it badly.
When it applies
Always, for any llms.txt that exists and isn’t served as HTML.
An audit that doesn't apply, or that we couldn't verify, is removed from your score and its weight shared among the Retrievability & Access audits that do apply. It is never scored as a zero.
How it's scored
1.0 for every file that reaches scoring. A response served as text/html, or whose body is an HTML page, never gets here: the scan reports that a web page answered instead of an llms.txt, and nothing is scored.
How to fix
- Set Content-Type: text/markdown; charset=utf-8 (or text/plain; charset=utf-8) for /llms.txt.
- On static hosts, map the .txt extension explicitly if the default is octet-stream.
- Make sure a framework catch-all route isn’t wrapping the file in an HTML page.
Frequently asked questions
Should llms.txt be served as text/plain or text/markdown?
text/markdown is the registered markdown type (RFC 7763), and it makes charset required, so send text/markdown; charset=utf-8; text/plain; charset=utf-8 is what most servers send for .txt by default and is just as good.Sources: RFC 7763: The text/markdown Media Type · MDN: Common media types
What happens if my server sends llms.txt as text/html, even though the body is markdown?
text/html response is treated as a web page, not a file. The scan reports that a web page answered instead and nothing is scored, however clean the markdown inside is. This usually comes from a framework route or CMS page rendering the path; serve the raw file with a text type instead.Sources: RFC 9110 §8.3: Content-Type · Content type
Is application/octet-stream a problem?
location = /llms.txt { default_type text/plain; } (or a types mapping), and on other hosts add an explicit header for the path.Sources: MDN: Common media types · nginx: default_type and types
How do I set the content type for llms.txt on Vercel?
public/llms.txt is served as a text file already. To be explicit, add a headers entry in vercel.json with "source": "/llms.txt" and a Content-Type of text/markdown; charset=utf-8 (or text/plain; charset=utf-8), and check with curl -I https://your-domain/llms.txt that no catch-all route is answering instead.Sources: Vercel: vercel.json headers
In your research, how many sites serve llms.txt with the right content type?
Sources: LLMSRank method · Content type