# Content negotiation

> One URL, two answers: how a request gets Markdown or HTML, on your site and on these docs.

Source: https://docs.buildonto.dev/concepts/negotiation
Section: Concepts

---

Content negotiation\[01\]

## Content negotiation

One URL, two answers. People get the page; agents that ask for Markdown get Markdown — no separate site to keep in step.

### Try it on these docs

\[02\]

These docs negotiate too. Ask for the Quickstart three ways:

As a browserAccept: text/markdown.md on the URL

Pick one — it really asks this site.

### The signals

\[03\]

SignalYour site (Serve SDK)These docs

A known agent's user-agentYes — 42 names, plain curl among themNo

`Accept: text/markdown`Yes — anywhere in the headerYes

`?onto` on the URLYes, and it says so in X-Onto-DebugNo

`.md` on the URLNo — dotted paths pass throughYes

### On your site

\[04\]

Try any request against a site running the Serve SDK:

GET /pricing

GPTBotClaudeBotA browserPlain curlLink previewGooglebot

Accept: text/markdown?onto on the URL_to see what agents get_Your siteRoute has a prebuilt .md_only prerendered pages do_Site key setServe Pro or above, with context for /pricing

1.  Asking for Markdown — user-agent matches GPTBot (OpenAI)
2.  Note the visit — sent without waiting
3.  Fetch /.onto/pricing.md from your own site
4.  Add your context — asked, but Free gets nothing back

HTTP/1.1 200
Content-Type: text/markdown; charset=utf-8
Cache-Control: no-store, must-revalidate
Vary: User-Agent, Accept
X-Onto-Trace: GPTBot/1.2 (+https://openai.com/gptbot)
X-Onto-Bot: GPTBot (OpenAI)
X-Onto-Matched: true

\# Pricing

> Plans and what each includes

\*\*Source:\*\* /pricing
…

### What comes back

\[05\]

WhenYou get

Markdown, from your site`text/markdown`, `Cache-Control: no-store`, `Vary: User-Agent, Accept`, and `X-Onto-*` headers naming the agent

Asked, but no .md for the routeYour page as HTML, as if nothing had asked

Anyone else, on your siteYour page, plus `Vary` and `X-Onto-Identified: false`

Markdown, from these docs`text/markdown`, cached for an hour, with `x-onto-source` naming the page

**Search engines still get HTML.** Googlebot and Bingbot aren't on the agent list, so your pages index exactly as before.

Copy as Markdown[](/concepts/negotiation.md "Open the raw Markdown")

---
## Structured Data (JSON-LD)
```json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Onto Docs",
  "url": "https://docs.buildonto.dev",
  "description": "How to use Onto: serve AI agents Markdown from your Next.js site, call the Read API, connect over MCP, and read the AIO score.",
  "inLanguage": "en",
  "publisher": {
    "@type": "Organization",
    "name": "Onto",
    "url": "https://buildonto.dev"
  }
}
```