Inbound AP parsing API · Leuven

Parse any Belgian invoice into structured JSON.

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.

EN 16931 validation built in OGM/VCS reference extraction <500ms response
POST
# Upload any inbound Belgian invoice
curl https://api.belgiuminvoice.com/v1/invoices/extract \
  -H "X-API-Key: sk_live_…" \
  -F "file=@invoice.xml"
returns in 412 ms
200 OK · application/json
{
  "invoice_number": "INV-2026-00142",
  "supplier": { "vat_number": "BE0123456789" },
  "payment": { "reference": "090933755493" },
  "validation": { "is_valid": true },
  "source_format": "ubl-peppol"
}
The problem

The mandate is live. The invoices are already arriving.

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.

1 Jan 2026
Mandate enforced. Structured e-invoicing is now required for Belgian B2B.
1,500
Fine per first offence for failing to comply — and it escalates from there.
700,000
Belgian businesses affected, all sending and receiving in different states of readiness.
XML

UBL-XML you can't parse

Compliant suppliers send Peppol BIS 3.0 UBL-XML. It's valid, structured — and a nightmare to map into your ERP by hand.

PDF

PDFs from the unprepared

Plenty of suppliers aren't compliant yet. You still receive their PDFs, and you still need the data out of them.

Mixed formats you didn't plan for

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.

The API

One call. Twenty-one fields.

Upload a file, send your key. Get back everything your accounting system needs for automated reconciliation — including the Belgian-specific fields nobody else extracts.

REQUEST Python · requests
extract.py
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
RESPONSE 200 OK · application/json
response.json
{
  "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"
}
Three inputs, one schema

Send what your suppliers send. We handle all of it.

Whatever arrives, the response shape is identical — and every response tells you exactly which format you sent, in source_format.

Peppol BIS 3.0 · UBL-XML

The fully-compliant default

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.

"source_format": "ubl-peppol"
<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>
Factur-X · EN 16931 CII

The alternative compliant format

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.

"source_format": "facturx-cii"
<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>
PDF · non-compliant

For suppliers who aren't ready yet

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"
{
  "source_format": "pdf-unstructured",
  "validation": {
    "is_valid": false,
    "errors": [
      "BR-CO-25: missing payment ref",
      "BR-09: missing supplier country"
    ]
  }
}
Why this, not Veryfi or Mindee

Two things general OCR APIs simply don't do.

Generic invoice parsers read fields. They don't understand Belgian compliance, and they don't understand how Belgian payments reconcile. We do both.

1EN 16931 Validation

Know if it's legally valid — not just what's in it.

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"]
}
Veryfi and Mindee tell you what the invoice contains. Neither tells you whether it's compliant.
2OGM/VCS Extraction

The 12-digit reconciliation code, as its own field.

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"
}
Other APIs leave it in free-text notes — if they catch it at all. Nobody else gives it to you as a field.
Pricing

Published pricing. No sales call required.

Start free, scale when you ship. Every tier includes EN 16931 validation and OGM/VCS extraction — they're not an enterprise upsell.

Monthly
Annual Save ~20%
Free
For evaluating the API and small side projects.
€0/month
No credit card required.
100 documents / month
UBL-XML and Factur-X only. PDF extraction requires Starter.
Hard cap — no unexpected charges.
  • EN 16931 validation
  • OGM/VCS extraction
  • UBL-XML & Factur-X formats
  • PDF input — Starter and above
  • Community support
Get free API key
Starter
For production AP automation and integrations.
€49/month
Billed monthly.
2,500 documents / month
€0.025 / document overage
  • Everything in Free, plus:
  • PDF extraction (pdfplumber + LLM fallback)
  • Batch processing (up to 50 docs)
  • Webhooks
  • Email support
Start with Starter
Growth
For high-volume platforms and accounting SaaS.
€149/month
Billed monthly.
10,000 documents / month
€0.018 / document overage
  • Everything in Starter, plus:
  • Higher rate limits
  • Priority support
  • Volume overage pricing
Choose Growth
★ No sales call required — sign up and ship today.

Need more than 10,000 documents a month? Talk to us about volume.
FAQ

Questions developers actually ask.

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.

Get started

Get your free API key.

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

You're on the list.

We'll send your free API key to you@company.be as soon as we launch.