Onto API

Read the web as Markdown.

Any URL in, clean Markdown out, with an AIO score for how readable the page is to an agent. We read robots.txt first, and when a read comes back thin we say so rather than hand you an empty page.

Quick start[01]

One call, and what comes back.

1,000 free credits a month; a read is one of them. Failed reads are refunded.

requestPOST
$ curl https://api.buildonto.dev/v1/read \
    -H "Authorization: Bearer onto_sk_live_…" \
    -H "Content-Type: application/json" \
    -d '{"url": "https://stripe.com/pricing"}'
response200
{
  "status": "success",
  "url": "https://stripe.com/pricing",
  "markdown": "# Pricing & Fees\n\n> Find Stripe fees…",
  "metadata": { "title": "Pricing & Fees", … },
  "stats": {
    "raw_html_size_kb": 698.8,
    "markdown_size_kb": 16.9,
    "reduction_percent": 97.6, …
  },
  "cache": { "hit": false, "ttl_seconds": 3600 }
}

One real read of stripe.com/pricing, 24 Sep 2026. Its AIO score, 90, comes from /v1/score or /v1/read-and-score.

No key required[02]

The reader is open.

Put any URL after the host. Agents get plain Markdown; a browser gets a readable page. Same URL either way.

md.buildonto.dev/any-url, no sign-up. It's the same reader as /v1/read, with the same robots.txt check.

md.buildonto.dev/stripe.com/pricing open →
  • 30 a minuteper IP address, with no total cap and no sign-up
  • 1 houra page is cached, so a repeat doesn't fetch it again
  • No JSit reads the HTML the server sends; client-rendered pages come back flagged
Endpoints[03]

What you can call.

JSON in, JSON out, with Authorization: Bearer and your key. Scores never cost a credit.

Errors[04]

When it fails, you get a name.

Every error comes back as { "status": "error", "code", "message" } with the HTTP status below.

Your requestFix the call, the key or the plan.
400INVALID_REQUESTThe body is missing a field or malformed
400INVALID_URLNot a parseable http(s) URL, or a private address
401UNAUTHORIZEDMissing or invalid API key
402PAYMENT_REQUIREDThe plan's credits are used and there are no pack credits left
403PLAN_RESTRICTEDNot on your plan: credit packs need a paid plan
429RATE_LIMITEDThe free tier's monthly credits are used
429CONCURRENT_LIMITToo many requests in flight at once for your plan
The siteThe target said no, or isn't a page. Failed reads are refunded.
403ROBOTS_BLOCKEDIts robots.txt disallows GPTBot or every crawler, and we honour that
403WAF_BLOCKEDIt refused our fetcher (401 or 403)
404URL_NOT_FOUNDThe page 404s, or the host doesn't resolve
404NO_RESULTSMap or batch found no pages on it
415UNSUPPORTED_TYPENot a document: an image, video or archive
413TOO_LARGEThe body is over the read limit
422IMAGE_PDFA scanned PDF with no text to extract
502TLS_ERRORIts certificate is invalid
504TIMEOUTIt took more than 15 seconds to answer
UsTell us: founder@buildonto.dev
500EXTRACTION_FAILEDThe page loaded but we couldn't convert it