Skip to content
Docs Security Sign in
PdfParse

OCR API that returns structure, not just words

Plain OCR gives you a wall of words. The PdfParse OCR API reads scanned PDFs, phone photos, faxes and multi page TIFF files, then rebuilds what the page actually shows: headings, paragraphs in reading order, tables with cells, and form fields with their labels. Every word keeps its position, so you can draw it back onto the image.

Parse PDF
A creased, stamped paper form under the open lid of a flatbed scanner

Run OCR on a scan in your browser

Drop a scanned page or a photo with the OCR toggle on, and compare the recognized blocks with the image side by side.

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

Recognized text with its layout attached

The output of a scanned page has the same shape as the output of a digital PDF. Your code does not need a second path for scans. The only visible difference is the confidence value, which tends to be lower on faint or skewed images and tells you where to look first.

  • Text grouped into heading, paragraph, list, table, form field and checkbox blocks
  • Bounding boxes in page coordinates for every block, ready for highlighting
  • Tables rebuilt from recognized words, exported as rows and CSV
  • Markdown and JSON from the same call, so scans can feed search and LLM pipelines
  • Mixed documents handled page by page, with OCR used only where a page has no text layer in auto mode
JSON
{
  "number": 1,
  "blocks": [
    {"type": "heading", "text": "CLAIM FORM", "bbox": [210, 48, 402, 80], "confidence": 0.96},
    {"type": "form_field", "text": "Policy number  PL-448120", "bbox": [60, 140, 330, 162], "confidence": 0.93},
    {"type": "checkbox", "text": "Vehicle damage  checked", "bbox": [60, 220, 250, 238], "confidence": 0.91}
  ]
}

What happens to a scanned page

  1. 1

    The image is cleaned up, which means deskewing, correcting rotation and normalizing contrast.

  2. 2

    Characters and words are recognized, each with a position and a confidence value.

  3. 3

    Words are grouped into lines and blocks, and the reading order is restored across columns.

  4. 4

    Tables and form fields are rebuilt from the recognized words, then the result is written to JSON, Markdown and CSV.

Built for scans that are far from perfect

Real archives hold crooked photocopies, faxes with noise and phone pictures taken at an angle. These are the files the OCR path is designed around.

  • Pages scanned upside down or sideways are detected and turned upright before recognition.
  • Two and three column layouts in scanned journals and reports are read in the correct column order.
  • Tables on scanned statements keep their columns, including tables with merged header cells.
  • Stamps, signatures and handwritten notes in margins are kept out of the body text where they would break sentences.
  • Repeated letterheads and page footers on scanned correspondence are recognized and set apart from the content.

Call the OCR API

Set ocr to always for pure image input, or keep auto for mixed PDFs. Images and PDFs use the same endpoint.

curl
curl https://api.pdfparse.ai/v1/parse \
  -H "Authorization: Bearer pp_live_your_key" \
  -F "[email protected]" \
  -F "ocr=always" \
  -F 'outputs=["json","markdown"]'
Python
import os
from pdfparse_ai import PdfParse

client = PdfParse(api_key=os.environ["PDFPARSE_API_KEY"])
result = client.parse("claim-scan.tiff", outputs=["json", "markdown"], ocr="always")

for page in result.pages:
    low = [b for b in page.blocks if b.confidence < 0.8]
    print(page.number, len(page.blocks), "blocks,", len(low), "to review")

Who relies on the OCR API

  • Insurance and claims teams digitizing paper claim forms, medical bills and repair estimates.
  • Legal and records teams turning archives of scanned contracts and letters into searchable text.
  • Expense and accounting tools reading receipts and invoices photographed on a phone.
  • AI teams that need scanned manuals and reports in the same structured form as their digital documents.

OCR on every plan, forms on Scale

OCR for scanned pages is included from Starter at $49 a month, or $24 a month billed yearly, for 2,000 pages and image files up to 25 MB. Growth at $149 a month adds batch jobs and webhooks for large backlogs of scans. Form field and checkbox detection, which most paper forms need, starts on Scale at $499 a month along with zero retention mode. Every limit is listed on pdf extraction api pricing.

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

Which file types does the OCR API accept?

PDF, scanned PDF, PNG, JPG and TIFF, including multi page TIFF. Each page of a PDF, each PNG or JPG file and each frame of a TIFF counts as one page.

Do I pay extra for OCR?

No. OCR is part of every plan and uses the same page count as a digital PDF.

Can it read handwriting?

Printed text is the main focus. Clear handwritten block letters in form fields are often recognized, and the confidence value tells you when a person should check them.

How do I know which words are uncertain?

Every block has a confidence value. Filter on it to build a review screen that shows only the parts of a scan that need a second look.

What happens with PDFs that mix digital and scanned pages?

With ocr set to auto, each page is checked for a text layer. Digital pages are read directly, and only image pages go through OCR.

Put your scans to work

Create an account and send the first stack of scanned pages through the API.