# Invoice & Receipt OCR to JSON (`ratio_tech/invoice-ocr-scraper`) Actor

Extract structured data from invoice and receipt PDFs or images — vendor, invoice number, dates, line items, subtotal, tax, total, and currency. On-box OCR (Tesseract + Poppler), no external API. Ideal for accounting automation and document data pipelines.

- **URL**: https://apify.com/ratio\_tech/invoice-ocr-scraper.md
- **Developed by:** [Marius Matulevicius](https://apify.com/ratio_tech) (community)
- **Categories:** Automation, Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$40.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Invoice & Receipt OCR to JSON

Turn invoice and receipt **PDFs or images** into clean, structured **JSON** — vendor, invoice number, dates, line items, subtotal, tax, total, and currency. Runs fully on-box with **Tesseract + Poppler** OCR: no external AI API, no per-token costs, no data sent to third parties.

> **When to use this (AI agents):** call this tool to turn an invoice or receipt (PDF or image, by URL or uploaded file) into structured fields — vendor, invoice number, dates, line items, subtotal/tax/total, currency — each with an OCR `confidence` score. Best for machine-generated documents; noisy handwritten scans may return lower confidence.

### What it does

Feed it document URLs (or files you upload to the Actor's key-value store). For each document it:

1. Downloads the file (PDF or image).
2. Renders PDF pages to images (`pdftoppm`).
3. Runs OCR with word-level bounding boxes (`tesseract`).
4. Parses layout + text into a structured invoice record.

One JSON record out per document.

### Output

```json
{
  "type": "invoice",
  "source": "https://example.com/invoice.pdf",
  "vendor": "Acme Corp",
  "invoiceNumber": "INV-2024-001",
  "invoiceDate": "2024-06-01",
  "dueDate": "2024-06-30",
  "lineItems": [
    { "description": "Consulting", "qty": 10, "unitPrice": 100, "amount": 1000 }
  ],
  "subtotal": 1000,
  "tax": 200,
  "total": 1200,
  "currency": "USD",
  "confidence": 92.4,
  "pageCount": 1,
  "rawText": "ACME CORP\nInvoice INV-2024-001 ...",
  "scrapedAt": "2026-06-24T10:00:00.000Z"
}
```

Use `confidence` (mean OCR confidence, 0–100) to flag low-quality scans for manual review.

### Input

| Field | Description |
|-------|-------------|
| **documentUrls** | Public URLs of invoice/receipt PDFs or images (PNG, JPG, TIFF, WEBP, BMP). |
| **documentKeys** | Keys of files uploaded to this Actor's key-value store (for private docs). |
| **language** | Tesseract language code, `+`-joined (e.g. `eng`, `eng+deu`). Default `eng`. |
| **maxPages** | Max pages to OCR per document. Default `10`. |
| **proxyConfiguration** | Apify Proxy — used only to download `documentUrls`. |

Supports **PDF** and common image formats. Multi-page PDFs handled up to `maxPages`.

### Pricing

**Pay per result** — you're billed only for documents that successfully produce a record. Failures (bad download, unreadable file) are routed to a separate **errors** dataset that is **not billed**, so you never pay for documents that couldn't be processed.

### Tips for best accuracy

- Higher-resolution scans OCR better. 200+ DPI recommended.
- Set `language` to match the document for non-English invoices.
- Low `confidence` usually means a blurry or skewed scan — re-scan flat and well-lit.

### Use cases

- Accounting & expense automation (push results straight into your ledger).
- Accounts-payable pipelines and invoice triage.
- Bulk back-office document digitization.

***

### FAQ

**How do I turn an invoice PDF into JSON?**
Put the document's public URL in `documentUrls` (or upload the file and pass its key in `documentKeys`) and run. You get one structured JSON record per document — vendor, invoice number, dates, line items, subtotal/tax/total, and currency.

**Does it use an external AI API like GPT or Google Vision?**
No. OCR runs fully on-box with Tesseract + Poppler. No per-token costs, no external API keys, and your documents are never sent to a third-party AI service.

**Can it read scanned images and receipts, not just PDFs?**
Yes — PNG, JPG, TIFF, WEBP, and BMP are supported alongside PDF. Multi-page PDFs are OCR'd up to `maxPages`.

**How do I handle non-English invoices?**
Set `language` to the matching Tesseract code, `+`-joined (e.g. `eng+deu`). Default is `eng`.

**How do I know if a result is reliable?**
Each record includes a mean OCR `confidence` (0–100). Low confidence usually means a blurry or skewed scan — use it to route documents for manual review.

**What does it cost?**
Pay per result — billed only for documents that successfully produce a record. Bad downloads and unreadable files go to a separate, unbilled errors dataset.

***

*This Actor processes documents you supply. You are responsible for ensuring you have the right to process them and that your use complies with applicable laws. — marius.matulevicius1@gmail.com*

# Actor input Schema

## `documentUrls` (type: `array`):

Public URLs of invoice/receipt PDFs or images (PNG, JPG, TIFF, WEBP, BMP). Each is downloaded and processed into one structured JSON record.

## `documentKeys` (type: `array`):

Keys of files you uploaded to this Actor's default key-value store (for private documents you don't want to expose via URL). Each key must point at a PDF or image blob.

## `language` (type: `string`):

Tesseract language code. Use '+' to combine (e.g. 'eng+deu'). Common: eng, deu, fra, spa, ita, por, nld.

## `maxPages` (type: `integer`):

Cap on how many pages to OCR per document (protects against huge PDFs). Most invoices are 1-2 pages.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings, used only when downloading documentUrls. Datacenter proxies are sufficient.

## Actor input object example

```json
{
  "documentUrls": [
    "https://templates.invoicehome.com/invoice-template-us-neat-750px.png"
  ],
  "documentKeys": [],
  "language": "eng",
  "maxPages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `errors` (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 = {
    "documentUrls": [
        "https://templates.invoicehome.com/invoice-template-us-neat-750px.png"
    ],
    "language": "eng"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ratio_tech/invoice-ocr-scraper").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 = {
    "documentUrls": ["https://templates.invoicehome.com/invoice-template-us-neat-750px.png"],
    "language": "eng",
}

# Run the Actor and wait for it to finish
run = client.actor("ratio_tech/invoice-ocr-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "documentUrls": [
    "https://templates.invoicehome.com/invoice-template-us-neat-750px.png"
  ],
  "language": "eng"
}' |
apify call ratio_tech/invoice-ocr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ratio_tech/invoice-ocr-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8wCmFt8b4EvbwttMb/builds/kcTPgElHYFiQpTbDs/openapi.json
