# Invoice & Receipt Data Extractor (`formnexa/invoice-receipt-data-extractor`) Actor

Extract structured data from invoices and receipts using privacy-first OCR. Get vendor, date, invoice number, currency, subtotal, tax, total, line items, and raw text from PDFs or images—without external AI APIs.

- **URL**: https://apify.com/formnexa/invoice-receipt-data-extractor.md
- **Developed by:** [formnexa Tools](https://apify.com/formnexa) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Data Extractor

Turn PDF and image invoices or receipts into structured JSON without an external AI API key.

This Actor runs OCR inside the Apify container with open-source Tesseract. It accepts direct public HTTPS document URLs or base64 documents and returns one dataset item per document.

### Why use it?

- No OpenAI, Google Vision, AWS Textract, or other paid API key required
- PDF, PNG, JPEG, WEBP, TIFF, and BMP support
- Embedded PDF text is used when available; OCR is used for scanned pages
- English, Spanish, French, German, Italian, and Portuguese OCR options
- Per-document errors do not stop the whole run
- Temporary document files are deleted at the end of every run
- Public URL validation blocks private and reserved network targets

### Extracted fields

- Document type
- Vendor
- Invoice or receipt number
- Date
- Currency
- Subtotal
- Tax
- Total
- Basic line items
- Page count
- Heuristic extraction confidence
- Raw extracted text (optional)
- Warnings and errors

### Quick start

Run the Actor with the default input. If no documents are supplied, it generates and processes a built-in sample invoice.

```json
{
  "useSampleDocument": true,
  "language": "eng",
  "maxPagesPerDocument": 10,
  "includeRawText": true
}
````

To process public files:

```json
{
  "documentUrls": [
    "https://example.com/invoice.pdf",
    "https://example.com/receipt.jpg"
  ],
  "useSampleDocument": false,
  "language": "eng",
  "maxPagesPerDocument": 10,
  "includeRawText": true
}
```

For private workflows, encode a file locally and send it in the Actor input:

```json
{
  "base64Documents": [
    {
      "name": "invoice.pdf",
      "data": "JVBERi0xLjQK..."
    }
  ],
  "useSampleDocument": false
}
```

### Output example

```json
{
  "source_url": "https://example.com/invoice.pdf",
  "file_name": "invoice.pdf",
  "status": "succeeded",
  "document_type": "invoice",
  "vendor": "Example Supplies Inc.",
  "invoice_number": "INV-1001",
  "date": "2026-07-17",
  "currency": "USD",
  "subtotal": 55.0,
  "tax": 4.4,
  "total": 59.4,
  "line_items": [
    { "description": "Notebook", "amount": 12.5 }
  ],
  "page_count": 1,
  "extraction_confidence": 0.95,
  "warnings": [],
  "raw_text": "...",
  "error": null
}
```

### Limits

- Maximum 20 URL documents and 5 base64 documents per run
- Maximum 15 MB per document
- Maximum 50 pages per document
- Direct URLs must use HTTPS and must be publicly reachable
- Password-protected PDFs are not supported
- Handwriting and very low-quality scans may not extract reliably

### Accuracy and privacy

Extraction is best effort. The `extraction_confidence` value is a heuristic based on which fields were found; it is not a calibrated OCR probability. Always review results before accounting, tax, payment, or legal use.

Documents are processed in the Actor container. This project does not send them to an external AI/OCR API. Apify platform storage and retention settings still apply to Actor input, logs, datasets, and key-value stores. Disable `includeRawText` when you do not need the full text.

Only process documents that you own or are authorized to handle.

### Monetization note for the Actor owner

First verify the sample and several real documents while the Actor is private. Configure Store pricing only after successful tests. The current code does not call a pay-per-event charge; add that only after the matching event is configured in Apify Console.

### Local development

```bash
python -m unittest discover -s tests -v
python -m my_actor
```

The Docker image installs Tesseract and all supported language packs.

# Actor input Schema

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

Direct public HTTPS URLs for PDF, PNG, JPEG, WEBP, or TIFF files. Maximum 20 documents per run.

## `base64Documents` (type: `array`):

Optional documents sent as JSON objects with name and base64-encoded data. Maximum 5 documents and 15 MB decoded per document.

## `useSampleDocument` (type: `boolean`):

Creates and processes a harmless sample invoice so you can verify the Actor immediately.

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

Select the main language. Multi-language options are slower.

## `maxPagesPerDocument` (type: `integer`):

Limits processing time and compute cost for large PDFs or multi-page images.

## `includeRawText` (type: `boolean`):

Include OCR or embedded PDF text in each result. Disable this for smaller outputs.

## Actor input object example

```json
{
  "documentUrls": [],
  "base64Documents": [],
  "useSampleDocument": true,
  "language": "eng",
  "maxPagesPerDocument": 10,
  "includeRawText": true
}
```

# Actor output Schema

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

One dataset item per processed document.

## `summary` (type: `string`):

Counts of successful and failed documents.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("formnexa/invoice-receipt-data-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("formnexa/invoice-receipt-data-extractor").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 '{}' |
apify call formnexa/invoice-receipt-data-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Invoice & Receipt Data Extractor",
        "description": "Extract structured data from invoices and receipts using privacy-first OCR. Get vendor, date, invoice number, currency, subtotal, tax, total, line items, and raw text from PDFs or images—without external AI APIs.",
        "version": "0.0",
        "x-build-id": "6pIjiJkV2rsMCTCJS"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/formnexa~invoice-receipt-data-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-formnexa-invoice-receipt-data-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/formnexa~invoice-receipt-data-extractor/runs": {
            "post": {
                "operationId": "runs-sync-formnexa-invoice-receipt-data-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/formnexa~invoice-receipt-data-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-formnexa-invoice-receipt-data-extractor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "documentUrls": {
                        "title": "Document URLs",
                        "type": "array",
                        "description": "Direct public HTTPS URLs for PDF, PNG, JPEG, WEBP, or TIFF files. Maximum 20 documents per run.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "base64Documents": {
                        "title": "Base64 documents (advanced)",
                        "type": "array",
                        "description": "Optional documents sent as JSON objects with name and base64-encoded data. Maximum 5 documents and 15 MB decoded per document.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "name": {
                                    "title": "File name",
                                    "type": "string",
                                    "description": "File name including a supported extension, such as invoice.pdf."
                                },
                                "data": {
                                    "title": "Base64 data",
                                    "type": "string",
                                    "description": "Base64-encoded file content, optionally as a data URI."
                                }
                            },
                            "required": [
                                "name",
                                "data"
                            ]
                        },
                        "default": []
                    },
                    "useSampleDocument": {
                        "title": "Run built-in sample when no documents are supplied",
                        "type": "boolean",
                        "description": "Creates and processes a harmless sample invoice so you can verify the Actor immediately.",
                        "default": true
                    },
                    "language": {
                        "title": "OCR language",
                        "enum": [
                            "eng",
                            "eng+spa",
                            "eng+fra",
                            "eng+deu",
                            "eng+ita",
                            "eng+por"
                        ],
                        "type": "string",
                        "description": "Select the main language. Multi-language options are slower.",
                        "default": "eng"
                    },
                    "maxPagesPerDocument": {
                        "title": "Maximum pages per document",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Limits processing time and compute cost for large PDFs or multi-page images.",
                        "default": 10
                    },
                    "includeRawText": {
                        "title": "Include extracted raw text",
                        "type": "boolean",
                        "description": "Include OCR or embedded PDF text in each result. Disable this for smaller outputs.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
