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.
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.
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.
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.
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}}'
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