BCE / KBO — the Belgian enterprise number
The BCE/KBO number (Banque-Carrefour des Entreprises / Kruispuntbank van Ondernemingen) is the unique identifier of every Belgian company, assigned by FPS Economy at incorporation. Indispensable for invoicing, it also serves as a PEPPOL identifier via ICD 0208 and as the matrix of the VAT-BE number.
History: from VAT to unified registry
Before 2003, Belgium operated with half a dozen distinct administrative identifiers: VAT number, ONSS number, RPM number (Commercial Register), INASTI number, etc. The Act of 16 January 2003 created the BCE to unify these identifiers into one, similar to the French SIREN/SIRET number but with broader scope.
- 2003 — Initial launch. New companies receive a BCE number. Older ones (registered before 2003) keep their identifiers until progressive update.
- 2005-2009 — Transition. Migration of all former RPM, INASTI and ONSS registrations to BCE. The BCE becomes the sole identifier.
- 2014 — KBO Bulk Open Data. FPS Economy publishes a monthly downloadable complete CSV export (~1.5 GB compressed).
- 2018 — BCE 2.0 redesign. New KBO/BCE portal, public API for lookup by number.
- 2020 — PEPPOL ICD 0208. OpenPEPPOL adds the ICD 0208 code for BCE/KBO to its Authority Identifier Scheme registry. Mercurius switches to this schemeID for B2G routing.
- 2025 — B2B preparation. Anticipating the Royal Decree of 20 March 2025, BCE provides ERP vendors with a PEPPOL Endpoint lookup service via Mercurius SMP.
BCE/KBO number format
The BCE number consists of 10 digits, formatted
0XXX.XXX.XXX with dot separators. The first digit is
always a 0 or 1 (internal FPS coding,
depending on age).
- Position 1: generation indicator digit
(
0= pre-2008,1= post-2008). - Positions 2-8: sequential identifier (7 digits).
- Positions 9-10: modulo 97 checksum (see below).
Three equivalent representations accepted in practice:
-
0473.495.177— human-readable (with dots) -
0473495177— technical (without dots) -
BE0473495177— prefixed for Belgian VAT
Modulo 97 checksum algorithm
The last two digits are a check digit computed by modulo 97 over the first 8 digits. The same algorithm applies to the IBAN and to Belgian OGM/VCS structured communications.
def bce_checksum(bce_9digits: str) -> str:
"""
Modulo 97 algorithm to validate / compute the checksum of a
Belgian BCE/KBO number.
bce_9digits : the first 8 digits (without check, without
leading 0) or the full 10 digits.
Returns the 2 check digits or compares against the existing key.
"""
if len(bce_9digits) == 10:
# Verification mode: strip the last 2
body = bce_9digits[:-2]
expected = bce_9digits[-2:]
check = 97 - (int(body) % 97)
return str(check).zfill(2) == expected
body = bce_9digits[:8].zfill(8)
check = 97 - (int(body) % 97)
return str(check).zfill(2)
# Examples
print(bce_checksum("04734951")) # 77 -> 0473.495.177
print(bce_checksum("0473495177")) # True (verification)
print(bce_checksum("03083571")) # 59 -> 0308.357.159 (FPS Finance) PEPPOL ICD 0208 and BE VAT identifier
In the OpenPEPPOL Authority Identifier Scheme (PartyID Schemes) registry, code 0208 precisely designates the Belgian BCE/KBO number. Every PEPPOL-BIS 3.0 invoice issued from or to Belgium must use this schemeID to identify sender and recipient.
┌──────────────────────────────────────────────────────────────────────┐
│ Mapping BCE/KBO -> PEPPOL Endpoint -> VAT-BE │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ BCE number : 0473.495.177 │
│ PEPPOL Endpoint : 0208:0473495177 (ICD 0208 + 10 digits) │
│ VAT-BE (BTW-BE) : BE0473495177 (BE + 10 digits) │
│ RPM (commercial court) : Brussels-French chamber │
│ Publication Moniteur : MB of 12 June 2003 │
│ │
│ Source: BCE OpenData CSV / public REST API │
│ URL : https://kbopub.economie.fgov.be/kbopub/ │
│ │
└──────────────────────────────────────────────────────────────────────┘
Important subtlety: the BCE number is not identical to the
VAT number, but they derive from each other since 2008. A
non-VAT-registered company has a BCE number but no VAT-BE. Conversely,
the VAT-BE identifier is built by prefixing the BCE number with
BE.
- BCE only (no VAT): ASBL (non-profits), foundations, de facto associations, franchise-regime enterprises.
- BCE + VAT-BE: ordinary taxable persons (~95% of active companies).
- Foreign BCE: tax representation of a foreign company VAT-registered in Belgium only.
KBO OpenData and public API
FPS Economy publishes a complete monthly BCE dataset in OpenData (CC-BY 2.0 BE licence):
- Format: 9 CSV ZIP files (~1.5 GB), UTF-8 BOM encoding, comma separator, double quotes
- Main files:
enterprise.csv(legal entity),establishment.csv(establishment units),denomination.csv(trading names),activity.csv(NACE codes),address.csv(registered office and addresses),contact.csv(phone, email, website) - Public REST API: the KBOpub portal allows lookup by BCE/KBO number, name or postal code (limited to ~100 req/h without authentication).
- Download: KBO Open Data portal requires a free
account (
kbopub.economie.fgov.be/kbo-open-data). - Pro SOAP/REST: FPS Economy offers a paid lookup service (~EUR 250/year) for large vendors and banks (unlimited volume).
Links with RPM and Moniteur belge
The BCE number is also the access key to two other public registries:
- RPM — Legal Entities Register. Competence of
enterprise courts (formerly commercial courts). The RPM contains
articles of association, statutory modifications, notarial deeds
and Moniteur belge publications for commercial companies. Search
by BCE on
cri-online.be. - Moniteur belge / Belgisch Staatsblad. Official
publication of the State. Every legal act (incorporation,
extraordinary general meeting, merger, dissolution) is published
there. Search by BCE on
ejustice.just.fgov.be. - NBB Central Balance Sheet Office. National Bank of
Belgium, mandatory annual accounts deposit. Search by BCE on
consult.cbso.nbb.be.