BCE/KBO API endpoints reference: complete list of REST routes (companies, addresses, NACE, UBO, establishments, Peppol)
Comprehensive technical reference of the Company Belgium REST API endpoints: search, company record, addresses, NACE activities, establishments, directors, UBO, Peppol verification. With response schemas, parameters and error codes.
In brief
The Company Belgium BCE/KBO API exposes about ten functional domains via versioned REST routes (/v1/): company search and record, addresses, establishments, NACE codes, directors, UBO beneficial owners, Peppol verification, denominations and webhooks. All responses follow the same JSON contract with standard rate-limiting headers.
About this reference
Comprehensive reference document for developers integrating the BCE/KBO API. All public endpoints are here, with parameters, response schemas and possible errors.
Base URL: https://api.companybelgium.be/v1
Format: JSON (request + response)
Authentication: X-API-Key + X-API-Secret in headers
Response structure
All responses follow the same contract:
1 2 3 4 5
{
"success": true,
"data": { ... },
"timestamp": "2026-05-10T14:32:01.523Z"
}
On error:
1 2 3 4 5
{
"success": false,
"error": "Company not found",
"timestamp": "2026-05-10T14:32:01.523Z"
}
Endpoints — Companies
GET /companies/:enterpriseNumber
Retrieves the full record of a company.
Parameter: BCE/KBO number (with or without dots, e.g. 0200.065.765 or 0200065765)
Response:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
{
"data": {
"enterpriseNumber": "0200065765",
"vatNumber": "BE0200065765",
"name": "Espero-Soft Informatiques SRL",
"legalForm": "Limited liability company",
"status": "AC",
"startDate": "1989-05-12",
"endDate": null,
"address": {
"street": "Example Street",
"number": "12",
"postalCode": "1000",
"municipality": "Brussels",
"country": "BE",
"fullAddress": "Example Street 12, 1000 Brussels"
},
"mainActivity": {
"code": "62.010",
"label": "Computer programming",
"version": "2008"
},
"establishmentsCount": 3
}
}
Errors: 404 (not found), 429 (rate limit), 401 (auth).
GET /companies/search
Full-text search of companies.
Query parameters:
| Param | Type | Description |
|---|---|---|
q | string | Query (name, partial name, number) |
limit | int | Max results (default 20, max 100) |
offset | int | Pagination (default 0) |
status | string | Filter (AC active, ST ceased, all) |
postalCode | string | Filter by postal code |
naceCode | string | Filter by NACE code |
Example:
1
GET /companies/search?q=espero&limit=10&status=AC
Response:
1 2 3 4 5 6 7 8 9 10 11
{
"data": [
{
"enterpriseNumber": "0200065765",
"name": "Espero-Soft Informatiques SRL",
"status": "AC",
"municipality": "Brussels"
}
],
"pagination": { "total": 1, "limit": 10, "offset": 0 }
}
Endpoints — Addresses
GET /companies/:enterpriseNumber/addresses
Retrieves all addresses associated with a company (registered office, mail, operations).
Response:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{
"data": [
{
"type": "REGO",
"typeLabel": "Registered office",
"street": "Example Street",
"number": "12",
"postalCode": "1000",
"municipality": "Brussels",
"country": "BE",
"validFrom": "2018-01-01",
"validTo": null
}
]
}
Address types: REGO (registered office), PMRG (manager's private), COBR (correspondence), EXPL (operations).
Endpoints — Establishments
GET /companies/:enterpriseNumber/establishments
Lists the establishment units of a company (physical sites attached).
Response:
1 2 3 4 5 6 7 8 9 10 11 12
{
"data": [
{
"establishmentNumber": "2100000123",
"name": "Espero-Soft - Liège branch",
"startDate": "2020-09-01",
"endDate": null,
"address": { ... },
"mainActivity": { ... }
}
]
}
GET /establishments/:establishmentNumber
Retrieves an establishment unit by its number.
Endpoints — NACE activities
GET /companies/:enterpriseNumber/activities
Lists declared NACE codes (main + secondary, per version 2003/2008/2025).
Response:
1 2 3 4 5 6 7 8 9 10 11
{
"data": [
{
"code": "62.010",
"label": "Computer programming",
"version": "2008",
"type": "MAIN",
"validFrom": "2018-01-01"
}
]
}
GET /nace-codes
Full reference list of NACE codes.
Query parameters:
| Param | Type | Description |
|---|---|---|
version | string | 2003, 2008 or 2025 (default 2008) |
q | string | Search in labels |
lang | string | Label language (fr, nl, en) |
Endpoints — Directors
GET /companies/:enterpriseNumber/directors
Lists the functions held (directors, managers, permanent representatives).
Response:
1 2 3 4 5 6 7 8 9 10 11 12 13
{
"data": [
{
"functionCode": "AD",
"functionLabel": "Managing director",
"person": {
"name": "Espero AKPOLI",
"type": "NATURAL"
},
"startDate": "2018-01-01"
}
]
}
Endpoints — Ultimate beneficial owners (UBO)
GET /companies/:enterpriseNumber/ubo
Retrieves the full UBO cascade, cross-checked with the Belgian register.
For the legal details of the UBO register, see the dedicated article.
Response:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
{
"data": {
"lastConfirmation": "2025-12-15",
"level1": [
{
"name": "John Doe",
"birthDate": "1975-03-21",
"nationality": "BE",
"controlPercentage": 60.0,
"category": "DIRECT"
}
],
"level2Cascade": [
{
"personName": "Mary Smith",
"effectivePercentage": 48.0,
"chain": [
{ "company": "Holding ABC SRL", "ownership": 80.0 },
{ "company": "Espero-Soft SRL", "ownership": 60.0 }
]
}
],
"discrepanciesWithRegister": []
}
}
Endpoints — Peppol verification
GET /peppol/check/:identifier
Verifies if a company is registered on Peppol (electronic invoicing network).
Parameter: identifier in Peppol format 0208:0200065765 (schema for BCE) or just the BCE number.
Response:
1 2 3 4 5 6 7 8 9 10 11
{
"data": {
"registered": true,
"smpUrl": "https://smp.example.com",
"capabilities": [
"urn:peppol:invoice:billing:3.0",
"urn:peppol:invoice:creditnote:3.0"
],
"lastSeen": "2026-05-09T08:12:00Z"
}
}
Endpoints — Denominations
GET /companies/:enterpriseNumber/denominations
Full history of names and trade denominations (FR/NL/EN).
Response:
1 2 3 4 5 6 7 8 9 10
{
"data": [
{
"type": "SOCIAL",
"language": "en",
"value": "Espero-Soft Informatiques",
"validFrom": "2018-01-01"
}
]
}
Endpoints — Webhooks
POST /webhooks
Create a webhook subscription.
Body:
1 2 3 4 5 6 7 8 9 10 11
{
"url": "https://your-app.example.com/webhooks/bce",
"events": [
"company.updated",
"company.director.added",
"company.ubo.changed",
"company.accounts.filed",
"company.peppol.registered"
],
"enterpriseNumbers": ["0200065765", "0400123456"]
}
GET /webhooks
List your subscriptions.
DELETE /webhooks/:id
Disable a subscription.
Standard HTTP codes
| Code | Meaning | What to do |
|---|---|---|
| 200 | OK | Read data |
| 400 | Bad Request | Verify parameters |
| 401 | Unauthorized | Verify API key/secret |
| 403 | Forbidden | Endpoint not allowed on your plan |
| 404 | Not Found | Company/establishment does not exist |
| 429 | Too Many Requests | Honor Retry-After |
| 500 / 502 / 503 | Server Error | Exponential retry |
Useful headers
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Total quota over window |
X-RateLimit-Remaining | Remaining quota |
X-RateLimit-Reset | Reset timestamp |
Retry-After | Seconds to wait before retry (on 429) |
X-Request-ID | Unique request ID (for support) |
Best practices
- Reuse one HTTP client instance (keep-alive)
- Implement exponential retry on 429/5xx
- Cache company records (TTL 5-30 min depending on volatility)
- Monitor
X-RateLimit-Remainingin logs
- Prefer webhooks over polling
How Company Belgium documents its endpoints
The Company Belgium API provides:
- Full OpenAPI 3.1 spec at
/docs/openapi.json
- Sandbox at
https://sandbox.api.companybelgium.bewith test data
- Python and TypeScript SDKs generated from the spec
- Public status page (incidents, maintenance)
To start: see the Python tutorial or the Node.js/TypeScript tutorial.
To understand scaling: see the rate-limit/caching architecture.
To compare with alternatives: comparison of the 5 BCE APIs.
Bottom line
A modern BCE/KBO API exposes about ten functional domains: companies, addresses, establishments, NACE, directors, UBO, Peppol, denominations, webhooks. The uniform response contract ({success, data, error, timestamp}) and the standardized rate-limit headers make integration predictable.
Bookmark this page as reference. All routes are stable and versioned (/v1/) — future changes will go via /v2/ without breaking existing integrations.
Frequently asked questions
What are the main endpoints of the Company Belgium BCE API ?
The BCE API exposes the following routes: GET /companies/search for full-text search, GET /companies/:number for the full record, GET /companies/:number/addresses for addresses, GET /companies/:number/establishments for establishments, GET /companies/:number/activities for NACE codes, GET /companies/:number/ubo for the UBO cascade and GET /peppol/check/:identifier to verify Peppol registration.
How do you authenticate requests to the BCE API ?
Every request must include two headers: X-API-Key with your public key (pk_live_...) and X-API-Secret with your secret key (sk_live_...). These keys are generated in the API Keys section of your dashboard on companybelgium.be. The secret key is hashed in SHA-256 and is only shown once at creation time.
How do you handle rate limiting (error 429) in BCE API calls ?
When the API returns HTTP 429, read the Retry-After header which indicates the number of seconds to wait before retrying. Implement a retry with exponential backoff: wait Retry-After times 2 to the power of the attempt number seconds between each try. Also monitor X-RateLimit-Remaining in your logs to anticipate quota exhaustion.
Does the BCE API support webhooks to track company changes ?
Yes, the POST /webhooks endpoint allows subscribing to company change events: company.updated, company.director.added, company.ubo.changed, company.accounts.filed and company.peppol.registered. You receive a real-time HTTP notification at your URL as soon as an event occurs, eliminating the need to poll the API every hour.
Comments
Related articles

Belgian Crossroads Bank for Enterprises (BCE/KBO) API: complete English developer documentation
English developer documentation for the Belgian Crossroads Bank for Enterprises API. Overview of the BCE/KBO registry, legal context, access options, quick start with cURL examples, and integration patterns for international developers.

Rate limits, quotas and caching to scale a BCE/KBO application: reference architecture
Your app queries the BCE/KBO API at volume — how to avoid 429s, control costs and guarantee latency? Reference architecture with multi-layer cache, request queue, observability and webhooks. Concrete patterns and target numbers.

Official KBO API vs third-party APIs: limitations of the public BCE service and why move to a modern API
The official SPF Economie API is free — but it's SOAP, without webhooks, without UBO or Peppol enrichment, and without SLA. Here is why 80% of serious projects end up migrating to a third-party API, and how to evaluate if it's your case.
