# Business PDF Field Extractor (`mambalabs/business-pdf-field-extractor`) Actor

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.

- **URL**: https://apify.com/mambalabs/business-pdf-field-extractor.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Automation, Developer tools, Other
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.50 / 1,000 document rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Business PDF Field Extractor

Give PDF addresses and get fixed fields back as rows. Invoices and purchase orders return numbers, dates, parties, totals, line items, and a check that the amounts add up. Contracts return parties, dates, term, renewal, notice days, governing law, and which standard clauses appear. Text PDFs and scans both work. You pay per document read, and Mamba Labs pays the platform costs.

### Features

- **The same columns on every run.** Text extractors return a page of text; this returns `document_number`, `total`, `due_date`, and so on, so a table or a Clay column does not change shape between files.
- **Line items.** Read from the table on the document, across pages when the header repeats, as a `line_items` field and as free rows.
- **A totals check.** `totals_check` says whether subtotal, tax, shipping, and discount add up to the total. A `mismatch` tells you to look at that document.
- **It says what it did not find.** `fields_found` and `fields_missing` are on each row. A missing value is null, never a guess.
- **Contract triage.** Parties, effective and end dates, term wording, renewal, termination and renewal notice days, governing law, contract value, bid due date, and 16 standard clause types with an excerpt and page number. `template_placeholders` counts blanks, so an unfilled template is visible.
- **Scans.** A page with no text layer goes through OCR at 200 dpi, charged per page, with a per file cap.
- **Label words beyond English** for invoices and purchase orders: Dutch, German, and French were tested on real samples; Spanish and Italian labels are in the rules but were not tested. Contract rules read English only.
- **No AI and no API key.** The same file gives the same output, and your documents go to no outside service.

### How the data is read

The actor downloads each address directly, and retries through the Apify proxy pool if the host refuses that. It never uses residential proxies. Poppler reads the text layer with its column layout, and Tesseract reads scanned pages, both inside the run. Fields come from known labels and column position. No login, no key, no AI, and no other developer's actor. Document text is not written to the log.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `pdf_urls` | array |  | Web 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_file` | string |  | Optional. One PDF file from your computer, stored in your Apify account. |
| `document_type` | string | `auto` | auto (default) works it out per file. Set invoice, purchase_order, or contract to read every file as that type. |
| `date_order` | string | `mdy` | How 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_scans` | string | `yes` | yes (default): a page with no text layer goes through OCR, charged per page. no: those pages are skipped and the row says so. |
| `ocr_language` | string | `eng` | Language of scanned pages: eng (default), deu, fra, spa, nld, ita, or por. |
| `max_pages` | string | `50` | Pages to read per file, up to 500. Default 50. |
| `max_ocr_pages` | string | `10` | Scanned pages to read per file, up to 100. Default 10. This caps the OCR charge per file. |
| `max_documents` | string | `100` | Files to read in this run, up to 1,000. Default 100. |
| `line_item_rows` | string | `yes` | yes (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_text` | string | `no` | yes: add the document text to the row, up to 200,000 characters. Default no. |
| `max_charge_usd` | string |  | Optional. The run stops before a charge that would pass this amount. Summary rows are always returned. |

### Output

| Field | Type | What it holds |
|---|---|---|
| `row_type` | string | One of: document, line_item, ocr_page, run_summary. run_summary is the one free row written when the input is refused. |
| `file_url` | string | The address this row came from. |
| `document_type` | string | invoice, purchase_order, contract, or other. Other returns no fields. |
| `pages_total` | integer | Pages the PDF reports. |
| `pages_read` | integer | Pages whose text was read, from the text layer or OCR. |
| `pages_ocr` | integer | Scanned pages read by OCR. Each one is charged as ocr-page. |
| `text_source` | string | text_layer, ocr, mixed, or none. |
| `page_number` | integer | On an ocr_page row: the page that was read. |
| `document_number` | string | Invoice number or purchase order number. |
| `document_date` | string | Invoice date or order date as YYYY-MM-DD. |
| `due_date` | string | Payment due date as YYYY-MM-DD. Invoices. |
| `delivery_date` | string | Requested delivery date as YYYY-MM-DD. Purchase orders. |
| `po_number` | string | The purchase order or order number the document cites. |
| `seller_name` | string | The issuer on an invoice, the supplier on a purchase order. |
| `seller_address` | string | The address lines under the seller, when labeled. |
| `seller_tax_id` | string | A VAT, GST, EIN, or ABN value next to its label. |
| `buyer_name` | string | The billed party on an invoice, the ordering party on a purchase order. |
| `buyer_address` | string | The address lines under the buyer, when labeled. |
| `ship_to` | string | The ship to or deliver to block. |
| `payment_terms` | string | Payment terms as written, such as Net 30. |
| `currency` | string | ISO code, from a code or symbol on the document. A bare $ reads as USD. |
| `subtotal` | number | Amount before tax. |
| `discount` | number | Document level discount. |
| `tax` | number | Tax amount. |
| `shipping` | number | Shipping or freight amount. |
| `total` | number | Document total. |
| `amount_due` | number | Amount or balance due, when stated apart from the total. |
| `line_items` | array | Line items on the document row: line_number, item_code, description, quantity, unit, unit_price, discount, tax_rate, amount. |
| `line_item_count` | integer | How many line items were read. |
| `totals_check` | string | match: subtotal plus tax and shipping less discount, or the line items, equal the total. lines_differ: the header adds up but the line items do not, so some lines were probably not read. mismatch: the amounts do not add up. not_checked: too few amounts were read. |
| `line_items_sum` | number | The line item amounts added up. |
| `line_number` | integer | On a line_item row: position in the table. |
| `item_code` | string | On a line_item row: SKU, part number, or item code. |
| `description` | string | On a line_item row: the item description. |
| `quantity` | number | On a line_item row: quantity. |
| `unit` | string | On a line_item row: unit of measure. |
| `unit_price` | number | On a line_item row: price per unit. |
| `line_discount` | string | On a line_item row: discount as written. |
| `tax_rate` | string | On a line_item row: tax rate as written. |
| `line_amount` | number | On a line_item row: line total. |
| `contract_title` | string | The title line of a contract or bid document. |
| `parties` | array | Party names from the by and between sentence or defined party labels. |
| `effective_date` | string | Contract effective date as YYYY-MM-DD. |
| `expiration_date` | string | Stated end date as YYYY-MM-DD. Null when the term is only a duration. |
| `term_text` | string | The sentence that states the term, up to 400 characters. |
| `term_months` | integer | The term in months when the wording states a duration. |
| `renewal` | string | automatic, optional, or none_found, from the wording. |
| `termination_notice_days` | integer | Days of notice in the first sentence about termination that states them. |
| `renewal_notice_days` | integer | Days of notice in the first sentence about renewal that states them. |
| `governing_law` | string | The jurisdiction named in the governing law wording. |
| `contract_value` | number | An amount next to wording such as total contract price, fixed fee, or not to exceed. |
| `bid_due_date` | string | Proposal or bid submission date as YYYY-MM-DD, on a bid document. |
| `clauses_found` | array | Which of 16 standard clause types appear in the wording. Keyword rules, not legal review. |
| `clause_excerpts` | array | For each clause found: clause, page, and an excerpt of up to 300 characters. |
| `template_placeholders` | integer | Count of blanks and insert markers. A high count means an unfilled template. |
| `fields_found` | array | The fields for this document type that hold a value. |
| `fields_missing` | array | The fields for this document type that were not found on the document. |
| `full_text` | string | The text of the document up to 200,000 characters, only with include_text yes. |
| `row_status` | string | ok, or why this row carries no data: no_results, no_change, partial, blocked, or error. |
| `error_reason` | string | Why the row is not ok. A refused input reads input_invalid: followed by what to fix. |
| `billable_events_json` | string | What this row was billed as, for example {"document-row":1}. {} means free. |
| `scraped_at` | string | When the row was written, UTC. |

### Pricing

Pay per event. You pay for each PDF with at least one field read, each scanned page read by OCR, and the run start. Line item rows, a document with no fields read, a failed download, and a refused input are free.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| `document-row`, one PDF with at least one field read | $0.01 | $0.0095 | $0.009 | $0.0085 |
| `ocr-page`, one scanned page read by OCR, charged when OCR returned text | $0.015 | $0.01425 | $0.0135 | $0.01275 |
| `apify-actor-start`, once per run (one per GB of memory; the default 1024 MB is one) | $0.004 | $0.004 | $0.004 | $0.004 |

Per 1,000 rows of `document-row`: $10.00 on the free plan, $8.50 on Gold.

Free plan cap: 1.50 USD of evaluation a month, about 150 rows. Any paid Apify plan removes the cap, and it resets on the 1st. The run stops before a charge that passes your maximum charge per run in Apify or your `max_charge_usd` input.

Mamba Labs pays the platform costs of your run, Apify proxy traffic included.

### Usage examples

**Invoices and purchase orders.**

```json
{
  "pdf_urls": ["https://docs.oasis-open.org/ubl/cd-UBL-1.0/fs/Order/pdf/OfficeOrder.Example-us.pdf"],
  "document_type": "auto"
}
```

**European invoices.** Set `date_order` to `dmy` so 03/04/2025 reads as 3 April.

**Clay.** Number and on or off inputs are text fields, which is what Clay sends. A list input takes a JSON list, so put the column inside a one item list.

**MCP.** The Mamba Labs MCP server `@mambalabsdev/mcp-business-pdf-field-extractor` exposes this actor to Claude and other MCP clients.

### Error handling

| Case | What you get |
|---|---|
| Missing or unreadable input | One free row, `row_type` `run_summary`, `error_reason` starting `input_invalid:` with what to fix. The run ends successfully and charges nothing but the run start |
| Download failed, not a PDF, over 40 MB, or a password | One free `document` row with `row_status` `error` or `blocked` and the reason |
| No field label found, or a type this actor does not read | One free `document` row with `row_status` `no_results`. OCR pages already read stay charged |
| Pages left unread by `max_pages` or `max_ocr_pages` | `row_status` `partial`, charged, and `error_reason` says how many |
| The run is close to its timeout | The actor stops starting new work 90 seconds before the timeout and delivers what it has |

### Limitations

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

### Mamba Labs actor suite

| Actor | Actor ID |
|---|---|
| [Account Hiring Watch](https://apify.com/mambalabs/account-hiring-watch?fpr=mamba) | `gRAZA5WBi1r6L0gy7` |
| [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor?fpr=mamba) | `anxbRv0lKrpQ1pnua` |
| [Agent to Brokerage Resolver](https://apify.com/mambalabs/agent-brokerage-resolver?fpr=mamba) | `ePRRGLxOGyaVHO4dI` |
| [AI Answer Visibility Tracker](https://apify.com/mambalabs/ai-answer-visibility-tracker?fpr=mamba) | `RJZvzKniYK4nswcMg` |
| [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector?fpr=mamba) | `EwkHhmqiuJgRoVEbE` |
| [Amazon Product, Price, and Stock Tracker](https://apify.com/mambalabs/amazon-product-price-stock-tracker?fpr=mamba) | `MtJPZoyjJ3IeqTFyo` |
| [API Deprecation and Breaking Change Monitor](https://apify.com/mambalabs/api-change-monitor?fpr=mamba) | `pHsbS3xXUK8Jqutz5` |
| [App Store and Google Play Review Monitor](https://apify.com/mambalabs/app-store-google-play-review-monitor?fpr=mamba) | `MaCMEhGrbchxQZ92G` |
| [B2B Reddit Conversation Monitor](https://apify.com/mambalabs/b2b-reddit-conversation-monitor?fpr=mamba) | `SoDryzzsjmY3SsiyG` |
| [Bluesky Brand Presence Mapper](https://apify.com/mambalabs/bluesky-brand-presence-mapper?fpr=mamba) | `eLpxzP4IuXznlFVND` |
| [Brand Sponsor Finder](https://apify.com/mambalabs/brand-sponsor-finder?fpr=mamba) | `PPgK6xrgOmvL7Nrys` |
| [Bulk WHOIS and RDAP Domain Age Lookup](https://apify.com/mambalabs/whois-domain-lookup?fpr=mamba) | `MTrkG5FLU6SjqLdJY` |
| [Career Change Signal Engine](https://apify.com/mambalabs/career-change-signal-engine?fpr=mamba) | `vX2Yga1a6wGaXaP14` |
| [Company Careers Page Jobs, 17 ATS Boards](https://apify.com/mambalabs/ats-jobs-feed?fpr=mamba) | `izP0rfIgf5YaRZfIh` |
| [Company Change Event Feed](https://apify.com/mambalabs/company-change-event-feed?fpr=mamba) | `oX44rS0fkEJ3rXLWe` |
| [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder?fpr=mamba) | `jch0HdaZnpbMqlcGS` |
| [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher?fpr=mamba) | `YlUtLWjfPpqykmB8g` |
| [Company Funding Record](https://apify.com/mambalabs/funding-investor-record?fpr=mamba) | `OFS4Mt1gyYNtGfUbE` |
| [Company Headcount Estimator](https://apify.com/mambalabs/company-headcount-estimator?fpr=mamba) | `aHC4GROnNt6kfZe5r` |
| [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver?fpr=mamba) | `lr8fTRAmZCBZmuwwh` |
| [Company Role Email, Phone and Address Finder](https://apify.com/mambalabs/company-contact-details-extractor?fpr=mamba) | `4mMncKaJykiq94grz` |
| [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper?fpr=mamba) | `4k6CCemkgBDz18m2h` |
| [Competitor Price, Stock, and Changelog Monitor](https://apify.com/mambalabs/competitor-price-stock-changelog-monitor?fpr=mamba) | `yxdgCbUQ4PYQWwRNU` |
| [Contact Classifier](https://apify.com/mambalabs/contact-classifier?fpr=mamba) | `0lGSeYJmniXhGANnO` |
| [Contractor License Search, CA, TX, WA, OR, LA](https://apify.com/mambalabs/contractor-license-lookup?fpr=mamba) | `WBYK3CPI2kdeq4bP1` |
| [CRM Contact Job Change Checker](https://apify.com/mambalabs/job-change-tracker?fpr=mamba) | `L8UbEmMJC1XYPSZOb` |
| [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker?fpr=mamba) | `0tVgxI7A6o9jMlxmc` |
| [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver?fpr=mamba) | `3HtnSaqPHOg1Qg5gx` |
| [Ecommerce Platform Profiler](https://apify.com/mambalabs/ecommerce-platform-profiler?fpr=mamba) | `5G2NeYjBbQTjaTn9L` |
| [Ecommerce Store Discovery](https://apify.com/mambalabs/ecommerce-store-discovery?fpr=mamba) | `PeHu4sLyFvQHXUUrX` |
| [Email List Verifier, Bring Your Own Key](https://apify.com/mambalabs/email-verifier?fpr=mamba) | `CzVJ4NlaCKk80xpgE` |
| [Event Presence Index](https://apify.com/mambalabs/event-presence-index?fpr=mamba) | `WLhMy8fMDgsxdYxv5` |
| [Expert Witness Finder, US and Australia](https://apify.com/mambalabs/expert-witness-directory?fpr=mamba) | `LIpwlgfE3LaQBaXd4` |
| [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner?fpr=mamba) | `FS13X6dhQVgX3XOM6` |
| [GDPR Cookie Banner and Consent Checker](https://apify.com/mambalabs/cookie-consent-audit?fpr=mamba) | `TrKyOS0KBoGC35nbr` |
| [GitHub Followers and Following Export](https://apify.com/mambalabs/github-followers-following-export?fpr=mamba) | `SGNxDmFb9v3tRDaFI` |
| [GitHub Organization Signal Scanner](https://apify.com/mambalabs/github-organization-signal-scanner?fpr=mamba) | `ahF8RRpv5mzPao5CN` |
| [Google Ads Transparency Center Scraper by Domain](https://apify.com/mambalabs/google-ads-transparency-monitor?fpr=mamba) | `1eOwxhBVxzvOXAm4s` |
| [Google Trends Scraper](https://apify.com/mambalabs/google-trends-scraper?fpr=mamba) | `OeDzaACKmBYJXzHZk` |
| [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper?fpr=mamba) | `D7O1SA2EqwHGsGr1P` |
| [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay?fpr=mamba) | `xKdRfnfFNkdMpFuNs` |
| [Healthcare Provider NPI Enricher](https://apify.com/mambalabs/healthcare-provider-npi-enricher?fpr=mamba) | `MrgbHzcpDq3mOv9Df` |
| [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay?fpr=mamba) | `W161DT8W4kW55dMFh` |
| [Influencer Change Monitor](https://apify.com/mambalabs/creator-change-monitor?fpr=mamba) | `d2VVgahNL6UmcLkhg` |
| [Influencer Lead List Builder](https://apify.com/mambalabs/creator-lead-list-all-in-one?fpr=mamba) | `KnmByszcv135yM30G` |
| [Influencer Profile Scraper](https://apify.com/mambalabs/creator-profile-reader?fpr=mamba) | `EqEnklDVMIcB1V499` |
| [Influencer Search Across TikTok, Instagram and YouTube](https://apify.com/mambalabs/creator-finder?fpr=mamba) | `tpkedmloIIWtXx6sg` |
| [Influencer Talent Agency Lookup](https://apify.com/mambalabs/talent-agency-lookup?fpr=mamba) | `zCuX4Mgyg6JvXgGzd` |
| [Instagram Facebook Brand Presence Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper?fpr=mamba) | `HXh65I0JBjPsunbY8` |
| [Integration and Marketplace Presence Mapper](https://apify.com/mambalabs/integration-marketplace-presence-mapper?fpr=mamba) | `V0guNuvM85Q61f2gj` |
| [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner?fpr=mamba) | `4DvqpvhMR74NLcDDY` |
| [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery?fpr=mamba) | `QCfICD9kOPiOdj5iI` |
| [Journalist and Media List Builder](https://apify.com/mambalabs/journalist-media-list-builder?fpr=mamba) | `mAfizsZC8qRoR0ecS` |
| [Launch Directory List Builder](https://apify.com/mambalabs/launch-directory-list-builder?fpr=mamba) | `cRq3bmvEZxZtioQ7U` |
| [Lead File Import Checker](https://apify.com/mambalabs/lead-file-import-checker?fpr=mamba) | `RwlGVXTf46LqZdUgt` |
| [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver?fpr=mamba) | `KHFyPCDIx7CyqULYm` |
| [Link in Bio Scraper and Newsletter Detector](https://apify.com/mambalabs/link-in-bio-newsletter-checker?fpr=mamba) | `OorucdheTIgu7RFzK` |
| [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper?fpr=mamba) | `zOPm6A9JEhUGcIdFW` |
| [LinkedIn Jobs Feed](https://apify.com/mambalabs/linkedin-jobs-feed?fpr=mamba) | `SH6N0d8cz46BhCC8B` |
| [LinkedIn Post Tracker](https://apify.com/mambalabs/linkedin-post-engager-capture?fpr=mamba) | `oiGLNPuaf5BRaz9K5` |
| [Local Business Lead Builder](https://apify.com/mambalabs/local-business-lead-builder?fpr=mamba) | `qMN97aoHhsAS5bznV` |
| [Local Rank and Map Pack Tracker](https://apify.com/mambalabs/local-rank-map-pack-tracker?fpr=mamba) | `gv0kyHGDIg8XscclB` |
| [Lookalike Companies from Seed Domains](https://apify.com/mambalabs/lookalike-company-finder?fpr=mamba) | `e2O426WBAbLLQL4Z2` |
| [Manufacturer and Supplier Finder](https://apify.com/mambalabs/manufacturer-supplier-finder?fpr=mamba) | `Qcsdmd0lUfPzVkonh` |
| [MCP Server Change and Health Monitor](https://apify.com/mambalabs/mcp-server-change-health-monitor?fpr=mamba) | `IeqjWF9U0BdDQFY08` |
| [Media URL Transcriber](https://apify.com/mambalabs/media-url-transcriber?fpr=mamba) | `Syfr7Ya3EsHgWfrB6` |
| [Meta Ad Library Ads by Company, Graph API](https://apify.com/mambalabs/meta-ad-library-monitor?fpr=mamba) | `J1GWlSXfSGU3u8Wng` |
| [Mobile Phone Waterfall](https://apify.com/mambalabs/mobile-phone-waterfall-orchestrator?fpr=mamba) | `6OOgPktf7RIa5XCOP` |
| [New Hire Finder](https://apify.com/mambalabs/new-hire-finder?fpr=mamba) | `cKuc38p4nYHNF3IW8` |
| [Newly Registered Companies, UK, Norway, Finland, France](https://apify.com/mambalabs/new-company-registrations-feed?fpr=mamba) | `g2WfZhWvCtc57g2Jo` |
| [News and Media Mention Monitor](https://apify.com/mambalabs/news-media-mention-monitor?fpr=mamba) | `gol1PPUKrsIk4QLBd` |
| [Newsletter Sponsor Tracker](https://apify.com/mambalabs/newsletter-sponsor-tracker?fpr=mamba) | `qSwpqxD1TiPZpLQHv` |
| [Open Tender and RFP Finder](https://apify.com/mambalabs/open-tender-rfp-finder?fpr=mamba) | `kPTGz6t6TFoUUyfaO` |
| [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint?fpr=mamba) | `v43UJC8r7qW7cBSTG` |
| [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor?fpr=mamba) | `TpurgcOZbVnknlaiC` |
| [Partner and Member Directory Extractor](https://apify.com/mambalabs/partner-member-directory-extractor?fpr=mamba) | `ZX0XJPPUvnFJxeC1a` |
| [People Finder & Email Verifier](https://apify.com/mambalabs/people-finder?fpr=mamba) | `LEgloG7tWgQl4o6TD` |
| [Person LinkedIn URL Resolver](https://apify.com/mambalabs/person-linkedin-url-resolver?fpr=mamba) | `ssuyPV8LnEsL8qbnb` |
| [Person Social Footprint Mapper](https://apify.com/mambalabs/person-social-footprint-mapper?fpr=mamba) | `jfQXa2zW9FHCJot9K` |
| [Personal Email to Company Resolver](https://apify.com/mambalabs/personal-email-to-company-resolver?fpr=mamba) | `AefT5Ye6YNPFQwJBf` |
| [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper?fpr=mamba) | `d1HvjZfKhgvWsoEwn` |
| [Podcast Guest and Host Finder](https://apify.com/mambalabs/podcast-guest-host-finder?fpr=mamba) | `o2MGSvgbSLeeXOsIo` |
| [Product Hunt Daily Launches with Maker Domains](https://apify.com/mambalabs/product-hunt-launches-feed?fpr=mamba) | `O4VX63drWK9Y9x641` |
| [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine?fpr=mamba) | `q9rT6v64nUJdPexOQ` |
| [Public Feature Board and Roadmap Monitor](https://apify.com/mambalabs/public-feature-board-roadmap-monitor?fpr=mamba) | `rcHF5gj5r2Vqnry35` |
| [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency?fpr=mamba) | `TbLwaUUATdYb6wp4N` |
| [Recent Funding Rounds Feed](https://apify.com/mambalabs/recent-funding-rounds-feed?fpr=mamba) | `KueVp9MOz7iOoAgDp` |
| [Reddit Brand Presence Mapper](https://apify.com/mambalabs/reddit-brand-presence-mapper?fpr=mamba) | `pKQZmDaT70SEb54bZ` |
| [Reddit Search and Thread Scraper](https://apify.com/mambalabs/reddit-search-thread-scraper?fpr=mamba) | `4Gsth5cP2Xt9V2xDN` |
| [Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder?fpr=mamba) | `uINxR7a1IW8qUTRUX` |
| [Research Topic Institutions and Authors](https://apify.com/mambalabs/research-topic-institutions-authors?fpr=mamba) | `OH8ANqt7bCKbo72Gk` |
| [Sequencer Event Poller](https://apify.com/mambalabs/sequencer-event-poller?fpr=mamba) | `S6s8Rjd61tGdrMRk4` |
| [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push?fpr=mamba) | `0Jv27VeWM5tSZQs9x` |
| [Shopify App Store and Chrome Web Store Listings](https://apify.com/mambalabs/shopify-app-store-chrome-web-store-listings?fpr=mamba) | `gaY0BzkLyN77mD3wI` |
| [Site Crawler for Links and Tables](https://apify.com/mambalabs/site-crawler-links-tables?fpr=mamba) | `lLLJ6JxZ4XqN8ULz0` |
| [Substack Newsletter and Posts Scraper](https://apify.com/mambalabs/substack-scraper?fpr=mamba) | `UEFsdwiPLmPNVy9xd` |
| [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor?fpr=mamba) | `j8a9zX0k4mNbvDbWK` |
| [Tech Stack Signal Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper?fpr=mamba) | `qyd7nNyqFPelQViBx` |
| [Threads Posts by Keyword, Exact Match](https://apify.com/mambalabs/threads-keyword-search?fpr=mamba) | `2OT8K8RiEEWtaj2MW` |
| [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper?fpr=mamba) | `fco8FvoJcSafbeyd1` |
| [Trustpilot Reputation Enricher](https://apify.com/mambalabs/review-platform-reputation-enricher?fpr=mamba) | `3lIqfCt61j4hqE1xz` |
| [US and UK Contract Award Winners by Company](https://apify.com/mambalabs/public-award-monitor?fpr=mamba) | `zhEtllASykOcx9hJ8` |
| [US Import Records Buyer Finder](https://apify.com/mambalabs/us-import-records-buyer-finder?fpr=mamba) | `VIMafpKF5ggOw0COU` |
| [VC and Accelerator Portfolio List Builder](https://apify.com/mambalabs/vc-accelerator-portfolio-list-builder?fpr=mamba) | `chH8hrfuoqqolW06m` |
| [Website Accessibility Checker, WCAG 2.2 AA](https://apify.com/mambalabs/wcag-accessibility-audit?fpr=mamba) | `P3jBj3FRghKEhX52z` |
| [Website Phrase and Business Model Classifier](https://apify.com/mambalabs/website-phrase-business-model-classifier?fpr=mamba) | `CBuZ9k7sRwBeiKiCS` |
| [Website Traffic Rank Estimator](https://apify.com/mambalabs/website-traffic-rank-estimator?fpr=mamba) | `GnOFUzlNVIoXgeJjH` |
| [Work Email Waterfall](https://apify.com/mambalabs/email-waterfall-orchestrator?fpr=mamba) | `OT6xqTFThC0Rjf7Zj` |
| [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector?fpr=mamba) | `Li6pPDhqbdzFz3h7G` |
| [X Brand Presence Mapper](https://apify.com/mambalabs/x-brand-presence-mapper?fpr=mamba) | `oLOgadhHUkNAyDA3w` |
| [YouTube Channel from Company Domain](https://apify.com/mambalabs/youtube-channel-transcript-extractor?fpr=mamba) | `6hSpD3kd2s2IQ4VSs` |
| [Zillow Listing Details](https://apify.com/mambalabs/zillow-listing-details?fpr=mamba) | `yG4zM0Enfsw2NefJ1` |

Built by [Mamba Labs](https://apify.com/mambalabs).

# Actor input Schema

## `pdf_urls` (type: `array`):

Web 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_file` (type: `string`):

Optional. One PDF file from your computer, stored in your Apify account.

## `document_type` (type: `string`):

auto (default) works it out per file. Set invoice, purchase_order, or contract to read every file as that type.

## `date_order` (type: `string`):

How 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_scans` (type: `string`):

yes (default): a page with no text layer goes through OCR, charged per page. no: those pages are skipped and the row says so.

## `ocr_language` (type: `string`):

Language of scanned pages: eng (default), deu, fra, spa, nld, ita, or por.

## `max_pages` (type: `string`):

Pages to read per file, up to 500. Default 50.

## `max_ocr_pages` (type: `string`):

Scanned pages to read per file, up to 100. Default 10. This caps the OCR charge per file.

## `max_documents` (type: `string`):

Files to read in this run, up to 1,000. Default 100.

## `line_item_rows` (type: `string`):

yes (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_text` (type: `string`):

yes: add the document text to the row, up to 200,000 characters. Default no.

## `max_charge_usd` (type: `string`):

Optional. The run stops before a charge that would pass this amount. Summary rows are always returned.

## `source_tag` (type: `string`):

Internal attribution tag. Leave empty.

## Actor input object example

```json
{
  "pdf_urls": [
    "https://docs.oasis-open.org/ubl/cd-UBL-1.0/fs/Order/pdf/OfficeOrder.Example-us.pdf",
    "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf",
    "https://gba.georgia.gov/document/publication/services-contractsample-agreement-templatepdf/download"
  ],
  "document_type": "auto",
  "date_order": "mdy",
  "read_scans": "yes",
  "ocr_language": "eng",
  "max_pages": "50",
  "max_ocr_pages": "10",
  "max_documents": "100",
  "line_item_rows": "yes",
  "include_text": "no"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `run_summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "pdf_urls": [
        "https://docs.oasis-open.org/ubl/cd-UBL-1.0/fs/Order/pdf/OfficeOrder.Example-us.pdf",
        "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf",
        "https://gba.georgia.gov/document/publication/services-contractsample-agreement-templatepdf/download"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/business-pdf-field-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "pdf_urls": [
        "https://docs.oasis-open.org/ubl/cd-UBL-1.0/fs/Order/pdf/OfficeOrder.Example-us.pdf",
        "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf",
        "https://gba.georgia.gov/document/publication/services-contractsample-agreement-templatepdf/download",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/business-pdf-field-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "pdf_urls": [
    "https://docs.oasis-open.org/ubl/cd-UBL-1.0/fs/Order/pdf/OfficeOrder.Example-us.pdf",
    "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf",
    "https://gba.georgia.gov/document/publication/services-contractsample-agreement-templatepdf/download"
  ]
}' |
apify call mambalabs/business-pdf-field-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mambalabs/business-pdf-field-extractor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vM7JCk0CMAx5W0oJh/builds/hw5ICwThSvgIhTn8q/openapi.json
