Structured data · GEO · Updated 2026

llms.txt and Schema.org: Do You Need Both?

Two signals get filed under one label — "machine-readable data for AI" — and then treated as interchangeable. They are not. One is a site-level index an agent reads to decide where to go; the other is page-level vocabulary that tells a parser what a page is. Mixing them up is how teams end up stuffing JSON into a Markdown file.

The Two Layers, Side by Side

llms.txtSchema.org JSON-LD
Question it answers Which pages on this site are worth my context window? What is this page, and which entity does it describe?
Scope One file covering a site or a path Per page, per entity — usually one or a few nodes
Where it lives A Markdown file at the site root or a subpath Inside the HTML of the page it describes
Who consumes it Coding agents and assistants with retrieval, plus Lighthouse's agentic browsing audit Search engines and any parser that extracts entities

The shorthand: llms.txt is the map, schema is the labeling system on it. Neither substitutes for the other, and neither is a ranking tactic — that debate is settled in does llms.txt affect SEO.

What the Spec Actually Says About Structured Data

Most "llms.txt plus schema" advice floating around is inference. There is one line of spec to anchor on. In the "Existing standards" section of the v2 proposal (last modified 10 August 2026), Jeremy Howard writes that the file "can also reference structured data markup used on the site, helping LLMs understand how to interpret this information in context."

That is a suggestion, not a requirement — and it is deliberately narrow. The proposal is not saying embed your JSON-LD in llms.txt. It is saying the index may point at markup so an agent knows what it is looking at. The same v2 text formalises the two link relations that connect files to pages: rel="alternate" type="text/markdown" for a page's Markdown twin, and rel="describedby" for the llms.txt file that covers it.

2026 Sharpened the Division of Labour

Two 2026 announcements confused a lot of people into thinking one layer had won. Both are true, and both point the same way.

Read together, the message is not "structured data died." It is that the visible reward attached to both shrank while the plumbing stayed useful. Keep the measured reality in view: an Ahrefs study of 137,210 domains found 97% of llms.txt files got no requests at all in May 2026 — see which AI engines read llms.txt.

The Consistency Rules That Actually Matter

Where the two touch, they should agree. Four rules cover almost every real conflict:

  1. Entity name. The H1 of your llms.txt should match the name in your Organization node, character for character — "Acme Analytics" and "Acme Analytics, Inc." are two entities to a parser.
  2. Canonical URLs. Every link in llms.txt should be the canonical form — no tracking parameters, no trailing-slash drift. If your schema uses @id, reuse those exact URLs.
  3. One summary, one story. The blockquote summary and the schema description should describe the same product the same way. A stale llms.txt promising a free tier your pricing schema dropped is the contradiction that makes an agent hedge.
  4. Only pages that exist. Schema on a live page promises the URL resolves; so does every link in the index. Broken pointers age both files at once.

Three Ways to Connect Them

  1. Add a "Machine-readable data" section to llms.txt. The spec-endorsed move: a short list pointing at sitemap.xml, the llms.txt file itself, and the pages carrying your key structured data.
  2. Seed the header from the same CMS fields that emit JSON-LD. If site name, one-line description and canonical URL already drive an Organization node, they can drive the H1 and blockquote too. One source of truth, two outputs.
  3. Reuse one curated list. The 10–50 pages you pick for llms.txt are the same pages worth an ItemList node. Curate once.

A Matching Pair You Can Copy

Same entity, two formats, no contradictions:

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Acme Analytics",
  "url": "https://acme.example/",
  "description": "Product analytics for small SaaS teams.",
  "sameAs": ["https://github.com/acme"]
}
# Acme Analytics

> Product analytics for small SaaS teams: event tracking, funnels and retention
> reports, with setup docs and an API reference.

## Docs
- [Quickstart](https://acme.example/docs/quickstart.md): Install the SDK and send a first event
- [API reference](https://acme.example/docs/api.md): Every endpoint and response body

## Machine-readable data
- [Sitemap](https://acme.example/sitemap.xml): Every indexable page
- [llms.txt](https://acme.example/llms.txt): This file
- [Organization details](https://acme.example/about.md): The facts published in our JSON-LD node

What Not to Do

A 20-Minute Checklist

  1. Fetch /llms.txt and your homepage's JSON-LD. Diff the entity name, canonical URL and description.
  2. Fix the H1 so it matches your Organization name exactly.
  3. Add the "Machine-readable data" section with three or four links.
  4. Run the file through the checker. Validate the JSON-LD with the Schema Markup Validator — FAQ support left the Rich Results Test in June 2026.
  5. Re-check quarterly, or whenever URLs change. Starting fresh? The generator builds a spec-compliant file from your sitemap in seconds.