EU Invoice Extractor with VIES VAT Validation
Pricing
Pay per event
EU Invoice Extractor with VIES VAT Validation
Extract validated data from EU invoices and receipts. Returns seller, buyer, VAT numbers, invoice number, dates, net/VAT/gross totals, IBAN and line items as JSON. Checks VAT against the official VIES registry, validates IBAN, OCRs scans. Never billed for a failure.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Nikita Kubishkin
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Turn EU invoices and receipts into validated structured JSON. Not just text extraction — every VAT number is checked against the official European Commission VIES registry, and every IBAN is verified with the mod-97 checksum.
Built for accounting automation, accounts-payable pipelines and AI agents that need to trust what comes out of a PDF.
Why this Actor
Most document extractors hand you fields and leave you guessing whether they are real. This one tells you:
- Is this VAT number actually registered, and to whom?
- Does the registered company name match the name printed on the invoice?
- Is this IBAN a real IBAN, or OCR noise?
- Do net + VAT actually add up to the gross total?
That last check alone catches a large share of OCR errors before they reach your ledger.
You are never billed for a failure
This is enforced in code, not promised in marketing copy:
| Situation | Billed? |
|---|---|
| Document parsed successfully | Yes |
| Download failed, file corrupt, password-protected | No |
| Document exceeded the timeout | No |
| No text could be extracted | No |
| VIES was down or rate-limited | No |
| VAT number was not an EU format | No |
Every run also writes a SUMMARY record to the key-value store with the actual success rate for that run.
What you get per document
{"status": "ok","invoice_number": "INV-2026-0417","issue_date": "2026-03-14","due_date": "2026-03-28","currency": "EUR","total_net": 2450.00,"total_vat": 539.00,"total_gross": 2989.00,"vat_rate": 22.0,"totals_reconcile": true,"seller_name": "ACME Software OÜ","seller_vat": "EE101584055","seller_vat_valid": true,"seller_registered_address": "Tartu mnt 84a, 10112 Tallinn","buyer_name": "Northwind Trading SIA","buyer_vat": "LV40003032949","buyer_vat_valid": true,"iban": "LV80BANK0000435195001","iban_valid": true,"line_items": [{ "description": "Annual licence", "quantity": 5, "unit_price": 490.0, "amount": 2450.0 }],"confidence": 1.0,"extraction_method": "text_layer","billed": true}
confidence is a transparent 0–1 score. Route anything below 0.6 to human review.
Languages
Field labels are recognised in English, German, French, Spanish, Italian, Dutch, Polish, Czech, Latvian, Lithuanian, Estonian and more. Both European (1.234,56) and Anglo (1,234.56) number formats are handled, along with parenthesised negatives and space-separated thousands.
Scanned documents are OCR'd on-box with Tesseract in 22 languages. No external AI API is called, so your invoices never leave the Apify platform — which matters if you are processing documents under GDPR.
Input
| Field | Type | Description |
|---|---|---|
documentUrls | array | Public URLs of PDFs or images. Up to 100 per run. |
documentsBase64 | array | {"filename": "...", "data": "<base64>"} for private files. |
validateVat | boolean | Check VAT numbers against VIES. Default true. |
validateIban | boolean | Validate IBAN checksums. Free. Default true. |
forceOcr | boolean | OCR even when a text layer exists. Default false. |
ocrLanguages | array | Tesseract codes, priority order. Default ["eng","deu"]. |
extractLineItems | boolean | Return the invoice table rows. Default true. |
includeRawText | boolean | Attach full extracted text. Default false. |
perDocumentTimeoutSecs | integer | Hard per-document limit. Default 90. |
Use with AI agents (MCP)
This Actor is exposed as an MCP tool, so an agent can call it directly:
https://mcp.apify.com/?actors=YOUR_USERNAME/eu-invoice-vat-extractor
Typical agent prompt: "Extract this supplier invoice and confirm the seller's VAT number is currently registered."
Pricing
Pay per event — you pay for results, not for runtime.
| Event | What triggers it |
|---|---|
invoice-parsed | One document turned into a usable record |
ocr-page | One page actually rasterised and OCR'd (scanned documents only) |
vat-validated | One VIES lookup that actually returned an answer |
Repeated VAT numbers within a run are cached and charged once.
Limits
- 100 documents per run, 25 MB per file, first 40 pages of a PDF
- Password-protected PDFs are reported as failed, not billed
- VIES is operated by the European Commission; individual member states go offline periodically. When that happens you get
status: "unavailable"and no charge - Party names are read from the layout and are best-effort; where VIES returns a registered name, that authoritative value replaces the guess
Development
apify loginapify run --purge # local runapify push # build on the platform
Parsing logic is deterministic and unit-tested:
$python -m pytest tests/ -q