Send a compliant Peppol e-invoice from your app (Belgium)

Belgium mandated structured B2B e-invoicing over Peppol, live since 1 January 2026. If your app invoices another Belgian VAT-registered business, a PDF or plain email is no longer sufficient — the invoice must be a structured EN 16931 / Peppol BIS 3.0 UBL document, delivered over the Peppol network.

What changed

Domestic B2B transactions between two Belgian businesses now require a structured e-invoice delivered over Peppol. This does not apply to B2C sales or to invoices where either party is outside Belgium (those follow their own country's timeline — see France and Germany). The obligation is on the seller to issue correctly and the buyer to be able to receive over Peppol.

Domestic sale — try it now

This is a real, runnable example against production. It mints a free private sandbox key, validates a Belgian domestic invoice (21% standard VAT), creates it, and simulates delivery — sandbox never touches the real Peppol network, so this is safe to run repeatedly.

# Validate — free, no key required. Fix errors using the llmFix field until status=validated.
curl -sS https://vantane.com/v1/validate \
  -H 'content-type: application/json' \
  -d '{"id":"BE-GUIDE-DOM-01","invoiceTypeCode":"380","issueDate":"2026-07-01","dueDate":"2026-07-31","currencyCode":"EUR","buyerReference":"PO-9001","seller":{"name":"Antwerpen Software BV","legalForm":"BV","vatId":"BE0876543270","registrationNumber":"0876543270","address":{"line1":"Meir 12","city":"Antwerpen","postalCode":"2000","countryCode":"BE"},"electronicAddress":{"scheme":"0208","value":"0876543270"}},"buyer":{"name":"Gent Logistics NV","vatId":"BE0123456749","registrationNumber":"0123456749","address":{"line1":"Korenmarkt 5","city":"Gent","postalCode":"9000","countryCode":"BE"},"electronicAddress":{"scheme":"0208","value":"0123456749"}},"lines":[{"id":"1","description":"Annual software subscription","quantity":1,"unitCode":"EA","unitPrice":4800,"vat":{"categoryCode":"S","rate":21}}],"paymentMeans":{"typeCode":"30","iban":"BE68539007547034","bic":"GKCCBEBB","accountName":"Antwerpen Software BV"},"paymentTerms":"Payment within 30 days"}'

# Create + deliver — the public sandbox key works with zero signup (rate-limited, no persistence
# guarantee beyond 24h). Sandbox simulates delivery; production sends over Peppol for real.
curl -sS https://vantane.com/v1/invoices \
  -H 'authorization: Bearer vantane_sandbox_public' \
  -H 'content-type: application/json' \
  -d '{"invoice":{"id":"BE-GUIDE-DOM-01","invoiceTypeCode":"380","issueDate":"2026-07-01","dueDate":"2026-07-31","currencyCode":"EUR","buyerReference":"PO-9001","seller":{"name":"Antwerpen Software BV","legalForm":"BV","vatId":"BE0876543270","registrationNumber":"0876543270","address":{"line1":"Meir 12","city":"Antwerpen","postalCode":"2000","countryCode":"BE"},"electronicAddress":{"scheme":"0208","value":"0876543270"}},"buyer":{"name":"Gent Logistics NV","vatId":"BE0123456749","registrationNumber":"0123456749","address":{"line1":"Korenmarkt 5","city":"Gent","postalCode":"9000","countryCode":"BE"},"electronicAddress":{"scheme":"0208","value":"0123456749"}},"lines":[{"id":"1","description":"Annual software subscription","quantity":1,"unitCode":"EA","unitPrice":4800,"vat":{"categoryCode":"S","rate":21}}],"paymentMeans":{"typeCode":"30","iban":"BE68539007547034","bic":"GKCCBEBB","accountName":"Antwerpen Software BV"},"paymentTerms":"Payment within 30 days"},"options":{"deliver":true}}'
# -> {"id":"...","status":"delivered_simulated","preview_url":"...","document_url":"..."}
# GET the preview_url and look at it before you ever flip this on for a real buyer.

Peppol addressing: deriving the 0208 electronic address

Belgian businesses are addressed on Peppol using EAS scheme 0208 (Numero d'entreprise / ondernemingsnummer), whose value is the company's 10-digit enterprise number with no punctuation — the same number as the VAT ID with the BE prefix and formatting stripped:

// vatId "BE0876543270" -> electronicAddress
function beElectronicAddress(vatId) {
  const digits = vatId.replace(/^BE/i, '').replace(/\D/g, '');
  return { scheme: '0208', value: digits }; // { scheme: "0208", value: "0876543270" }
}

Set this as seller.electronicAddress and buyer.electronicAddress in the canonical invoice JSON. If a buyer has no known Peppol address yet, look them up by VAT ID in the Peppol directory before invoicing them for real.

Reverse charge — cross-border B2B services

When a Belgian business sells services to a VAT-registered business in another EU country, VAT is normally reverse-charged to the buyer (Article 196 EU VAT Directive): the seller charges 0% VAT and the buyer self-accounts for it. In the canonical model this is category AE, rate: 0, with an exemptionReasonCode (VATEX-EU-AE) — EN 16931 rule BR-AE-10 requires the reason to be present whenever the category isn't standard-rated or zero-rated:

curl -sS https://vantane.com/v1/validate \
  -H 'content-type: application/json' \
  -d '{"id":"BE-GUIDE-AE-01","invoiceTypeCode":"380","issueDate":"2026-07-01","dueDate":"2026-07-31","currencyCode":"EUR","buyerReference":"PO-9002","seller":{"name":"Antwerpen Software BV","legalForm":"BV","vatId":"BE0876543270","registrationNumber":"0876543270","address":{"line1":"Meir 12","city":"Antwerpen","postalCode":"2000","countryCode":"BE"},"electronicAddress":{"scheme":"0208","value":"0876543270"}},"buyer":{"name":"Rotterdam Cloud Services B.V.","vatId":"NL123456789B01","registrationNumber":"12345678","address":{"line1":"Coolsingel 42","city":"Rotterdam","postalCode":"3011","countryCode":"NL"},"electronicAddress":{"scheme":"0088","value":"5410000000002"}},"lines":[{"id":"1","description":"Cross-border software consulting (B2B services)","quantity":10,"unitCode":"HUR","unitPrice":9500,"vat":{"categoryCode":"AE","rate":0,"exemptionReasonCode":"VATEX-EU-AE","exemptionReason":"VAT reverse-charged to the buyer under Article 196 EU VAT Directive"}}],"paymentMeans":{"typeCode":"30","iban":"BE68539007547034","bic":"GKCCBEBB","accountName":"Antwerpen Software BV"},"paymentTerms":"Payment within 30 days"}'

curl -sS https://vantane.com/v1/invoices \
  -H 'authorization: Bearer vantane_sandbox_public' \
  -H 'content-type: application/json' \
  -d '{"invoice":{"id":"BE-GUIDE-AE-01","invoiceTypeCode":"380","issueDate":"2026-07-01","dueDate":"2026-07-31","currencyCode":"EUR","buyerReference":"PO-9002","seller":{"name":"Antwerpen Software BV","legalForm":"BV","vatId":"BE0876543270","registrationNumber":"0876543270","address":{"line1":"Meir 12","city":"Antwerpen","postalCode":"2000","countryCode":"BE"},"electronicAddress":{"scheme":"0208","value":"0876543270"}},"buyer":{"name":"Rotterdam Cloud Services B.V.","vatId":"NL123456789B01","registrationNumber":"12345678","address":{"line1":"Coolsingel 42","city":"Rotterdam","postalCode":"3011","countryCode":"NL"},"electronicAddress":{"scheme":"0088","value":"5410000000002"}},"lines":[{"id":"1","description":"Cross-border software consulting (B2B services)","quantity":10,"unitCode":"HUR","unitPrice":9500,"vat":{"categoryCode":"AE","rate":0,"exemptionReasonCode":"VATEX-EU-AE","exemptionReason":"VAT reverse-charged to the buyer under Article 196 EU VAT Directive"}}],"paymentMeans":{"typeCode":"30","iban":"BE68539007547034","bic":"GKCCBEBB","accountName":"Antwerpen Software BV"},"paymentTerms":"Payment within 30 days"},"options":{"deliver":true}}'

From a Stripe webhook to a delivered invoice

See Your Stripe Checkout charges aren't legal invoices in the EU for the full pipeline pattern — a Stripe webhook handler that builds the canonical JSON above from a completed Checkout session and calls POST /v1/invoices directly.

See also: How delivery works · Peppol access points compared