PDF data extraction into your own fields
Describe the values you need, such as an invoice number, a policy start date or every line item, and PdfParse returns them as typed fields from any PDF or scan. No templates per supplier and no coordinates to maintain. Each value arrives with a confidence score and the page it was read from.
Try a schema on your own document
Drop a file, then type the fields you want in the Fields to extract box and watch them fill in on page one.
What one call returns
Page one rendered with every block outlined, next to the JSON your code receives.
- Reading text layer
- Detecting layout
- Extracting tables
- Building JSON
Headings, paragraphs, tables and totals detected
Portsmouth, NH 03801
| Description | Qty | Unit | Amount |
|---|---|---|---|
| Oak countertop, 2.4 m | 2 | 640.00 | 1,280.00 |
| Cabinet doors, shaker | 12 | 85.00 | 1,020.00 |
| On site fitting | 1 | 450.00 | 450.00 |
Quote the invoice number with your transfer.
Goods remain ours until paid in full.
Pages 2 and later are parsed after you create an account.
{ "document": { "pages": 2, "parsed_pages": 1, "language": "en" }, "pages": [ { "number": 1, "blocks": [ { "type": "heading", "text": "Invoice", "bbox": [48, 52, 132, 84] }, { "type": "paragraph", "text": "Harbor Street Joinery, 14 Dock Lane, Portsmouth" }, { "type": "key_value", "pairs": { "Invoice no.": "INV-2026-0418", "Issued": "Oct 14, 2026", "Due": "Nov 13, 2026" } }, { "type": "table", "columns": ["Description", "Qty", "Unit", "Amount"], "rows": [ ["Oak countertop, 2.4 m", 2, 640.00, 1280.00], ["Cabinet doors, shaker", 12, 85.00, 1020.00], ["On site fitting", 1, 450.00, 450.00] ] }, { "type": "total", "label": "Total due", "value": 2983.75, "currency": "USD", "confidence": 0.98 } ] } ], "fields": { "invoice_number": { "value": "INV-2026-0418", "confidence": 0.99, "page": 1 }, "total": { "value": 2983.75, "confidence": 0.98, "page": 1 }, "due_date": { "value": "2026-11-13", "confidence": 0.97, "page": 1 } } }
Downloads from the demo include a watermark field and cover page one only.
Page one is parsed in your browser, so your file never reaches our servers.
One demo per day from this network. Create an account to parse more pages.
$ curl https://api.pdfparse.ai/v1/parse \ -H "Authorization: Bearer $PDFPARSE_API_KEY" \ -F file[email protected] \ -F outputs=json,markdown,csv
Named, typed values instead of raw text
A schema is a list of fields. Each field has a name, a type and an optional description in plain English that tells the parser what to look for. The response returns a fields object with one entry per field, so your code reads result.fields.total_due instead of searching through text.
- Types string, number, date, money, boolean and array, with arrays of objects for line items
- Dates normalized to ISO format, money returned as a decimal string with its currency
- A confidence value for each field, so you can set your own review threshold
- The source page of each value, for audit trails and review screens
- Null for anything the document does not contain, never a guessed value
{
"fields": {
"supplier_name": {"value": "Northwind Components", "confidence": 0.98, "page": 1},
"invoice_date": {"value": "2024-05-14", "confidence": 0.99, "page": 1},
"total_due": {"value": "18240.50", "currency": "USD", "confidence": 0.97, "page": 2},
"line_items": {"value": [
{"sku": "NW-220", "quantity": 40, "amount": "9600.00"},
{"sku": "NW-310", "quantity": 12, "amount": "8640.50"}
], "confidence": 0.95, "page": 2}
}
}
From schema to clean data
-
1
Create a schema once with POST /v1/schemas, or build it in the web app with a form.
-
2
Send documents to /v1/parse with the schema_id, one by one or as a batch of up to 500 files.
-
3
The parser reads layout, tables and OCR text, then locates each field using its name, type and description.
-
4
Values are normalized to their type, scored and returned in fields along with the full document JSON.
-
5
Low confidence fields can be sent to a review queue in your own system before import.
Extraction that holds up when the layout changes
Template based tools break the moment a supplier moves the total to a new spot. A schema describes meaning, not position, so a new layout does not need a new rule.
- Values inside multi column layouts are found in the right column, not taken from the neighbour.
- Line items are read from tables with merged cells and from tables that continue onto a second page.
- Scanned and photographed documents go through OCR before fields are located.
- Rotated pages and landscape inserts are straightened before the search for fields.
- Text in running headers and footers, such as a page total or a reference repeated on every page, is weighed separately from the body.
Create a schema and use it
The first call defines the fields. The second applies them to a document. Keep the schema_id and reuse it for every file of that kind.
curl https://api.pdfparse.ai/v1/schemas \
-H "Authorization: Bearer pp_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "supplier_invoice",
"fields": [
{"name": "supplier_name", "type": "string", "description": "Company that issued the invoice"},
{"name": "invoice_date", "type": "date"},
{"name": "total_due", "type": "money", "description": "Amount payable including tax"},
{"name": "line_items", "type": "array", "description": "Each billed line with sku, quantity and amount"}
]
}'
import os
from pdfparse_ai import PdfParse
client = PdfParse(api_key=os.environ["PDFPARSE_API_KEY"])
result = client.parse("northwind-0514.pdf", outputs=["json"], schema_id="sch_supplier_invoice")
needs_review = [name for name, f in result.fields.items() if f["confidence"] < 0.9]
print(result.fields["total_due"]["value"], needs_review)
Who builds on schema extraction
- Accounts payable teams capturing invoice headers and line items without per supplier templates.
- Lending and insurance operations reading applications, statements and declarations pages.
- Logistics teams pulling shipment numbers, weights and consignee details from bills of lading.
- Software vendors adding document upload to their own product and showing the extracted fields to their users.
Schemas start on Growth
Custom extraction schemas are included from Growth at $149 a month, or $74 a month billed yearly, with up to 10 schemas, webhooks and batch jobs. Scale at $499 a month allows unlimited schemas and adds form field and checkbox detection, which matters for applications and claim forms. Starter at $49 a month covers block JSON, tables and OCR without schemas. Compare plans on pdf extraction api pricing.
- Starter 2,000 pages, 1 API key, 1 seat $49 per month $24 per month, $288 billed yearly
- Growth 7,000 pages, 5 API keys, 3 seats $149 per month $74 per month, $888 billed yearly
- Scale 24,000 pages, 20 API keys, 10 seats $499 per month $249 per month, $2,988 billed yearly
- Enterprise 72,000 pages, unlimited API keys with per key limits, 25 seats $1,499 per month $749 per month, $8,988 billed yearly
FAQ
Do I need a template for each supplier or form?
No. A schema describes what a field means, so the same schema works across layouts. Add a description when a field name alone is ambiguous.
How do I handle values the parser is unsure about?
Every field has a confidence value. Set a threshold in your code and send anything below it to a person, while the rest flows straight into your system.
Can a schema extract repeating rows?
Yes. Use the array type with a description of the row, and you get one object per line item, even when the table spans several pages.
Can operations staff build schemas without code?
Yes. The web app has a schema editor, an upload screen and a CSV export of the extracted fields, all on the same engine as the API.
How many schemas can I keep?
Growth includes up to 10 schemas. Scale and Enterprise allow an unlimited number.
Define your first schema
Sign up, describe the fields you need and run them on a real document in minutes.