CompanyBelgium

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.

May 10, 202610 min read

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:

JSON
1
2
3
4
5
{
  "success": true,
  "data": { ... },
  "timestamp": "2026-05-10T14:32:01.523Z"
}

On error:

JSON
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:

JSON
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:

ParamTypeDescription
qstringQuery (name, partial name, number)
limitintMax results (default 20, max 100)
offsetintPagination (default 0)
statusstringFilter (AC active, ST ceased, all)
postalCodestringFilter by postal code
naceCodestringFilter by NACE code

Example:

http
1
GET /companies/search?q=espero&limit=10&status=AC

Response:

JSON
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:

JSON
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:

JSON
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:

JSON
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:

ParamTypeDescription
versionstring2003, 2008 or 2025 (default 2008)
qstringSearch in labels
langstringLabel language (fr, nl, en)

Endpoints — Directors

GET /companies/:enterpriseNumber/directors

Lists the functions held (directors, managers, permanent representatives).

Response:

JSON
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:

JSON
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:

JSON
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:

JSON
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:

JSON
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

CodeMeaningWhat to do
200OKRead data
400Bad RequestVerify parameters
401UnauthorizedVerify API key/secret
403ForbiddenEndpoint not allowed on your plan
404Not FoundCompany/establishment does not exist
429Too Many RequestsHonor Retry-After
500 / 502 / 503Server ErrorExponential retry

Useful headers

HeaderMeaning
X-RateLimit-LimitTotal quota over window
X-RateLimit-RemainingRemaining quota
X-RateLimit-ResetReset timestamp
Retry-AfterSeconds to wait before retry (on 429)
X-Request-IDUnique 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-Remaining in 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.be with 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.

Ready to get started?

Create your free account and get your API keys in minutes.

Comments

Loading comments…

Leave a comment

Not published — used only to notify you.

Comments are moderated before publication.

Related articles