Belgium ๐ง๐ช
E-invoicing requirements and Mercurius integration for Belgium.
Overviewโ
| Aspect | Details |
|---|---|
| B2G Mandate | Required (federal since 2021, all levels 2024) |
| B2B Status | Voluntary, growing adoption |
| Preferred CIUS | Peppol BIS 3.0 |
| Primary Scheme | 0208 (CBE/KBO) |
| Government Portal | Mercurius |
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โ
- Peppol format (UBL 2.1 via BIS 3.0)
- CBE number as sender ID
- Correct Mercurius endpoint for receiver
- 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โ
| Level | Portal | Notes |
|---|---|---|
| Federal | Mercurius | All federal entities |
| Flanders | Mercurius | Integrated |
| Wallonia | Mercurius | Integrated |
| Brussels | Mercurius | Integrated |
| Municipalities | Varies | Many 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โ
| Code | Rate | Description |
|---|---|---|
| S | 21% | Standard rate |
| AA | 12% | Reduced (restaurants, social housing) |
| H | 6% | Super-reduced |
| Z | 0% | Zero rate (exports) |
| E | 0% | 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>