PDFCraft
Extraction guide

Extract a aged receivables report PDF to JSON

Everything below is the response the live API returned for a aged receivables report, generated when this page was built. Not a description of what it would return — the output itself, including what it scored low on.

Who this is for

Credit control, factoring and cash-flow forecasting tools reading a report the accounting system will only export as PDF.

The job, in the words people search for: “parse an aged debtors report from a PDF”.

What makes this shape awkward

Five ageing buckets across the page, most of them empty on any given row — a customer owing money in one bucket has four blank cells. This is the shape that breaks any extractor grouping rows by how many cells they contain.

The measured result

Pages read1
Time7 ms (7 ms/page)
Labelled fields found unprompted3
Tables1 (18 rows)
Inputaged-receivables.pdf (31 KB — synthetic, generated from a spec in the repo; real documents of this type cannot be published)

Fields, with a schema

Ask for the fields you want by the label printed on the page. Each answer carries the text exactly as printed (raw), the value coerced to the type you asked for, a confidence, and a bounding box you can draw on the page to check it.

curl -X POST https://api.pdfcraft.dev/v1/extract \
  -H "Authorization: Bearer $PDFCRAFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "file": "<base64 of your aged receivables report>",
    "schema": {
      "as_at": "date",
      "total_outstanding": "currency"
    }
  }'

What came back

Fieldrawvalueconfidence
as_at2026-03-31"2026-03-31"70%
total_outstandingGBP 184,402.18184402.18 GBP70%

Every label it found without being asked

Send no schema and you get all of these, keyed by the label as printed. Useful for discovering what a new supplier’s layout actually contains before you write a schema against it.

As At, Currency, Total Outstanding

Tables

Customer · Current · 1-30 · 31-60 · 61-90 · 90+ · 18 rows × 6 columns · page 1

Table confidence 70%. Header confidence 60% — the first row was promoted out of the data.

CustomerCurrent1-3031-6061-9090+
Meridian Foods—8,973.00———
Caldera Print———3,439.00—
Orbit Logistics———3,077.00—

First 3 of 18 rows.

With options.rows_as_objects, the same row keyed by its header:

{
  "Customer": "Meridian Foods",
  "Current": "",
  "1-30": "8,973.00",
  "31-60": "",
  "61-90": "",
  "90+": ""
}

What this does not do

Try it on your own aged receivables report

The playground takes a file and shows the same JSON, with every bounding box drawn over the page. No key and no signup for the first few; a free key gives you 100 pages a month.

Related