Four steps, and one of them
is the whole product.
The first three are what any extraction tool does. The fourth — checking the result against your schema before charging you for it — is the reason this exists.
From a URL to a checked object.
- 01
You write the schema
A plain JSON Schema object — the shape you want back. Test it free against a sample first if you like; the playground runs the exact validator that decides billing.
- 02
We read the page
The URL is rendered like a browser would render it, then reduced to clean text — navigation, cookie bars and ad slots stripped. JavaScript-built pages work; a login wall does not.
- 03
The text is fitted to your schema
A model reads that text with your schema in front of it and returns one object. Its standing instruction is to omit a field the page never states rather than guess it — a guess would pass validation and be wrong.
- 04
The object is validated, then billed
Field by field against your schema. Valid, and the URL settles 4 credits. Invalid under strict, and it refunds — you still get the partial object and the list of what was missing.
Strict mode, drawn.
Two runs that did exactly the same work upstream. Only one of them is a result, so only one of them is charged.
Set strict: false when a partial answer is still worth money to you — surveying two hundred competitor pages where half will be missing a field anyway, say. Every URL that produced any data is then charged, and valid plus missing_fields still come back so you can sort the complete rows from the ragged ones yourself. Leave it on when you are feeding a pipeline that will break on a null.
Reserved for all. Settled for some.
Send up to 25URLs in one call. The billable unit is still one URL: the run reserves for the whole list up front so it can never overdraw mid-flight, then returns everything it didn't earn.
Everything you need to decide what to do next.
Each URL comes back with its object, its verdict, and — when the verdict is no — the exact fields that were missing. Nothing is hidden behind a status code.
{ "url": "https://acme.io/pricing", "final_url": "https://acme.io/pricing", "title": "Pricing — Acme", "data": { "name": "Growth" }, "valid": false, "missing_fields": ["price"], "errors": ["price: required property is missing"], "used_tokens": 4180, "billed": false, // strict mode: not charged "error": null }