---
title: "VERCEL-NEGOTIATION-HEADERS: Markdown headers | Agent Ready Checklist"
description: "VERCEL-NEGOTIATION-HEADERS (VERCEL, Read layer): Markdown headers. What it asks, the evidence, the command that verifies it and the fix on 19 platforms."
canonical: https://agentreadychecklist.com/checklist/vercel-negotiation-headers
site: "Agent Ready Checklist"
last_updated: 2026-11-05
section: "Checklist"
---

# VERCEL-NEGOTIATION-HEADERS: Markdown headers | Agent Ready Checklist

> VERCEL-NEGOTIATION-HEADERS (VERCEL, Read layer): Markdown headers. What it asks, the evidence, the command that verifies it and the fix on 19 platforms.

Source: https://agentreadychecklist.com/checklist/vercel-negotiation-headers
Site: Agent Ready Checklist
Last reviewed: 2026-11-05
Agent endpoints: https://agentreadychecklist.com/llms.txt (index), https://agentreadychecklist.com/openapi.json (API), https://agentreadychecklist.com/mcp (MCP server), https://agentreadychecklist.com/ask (search)
Access: https://agentreadychecklist.com/auth.md (no key). Pricing: https://agentreadychecklist.com/pricing.md (free).

# VERCEL-NEGOTIATION-HEADERS: Markdown headers

VERCEL-NEGOTIATION-HEADERS is an item from the Vercel guide on the read layer: If you serve markdown by negotiation, answer Accept: text/markdown with Content-Type: text/markdown; charset=utf-8 and Vary: Accept; when markdown is unavailable, return HTML with its correct content type. It applies to sites that negotiate markdown. 19 of 19 platforms have a recipe below, 8 of them workarounds.

## The requirement

Identifier

VERCEL-NEGOTIATION-HEADERS

Level

VERCEL

Layer

Read

Applies to

sites that negotiate markdown

Checked by

Ora, matched on this site, Verify Kit markdown-negotiation

Ora check

[markdown-negotiation-vary](#ora)

The statement

If you serve markdown by negotiation, answer Accept: text/markdown with Content-Type: text/markdown; charset=utf-8 and Vary: Accept; when markdown is unavailable, return HTML with its correct content type.

## Why

-   The Vercel guide adds the Content-Type and Vary: Accept rule; the AgentReady spec text has no equivalent line.primary source, 2026-08-28: [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents), read 2026-11-04
-   Cloudflare Markdown for Agents sets Content-Type text/markdown; charset=utf-8 and adds Accept to Vary.primary source, 2026-10-09: [developers.cloudflare.com/fundamentals/reference/markdown-for-agents/](https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/), read 2026-11-04
-   is-agentic says shared caches keep its HTML and markdown representations apart through the Vary header.vendor claim, 2026-11-04: [is-agentic.com](https://is-agentic.com/), read 2026-11-04

## How to verify

### [Markdown negotiation and mirror](https://agentreadychecklist.com/kit/markdown-negotiation/)

```bash
curl -fsSL https://agentreadychecklist.com/kit/verify.sh | bash -s -- https://example.com --only=markdown-negotiation
```

Sends Accept: text/markdown and checks the response Content-Type starts with text/markdown and Vary includes Accept; separately looks for <link rel="alternate" type="text/markdown"> or a Link header.

**It cannot prove:** Does not compare the markdown to the HTML for drift; a FAIL is not a spec violation because AgentReady does not require negotiation.

### The one-line version

curl -sI -H "Accept: text/markdown" <url> | grep -i "^vary:.\*accept".

## Verify with Ora

One check in Ora's catalogue (contract 1.38.0, read 2026-11-05) read this row. Each entry says what the check looks at and why this page lists it.

-   `markdown-negotiation-vary` Markdown content negotiation (acceptmarkdown.com) Tests that the homepage serves markdown when asked and HTML for browsers, with Vary: Accept on the markdown response. A markdown route on a docs page alone does not satisfy it. A bonus check. Access, 1 point, bonus, recommended; catalogue applicability domain-only. Listed because: same file in its description, `vary accept`.

### Run just these checks

```bash
curl -s -X POST https://ora.ai/api/scan/checks -H 'content-type: application/json' -d '{"url":"https://example.com","checkIds":["markdown-negotiation-vary"]}'
```

This calls the endpoint Ora documents for re-verifying a fix. It sends no cache, returns a result for each id and no total score, and spends one scan from the daily budget. Replace the URL with yours. [How to re-verify one fix](https://agentreadychecklist.com/guides/re-verify-one-fix-with-ora/).

### Or audit the whole site

```bash
npx ax@0.10 audit https://example.com --min-score 70
```

Exit code 1 means the score is below the number you passed, so the same line gates a deploy: [the CI recipe](https://agentreadychecklist.com/guides/gate-deploys-on-agent-readiness-in-ci/). [Why this site recommends Ora, and where it falls short](https://agentreadychecklist.com/verify-with-ora/).

## Fix it on your platform

### Next.js (App Router)recipe

In the markdown Route Handler return headers { "Content-Type": "text/markdown; charset=utf-8", "Vary": "Accept" }; add Vary: Accept to the HTML route as well via next.config.js headers().

Next.js 16.x (npm latest 16.4.5, read 2026-11-04); docs at nextjs.org/docs/app. Read 2026-11-04. [nextjs.org/docs/app/api-reference/config/next-config-js/headers](https://nextjs.org/docs/app/api-reference/config/next-config-js/headers). [All Next.js (App Router) recipes](https://agentreadychecklist.com/platforms/nextjs-app-router/#vercel-negotiation-headers)

### Astrorecipe

In the .md endpoint return headers { "Content-Type": "text/markdown; charset=utf-8", "Vary": "Accept" }; in middleware append Vary: Accept to HTML responses on negotiated routes.

Astro 7.x (npm latest astro 7.4.5, @astrojs/sitemap 3.7.4, read 2026-11-04). Read 2026-11-04. [docs.astro.build/en/guides/middleware/](https://docs.astro.build/en/guides/middleware/). [All Astro recipes](https://agentreadychecklist.com/platforms/astro/#vercel-negotiation-headers)

### Nuxtrecipe

In that middleware set setResponseHeader(event, "Content-Type", "text/markdown; charset=utf-8") and "Vary", "Accept"; add Vary: Accept to HTML routes through routeRules headers.

Nuxt 4.x (npm latest nuxt 4.6.4, @nuxtjs/robots 7.0.2, @nuxtjs/sitemap 9.1.0, read 2026-11-04). Read 2026-11-04. [nuxt.com/docs/guide/concepts/rendering](https://nuxt.com/docs/guide/concepts/rendering). [All Nuxt recipes](https://agentreadychecklist.com/platforms/nuxt/#vercel-negotiation-headers)

### SvelteKitrecipe

Set headers { "Content-Type": "text/markdown; charset=utf-8", "Vary": "Accept" } on the markdown response and append Vary: Accept to the HTML response from resolve(event).

SvelteKit (npm latest @sveltejs/kit 3.1.1, read 2026-11-04); docs at svelte.dev/docs/kit. Read 2026-11-04. [svelte.dev/docs/kit/hooks](https://svelte.dev/docs/kit/hooks). [All SvelteKit recipes](https://agentreadychecklist.com/platforms/sveltekit/#vercel-negotiation-headers)

### Remix and React Router (framework mode)recipe

Set Content-Type: text/markdown; charset=utf-8 and Vary: Accept on the markdown response; return Vary: Accept from the HTML route headers export too.

React Router framework mode (npm latest react-router 8.5.1; Remix v2 @remix-run/node 2.17.5, read 2026-11-04); docs at reactrouter.com. Read 2026-11-04. [reactrouter.com/how-to/headers](https://reactrouter.com/how-to/headers). [All Remix and React Router (framework mode) recipes](https://agentreadychecklist.com/platforms/remix-react-router/#vercel-negotiation-headers)

### Plain static hosting (Netlify, Vercel static, Cloudflare Pages, GitHub Pages, S3 and CloudFront)workaround

Set the headers where the rewrite happens: in vercel.json headers add Content-Type "text/markdown; charset=utf-8" for "/(.\*).md" and Vary "Accept" for "/(.\*)". On Netlify and Pages set them in the function response. Not possible on GitHub Pages, which allows no custom headers.

Host documentation as published on 2026-11-04 (no version numbers; config files \_headers, \_redirects, vercel.json, 404.html). Read 2026-11-04. [vercel.com/docs/project-configuration/vercel-json](https://vercel.com/docs/project-configuration/vercel-json). [All Plain static hosting (Netlify, Vercel static, Cloudflare Pages, GitHub Pages, S3 and CloudFront) recipes](https://agentreadychecklist.com/platforms/static-hosting/#vercel-negotiation-headers)

### WordPress and Elementorworkaround

Wherever markdown is served, send `header('Content-Type: text/markdown; charset=utf-8'); header('Vary: Accept', false);` from send\_headers so caches keep the HTML and markdown variants apart.

WordPress 7.1.4 (core release from the version-check API), Elementor 4.3.6 (plugin directory, updated 2026-11-02), Yoast SEO 28.8 noted for llms.txt; docs read 2026-11-04. Read 2026-11-04. [developer.wordpress.org/reference/hooks/send\_headers/](https://developer.wordpress.org/reference/hooks/send_headers/). [All WordPress and Elementor recipes](https://agentreadychecklist.com/platforms/wordpress-elementor/#vercel-negotiation-headers)

### Shopify (Online Store 2.0 themes)recipe

Observed 2026-11-04: markdown responses carry `Content-Type: text/markdown; charset=utf-8` and `Vary: Accept`. Nothing to configure; re-test after theme changes.

Hosted SaaS, Online Store 2.0 Liquid themes, docs read 2026-11-04; storefront behaviour probed live on one Shopify store the same day. Read 2026-11-04. [shopify.dev/docs/storefronts/themes/architecture/templates/agents-md-liquid](https://shopify.dev/docs/storefronts/themes/architecture/templates/agents-md-liquid). [All Shopify (Online Store 2.0 themes) recipes](https://agentreadychecklist.com/platforms/shopify/#vercel-negotiation-headers)

### Webflowrecipe

With Markdown for Agents on, check `curl -sI -H 'Accept: text/markdown' https://example.com/ | grep -iE 'content-type|vary'`; webflow.com itself returned text/markdown and `vary: accept-encoding, accept` on 2026-11-04.

Hosted SaaS, help center articles read 2026-11-04 (updated dates 2024-10-14 to 2026-10-29). Read 2026-11-04. [help.webflow.com/hc/en-us/articles/50435871026195-Markdown-for-AI-agents](https://help.webflow.com/hc/en-us/articles/50435871026195-Markdown-for-AI-agents). [All Webflow recipes](https://agentreadychecklist.com/platforms/webflow/#vercel-negotiation-headers)

### Framerrecipe

Nothing to set; framer.com returned `content-type: text/markdown; charset=utf-8` with `vary: Accept-Encoding, Accept` on 2026-11-04. Re-check on your domain.

Hosted SaaS, help articles read 2026-11-04 (marked updated 2026-09-15). Read 2026-11-04. [framer.com/help/articles/make-site-readable-by-ai-agents/](https://www.framer.com/help/articles/make-site-readable-by-ai-agents/). [All Framer recipes](https://agentreadychecklist.com/platforms/framer/#vercel-negotiation-headers)

### Wix (Wix Editor and Wix Studio)workaround

Wix does not expose response header settings (its documentation notes). Not possible on this platform without outside help. Workaround: a proxy or CDN in front of the site that answers Accept: text/markdown with Content-Type text/markdown; charset=utf-8 and Vary: Accept, and leaves HTML as the default.

Hosted SaaS, help center read 2026-11-04. Generic step from the AgentReady specification; not platform-specific. [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents). [All Wix (Wix Editor and Wix Studio) recipes](https://agentreadychecklist.com/platforms/wix/#vercel-negotiation-headers)

### Squarespace (version 7.1)workaround

Squarespace has no markdown negotiation setting (its documentation notes). Not possible on this platform without outside help. Workaround: a proxy or CDN in front of the site that answers Accept: text/markdown with Content-Type text/markdown; charset=utf-8 and Vary: Accept, and leaves HTML as the default.

Hosted SaaS, version 7.1 sites, help center read 2026-11-04 (articles updated 2026-07-17 to 2026-11-03). Generic step from the AgentReady specification; not platform-specific. [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents). [All Squarespace (version 7.1) recipes](https://agentreadychecklist.com/platforms/squarespace/#vercel-negotiation-headers)

### HubSpot CMS (Content Hub)workaround

HubSpot-hosted pages have no markdown negotiation (its documentation notes). Not possible on this platform without outside help. Workaround: a proxy or CDN in front of the site that answers Accept: text/markdown with Content-Type text/markdown; charset=utf-8 and Vary: Accept, and leaves HTML as the default.

Hosted SaaS, Content Hub, knowledge base and developer docs read 2026-11-04. Generic step from the AgentReady specification; not platform-specific. [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents). [All HubSpot CMS (Content Hub) recipes](https://agentreadychecklist.com/platforms/hubspot-cms/#vercel-negotiation-headers)

### Docusaurusworkaround

With Cloudflare Markdown for Agents in front, markdown responses get Content-Type: text/markdown; charset=utf-8 and Vary includes Accept. On other hosts set Vary: Accept in the edge function that serves markdown.

3.10.2 (npm @docusaurus/core latest, read 2026-11-04). Read 2026-11-04. [developers.cloudflare.com/fundamentals/reference/markdown-for-agents/](https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/). [All Docusaurus recipes](https://agentreadychecklist.com/platforms/docusaurus/#vercel-negotiation-headers)

### Mintlifyrecipe

Automatic: markdown responses carry content-type: text/markdown; charset=utf-8 and Vary including Accept (and User-Agent).

Hosted SaaS, docs read 2026-11-04. Read 2026-11-04. [mintlify.com/docs/ai/markdown-export](https://mintlify.com/docs/ai/markdown-export). [All Mintlify recipes](https://agentreadychecklist.com/platforms/mintlify/#vercel-negotiation-headers)

### GitBookrecipe

Automatic: markdown responses carry content-type text/markdown; charset=utf-8 and Vary includes Accept (live 2026-11-04).

Hosted SaaS, docs read 2026-11-04. Read 2026-11-04. [gitbook.com/docs/getting-started/llm-ready-docs](https://gitbook.com/docs/getting-started/llm-ready-docs). [All GitBook recipes](https://agentreadychecklist.com/platforms/gitbook/#vercel-negotiation-headers)

### ReadMerecipe

Automatic with Markdown for Agents: live responses on 2026-11-04 carried text/markdown; charset=utf-8 and Vary: Accept.

Hosted SaaS, docs read 2026-11-04. Read 2026-11-04. [docs.readme.com/main/docs/ai-ready-docs](https://docs.readme.com/main/docs/ai-ready-docs). [All ReadMe recipes](https://agentreadychecklist.com/platforms/readme/#vercel-negotiation-headers)

### Salesforce B2C Commerce (SFRA and PWA Kit / Composable Storefront)workaround

If a Worker serves markdown, set Content-Type: text/markdown; charset=utf-8 and Vary: Accept on that response; Cloudflare Markdown for Agents does this for you.

Hosted SaaS (B2C Commerce help release 264.0.0); PWA Kit retail-react-app 10.3.0 and pwa-kit-runtime 3.21.0 on npm, read 2026-11-04. Read 2026-11-04. [developers.cloudflare.com/fundamentals/reference/markdown-for-agents/](https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/). [All Salesforce B2C Commerce (SFRA and PWA Kit / Composable Storefront) recipes](https://agentreadychecklist.com/platforms/salesforce-commerce-cloud/#vercel-negotiation-headers)

### Adobe Commerce and Magento Open Sourceworkaround

Whatever serves markdown must set Content-Type: text/markdown; charset=utf-8 and Vary: Accept; on cloud add Vary in a Fastly snippet so cached HTML is not served to markdown requests.

2.4.9 (GitHub tag published 2026-05-12; 2.4.10-alpha1 tagged 2026-10-13); release notes read 2026-11-04. Read 2026-11-04. [experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/cdn/fastly](https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/cdn/fastly). [All Adobe Commerce and Magento Open Source recipes](https://agentreadychecklist.com/platforms/adobe-commerce/#vercel-negotiation-headers)

## What it does not do

-   Does not require negotiation; it only governs it when you do it.

## Common mistakes

-   CDN caches the markdown variant and serves it to browsers because Vary is missing.

## Related

-   Term: [Vary: Accept](https://agentreadychecklist.com/glossary/vary-accept/)

## Sources

-   [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents)read 2026-11-04
-   [developers.cloudflare.com/fundamentals/reference/markdown-for-agents/](https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/)read 2026-11-04
-   [is-agentic.com](https://is-agentic.com/)read 2026-11-04
-   [nextjs.org/docs/app/api-reference/config/next-config-js/headers](https://nextjs.org/docs/app/api-reference/config/next-config-js/headers)read 2026-11-04
-   [docs.astro.build/en/guides/middleware/](https://docs.astro.build/en/guides/middleware/)read 2026-11-04
-   [nuxt.com/docs/guide/concepts/rendering](https://nuxt.com/docs/guide/concepts/rendering)read 2026-11-04
-   [svelte.dev/docs/kit/hooks](https://svelte.dev/docs/kit/hooks)read 2026-11-04
-   [reactrouter.com/how-to/headers](https://reactrouter.com/how-to/headers)read 2026-11-04
-   [vercel.com/docs/project-configuration/vercel-json](https://vercel.com/docs/project-configuration/vercel-json)read 2026-11-04
-   [developer.wordpress.org/reference/hooks/send\_headers/](https://developer.wordpress.org/reference/hooks/send_headers/)read 2026-11-04
-   [shopify.dev/docs/storefronts/themes/architecture/templates/agents-md-liquid](https://shopify.dev/docs/storefronts/themes/architecture/templates/agents-md-liquid)read 2026-11-04
-   [help.webflow.com/hc/en-us/articles/50435871026195-Markdown-for-AI-agents](https://help.webflow.com/hc/en-us/articles/50435871026195-Markdown-for-AI-agents)read 2026-11-04
-   [framer.com/help/articles/make-site-readable-by-ai-agents/](https://www.framer.com/help/articles/make-site-readable-by-ai-agents/)read 2026-11-04
-   [mintlify.com/docs/ai/markdown-export](https://mintlify.com/docs/ai/markdown-export)read 2026-11-04
-   [gitbook.com/docs/getting-started/llm-ready-docs](https://gitbook.com/docs/getting-started/llm-ready-docs)read 2026-11-04
-   [docs.readme.com/main/docs/ai-ready-docs](https://docs.readme.com/main/docs/ai-ready-docs)read 2026-11-04
-   [experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/cdn/fastly](https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/cdn/fastly)read 2026-11-04
-   [ora.ai/api/checks, contract 1.38.0](https://ora.ai/api/checks?utm_source=agentreadychecklist.com&utm_medium=referral&utm_campaign=requirement)read 2026-11-05
-   [ora.ai/llms-full.txt](https://ora.ai/llms-full.txt?utm_source=agentreadychecklist.com&utm_medium=referral&utm_campaign=requirement)read 2026-11-05
-   [registry.npmjs.org/ax, the ax README](https://registry.npmjs.org/ax)read 2026-11-05

Verify with Ora

The scanner this site recommends for the whole checklist. 132 checks, a score out of 100, no account.

`npx ax@0.10 audit <url> --min-score <n>`

[Why Ora, and its limits](https://agentreadychecklist.com/verify-with-ora/)

Fix it on

-   [Next.js (App Router)recipe](#p-nextjs-app-router)
-   [Astrorecipe](#p-astro)
-   [Nuxtrecipe](#p-nuxt)
-   [SvelteKitrecipe](#p-sveltekit)
-   [Remix and React Router (framework mode)recipe](#p-remix-react-router)
-   [Plain static hosting (Netlify, Vercel static, Cloudflare Pages, GitHub Pages, S3 and CloudFront)workaround](#p-static-hosting)
-   [WordPress and Elementorworkaround](#p-wordpress-elementor)
-   [Shopify (Online Store 2.0 themes)recipe](#p-shopify)
-   [Webflowrecipe](#p-webflow)
-   [Framerrecipe](#p-framer)
-   [Wix (Wix Editor and Wix Studio)workaround](#p-wix)
-   [Squarespace (version 7.1)workaround](#p-squarespace)
-   [HubSpot CMS (Content Hub)workaround](#p-hubspot-cms)
-   [Docusaurusworkaround](#p-docusaurus)
-   [Mintlifyrecipe](#p-mintlify)
-   [GitBookrecipe](#p-gitbook)
-   [ReadMerecipe](#p-readme)
-   [Salesforce B2C Commerce (SFRA and PWA Kit / Composable Storefront)workaround](#p-salesforce-commerce-cloud)
-   [Adobe Commerce and Magento Open Sourceworkaround](#p-adobe-commerce)

Last reviewed 2026-11-05. AgentReady v2.0, read 2026-11-04.
