Content Checks
C1 Markdown content negotiation, C2 llms.txt, C3 structured HTML.
Agents don't render HTML the way a browser does. They strip it down, look for headings and meta, and try to extract clean prose. Help them by exposing content in formats they don't have to fight. None of this matters if crawlers can't find or aren't allowed to reach your pages — pair these with the Discoverability checks and Bot Access checks.
C1 — Markdown content negotiation (weight 8)
AIScan re-requests your homepage with Accept: text/markdown. If the server replies with atext/markdown content-type and the body looks like markdown (headings, lists, links), the check passes.
How to fix
Two approaches:
- Content negotiation — at the edge or in your framework, when
Acceptincludestext/markdown, render the same page as Markdown instead of HTML. - Sidecar URLs — also serve
/path/index.mdalongside/path. Easier for static sites.
C2 — /llms.txt (weight 6)
Per llmstxt.org, /llms.txt is a markdown file that gives agents a curated index of your site. AIScan checks that the file exists, returns 200, and contains an H1, at least one ## section, and markdown links.
How to fix
Drop a file at the root of your site that looks like the example below — or generate one with the llms.txt generator:
# Acme Inc.
> A short summary of what Acme does — one or two sentences.
## Docs
- [Getting started](https://acme.com/docs/getting-started.md)
- [API reference](https://acme.com/docs/api.md)
## Examples
- [Example app](https://acme.com/examples/app.md)C3 — Structured HTML (weight 4)
Four basic signals on your homepage: a single <h1>, a non-empty <title>, a <meta name="description">, and at least one application/ld+jsonblock. One point each.
How to fix
For JSON-LD, start with an Organization or WebSite schema sitewide, then add page-type-specific schemas (Article, Product, FAQPage) on the pages that match. Validators: schema.org validator.
E3 — Heading hierarchy & server-rendered text (weight 4, essential)
AIScan strips scripts and styles from the HTML your server actually returns, then counts the remaining words and the <h2>/<h3> outline. This is what a non-JavaScript crawler receives — most LLM crawlers do not execute your bundle.
- 150+ words of server-rendered text: 2 points (50+: 1 point).
- Two or more
<h2>sections: 2 points (one: 1 point).
How to fix
Server-render or pre-render your marketing and docs copy, and structure it with one <h1> then descriptive <h2>/<h3> sections. Check what a crawler sees:
curl -s https://yoursite.com/ | sed 's/<[^>]*>/ /g' | tr -s ' ' | head -c 800E5 — Content feed (RSS / Atom / JSON Feed) (weight 3, recommended)
A feed is a dated changelog of your site — a freshness signal a sitemap doesn't carry. AIScan looks for a feed at the conventional paths and checks whether it's declared in <head> with <link rel="alternate">. Declared feed: full credit. Found by convention only: partial.
This check is graded only where periodical content is expected (a blog, news, or articles section, or a platform like WordPress or Ghost). Otherwise it reports N/A with the reason, and costs nothing.
How to fix
<link rel="alternate" type="application/rss+xml" title="Blog" href="/feed.xml" />Further reading
- Your RSS Feed Returns 403 to Feed Readers and Agents: Cloudflare and Firewall Rules That Block It
Cloudflare's Bot Fight Mode and its "block AI bots" switch can answer your RSS feed with a 403 challenge page, and a feed reader or AI agent has no way to solve one. On 1 November 2026 we requested…
- ChatGPT Says It Can't Access Your Website: Five Causes and How to Tell Which
When ChatGPT says it cannot open your page, one of five things happened, and a short script of four curl requests sorts four of them in about a minute. The fifth is that ChatGPT never tried. This…
- RSS, Atom or JSON Feed: What 340 Sites With a Blog Actually Ship
Of the 340 sites in our scan corpus that have a blog, news or articles section, 233 serve a feed, and 191 of those feeds are RSS. Atom is on 6 sites. JSON Feed is on 36. The bigger story is not the…
- Fix "Heading elements are not in a sequentially-descending order" without breaking your design
Lighthouse prints "Heading elements are not in a sequentiallydescending order" when a heading jumps more than one level, for example an <h4 straight after an <h2. The fix is almost never to delete…
- llms.txt Content-Type and Charset: What to Send and How to Check
Send llms.txt as text/plain; charset=utf8 or text/markdown; charset=utf8, with no byte order mark, and always spell out the charset. The type decides whether a client treats the file as text at all.…
- JSON-LD in Google Tag Manager is missing from your served HTML: test it and move it server-side
If your JSONLD is added by a Google Tag Manager Custom HTML tag, a plain HTTP fetch of your page contains zero schema blocks. Google can still read it, because Googlebot renders JavaScript. Crawlers…
- One h1, title, meta description and JSON-LD on Ghost, Lovable, Next.js, Replit, Webflow, Wix and WordPress
One page needs one <h1, a <title, a meta description and a JSONLD block, and AIScan check C3 structured HTML passes only when all four are in the HTML the server returns. Who writes each of the four…
- Serve Markdown to agents with a Cloudflare rule
To serve Markdown to AI agents from a site on Cloudflare, turn on Markdown for Agents for the zone Dashboard AI Crawl Control or for one path with a Configuration Rule. When a client sends Accept:…