Skip to content
Docs Security Sign in
PdfParse

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.

Parse PDF

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.

Drop a PDF or scan

PDF, PNG or JPG up to 10 MB. Page one is parsed in full, right here.

Or try a sample file
Output

Optional. Comma separated field names, for example invoice_number, total, due_date.

Page one is parsed in your browser and never uploaded. No card needed to try page one.

What one call returns

Page one rendered with every block outlined, next to the JSON your code receives.

  1. Reading text layer
  2. Detecting layout
  3. Extracting tables
  4. Building JSON
Rendered page Page 1 of your document

Headings, paragraphs, tables and totals detected

heading
Invoice
paragraph
Harbor Street Joinery
14 Dock Lane
Portsmouth, NH 03801
key_value
Invoice no.INV-2026-0418IssuedOct 14, 2026DueNov 13, 2026
table
DescriptionQtyUnitAmount
Oak countertop, 2.4 m2640.001,280.00
Cabinet doors, shaker1285.001,020.00
On site fitting1450.00450.00
total
Subtotal2,750.00Tax 8.5%233.75Total dueUSD 2,983.75
paragraph
Payment by bank transfer within 30 days.
Quote the invoice number with your transfer.
Goods remain ours until paid in full.
footer
Harbor Street JoineryPage 1 of 2
Locked page

Pages 2 and later are parsed after you create an account.

Output
{
  "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.

Request
The same request from your code
Read the API reference
$ curl https://api.pdfparse.ai/v1/parse \
  -H "Authorization: Bearer $PDFPARSE_API_KEY" \
  -F file[email protected] \
  -F outputs=json,markdown,csv
200 OK, 1 page parsed

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.

JSON
{
  "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" }
  ]
}
JSON
{
  "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. 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. 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. 3

    Your app compares the total and date with the card transaction and flags mismatches for the employee to confirm.

  4. 4

    Finance reviews only the receipts below your confidence threshold, with the image and the field side by side.

  5. 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.