UBL, Factur-X, or a non-compliant PDF in. 21 clean fields out — in under 500 ms.
✓ Free tier: 100 documents / month (UBL + Factur-X). No credit card required.
# Upload any inbound Belgian invoice curl https://api.belgiuminvoice.com/v1/invoices/extract \ -H "X-API-Key: sk_live_…" \ -F "file=@invoice.xml"
{ "invoice_number": "INV-2026-00142", "supplier": { "vat_number": "BE0123456789" }, "payment": { "reference": "090933755493" }, "validation": { "is_valid": true }, "source_format": "ubl-peppol" }
Belgium's structured B2B e-invoicing mandate has been enforced since 1 January 2026 — and the invoices hitting your inbox don't all look the same.
Compliant suppliers send Peppol BIS 3.0 UBL-XML. It's valid, structured — and a nightmare to map into your ERP by hand.
Plenty of suppliers aren't compliant yet. You still receive their PDFs, and you still need the data out of them.
Factur-X here, UBL there, a scanned PDF in between. Three parsers, three failure modes, one reconciliation headache.
You need one API that handles all three — and tells you whether what arrived is actually valid.
Upload a file, send your key. Get back everything your accounting system needs for automated reconciliation — including the Belgian-specific fields nobody else extracts.
import requests resp = requests.post( "https://api.belgiuminvoice.com/v1/invoices/extract", headers={"X-API-Key": "sk_live_…"}, files={"file": open("invoice.xml", "rb")}, ) invoice = resp.json() # The Belgian payment reference, as a field — # not buried in free-text notes. print(invoice["payment"]["reference"]) # → 090933755493
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "invoice_number": "INV-2026-00142", "issue_date": "2026-05-15", "due_date": "2026-06-14", "currency": "EUR", "supplier": { "name": "Acme Services BV", "vat_number": "BE0123456789", "address": "Leopoldstraat 12, 1000 Brussel, BE", "kbo_number": "0123456789" }, "buyer": { "name": "TechCorp NV", "vat_number": "BE0987654321", "reference": "PO-2026-0042" }, "totals": { "net": 5000.00, "vat": 1050.00, "gross": 6050.00 }, "vat_breakdown": [{ "rate": 21.0, "category": "S", "taxable_amount": 5000.00, "tax_amount": 1050.00 }], "payment": { "iban": "BE68539007547034", "reference": "090933755493" }, "lines": [{ "description": "API development services", "quantity": 10.0, "unit": "HUR", "unit_price": 500.00, "net_amount": 5000.00 }], "validation": { "is_valid": true, "errors": [] }, "source_format": "ubl-peppol" }
Whatever arrives, the response shape is identical — and every response tells you exactly which format you sent, in source_format.
The standard for Belgian B2B e-invoicing. Structured, signed, and exactly what the mandate expects. We map every required element straight into the response schema.
<Invoice xmlns="…:Invoice-2"> <cbc:ID>INV-2026-00142</cbc:ID> <cbc:IssueDate>2026-05-15</…> <cac:PaymentMeans> <cbc:PaymentID>+++090/9337/55493+++</…> </cac:PaymentMeans> </Invoice>
A hybrid PDF with embedded Cross-Industry Invoice XML. We parse the structured CII payload — not the rendered page — so you get the same clean fields as native UBL.
<rsm:CrossIndustryInvoice> <ram:ID>INV-2026-00142</ram:ID> <ram:TypeCode>380</ram:TypeCode> <!-- embedded in the PDF/A-3 --> <ram:GuidelineParameter> en16931</…> </rsm:CrossIndustryInvoice>
Not everyone has switched over. Send the plain PDF and we extract and structure the data anyway — then flag in validation.errors what's missing for EN 16931.
{ "source_format": "pdf-unstructured", "validation": { "is_valid": false, "errors": [ "BR-CO-25: missing payment ref", "BR-09: missing supplier country" ] } }
Generic invoice parsers read fields. They don't understand Belgian compliance, and they don't understand how Belgian payments reconcile. We do both.
Every response includes a validation object: a boolean is_valid and a structured errors array of the exact EN 16931 business rules that failed.
"validation": { "is_valid": false, "errors": ["BR-CO-10: sum of lines ≠ total"] }
Belgium's structured payment reference +++090/9337/55493+++ is what lets you auto-match a payment to an invoice. We extract it cleanly into payment.reference.
"payment": { "iban": "BE68539007547034", "reference": "090933755493" }
Start free, scale when you ship. Every tier includes EN 16931 validation and OGM/VCS extraction — they're not an enterprise upsell.
Three: Peppol BIS 3.0 UBL-XML, Factur-X / EN 16931 CII XML, and plain PDF for suppliers who aren't compliant yet. The response schema is identical across all three, and every response includes a source_format field so you always know which one you sent.
No. Documents are processed in-memory to produce the JSON response and are not retained afterwards. We don't train on your data, and processing stays within the EU. Full details are in our privacy policy.
Since 1 January 2026, structured electronic invoicing is mandatory for most Belgian B2B transactions. Non-compliance carries a fine of €1,500 for a first offence, and roughly 700,000 businesses are affected. In practice it means the invoices you receive are increasingly structured UBL or Factur-X — which is exactly what this API parses.
An Access Point transmits invoices over the Peppol network — it's the pipe that sends and delivers. We don't send anything. BelgiumInvoice parses the inbound invoices you've already received into structured JSON. If you're looking to dispatch invoices, you need an Access Point; if you need to turn received invoices into usable data, you need us.
It's Belgium's structured payment communication — a 12-digit code formatted as +++090/9337/55493+++ that lets banks and accounting systems automatically match an incoming payment to the right invoice. We extract it into a dedicated payment.reference field instead of leaving it buried in free-text notes.
Yes. Peppol BIS and EN 16931 are EU-wide standards, so Dutch UBL and Factur-X invoices parse cleanly into the same schema. The Belgium-specific extras — OGM/VCS references and KBO numbers — naturally only apply where present on Belgian documents.
Drop your email and we'll send your key the moment the API goes live. 100 documents a month, free, no credit card.
✓ No credit card · No spam · Unsubscribe anytime
We'll send your free API key to you@company.be as soon as we launch.