TL;DR

No AI crawler uses content negotiation for Markdown — Dries Buytaert's crawler-log analysis found zero requests from GPTBot, ClaudeBot, or PerplexityBot via the Accept header. Vercel reported a 99.37% size reduction (500 KB HTML to 3 KB Markdown) when implementing it, but that savings is irrelevant if no agent asks for it. llms.txt saw 52 requests in a month, all from SEO audit tools, not actual AI systems, and across 400 million requests it accounted for 0.001% of traffic. The technique is real, standards-compliant, and used by coding agents like Claude Code and OpenCode, but general AI search crawlers and browsing features do not request Markdown.

Bottom line: implement it only if you target coding-agent tooling; it is not yet a proven ranking or citation lever for mainstream AI crawlers.

Markdown content negotiation is a way to serve a stripped-down, ~99% smaller Markdown version of a page from the same URL, triggered when a client sends Accept: text/markdown instead of Accept: text/html. It's real, standards-based, and Cloudflare now supports it natively — but independent crawler-log analysis from 2026 shows that GPTBot, ClaudeBot, and PerplexityBot rarely use it, and llms.txt is requested almost exclusively by SEO audit tools, not by AI systems. This is an emerging technique worth understanding, not yet a proven ranking or citation lever.

What content negotiation actually is

Direct answer: Content negotiation is a standard HTTP mechanism — not something invented for AI. RFC 9110, the current HTTP Semantics specification, defines it in Section 12: a single URL can have multiple representations, and the client and server negotiate which one to exchange. In "proactive" (server-driven) negotiation, the client sends preference headers — Accept, Accept-Language, Accept-Encoding — and the server picks a representation before responding.

MDN's content negotiation docs describe the same mechanism used every day for language and image-format selection: a browser sends Accept: text/html, application/xhtml+xml, application/xml;q=0.9, /;q=0.8, and the server picks the best match. If nothing acceptable exists, the server can return 406 Not Acceptable. Markdown negotiation applies the identical mechanism to a new media type: a client sends Accept: text/markdown, and a server that supports it returns Markdown instead of HTML from the same URL, rather than a separate .md file at a separate address.

text/markdown itself isn't a made-up type — it was formally registered with IANA in RFC 7763 in March 2016, with charset as a required parameter and an optional variant parameter (e.g., CommonMark, GFM) defined in the companion RFC 7764.

How it works in practice

The core exchange looks like this:

```

GET /blog/my-article HTTP/1.1

Accept: text/markdown

```

```

HTTP/1.1 200 OK

Content-Type: text/markdown; charset=utf-8

Vary: Accept

```

Two details matter more than the happy path:

  • The Vary: Accept header is not optional. Per RFC 9110 and MDN, any cache sitting between the client and your server (a CDN, a reverse proxy, a browser cache) needs to know the response varies by Accept, or it will serve the wrong representation to the next visitor. Omit Vary: Accept and you risk a Markdown response getting cached and served to a human browser, or vice versa.
  • Match the header correctly, not with a substring check. Accept headers carry comma-separated types with quality values, e.g. text/markdown;q=0.9, text/html;q=0.8. A naive accept.includes('text/markdown') mostly works, but production Accept headers from real browsers and agents are messy enough that it's worth using a proper parser rather than string matching.

A minimal Node/Express implementation:

```javascript

app.get('/blog/:slug', (req, res) => {

res.set('Vary', 'Accept');

if (req.accepts(['html', 'markdown']) === 'markdown') {

res.type('text/markdown').send(getMarkdown(req.params.slug));

} else {

res.type('text/html').send(getHtml(req.params.slug));

}

});

```

You don't have to build this yourself. Cloudflare's Markdown for Agents does the conversion at the edge: enable it on a zone, and when a request arrives with Accept: text/markdown, Cloudflare fetches your normal HTML, strips navigation/scripts/footers, converts the body to Markdown, keeps <meta> tags as YAML frontmatter and any JSON-LD as a code block, and returns it — along with x-markdown-tokens and x-original-tokens headers so a calling agent can see the token savings. It's available on Pro, Business, and Enterprise plans (free for SSL-for-SaaS customers), and it only converts HTML responses under 2 MB.

The honest adoption picture

Direct answer: This is the part most GEO content skips, and it's the part that matters most before you invest engineering time.

Cloudflare's own case study and independent testing back the mechanism's size claim: Vercel reported (Feb 3, 2026) that its blog page shrank from roughly 500 KB of HTML to 3 KB of Markdown — a 99.37% reduction — after adding content negotiation to its Next.js routes.

But size savings only matter if something requests the smaller version. Developer Dries Buytaert ran the experiment on his own site and published detailed crawler-log data: over a month of traffic, after implementing both content negotiation and dedicated Markdown URLs:

CrawlerMarkdown-file requests (of total pages fetched)
GPTBot (OpenAI)34.8% (1,177 of 3,385)
OAI-SearchBot (OpenAI)22.7% (1,300 of 5,722)
Amazonbot10.9% (1,840 of 16,872)
ClaudeBot (Anthropic)2.1% (149 of 7,144)

That's crawlers fetching dedicated .md URLs when they exist — a related but separate mechanism from Accept-header negotiation. On content negotiation specifically, his finding was blunter: "No AI crawler uses content negotiation. Not one." He also found llms.txt received 52 requests in a month, all from SEO audit tools, none from an actual AI crawler — and across Acquia's hosting fleet of roughly 400 million requests, llms.txt traffic came to about 0.001% of total volume, again dominated by SEO tooling rather than AI systems. His overall citation economics were unfavorable too: crawlers fetched roughly 1,241 pages for every one that got cited.

Separately, Checkly's February 2026 survey of the space found the practice is real but concentrated among coding agents, not general AI search crawlers: Claude Code and OpenCode were confirmed to send Accept: text/markdown by default, while ChatGPT's agent does not send that header (it can instead be identified by a separate Signature-Agent header). ChatGPT's and Claude.ai's own browsing features, along with tools like Cline and Devin, were reported as not requesting Markdown as of that survey.

Net honest read: content negotiation for Markdown is a real, standards-compliant, low-risk technique that a handful of coding-agent tools already use — but the flagship AI search crawlers (GPTBot, ClaudeBot, PerplexityBot) mostly don't request it yet, and llms.txt is being read almost entirely by SEO tools auditing your site, not by the AI systems it was built for. Treat this as infrastructure you're allowed to lay down cheaply now, not a lever proven to move citations today.

There's also an active industry disagreement about whether this practice is even advisable. Search Engine Journal reported that Google's John Mueller pushed back publicly on serving separate Markdown to LLMs, arguing models have been trained on ordinary HTML pages for years and don't need a special format; Microsoft's Fabrice Canel raised similar concerns. Proponents counter that content negotiation via Accept is not cloaking — it's the same standard mechanism sites already use for Accept-Language, and regular search crawlers still get HTML by default since they don't send Accept: text/markdown. Neither side has settled it as of this writing; if you implement this, know that it's not universally endorsed practice.

How to implement it (if you decide to)

  1. Pick your scope. Start with your highest-value, most-crawled pages (docs, key articles) rather than the whole site — this keeps maintenance burden bounded.
  2. Generate Markdown that matches the HTML. Either maintain Markdown as your source of truth and render HTML from it, or convert HTML to Markdown at request time/build time. Stale Markdown that drifts from the HTML is worse than no Markdown.
  3. Check the Accept header server-side using a proper parser (see the Express example above), not substring matching.
  4. Always send Vary: Accept on any negotiated response so caches and CDNs don't serve the wrong representation.
  5. Keep the canonical URL pointing at the HTML version (rel="canonical") so search engines don't see the Markdown as duplicate or competing content.
  6. Don't block Markdown in robots.txt if you want it to actually get fetched — a disallow rule blocks compliant AI crawlers along with everything else.
  7. Verify with curl, not assumptions: curl -H "Accept: text/markdown" https://yoursite.com/page -v and confirm you get Markdown back with the right Content-Type and Vary headers.
  8. Watch your logs, not vanity metrics. Track how many requests actually carry Accept: text/markdown for at least a month before deciding whether to expand coverage. Buytaert's data above is a reasonable baseline for what to expect: low, but not always zero.

Where this fits in a broader GEO strategy

Content negotiation is one small, cheap, standards-based piece of technical GEO — it costs little to implement on a handful of pages and does no harm even if adoption stays low. It shouldn't replace the higher-leverage work: clear direct-answer structure, real citations, crawlable content that isn't gated behind JavaScript, and tracking whether AI systems are actually citing you. nqzai's GEO tooling focuses on that measurement layer — surfacing which AI engines reference your site and where you show up in AI-generated answers — so you can see whether experiments like this one are moving anything before you invest further engineering time in them.

FAQ

Does ChatGPT read Accept: text/markdown?

Not reliably as of 2026. Checkly's survey found ChatGPT's agent does not send that header; it's identifiable instead via a separate Signature-Agent header. Its consumer browsing feature was also reported as not requesting Markdown.

Is serving Markdown to AI crawlers considered cloaking by Google?

It's disputed. Google's John Mueller has publicly criticized the practice; supporters argue standard Accept-based negotiation isn't cloaking because it's the same mechanism used for language negotiation and regular search crawlers still receive HTML. There's no settled consensus as of this writing.

What's the difference between content negotiation and llms.txt?

Content negotiation serves an alternate format of the same URL based on the Accept header. llms.txt is a separate proposed file (like robots.txt) that lists and links to Markdown versions of key pages for discovery. They're complementary, but evidence for llms.txt's real-world use by AI systems (rather than SEO audit tools) is currently weak.

Will this improve my rankings or AI citations?

There's no published evidence it does, as of 2026. The strongest documented benefit is smaller payloads for the clients that do request Markdown (coding agents), not confirmed citation or ranking gains from AI search engines.

Do I need Cloudflare to implement this?

No — it's a standard HTTP behavior you can implement in any server framework (see the Express example above). Cloudflare's Markdown for Agents just automates the conversion and edge delivery if you're already on their network.

Is text/markdown an officially registered media type?

Yes — RFC 7763 registered it with IANA in March 2016, so it's a recognized standard type, not a vendor-specific convention.