StructuredWeb
Structured extraction · pay per URL

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.

vercel.com/pricingYOUR SCHEMA, FILLED{"name": "Pro","price": 20,"features": ["Spend management","Free custom domain"],"cta": "Start a free trial"}valid: true
4 credits per URLNo subscription — pay in Ounie creditsStrict mismatch = refunded
01Schema-first

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 tablesplan name, monthly price, seat limits, what each tier includes

  • team rostersname, title, bio, headshot URL, LinkedIn

  • product listsSKU, title, price, currency, availability, image

  • job postsrole, location, salary band, remote policy, apply URL

  • changelogsversion, date, added / fixed / changed, breaking flag

  • anything elseif you can write the schema, it can fill it

REQUEST
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"]
  }
}
RESPONSE
{
  "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" }
    ]
  }
}
02Strict mode

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.

page yields every required key{ "name": "Pro", "price": 20 }VALIDATEvalidsettled4 creditsRUN Apage never states a price{ "name": "Pro" } missing: priceVALIDATEthinrefunded0 creditsRUN B
valid: true

Every required field present and correctly typed. Settles, and lands in your run history with the object attached.

valid: false

You still get the partial object and a missing_fields list — useful for deciding whether to loosen the schema. Under strict, not charged.

error

The page was unreachable, empty, or blocked. Never charged, on either rail, in either mode.

03For developers & AI agents

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.

RESTBearer sjs_live_…MCP/api/mcpx402USDC on BaseEXTRACTVALIDATEvalidatedJSON
REST

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.

REST reference →
MCP

/api/mcp for Claude, Cursor, ChatGPT and the Ounie AI Team. Tools: extract_structured, check_schema, get_run, get_pricing.

MCP reference →
x402

POST /api/x402/extract — $0.048 in USDC on Base, per URL, no account. Verified first, settled only on a billable result.

x402 reference →
curl
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.

04Credit math

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
A five-URL run, billed honestly
ONE RUN · 5 URLSreserved20 crstripe.com/pricing3 plans4 crlinear.app/pricing4 plans4 cracme.io/pricingno price on pagevercel.com/pricing3 plans4 croldsite.net/planspage unreachablecharged 3 of 58 cr returned12 cr
05Questions

The parts people ask about twice.

What happens when the page doesn't have what my schema asks for?
Under 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?
The difference is the last step. A prompt gives you whatever JSON the model felt like emitting; here your schema is checked field by field before anything settles, and the verdict is returned with the data. You never have to write the “did I actually get what I asked for” check — and you never pay for a run that fails it.
Which JSON Schema keywords are enforced?
A draft-07 subset that covers what extraction schemas use: types (including unions and 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?
Yes — 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?
Up to 25 per run on the credit rail. Each URL is its own billable unit: the run reserves 25 × 4 credits up front and settles only the ones that came back billable. The x402 rail is one URL per call.
Do I pay to read a run again?
No. Listing runs, re-reading extracted JSON, and testing a schema are all free.

Write the schema. We'll go and fill it.

Sign in with your Ounie account and your first extraction is four credits away.