Business PDF Field Extractor
Last updated November 10, 2026
Give PDF addresses and get fixed fields back: invoice and purchase order numbers, dates, parties, totals, and line items, plus contract parties, dates, term, renewal, notice, and governing law. Reads scans with OCR. No AI and no API key.
Features
- Fixed fields for invoices, purchase orders, and contracts, the same columns on every run.
- Line items as rows, read across pages, with a check that the amounts add up.
- Contract parties, dates, term, renewal, notice days, governing law, and clauses found.
- Scanned pages go through OCR in 7 languages, charged per page.
- A document with no fields read is free.
- Pay per event: Document row at $0.01.
Input
pdf_urlsarrayoptionalWeb addresses of PDF files, up to 1,000. Each file up to 40 MB. The address must answer without a login. In Clay, put the column in a one item list.
pdf_filestringoptionalOptional. One PDF file from your computer, stored in your Apify account.
document_typestringoptionalauto (default) works it out per file. Set invoice, purchase_order, or contract to read every file as that type.
date_orderstringoptionalHow to read a date such as 03/04/2025 when both readings are valid. mdy (default) reads March 4, dmy reads 3 April. Unambiguous dates ignore this.
read_scansstringoptionalyes (default): a page with no text layer goes through OCR, charged per page. no: those pages are skipped and the row says so.
ocr_languagestringoptionalLanguage of scanned pages: eng (default), deu, fra, spa, nld, ita, or por.
max_pagesstringoptionalPages to read per file, up to 500. Default 50.
max_ocr_pagesstringoptionalScanned pages to read per file, up to 100. Default 10. This caps the OCR charge per file.
max_documentsstringoptionalFiles to read in this run, up to 1,000. Default 100.
line_item_rowsstringoptionalyes (default): each line item is also its own free row, which suits CSV and Clay. no: line items stay in the line_items field only.
include_textstringoptionalyes: add the document text to the row, up to 200,000 characters. Default no.
max_charge_usdstringoptionalOptional. The run stops before a charge that would pass this amount. Summary rows are always returned.
Output schema
{
"row_type": "string",
"file_url": "string",
"document_type": "string",
"pages_total": "integer",
"pages_read": "integer",
"pages_ocr": "integer",
"text_source": "string",
"page_number": "integer",
"document_number": "string",
"document_date": "string",
"due_date": "string",
"delivery_date": "string",
"po_number": "string",
"seller_name": "string",
"seller_address": "string",
"seller_tax_id": "string",
"buyer_name": "string",
"buyer_address": "string",
"ship_to": "string",
"payment_terms": "string",
"currency": "string",
"subtotal": "number",
"discount": "number",
"tax": "number",
"shipping": "number",
"total": "number",
"amount_due": "number",
"line_items": "array",
"line_item_count": "integer",
"totals_check": "string",
"line_items_sum": "number",
"line_number": "integer",
"item_code": "string",
"description": "string",
"quantity": "number",
"unit": "string",
"unit_price": "number",
"line_discount": "string",
"tax_rate": "string",
"line_amount": "number",
"contract_title": "string",
"parties": "array",
"effective_date": "string",
"expiration_date": "string",
"term_text": "string",
"term_months": "integer",
"renewal": "string",
"termination_notice_days": "integer",
"renewal_notice_days": "integer",
"governing_law": "string",
"contract_value": "number",
"bid_due_date": "string",
"clauses_found": "array",
"clause_excerpts": "array",
"template_placeholders": "integer",
"fields_found": "array",
"fields_missing": "array",
"full_text": "string",
"row_status": "string",
"error_reason": "string",
"billable_events_json": "string",
"scraped_at": "string"
}Pricing
| Event | Free plan price |
|---|---|
| Document row | $0.01 |
| OCR page | $0.015 |
| Actor Start | $0.004 |
Pay per event on the Apify platform. Paid Apify plans pay less per event. No subscription, no seat license.
On the Apify free plan the actor stops at $1.50 of charges a month, about 150 documents. Any paid Apify plan removes the cap.
Limits
- Fields come from labels and column position, with no AI. On a layout with unusual labels a value can be missing, and on a crowded layout it can be wrong. Check totals_check and fields_missing, and review before you pay or sign anything.
- Seller and buyer names are the least reliable fields. A name with no label next to it is taken from a company suffix such as Inc or B.V., and a name inside a logo image on a text page is not read.
- Line items need a header row with column names. A list of charges with no table header returns no line items.
- OCR accuracy follows scan quality. Skewed or low resolution pages read poorly, handwriting is not supported, and a single digit inside a bordered table cell can be lost, which leaves quantity null on that row. English and Dutch scans were tested; the other OCR languages are installed but were not tested.
- Clause detection finds keywords in the wording. It is not legal review, and it can flag a clause that is only mentioned in passing.
- A bare $ reads as USD, so Canadian or Australian dollars need the code on the document.
- Tested on 11 invoices from a public parser test set, 6 sample purchase orders, and 6 published contract templates. Filled contracts were tested on one document written for the test. Bank statements are out of scope and return no fields.
- The address must answer without a login. Files over 40 MB are refused.