Reference data KBO/BCE NBB Peppol Addresses Belgium
BETA

AXITAM Public API

Ready-to-use data for your applications, free, in JSON:

  • countries, subdivisions, currencies, languages, scripts and regions, how they relate, translated into dozens of languages;
  • every Belgian enterprise, to fill in and check forms;
  • the annual accounts Belgian enterprises deposit at the National Bank;
  • every Belgian address, to autocomplete and validate forms;
  • any place or address in the world, searched as the user types;
  • who receives electronic invoices on the Peppol network, worldwide.

ISO 3166-1 · ISO 3166-2 · ISO 3166-3 · ISO 4217 · ISO 639-3 · ISO 639-5 · ISO 15924 · UN M49KBO/BCE Open Data · NACE-BELNBB Central Balance Sheet OfficeBeSt AddressOpenStreetMap · PhotonPeppol Directoryupdated daily

The APIs

Simple JSON over HTTPS, read-only, no SDK required. Every API has its own OpenAPI specification.

Countries

ISO 3166-1 / 3166-2 / 3166-3

Countries by alpha-2, alpha-3 or numeric code, their subdivisions (regions, provinces...), the currencies and languages used there, and former countries.

GET /api/v1/countries/{code} GET /api/v1/countries/{code}/subdivisions GET /api/v1/countries/{code}/currencies GET /api/v1/countries/{code}/languages GET /api/v1/former-countries OpenAPI specification →

Currencies

ISO 4217

Active currencies with their decimal digits and cash rounding, looked up by alphabetic code (EUR) or numeric code (978), and the countries using each one.

GET /api/v1/currencies GET /api/v1/currencies/{code} GET /api/v1/currencies/{code}/countries OpenAPI specification →

Languages

ISO 639-3 / 639-5

Over 7,900 languages with filters (scope, type, 639-1 code), lookup by 639-1, 639-3 or 639-2/B code, the countries where each is spoken (official status, share of the population), and language families.

GET /api/v1/languages?hasAlpha2=true GET /api/v1/languages/{code} GET /api/v1/languages/{code}/countries GET /api/v1/language-families OpenAPI specification →

Scripts

ISO 15924

Writing systems (Latin, Cyrillic, Arabic, Han...) by four-letter code in any case or by numeric code.

GET /api/v1/scripts GET /api/v1/scripts/{code} OpenAPI specification →

Regions

UN M49

The World, continents and sub-regions (Western Europe, Eastern Africa...) as a tree, and every country within a region.

GET /api/v1/regions GET /api/v1/regions/{code} GET /api/v1/regions/{code}/countries OpenAPI specification →

Belgium: enterprises

KBO/BCE Open Data · NACE-BEL

Every enterprise registered in the Crossroads Bank for Enterprises: lookup by enterprise or VAT number in any form, number validation (check digits, registered, active), name autocompletion, names, juridical form, addresses, contacts, activities, establishment units and branches, plus the KBO code lists for your drop-downs. The record also says whether the enterprise receives Peppol e-invoices.

GET /api/v1/bel/enterprises/{number} GET /api/v1/bel/enterprises/{number}/validation GET /api/v1/bel/enterprises?name={text} GET /api/v1/bel/enterprises/{number}/establishments GET /api/v1/bel/kbo-codes/{category} GET /api/v1/bel/enterprises/{number}/peppol OpenAPI specification →

Belgium: annual accounts

NBB Central Balance Sheet Office

The annual accounts every Belgian enterprise deposits at the National Bank of Belgium: the list of deposits (financial year, model, language) of the last three years, the complete history since 1978 on request, and the documents (PDF, XBRL, JSON) relayed from the NBB.

GET /api/v1/bel/enterprises/{number}/annual-accounts GET /api/v1/bel/enterprises/{number}/annual-accounts?history=complete GET /api/v1/bel/annual-accounts/{reference} GET /api/v1/bel/annual-accounts/{reference}/pdf OpenAPI specification →

Belgium: addresses

BeSt Address · BOSA and the three regions (CC BY 4.0)

Autocomplete a Belgian address in three guided steps - municipality (by postal code or name), street, house number and box - then read the full address with its official BeSt identifier, its WGS84 position and its status. Queried live in the federal and regional address registers.

GET /api/v1/bel/addresses/municipalities?q={text} GET /api/v1/bel/addresses/streets?postCode={code}&name={text} GET /api/v1/bel/addresses/house-numbers?streetId={id}&houseNumber={digits} GET /api/v1/bel/addresses?id={addressId} OpenAPI specification →

Address search (worldwide)

OpenStreetMap · Photon (ODbL)

Free-text search of places and addresses anywhere in the world, as the user types: houses, streets, cities... with their WGS84 position, biased towards a point or restricted to a country. Queried live in OpenStreetMap data through Photon. A Belgian house also carries its match in the official BeSt registers (field best).

GET /api/v1/addresses/search?q={text}&countryCode={code}&lang={lang} GET /api/v1/addresses/search?q={text}&lat={lat}&lon={lon} OpenAPI specification →

Peppol participants

Peppol Directory · ISO 6523 identifiers

Who receives electronic invoices and other documents on the Peppol network, worldwide (8 million participants): search by name, country or identifier, read a participant with the business entities behind it and the document types it accepts. Queried live in the Peppol Directory. Belgian enterprises get a shortcut under the Belgium group, and their record already carries it.

GET /api/v1/peppol/participants?name={text}&country={code} GET /api/v1/peppol/participants/{participantId} GET /api/v1/bel/enterprises/{number}/peppol OpenAPI specification →

Getting started

No sign-up, no key needed: send a request and get JSON back. A free developer account raises your limits.

1Call an endpoint

All endpoints live under https://publicapi.axitam.net/api/v1.

curl https://publicapi.axitam.net/api/v1/countries/BE

# {"alpha2":"BE","alpha3":"BEL","numeric":"056","name":"Belgium",
#  "officialName":"Kingdom of Belgium","commonName":null,"flag":"๐Ÿ‡ง๐Ÿ‡ช"}
curl https://publicapi.axitam.net/api/v1/bel/enterprises/0420.254.973

# {"enterpriseNumber":"0420.254.973","vatNumber":"BE0420254973","status":{"code":"AC",...},
#  "denominations":[{"value":"AXITAM",...}],"addresses":[...],"activities":[...]}
curl https://publicapi.axitam.net/api/v1/bel/enterprises/0420.254.973/annual-accounts

# {"enterpriseNumber":"0420254973","historyComplete":false,"annualAccounts":[{"referenceNumber":"2025-00555958",
#   "depositDate":"2025-10-31","exerciseStart":"2024-01-01","exerciseEnd":"2024-12-31","modelType":"m87-f",...}]}
curl https://publicapi.axitam.net/api/v1/peppol/participants/0208:0420254973

# {"participantId":{"scheme":"iso6523-actorid-upis","value":"0208:0420254973"},
#  "entities":[{"names":[{"name":"AXITAM"}],"countryCode":"BE",...}],"documentTypes":[...]}
curl "https://publicapi.axitam.net/api/v1/bel/addresses/streets?postCode=1000&name=loi"

# [{"streetId":"https://databrussels.be/id/streetname/1679/1","name":{"nl":"Wetstraat","fr":"Rue de la Loi","de":null},
#   "municipality":{"municipalityId":"https://databrussels.be/id/municipality/21004/7","nisCode":"21004","name":{...}}},...]
curl "https://publicapi.axitam.net/api/v1/addresses/search?q=rue%20de%20la%20loi%2016%20bruxelles&countryCode=BE&lang=fr"

# {"query":"rue de la loi 16 bruxelles","language":"fr","results":[{"label":"Rue de la Loi 16, 1000 Bruxelles, Belgique",
#   "type":"house","street":"Rue de la Loi","houseNumber":"16","postCode":"1000","city":"Bruxelles","countryCode":"BE",...}]}

2Get names in your language

Add lang with a language tag (fr, nl-BE, pt-BR, ja...). A regional variant falls back to its language, then to English.

curl "https://publicapi.axitam.net/api/v1/countries/BE?lang=nl-BE"     # "name":"Belgiรซ"
curl "https://publicapi.axitam.net/api/v1/countries/BE/subdivisions?lang=fr"
curl "https://publicapi.axitam.net/api/v1/currencies/978?lang=fr"      # "name":"Euro"
curl "https://publicapi.axitam.net/api/v1/languages/fr?lang=fr"        # "name":"Franรงais"
curl "https://publicapi.axitam.net/api/v1/scripts/Latn"

3Follow the links

Countries lead to their currencies and languages, and back; regions list their countries.

curl "https://publicapi.axitam.net/api/v1/countries/PA/currencies"          # PAB and USD
curl "https://publicapi.axitam.net/api/v1/countries/BE/languages?official=true"  # nl, fr, de
curl "https://publicapi.axitam.net/api/v1/currencies/EUR/countries"
curl "https://publicapi.axitam.net/api/v1/regions/155/countries"          # Western Europe

4Fill in a Belgian enterprise

Type a VAT or enterprise number as your users do, validate it, or let them pick from an autocompletion on the name; then read the record and the KBO code lists for your drop-downs.

curl "https://publicapi.axitam.net/api/v1/bel/enterprises/BE0420254973/validation"
# {"input":"BE0420254973","normalized":"0420.254.973","vatNumber":"BE0420254973",
#  "isWellFormed":true,"isRegistered":true,"isActive":true}
curl "https://publicapi.axitam.net/api/v1/bel/enterprises/0420.254.973"      # names, form, addresses, activities...
curl "https://publicapi.axitam.net/api/v1/bel/enterprises?name=axitam"   # autocompletion
curl "https://publicapi.axitam.net/api/v1/bel/kbo-codes/JuridicalForm"      # drop-down of juridical forms

5Read the annual accounts of a Belgian enterprise

List the annual accounts it deposited at the National Bank of Belgium and open the documents. The last three years are always there; ask once for history=complete to fetch every deposit since 1978 (a few seconds the first time).

curl "https://publicapi.axitam.net/api/v1/bel/enterprises/0420.254.973/annual-accounts?history=complete"
# {"enterpriseNumber":"0420254973","historyComplete":true,"annualAccounts":[{"referenceNumber":"2025-00555958",
#   "depositDate":"2025-10-31","exerciseStart":"2024-01-01","exerciseEnd":"2024-12-31","modelType":"m87-f",
#   "language":"FR","currency":"EUR","documents":{"pdf":"/api/v1/bel/annual-accounts/2025-00555958/pdf",
#   "xbrl":"/api/v1/bel/annual-accounts/2025-00555958/xbrl","json":"/api/v1/bel/annual-accounts/2025-00555958/json"}},...]}
curl -O -J "https://publicapi.axitam.net/api/v1/bel/annual-accounts/2025-00555958/pdf"   # the accounts as filed

6Autocomplete a Belgian address

Three calls as the user types - municipality, street, house number - then one call to read the validated address with its official BeSt identifier and its coordinates. Identifiers are the regional URIs BeSt publishes: pass them back exactly as received. No wildcard is needed (nor accepted): the text typed matches the beginning of a word or any part of the name, in any language.

curl "https://publicapi.axitam.net/api/v1/bel/addresses/municipalities?q=brux"               # or q=10 for a postal-code prefix
curl "https://publicapi.axitam.net/api/v1/bel/addresses/streets?postCode=1000&name=loi"     # Rue de la Loi first
curl "https://publicapi.axitam.net/api/v1/bel/addresses/house-numbers?streetId=https://databrussels.be/id/streetname/1679/1&houseNumber=1"
curl "https://publicapi.axitam.net/api/v1/bel/addresses?id=https://databrussels.be/id/address/210225/1"
# {"addressId":"https://databrussels.be/id/address/210225/1","street":{"streetId":"https://databrussels.be/id/streetname/1679/1",
#   "name":{"nl":"Wetstraat","fr":"Rue de la Loi","de":null},"municipality":null},"houseNumber":"16","boxNumber":null,"postCode":"1000",
#  "municipality":{"municipalityId":"https://databrussels.be/id/municipality/21004/7","nisCode":"21004","name":{"nl":"Brussel","fr":"Bruxelles","de":null}},
#  "position":{"latitude":50.846169319921074,"longitude":4.366537635141211},"status":"current","isOfficiallyAssigned":true}

7Search an address anywhere in the world

One free-text field, one call per keystroke: places and addresses from OpenStreetMap, best first, with their type (house, street, city...) and their position. Bias the results towards the user with lat and lon, or restrict them to a country. The names come in the language asked when the instance knows it; the answer says which language was applied. A Belgian house also carries its best match: the official BeSt identifier to read with the Belgian addresses API, or a status saying why there is none.

curl "https://publicapi.axitam.net/api/v1/addresses/search?q=rue%20de%20la%20loi%2016%20bruxelles&countryCode=BE&lang=fr"
# {"query":"rue de la loi 16 bruxelles","language":"fr","results":[{"label":"Rue de la Loi 16, 1000 Bruxelles, Belgique","type":"house",
#   "street":"Rue de la Loi","houseNumber":"16","postCode":"1000","city":"Bruxelles","countryCode":"BE",
#   "position":{"latitude":50.8461212,"longitude":4.3663795},"osm":{"type":"N","id":11015484234,"key":"place","value":"house"},
#   "best":{"status":"OK","addressId":"https://databrussels.be/id/address/210225/1","position":{"latitude":50.846169319921074,"longitude":4.366537635141211}}}]}
curl "https://publicapi.axitam.net/api/v1/addresses/search?q=221b%20baker%20street%20london&lang=en"       # anywhere, no best field abroad
curl "https://publicapi.axitam.net/api/v1/addresses/search?q=loi%2016&lat=50.85&lon=4.35"               # biased towards Brussels

8Check who receives Peppol e-invoices

Before sending an electronic invoice, check that your customer is on the Peppol network and which documents it accepts. For a Belgian enterprise, one call on its number; for anyone else, search the Directory by name and country or read a participant identifier.

curl "https://publicapi.axitam.net/api/v1/bel/enterprises/0420.254.973/peppol"
# {"enterpriseNumber":"0420.254.973","vatNumber":"BE0420254973","status":"OK","isRegistered":true,
#  "participants":[{"participantId":{"scheme":"iso6523-actorid-upis","value":"0208:0420254973"},
#    "entities":[{"names":[{"name":"AXITAM"}],"countryCode":"BE","registrationDate":"2025-04-04",...}],
#    "documentTypes":[{"scheme":"busdox-docid-qns","value":"urn:oasis:names:...:Invoice-2::Invoice##...billing:3.0::2.1"},...]}]}
curl "https://publicapi.axitam.net/api/v1/peppol/participants?name=proximus&country=BE"   # search the Directory
curl "https://publicapi.axitam.net/api/v1/peppol/participants/0208:0420254973"             # one participant

9Handle errors

Errors use standard HTTP status codes (400 for an invalid code, 404 for an unknown one, 429 beyond your usage limit) and always the same body: a stable error code and a correlationId to quote when you contact us.

curl -i https://publicapi.axitam.net/api/v1/countries/ZZ

# HTTP/2 404
# {"code":"COUNTRY_NOT_FOUND","correlationId":"54046f8d-6bc9-44bf-b4fe-ea4377737f97"}
curl -i https://publicapi.axitam.net/api/v1/bel/enterprises/123

# HTTP/2 400
# {"code":"INVALID_ENTERPRISE_NUMBER","correlationId":"54046f8d-6bc9-44bf-b4fe-ea4377737f97"}
curl -i https://publicapi.axitam.net/api/v1/peppol/participants/0208:0999999922

# HTTP/2 404
# {"code":"PEPPOL_PARTICIPANT_NOT_FOUND","correlationId":"54046f8d-6bc9-44bf-b4fe-ea4377737f97"}
curl -i "https://publicapi.axitam.net/api/v1/bel/addresses/streets?postCode=1000&name=lo*"

# HTTP/2 400
# {"code":"INVALID_REQUEST","correlationId":"54046f8d-6bc9-44bf-b4fe-ea4377737f97"}
curl -i "https://publicapi.axitam.net/api/v1/addresses/search?q=paris&lat=48.85"

# HTTP/2 400 (lat without lon)
# {"code":"INVALID_ARGUMENT","correlationId":"54046f8d-6bc9-44bf-b4fe-ea4377737f97"}

Try it

Pick a request and send it to the live API.


            

Documentation

Browse every endpoint interactively, or import an OpenAPI specification into your tools to generate a client.

Usage limits and one host per source

The API is free to use without a key. To keep it fast for everyone, each client (IP address) is limited: 10 requests per second with bursts of 20 on every path, 2 per second on the Peppol paths (the Peppol Directory's own limit), 1 per second when an annual-account document is relayed from the NBB, 5 per second on the worldwide address search (the public Photon instance asks for a reasonable use). A request beyond the limit gets HTTP 429 with the error code RATE_LIMITED and a Retry-After header; every limited response carries X-RateLimit-Limit and X-RateLimit-Remaining.

Need more? Create a free developer account (e-mail confirmation, then a short manual approval), subscribe to the free plan and send your API key in the X-API-Key header: 30 requests per second with bursts of 60 on every host, per key rather than per IP address. The path limits above still apply; an unknown or revoked key is refused with 401 INVALID_API_KEY.

Get an API key

Each source is also served alone on its own host, with the same paths and formats:

HostWhat it servesData sources
publicapi.axitam.netEverything below, on one hostiso-codes, cldr, kbo-open-data, nbb-cbso, peppol-directory, best-address, photon
cbe.publicapi.axitam.netBelgian enterprises (KBO/BCE)kbo-open-data
nbb.publicapi.axitam.netBelgian annual accounts (NBB)nbb-cbso
peppol.publicapi.axitam.netPeppol participants (live)peppol-directory
be.publicapi.axitam.netEverything Belgian: enterprises, annual accounts, Peppol, addresses, address searchkbo-open-data, nbb-cbso, peppol-directory, best-address, photon
address.publicapi.axitam.netBelgian addresses and worldwide address search (BeSt Address, Photon, live)best-address, photon
refdata.publicapi.axitam.netCountries, currencies, languages, scripts, regionsiso-codes, cldr

Public beta

The AXITAM Public API is in beta: it is available and kept up to date, but endpoints and response formats may still evolve before version 1.0. More reference data (VAT codes of other countries, phone number validation...) is on the way.

Questions, ideas or feedback? We would love to hear from you.

Contact AXITAM