Your schema,
filled. From any URL.
Agents don't want raw HTML. They want their schema, filled. Give this a URL and the JSON Schema you want back, and get validated JSON — pricing tables, team rosters, product lists, job posts, anything you can describe.
You define the shape. The page has to fit it.
Every other extraction tool hands you its idea of the page and leaves you to reshape it. Here the schema is the request, not the response — the same object comes back from a Shopify listing, a Notion page and a 2011 WordPress site, because the shape was never theirs to choose.
pricing tables — plan name, monthly price, seat limits, what each tier includes
team rosters — name, title, bio, headshot URL, LinkedIn
product lists — SKU, title, price, currency, availability, image
job posts — role, location, salary band, remote policy, apply URL
changelogs — version, date, added / fixed / changed, breaking flag
anything else — if you can write the schema, it can fill it
POST /api/extract { "url": "https://vercel.com/pricing", "schema": { "type": "object", "properties": { "plans": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "number" }, "cta": { "type": "string" } }, "required": ["name", "price"] } } }, "required": ["plans"] } }
{ "valid": true, "missing_fields": [], "billed": true, "credits_spent": 4, "data": { "plans": [ { "name": "Hobby", "price": 0, "cta": "Start deploying" }, { "name": "Pro", "price": 20, "cta": "Start a free trial" } ] } }
A result that fails your schema is not a result.
So it isn't billed. Validation happens before the money moves, on both rails — on credits the run refunds, and on x402 the payment is verified but never settled. That is the whole reason the validator is ours and not a prompt's opinion.
Every required field present and correctly typed. Settles, and lands in your run history with the object attached.
You still get the partial object and a missing_fields list — useful for deciding whether to loosen the schema. Under strict, not charged.
The page was unreachable, empty, or blocked. Never charged, on either rail, in either mode.
Three doors. One guarantee behind all of them.
The same extractor and the same validator serve a curl, an MCP tool call, and a keyless wallet. Pick the door that suits the caller.
POST /api/extract with a Bearer key from your console. Session cookie, Authorization header, or ?api_key= — all three resolve the same owner and draw the same wallet.
/api/mcp for Claude, Cursor, ChatGPT and the Ounie AI Team. Tools: extract_structured, check_schema, get_run, get_pricing.
POST /api/x402/extract — $0.048 in USDC on Base, per URL, no account. Verified first, settled only on a billable result.
curl -X POST https://sitejson.ounie.com/api/extract \
-H "Authorization: Bearer sjs_live_…" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/pricing",
"schema": { "type": "object",
"properties": { "price": { "type": "number" } },
"required": ["price"] }
}'Short on credits? The call is refused with a 402 and a top-up link. An agent can never overdraw.
4 credits a URL. Nothing else.
One credit is one cent, drawn from the same Ounie wallet every app shares. A run reserves for every URL you sent and settles only the ones that came back billable — the rest are returned, pool for pool, the moment the run ends.
- One URL
- $0.044 cr
- Ten URLs
- $0.4040 cr
- Batch cap (25 URLs)
- $1.00100 cr
- Reading a finished run
- foreverfree
- Testing a schema
- no upstream callfree
- Strict mismatch
- refunded0 cr
The parts people ask about twice.
What happens when the page doesn't have what my schema asks for?
strict: true (the default) that URL is a thin result: you get the partial object back with valid: false and a missing_fields list, and you are not charged for it. Under strict: false the partial object is charged, because you asked for whatever it could find.Is this just a scraper with a prompt on top?
Which JSON Schema keywords are enforced?
nullable), properties, required, items (schema and tuple), enum, const, string and number bounds, additionalProperties, and anyOf/oneOf/allOf/not. $ref and if/then are not — and the response says so rather than quietly ignoring them. Full list in the docs.Can an AI agent use this without an Ounie account?
POST /api/x402/extract takes USDC on Base per call at $0.048, no key and no signup. Payment is verified before the extraction runs and settled only if the result is billable, so a strict mismatch costs the agent nothing there too.How many URLs can one call handle?
Do I pay to read a run again?
Write the schema. We'll go and fill it.
Sign in with your Ounie account and your first extraction is four credits away.