Six steps, and only two of them cost anything.
Extraction is mostly bookkeeping: knowing what you have, measuring it before you price it, and being honest about what came out. Here is the whole sequence, in the order it runs.
It works out what it is looking at
A URL that points at a real file gets fetched and parsed directly. A URL that points at a page gets rendered first, because half the modern web only exists after JavaScript runs. An upload is classified by name and content type. Anything we can't parse is refused here — before a single credit moves.
0 credits · alwaysIt reads the document before it quotes you
PDFs, Word files, decks and spreadsheets are parsed locally, which costs us nothing and tells us the real page count. That is deliberate: the price depends on size, and we would rather measure than guess. Only then is the reserve placed.
0 credits · local parseCredits are reserved, then the paid work runs
2 credits per 50-page block are held from your wallet. Nothing that costs money upstream — rendering a page, running OCR, shaping JSON — happens before that hold exists.
2 credits reservedThe chrome comes off
Navigation, cookie banners, newsletter modals, share widgets, footers and legal boilerplate are separated from the document. What's left keeps its structure — headings stay headings, tables stay tables, code stays fenced.
structure preservedYou get the shape you asked for
Markdown by default. Plain text if you're indexing or embedding. JSON if you passed a schema — and any field the document didn't state comes back null, listed in missing_fields, rather than invented.
markdown · text · jsonIt settles on what the document really was
The hold is settled at the true block count and the difference refunds pool-exact. A 200-page scan with a text layer on 30 pages was quoted four blocks and pays for one. A document with no text at all pays nothing and writes no ledger row.
refund is automatic
What actually comes off
- −Navigation & chromemenus, breadcrumbs, headers, tab bars
- −Interruptionscookie banners, newsletter modals, ads
- −Boilerplatefooters, legal blocks, share widgets
- ✓The documentheadings, paragraphs, lists, tables, code
One call.
There is no job to submit, no id to poll, no webhook to receive. Extraction is synchronous: you post a source and the response is the document. If something goes wrong, the error is the response too — and the credits are already back.
Speech is the one thing that doesn't fit this shape, because its honest unit is a minute rather than a document — so it lives at transcribe.ounie.com instead, and Extractor says so rather than failing quietly.
POST /api/extract
{ "url": "https://example.com/q3-report", "format": "markdown" }
200 {
"ok": true,
"id": "9f3c…",
"doc_type": "webpage",
"metadata": {
"title": "Q3 Board Report",
"pages": 1, "billed_pages": 1,
"words": 1842, "lang": "en"
},
"markdown": "# Q3 Board Report\n\n## Revenue\n…",
"text": "Q3 Board Report\n\nRevenue\n…",
"credits": { "quoted": 2, "charged": 2, "refunded": 0 }
}Point it at something messy.
A URL, a PDF, a deck someone emailed you. Two credits, a couple of seconds, and text you can actually use.
No subscription — pay in Ounie credits