KBO Open Data: a developer's guide
The Crossroads Bank for Enterprises (CBE, called BCE in French and KBO in Dutch) publishes the Belgian company register as open data. This guide explains how to get the files, what they contain and how to keep a copy up to date, with the pitfalls we met running our own import every day.
Last checked: September 2026
Based on the official cookbook version R018.00 (December 2025) and the files published in September 2026.
What KBO Open Data is
KBO Open Data, officially called CBE Open Data in English, is the free, official extract of the register kept by the FPS Economy. It covers every active registered entity and establishment unit: the full file of 26 September 2026 held 1,964,143 enterprises and 1,699,251 establishment units.
It holds the current state only, with no history: when a company moves, only its new address is in the file.
How to get access
Create a free account on the KBO Open Data portal and accept the licence. There is no anonymous download. Once registered, you download the files from the portal.
Automated downloads over SFTP have to be requested separately from the FPS Economy, as explained on the official CBE Open Data page.
Full and Update files
A Full file and an Update file are published every day, and each stays available for 31 days. The Full file is a complete snapshot; the Update file holds the changes since the previous Full file. Some older documents, including the licence, still describe monthly files: they have been daily since late 2025.
File names carry an extract number, which goes up by one every day, and the date. The Update file has the same name ending in _Update.zip.
KboOpenData_0494_2026_09_26_Full.zip Each zip contains a meta.csv with the snapshot date, the extract number, the extract type (full or update) and the file format version, which tells you which version of the cookbook to read.
The files and their columns
| File | What it holds | Main columns |
|---|---|---|
enterprise.csv |
One row per active enterprise: legal situation, type (natural or legal person), legal form, start date
|
EnterpriseNumber, Status, JuridicalSituation, TypeOfEnterprise, JuridicalForm, JuridicalFormCAC, StartDate
|
establishment.csv |
Establishment units, the places where an enterprise carries out its activities
|
EstablishmentNumber, StartDate, EnterpriseNumber
|
denomination.csv |
Names: legal name, abbreviation and commercial name, per language
|
EntityNumber, Language, TypeOfDenomination, Denomination
|
address.csv |
Addresses, in Dutch and French
|
EntityNumber, TypeOfAddress, Zipcode, MunicipalityNL, MunicipalityFR, StreetNL, StreetFR, HouseNumber, Box
|
contact.csv |
Phone numbers, email and web addresses
|
EntityNumber, EntityContact, ContactType, Value
|
activity.csv |
Activities as NACE codes, per activity group
|
EntityNumber, ActivityGroup, NaceVersion, NaceCode, Classification
|
branch.csv |
Branches of foreign entities in Belgium
|
Id, StartDate, EnterpriseNumber
|
code.csv |
The description of every code, per language
|
Category, Code, Language, Description
|
meta.csv |
Information about the extract itself
|
SnapshotDate, ExtractTimestamp, ExtractType, ExtractNumber, Version
|
You do not have to load every file: pick the ones your application needs.
File format
- Comma-separated values, text in double quotes, with a header row.
- An empty field means no value.
- Dates are written
dd-mm-yyyy, not ISO 8601. - Enterprise numbers are written
0123.456.789and establishment unit numbers2.123.456.789.EntityNumbercolumns can hold either.
Applying Update files
Update files replace data per entity, not per row. For each table, the zip holds a _delete file and an _insert file. When anything about an entity changed in a table, its number is in the delete file, and all its current rows for that table, changed or not, are in the insert file.
- Load a Full file first.
- For each table, delete every row of the entity numbers listed in
<table>_delete.csv. - Then insert every row of
<table>_insert.csv. - Replace your code table with the
code.csvof the zip: Update files always contain the complete code list.
-- for each table, e.g. denomination, after loading
-- denomination_delete.csv and denomination_insert.csv
BEGIN;
DELETE FROM denomination
WHERE entity_number IN (SELECT entity_number FROM denomination_delete);
INSERT INTO denomination SELECT * FROM denomination_insert;
COMMIT; Each Update file builds on the previous one, so apply them in order. Files stay available for 31 days only: if your import falls further behind, start again from a Full file.
Pitfalls to avoid
- Natural persons have no seat address and no legal form. They make up about 39% of enterprises (770,175 on 26 September 2026), and only their establishment units have addresses. Make joins on addresses and legal forms optional.
- One entity, several names. An enterprise can have a legal name, an abbreviation and a commercial name, each in several languages. In
denomination.csvthe language is a number (1 French, 2 Dutch, 3 German, 4 English, 0 unknown); incode.csvit is a letter code. - Keep codes as text. Legal forms, legal situations and activity groups have leading zeros (
014,000,006). Stored as numbers, they no longer matchcode.csv. - Three NACE-BEL versions side by side. An activity code only means something together with its
NaceVersion: NACE-BEL 2003, 2008 or 2025.62010, for example, exists in the 2008 table but not in the 2003 or 2025 tables. - No English descriptions.
code.csvdescribes every code in Dutch and French, some in German, and none in English yet. - Addresses in two languages. Streets and municipalities come in Dutch and French only, and the country is empty for Belgian addresses.
- Branch identifiers are not official numbers. A branch
Idcannot be used anywhere else, and names and addresses can belong to branches. If you load only enterprises and establishment units, those rows have nothing to attach to. - People do not type the dotted format. Expect
0123456789,BE0123456789or0123.456.789, and normalise the number before you search. - Size. In the full file of 26 September 2026,
activity.csvalone has about 34 million rows. Stream the CSV files instead of loading them into memory, and plan disk space for the zip, the extracted files and your database at the same time.
What the licence asks of you
- Mention the source and the date of the last update of the data.
- Do not alter the data or distort its meaning, and use it for the purpose you declared when registering.
- Do not use personal data for direct marketing. This covers all data about enterprises that are natural persons.
- For the personal data you keep, you are the controller under the GDPR and must handle access, rectification and objection requests.
- The licence ends if you download nothing for a year.
This is a summary for developers, not legal advice. Read the licence (in French) before you use the data.
KBO Open Data or CBE2JSON?
| KBO Open Data | CBE2JSON |
|---|---|
ZIP / CSV files
|
JSON REST API
|
Full + Update import
|
Managed sync
|
Several tables to join
|
A ready-to-use company object
|
Tens of millions of activity rows to handle
|
Hosted infrastructure
|
A local database to maintain
|
No storage needed
|
Search to build yourself
|
Search through the API
|
Format changes to watch
|
Maintenance included
|
KBO Open Data remains the best choice if you need to own or analyse the complete dataset. CBE2JSON is built for applications that need to look up the data without maintaining the import infrastructure.
Need the data, not the infrastructure?
CBE2JSON downloads, imports and syncs KBO Open Data every day, then serves the data through a ready-to-use JSON API.
Request
POST https://api.cbe2json.be/byCBE
Content-Type: application/json
{ "clientId": "…", "secretKey": "…", "data": { "cbe": "0202.239.951" } } Response (shortened)
{
"enterpriseNumber": "0202.239.951",
"status": "AC",
"startDate": "1930-07-19T00:00:00.000Z",
"juridicalFormDescription": {
"FR": "Société anonyme de droit public",
"NL": "Naamloze vennootschap van publiek recht", …
},
"denominations": [
{ "language": 1, "typeOfDenomination": "001", "denomination": "PROXIMUS", … },
{ "language": 2, "typeOfDenomination": "001", "denomination": "PROXIMUS", … }
],
"addresses": [
{ "typeOfAddress": "REGO", "zipcode": "1030", "municipalityFR": "Schaerbeek", … }
],
"activities": [ … ],
"establishments": [ … ],
"meta": { "source": "CBE", "dataUpdatedAt": "2026-09-26" }
}
Try it free
Read the documentation
50 free credits a month, no credit card. Need more? Start a 30-day Developer trial from your dashboard.
Related resources
Sources: the CBE Open Data cookbook (FPS Economy), the Open Data licence, and our own daily import of the files. Figures are from the full file of 26 September 2026.