# Onto: make your website readable to AI agents
> Onto serves AI agents clean Markdown from your own site, at the same URL, and shows you which agents came. Plus the AIO score, a Read API and an MCP server.

**Source:** /index
**Extracted:** 2026-09-26T11:50:53.737Z

---
## The web is written for eyes. Agents don't have any.

Onto gives AI agents your pages as clean Markdown, at the same URL. People still get the full page — and agents stop guessing.

[Start free →](https://app.buildonto.dev/signup)[Read the spec](#spec)

Free tier · 1,000 credits / month · no card

ReadBatchScorefreeRead & scoreMapExtract

https://free scan

Show:MarkdownJSON

Get codeScanfree

Trystripe.com/pricingvercel.com/pricinglinear.app/pricing

The 14 agents the Serve SDK answers with Markdown

#### Answering someone now4

A person just asked about your page, and the agent is fetching it to reply.

*   ![](/_next/image?url=%2Fanthropic.png&w=48&q=75)Claude-User
*   ![](/openai.svg)ChatGPT-User
*   ![](/_next/image?url=%2Fperplexity.png&w=48&q=75)Perplexity-User
*   ![](/_next/image?url=%2Fduckduckgo.png&w=48&q=75)DuckAssistBot

#### Building AI search4

Indexing your pages so an AI search engine can cite them later.

*   ![](/_next/image?url=%2Fperplexity.png&w=48&q=75)PerplexityBot
*   ![](/openai.svg)OAI-SearchBot
*   ![](/_next/image?url=%2Famazon.png&w=48&q=75)Amazonbot
*   ![](/_next/image?url=%2Fyou.png&w=48&q=75)YouBot

#### Collecting training data6

Reading your pages into the data the next model learns from.

*   ![](/openai.svg)GPTBot
*   ![](/_next/image?url=%2Fanthropic.png&w=48&q=75)ClaudeBot
*   ![](/_next/image?url=%2Fgoogle.png&w=48&q=75)Google-Extended
*   ![](/_next/image?url=%2Fmeta.png&w=48&q=75)Meta-ExternalAgent
*   ![](/_next/image?url=%2Fbytedance.png&w=48&q=75)Bytespider
*   ![](/_next/image?url=%2Fcommoncrawl.png&w=48&q=75)CCBot

The list ships in `@ontosdk/next` and updates with it on npm. Googlebot isn't on it, so your search results don't change.

The difference\[01/07\]

### Same page.  
Two different webs.

One URL, one request. What comes back depends on who is asking. We read 5 real pricing pages on 23 Sep 2026: stripe.com/pricing is **699 KB** of HTML and **17 KB** of Markdown.

HTML, as served Markdown, as Onto serves itMeasured 23 Sep 2026 · one GET of each live page · cleaned by the engine the API runs

HTML against Markdown, measured 23 Sep 2026
| Page | HTML | Markdown | Lighter |
| --- | --- | --- | --- |
| stripe.com/pricing | 699 KB | 17 KB | 97.6% |
| vercel.com/pricing | 1,199 KB | 15.4 KB | 98.7% |
| linear.app/pricing | 801 KB | 3.4 KB | 99.6% |
| notion.com/pricing | 501 KB | 23.2 KB | 95.4% |
| github.com/pricing | 688 KB | 34.7 KB | 95% |

The cost\[02/07\]

### It doesn't fail loudly.  
It answers anyway.

An agent that can't parse your pricing page still gets asked about your pricing. It reads what it can, fills the gaps, and replies with confidence.

Asked of two agents · acme.com example“How much is Acme Pro?”

Without Onto_the agent parses your markup_

> “Acme's Pro plan is around $29 a month, I believe.”

hallucinated — the price never reached the agent

With Onto_the agent is served Markdown_

> “Acme Pro is **$20/mo** and includes 100,000 reads.”

cited — straight from the served Markdown

*   Markup arrives, not contentContent arrives, not markup
*   Declared prices get lost in the noisePrices survive as plain text
*   Gaps get filled from guessworkStructure is already declared
*   Nothing specific to citeThe URL is citable

How it works\[03/07\]

### Three ways Onto meets an agent.

On your site, through the SDK. In your agent, over MCP. In your code, through the API. Watch each one, or click a step.

Serve SDKAn agent visits your siteMCPYour agent reads a pageRead APIYour code reads a page

your edge · @ontosdk/next

GPTBot asks yoursite.com for /pricing

1.  01Who's asking
    
    A known AI crawler's User-Agent, an `Accept: text/markdown` header, or `?onto` on the URL.
    
    *   `a person`→straight through to your page — nothing changes
    *   `an agent`→carry on
    
2.  02Note the visit
    
    Sent to your dashboard without waiting, so it never slows the answer.
    
3.  03Hand over the Markdown
    
    Built from your pages at deploy time and served from your own site — nothing is extracted per request.
    
4.  04Add your context
    
    Notes you've written for the route, on Serve Pro and above.
    

Markdown for the agent, your page for everyone else

your client → api.buildonto.dev/mcp

You ask Claude, ChatGPT or Cursor about a page

1.  01You ask
    
    Your agent has no reader of its own for the page, so it looks at the tools it has.
    
2.  02It picks a tool
    
    One of Onto's six — here `read_url` and the URL.
    
3.  03The call reaches Onto
    
    Over the connector URL, signed in with your Onto account — or through the local `npx` server with a key.
    
4.  04The API call runs
    
    Each tool calls its `/v1` endpoint, so the credits are the API's, charged once.
    
5.  05Markdown comes back
    
    The agent reads the clean page and answers from it.
    

Clean Markdown in the chat, billed like any API call

api.buildonto.dev

POST /v1/read { url }

1.  01Check the key
    
    Looked up by its hash — Onto never keeps the key itself.
    
2.  02Take a credit
    
    From your month's credits. A failed read is refunded.
    
3.  03Look in the cache
    
    Kept for an hour. `"fresh": true` skips it.
    
    *   `hit`→answer from the cache
    *   `miss`→carry on
    
4.  04Check the address
    
    Public hosts only, checked again on every redirect.
    
5.  05Read robots.txt
    
    If it shuts out GPTBot or every crawler, Onto stops before fetching.
    
6.  06Fetch the page
    
    15 seconds, up to 5 redirects, 10 MB at most, no JavaScript run.
    
7.  07Clean it
    
    Through `@ontosdk/core` — the same cleaner the Serve SDK runs at build.
    
8.  08Score it
    
    An AIO score, returned by `/v1/score` and `/v1/read-and-score`.
    
9.  09Answer
    
    Cached, logged, and sent back.
    

JSON — or raw Markdown with Accept: text/markdown

Control plane\[04/07\]

### Analytics for readers who never render a pixel.

Every agent the Serve SDK answers: which one, which page, from where, and how much lighter the answer was. On Serve Pro, agents Onto can't name get their own list and everything exports to CSV.

acme.com _example_

**16**agent visits

**13**named

**3**unknown

**5.8 MB**not sent

Live feed

All_16_Named_13_Unknown_3_

1.  Perplexity-User/docs/apiJP21.3 KB ~of 498 KB~now
2.  ClaudeBot/pricingCA8.2 KB ~of 412 KB~40s
3.  Amazonbot/changelogUS5.4 KB ~of 287 KB~1m
4.  GPTBot/docs/quickstartUS11.6 KB ~of 356 KB~2m
5.  Unknown/blog/launchBR6.9 KB ~of 301 KB~2m

AIO Score\[05/07\]

### A number for how readable you are.

Starts at 100 and subtracts. Every point lost traces to a named structural fault, not a weighting nobody can audit.

acme.com _example_

**65**/ 100

Needs workmedium hallucination risk

Starts at 100 and subtracts. 3 faults, 35 points — every one traceable to a named check, no weighting to audit.

1.  robots.txt lets AI crawlers inGPTBot and \* allowed0
2.  A Markdown version existsfound — a page without one loses 250
3.  Served through the Onto SDKMarkdown found, but not served by the SDK−10
4.  Code-to-content noisenot scored — a Markdown version exists—
5.  Page under 200 KBnot scored — a Markdown version exists—
6.  JSON-LD schema markupnone found on the page−20
7.  Two or more headingsh1 / h2 / h30
8.  Every image has alt textone image missing alt−5

Spec\[06/07\]

### The numbers, without the pitch.

Tokens saved reading stripe.com/pricing

174,618

One read of the live page, cleaned by the same engine as the API · ≈4 bytes per token

**699 KB**HTML in

**17 KB**Markdown out

**97.6%**lighter

**23 Sep 2026**measured

01/readClean Markdown + metadata02/read + scoreMarkdown and its score, one call03/scoreAIO score, 0–10004/batchUp to 50 URLs · failures refunded05/mapURL list from sitemap06/extractJSON-LD, OpenGraph, meta

/v1/read

$ curl api.buildonto.dev/v1/read \\
  \-H "Authorization: Bearer onto\_sk\_…" \\
  \-d '{"url":"https://stripe.com"}'

{
  "status": "success",
  "url": "https://stripe.com",
  "markdown": "# Stripe\\n\\n…",
  "metadata": { title, description, language },
  "stats": { raw\_html\_size\_kb, markdown\_size\_kb, reduction\_percent },
}

_MCP_read\_url_Cost_1 credit

Pricing\[07/07\]

### Priced on usage, not per seat.

Start free. Every tier is the same API — only the ceiling moves.

Read APIServe

2 concurrent · hard monthly cap

$0forever

1,000 credits / month

[Start free](https://app.buildonto.dev/signup)

Includes

*   Read · Score · MCP server
*   Clean Markdown + AIO accuracy score
*   Community support

5 concurrent · top up with credits

$9/ month

10,000 credits / month

[Upgrade to Starter](https://app.buildonto.dev/read/billing)

Includes

*   Everything in Free
*   Credit packs unlock overage
*   Email support

20 concurrent · top up with credits

$49/ month

100,000 credits / month

[Upgrade to Growth](https://app.buildonto.dev/read/billing)

Includes

*   Everything in Starter
*   10× Starter's monthly credits
*   Credit packs unlock overage

50 concurrent · shared Slack

$250/ month

500,000 credits / month

[Upgrade to Scale](https://app.buildonto.dev/read/billing)

Includes

*   Everything in Growth
*   Shared Slack support
*   50 reads in flight at once

100 concurrent · unlimited sites

Customannual

No monthly cap

[Contact sales](mailto:founder@buildonto.dev)

Includes

*   Read without a monthly credit cap
*   Serve on as many sites as you run
*   Security and legal questions answered in writing

### Find out what agents actually read on your site.

Free scan. Real payload, real score, no signup.

ReadBatchScorefreeRead & scoreMapExtract

https://free scan

Show:MarkdownJSON

Get codeScanfree

Trystripe.com/pricingvercel.com/pricinglinear.app/pricing

1.  01**Scan a page**
    
    Free, right here. No signup, no key.
    
    You're here ↑
2.  02**Open the full report**
    
    Every fault and what it costs, the fixes in order, and the agent's view. Save it to your dashboard.
    
    [Open a report →](/report)
3.  03**Serve agents Markdown**
    
    Install the SDK. Agents get your pages as Markdown; people keep the page.
    
    $`npm install @ontosdk/next`

Measured by Onto · refreshed every minute

518

scans run

52/100

average AIO score

0.11 GB

of HTML read

---
## Structured Data (JSON-LD)
```json
{
  "@context": "https://schema.org",
  "@type": "AboutPage",
  "name": "About Onto",
  "url": "https://buildonto.dev/",
  "description": "Onto serves clean Markdown to AI agents instead of HTML noise. It solves the React Tax by intercepting AI bot traffic and serving optimized content at the Edge."
}
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://buildonto.dev/#org",
      "name": "Onto",
      "url": "https://buildonto.dev",
      "logo": "https://buildonto.dev/icon.png",
      "sameAs": [
        "https://x.com/buildonto",
        "https://github.com/ravixalgorithm/ontosdk"
      ]
    },
    {
      "@type": "WebSite",
      "@id": "https://buildonto.dev/#site",
      "url": "https://buildonto.dev",
      "name": "Onto",
      "publisher": {
        "@id": "https://buildonto.dev/#org"
      }
    },
    {
      "@type": "SoftwareApplication",
      "name": "Onto",
      "applicationCategory": "DeveloperApplication",
      "operatingSystem": "Web",
      "url": "https://buildonto.dev",
      "description": "Onto serves AI agents clean Markdown from your own site, at the same URL, and shows you which agents came. Plus the AIO score, a Read API and an MCP server.",
      "publisher": {
        "@id": "https://buildonto.dev/#org"
      },
      "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "USD",
        "description": "Free tier: 1,000 credits / month"
      }
    }
  ]
}
```
