Skip to main content

Belgium ๐Ÿ‡ง๐Ÿ‡ช

E-invoicing requirements and Mercurius integration for Belgium.

Overviewโ€‹

AspectDetails
B2G MandateRequired (federal since 2021, all levels 2024)
B2B StatusVoluntary, growing adoption
Preferred CIUSPeppol BIS 3.0
Primary Scheme0208 (CBE/KBO)
Government PortalMercurius

Identifier Schemesโ€‹

CBE/KBO Number (0208) โ€” Standardโ€‹

The Crossroads Bank for Enterprises number:

# Format: 0/1 + 9 digits (10 total)
participant = {
"scheme": "0208",
"identifier": "0123456789",
"name": "Example BVBA",
"country": "BE"
}

Validation Rules:

  • 10 digits, starts with 0 or 1
  • Last 2 digits are check digits (mod 97)
  • Look up at KBO Public Search
def validate_cbe(cbe: str) -> bool:
"""Validate Belgian CBE/KBO number."""
if len(cbe) != 10:
return False
if cbe[0] not in ('0', '1'):
return False
if not cbe.isdigit():
return False
# Check digit validation
base = int(cbe[:8])
check = int(cbe[8:])
return 97 - (base % 97) == check

VAT Number (9925)โ€‹

For cross-border B2B:

# Format: BE + 10 digits (or BE + 0 + 9 digits)
participant = {
"scheme": "9925",
"identifier": "BE0123456789",
"name": "Example NV",
"country": "BE"
}

Government E-invoicing (B2G)โ€‹

Mercurius Platformโ€‹

All B2G invoices in Belgium go through Mercurius:

Supplier โ†’ GoRoute (Peppol AP) โ†’ Mercurius โ†’ Government Entity

Mercurius Requirementsโ€‹

  1. Peppol format (UBL 2.1 via BIS 3.0)
  2. CBE number as sender ID
  3. Correct Mercurius endpoint for receiver
  4. Structured references when required

Finding Government Endpointsโ€‹

# Lookup Belgian government entity
response = requests.get(
"https://app.goroute.ai/peppol-api/api/v1/participants/lookup",
params={
"scheme": "0208",
"identifier": "0671516647" # Example federal entity
},
headers={"X-API-Key": "your_api_key"}
)

Federal vs Regionalโ€‹

LevelPortalNotes
FederalMercuriusAll federal entities
FlandersMercuriusIntegrated
WalloniaMercuriusIntegrated
BrusselsMercuriusIntegrated
MunicipalitiesVariesMany via Mercurius

Invoice Requirementsโ€‹

Standard Belgian Invoiceโ€‹

<Invoice>
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>

<cbc:ID>BE-INV-2024-00123</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

<!-- Required for B2G -->
<cbc:BuyerReference>PO-2024-1234</cbc:BuyerReference>

<!-- Belgian Seller -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0123456789</cbc:EndpointID>

<cac:PartyTaxScheme>
<cbc:CompanyID>BE0123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>

<cac:PartyLegalEntity>
<cbc:RegistrationName>Voorbeeld BVBA</cbc:RegistrationName>
<cbc:CompanyID schemeID="0208">0123456789</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>

<!-- Belgian Government Receiver -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0671516647</cbc:EndpointID>
</cac:Party>
</cac:AccountingCustomerParty>
</Invoice>

Structured Communicationโ€‹

Belgian B2G often requires structured payment reference:

<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<!-- OGM/VCS structured communication: +++123/1234/12345+++ -->
<cbc:PaymentID>+++123/1234/12345+++</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>BE68539007547034</cbc:ID>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>

VAT Requirementsโ€‹

Belgian VAT Formatโ€‹

# Belgian VAT: BE + 10 digits
def validate_belgian_vat(vat: str) -> bool:
if not vat.startswith("BE"):
return False
number = vat[2:]
if len(number) != 10:
return False
if not number.isdigit():
return False
# Mod 97 check
return int(number[:8]) % 97 == 97 - int(number[8:])

VAT Ratesโ€‹

CodeRateDescription
S21%Standard rate
AA12%Reduced (restaurants, social housing)
H6%Super-reduced
Z0%Zero rate (exports)
E0%Exempt

Example Invoiceโ€‹

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">

<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>

<cbc:ID>BE-RG-2024-00123</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
<cbc:DueDate>2024-02-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

<cbc:BuyerReference>BESTELBON-2024-001</cbc:BuyerReference>

<!-- Belgian Supplier -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0123456789</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Voorbeeld NV</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Koningsstraat 1</cbc:StreetName>
<cbc:CityName>Brussel</cbc:CityName>
<cbc:PostalZone>1000</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>BE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>BE0123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Voorbeeld NV</cbc:RegistrationName>
<cbc:CompanyID schemeID="0208">0123456789</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>

<!-- Belgian Government Buyer -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0671516647</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>FOD Financiรซn</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>North Galaxy</cbc:StreetName>
<cbc:CityName>Brussel</cbc:CityName>
<cbc:PostalZone>1030</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>BE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyLegalEntity>
<cbc:RegistrationName>FOD Financiรซn</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>

<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cbc:PaymentID>+++123/1234/12345+++</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>BE68539007547034</cbc:ID>
<cbc:Name>Voorbeeld NV</cbc:Name>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>

<cac:PaymentTerms>
<cbc:Note>Betaling binnen 30 dagen</cbc:Note>
</cac:PaymentTerms>

<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">21.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">100.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">21.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>

<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">100.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">121.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">121.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consulting diensten</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>

Bilingual Considerationsโ€‹

Belgium has three official languages. Consider:

<!-- Item names can be multilingual -->
<cac:Item>
<cbc:Name>Consultancy services / Conseil / Advies</cbc:Name>
</cac:Item>

Resourcesโ€‹

Next Stepsโ€‹