Receipt OCR API for expense workflows
Employees photograph receipts at odd angles, under bad light, on crumpled thermal paper. PdfParse reads the photo or the PDF and returns the merchant, date, payment method, tax, total and each purchased item as typed JSON your expense app can store and check.
Try a receipt before you create an account
Drop a phone photo or a PDF receipt and see the extracted fields, the Markdown text and the item table as CSV. The rendered image shows every block the parser detected.
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
A receipt schema in a dozen lines
Receipts are short, but they vary more than any other document. Some list items, some only show a total, and many print the tax as a percentage next to the amount. You describe the fields you need once with POST /v1/schemas, and PdfParse fills them for every receipt, whatever the till printed.
The JSON your app receives
Each value comes with a confidence score and the page or image it was read from. One image file counts as one page.
{
"name": "receipt",
"fields": [
{ "name": "merchant_name", "type": "string", "description": "Store or restaurant name at the top of the receipt" },
{ "name": "purchase_date", "type": "date", "description": "Date of purchase" },
{ "name": "payment_method", "type": "string", "description": "Card, cash or other method as printed" },
{ "name": "card_last_four", "type": "string", "description": "Last four digits of the card, if printed" },
{ "name": "currency", "type": "string", "description": "ISO currency code" },
{ "name": "tax", "type": "money", "description": "Total tax or VAT amount" },
{ "name": "tip", "type": "money", "description": "Tip or gratuity, if any" },
{ "name": "total", "type": "money", "description": "Amount paid" },
{ "name": "items", "type": "array", "description": "Purchased items with description, quantity and amount" }
]
}
{
"id": "prs_3b91d0",
"status": "completed",
"fields": {
"merchant_name": { "value": "Corner Street Cafe", "confidence": 0.96, "page": 1 },
"purchase_date": { "value": "2026-10-14", "confidence": 0.98, "page": 1 },
"payment_method": { "value": "Card", "confidence": 0.95, "page": 1 },
"card_last_four": { "value": "4417", "confidence": 0.93, "page": 1 },
"currency": { "value": "USD", "confidence": 0.99, "page": 1 },
"tax": { "value": 2.31, "confidence": 0.94, "page": 1 },
"tip": { "value": 5.00, "confidence": 0.91, "page": 1 },
"total": { "value": 34.81, "confidence": 0.97, "page": 1 },
"items": {
"value": [
{ "description": "Lunch set", "quantity": 2, "amount": 21.00 },
{ "description": "Sparkling water", "quantity": 2, "amount": 6.50 }
],
"confidence": 0.92,
"page": 1
}
},
"usage": { "pages": 1 }
}
Where receipt OCR fits in an expense flow
-
1
The mobile app uploads the photo as PNG or JPG, or forwards a PDF receipt from email, to POST /v1/parse with the receipt schema id.
-
2
Single receipts return in the same response, which is fast enough to prefill the expense form while the employee is still on the screen.
-
3
Your app compares the total and date with the card transaction and flags mismatches for the employee to confirm.
-
4
Finance reviews only the receipts below your confidence threshold, with the image and the field side by side.
-
5
At month end, receipts collected by email go through a batch job, and a parse.completed webhook updates each expense when its result is ready.
Teams without an engineering budget use the web app instead. They upload a folder of receipts, apply the schema and export one CSV for the reimbursement run.
Receipts that need more than plain OCR
- Faded thermal paper and low contrast photos go through OCR with layout detection, so the total is read from the totals block and not from a random line.
- Rotated and skewed photos are straightened before reading.
- Long pharmacy and grocery receipts photographed in two images can be sent as one multi page PDF, and items are joined in order.
- Receipts that print subtotal, discount, tax and total in one column keep each amount in its own field.
- Restaurant receipts with a handwritten tip return the printed total and the tip separately, each with its own confidence.
- Hotel folios and multi page PDF receipts work with the same schema, because PdfParse is a general PDF and image parser.
Plans for receipt volumes
Each receipt image is one page. Custom schemas start on Growth.
| Plan | Yearly billing | Monthly billing | Pages per month | Fit |
|---|---|---|---|---|
| Starter | $24 per month | $49 per month | 2,000 | JSON, Markdown and CSV output for a small team |
| Growth | $74 per month | $149 per month | 7,000 | Receipt schema, webhooks, batch jobs |
| Scale | $249 per month | $499 per month | 24,000 | Priority queue, per key usage reports, zero retention mode |
| Enterprise | $749 per month | $1,499 per month | 72,000 | SSO, roles, priority support, EU or US processing region |
Pages count as usage in the billing period and deleting a receipt never returns pages. Compare limits on PDF extraction API pricing and read the request format in the document parsing API reference.
- 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
Does the receipt OCR API accept phone photos
Yes. Send PNG, JPG or TIFF images, or PDF files. Files up to 25 MB are accepted on Starter, and larger limits apply on higher plans.
How is a receipt counted against my plan
One image file is one page. A PDF receipt counts one page per PDF page.
Can I match receipts to card transactions
Yes. Extract the date, total and last four card digits with your schema, then compare them with the transaction in your own system.
What if the receipt has no item lines
Fields that are not printed come back empty with a low confidence score instead of a guessed value, so your app can ask the employee.
Are receipt images kept after parsing
They are kept per your plan retention, 7 days on Starter and configurable up to 30 days on Growth. Scale and Enterprise can switch on zero retention mode. Files are never used to train models.
Add receipt OCR to your expense app
Create an account, take an API key and send your first receipt from the Python or Node SDK.