Read the web as Markdown.
Any URL in, clean Markdown out, with an AIO score telling you how readable that page is to an agent. We honour robots.txt, and we tell you when a read came back thin instead of handing you an empty page.
Quick start
$ curl https://api.buildonto.dev/v1/read \ -H "Authorization: Bearer onto_sk_live_..." \ -H "Content-Type: application/json" \ -d '{"url": "https://stripe.com/pricing"}'
No key required
The reader is open. Put any URL after the host and read it straight away —
md.buildonto.dev/example.com. Plain text for agents, a readable page in a browser. Same URL either way.Endpoints
| Method | Path | Returns |
|---|---|---|
| POST | /v1/read | Any URL to clean Markdown |
| POST | /v1/score | AIO score — how readable a page is to an agent |
| POST | /v1/read-and-score | Both, in one round trip |
| POST | /v1/batch | Many URLs in one call |
| POST | /v1/map | Discover the URLs on a site |
| POST | /v1/extract | Structured data from a page |
| GET | /v1/usage | Your quota and consumption |
| GET | /mcp | Hosted MCP endpoint for Claude and ChatGPT |
Errors
| Code | HTTP | Meaning |
|---|---|---|
| UNAUTHORIZED | 401 | Missing or invalid API key |
| INVALID_URL | 400 | Unparseable, non-http, or a private address |
| URL_NOT_FOUND | 404 | Target 404ed, or the host does not resolve |
| ROBOTS_BLOCKED | 403 | The site disallows AI crawlers — we honour that |
| WAF_BLOCKED | 403 | The site refused our crawler |
| UNSUPPORTED_TYPE | 415 | Not a document — image, video, archive |
| TOO_LARGE | 413 | Body exceeds the read limit |
| IMAGE_PDF | 422 | Scanned PDF with no extractable text |
| TLS_ERROR | 502 | The site's certificate is invalid |
| TIMEOUT | 504 | The site took too long |
| RATE_LIMITED | 429 | Monthly quota exceeded |
| PAYMENT_REQUIRED | 402 | Quota exceeded and credits are empty |