extractor
How it works

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.

  1. 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 · always
  2. It 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 parse
  3. Credits 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 reserved
  4. The 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 preserved
  5. You 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 · json
  6. It 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
Step 04, in detail

What actually comes off

strippedmenusstrippedcookie bannersstrippedfooterskeptheadings
  1. Navigation & chrome
    menus, breadcrumbs, headers, tab bars
  2. Interruptions
    cookie banners, newsletter modals, ads
  3. Boilerplate
    footers, legal blocks, share widgets
  4. The document
    headings, paragraphs, lists, tables, code
The whole thing

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.

request → response2 credits
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