KVKBase Team

Ondernemingsnummer, KBO-nummer en btw-nummer: het verschil

Wat is het verschil tussen ondernemingsnummer en btw-nummer? Zo is het opgebouwd, wanneer er geen btw-nummer is en wat je in je database bewaart.

belgieondernemingsnummerbtw-nummerdatamodel

Facturen, formulieren en API’s gebruiken drie termen door elkaar: ondernemingsnummer, KBO-nummer en btw-nummer. Voor een mens lijkt dat hetzelfde, voor je database is het dat niet. Wie ze niet uit elkaar houdt, krijgt dubbele klanten, afgekeurde facturen of een btw-controle die zonder reden faalt. Hier lees je wat elk nummer betekent, hoe ze samenhangen en hoe je ze netjes opslaat.

De drie termen in een notendop

  • Ondernemingsnummer: het unieke identificatienummer van een Belgische onderneming. 10 cijfers, geschreven als 0xxx.xxx.xxx.
  • KBO-nummer: een andere naam voor exact hetzelfde nummer. Je ziet de term vooral in boekhoudpakketten en zoekopdrachten.
  • Btw-nummer: het nummer waarmee een onderneming btw rekent en aftrekt in het intra-Europese verkeer. In België is dat BE plus de 10 cijfers van het ondernemingsnummer.

Het ondernemingsnummer identificeert dus een onderneming. Het btw-nummer is een afgeleide die zegt dat die onderneming als btw-plichtige geregistreerd is.

Hoe het btw-nummer is opgebouwd

Neem het ondernemingsnummer, laat de punten weg en zet BE ervoor:

IdentificatorVoorbeeldOpbouw
Ondernemingsnummer0821.015.81910 cijfers, begint met 0 of 1
Zonder punten0821015819alleen cijfers, handig voor opslag
Btw-nummerBE0821015819BE plus dezelfde 10 cijfers
Vestigingseenheid2.xxx.xxx.xxxbegint met 2, hoort bij een onderneming

Het getoonde nummer is een voorbeeld om de opbouw te illustreren. Voor het controlegetal geldt in beide gevallen dezelfde regel: de laatste twee cijfers zijn gelijk aan 97 min de rest van de deling van de eerste acht cijfers door 97.

9 cijfers of 10 cijfers

Oudere Belgische btw-nummers werden met 9 cijfers geschreven, bijvoorbeeld BE821015819. Het ondernemingsnummer had al 10 cijfers. Vandaag voeg je gewoon een voorloopnul toe. In oude facturen, boekhoudexports en vooral in spreadsheets kom je nog 9-cijferige varianten tegen. Een spreadsheet die het nummer als getal behandelt, verwijdert de voorloopnul ook zelf. Je normalisatie moet daar dus mee overweg kunnen.

Wanneer is er geen btw-nummer?

Een ondernemingsnummer garandeert geen actief btw-nummer. Entiteiten die niet btw-plichtig zijn, hebben wel een ondernemingsnummer maar geen btw-registratie. Denk aan:

  • sommige vzw’s en stichtingen die geen btw-plichtige activiteiten uitoefenen
  • bepaalde vrije beroepen, zoals artsen, waarvan de prestaties van btw zijn vrijgesteld
  • eenmanszaken onder de franchiseregeling voor kleine ondernemingen

Dat betekent voor jouw software: je mag het btw-nummer nooit zomaar afleiden en als waar beschouwen. Leid het af als kandidaat en bevestig dan met VIES, het btw-systeem van de Europese Commissie. Hoe dat in zijn werk gaat, lees je in btw-nummer controleren in België via VIES.

Wat bewaar je in je database?

Een bewezen aanpak:

  1. Bewaar het ondernemingsnummer als tekst van 10 cijfers, zonder punten. Maak het de sleutel van je bedrijfsrecord. Het verandert niet als het bedrijf verhuist of van naam wisselt.
  2. Bewaar het btw-nummer in een apart veld, met het resultaat van de laatste validatie en het tijdstip.
  3. Bewaar vestigingen in een aparte tabel met hun eigen nummer en een verwijzing naar de onderneming.
  4. Gebruik nooit een getalkolom voor een van deze nummers.
CREATE TABLE company (
  enterprise_number CHAR(10) PRIMARY KEY,  -- e.g. 0821015819, stored as text
  name              TEXT NOT NULL,
  vat_number        VARCHAR(12),           -- e.g. BE0821015819, nullable
  vat_valid         BOOLEAN,               -- result of the last VIES check
  vat_checked_at    TIMESTAMP              -- when that check happened
);

Dat laatste veld is geen luxe. Een btw-nummer dat vandaag geldig is, kan morgen geschrapt zijn. Wie intra-Europees levert, wil bewijzen dat het nummer geldig was op het moment van de levering.

Normalisatie in JavaScript

Gebruikers typen 0821.015.819, BE 0821.015.819, be0821015819 of plakken 821015819 uit een spreadsheet. Normaliseer bij het binnenkomen naar een vaste vorm:

function normalizeBelgianNumber(input) {
  let digits = String(input)
    .toUpperCase()
    .replace(/^BE/, "")
    .replace(/\D/g, "");

  if (digits.length === 9) digits = "0" + digits; // restore the leading zero
  if (!/^[01]\d{9}$/.test(digits)) return null;

  const base = Number(digits.slice(0, 8));
  const check = Number(digits.slice(8));
  if (97 - (base % 97) !== check) return null; // check pair fails

  return {
    enterpriseNumber: digits,
    formatted: `${digits.slice(0, 4)}.${digits.slice(4, 7)}.${digits.slice(7)}`,
    vatCandidate: `BE${digits}`,
  };
}

console.log(normalizeBelgianNumber("be 0821.015.819"));
// { enterpriseNumber: "0821015819", formatted: "0821.015.819", vatCandidate: "BE0821015819" }
console.log(normalizeBelgianNumber("821015819")); // same result, leading zero restored

Het resultaat bevat vatCandidate en geen vatNumber: de naam herinnert je eraan dat het nog bevestigd moet worden.

Beide nummers in een keer ophalen

Met de API krijg je beide nummers terug uit een opzoeking. De endpoint accepteert elke schrijfwijze:

curl -s "https://api.kvkbase.nl/v1/be/lookup/BE0821015819" \
  -H "Authorization: Bearer YOUR_API_KEY"

In het antwoord staat het ondernemingsnummer in cbeNumber en cbeNumberFormatted. Het blok vat bevat number, valid, status, validatedAt en checksumValid. Zo zie je in een enkele aanroep of er een geldig btw-nummer aan de onderneming hangt. Een opzoeking kost 1 token. Wil je enkel het btw-nummer controleren, gebruik dan GET /v1/be/validate/vat/BE0821015819, ook 1 token. Alle velden staan in de API-referentie.

Zo ga je er in de praktijk mee om

  • Vraag klanten bij registratie naar hun ondernemingsnummer, niet naar hun btw-nummer. Het eerste heeft elke Belgische onderneming, het tweede niet.
  • Laat je formulier het nummer in elke schrijfwijze accepteren en normaliseer zelf.
  • Toon de gebruiker de naam en het adres uit de opzoeking, zodat een typfout meteen opvalt. Zoek je een bedrijf zonder nummer, dan helpt de tool om een ondernemingsnummer op te zoeken of de gids ondernemingsnummer opzoeken.
  • Controleer het btw-nummer apart met de btw-nummer-controle en bewaar het resultaat met tijdstip.

Een gratis account geeft je 50 tokens per maand om dit uit te proberen, zonder kredietkaart. Voor meer volume zie je de prijzen, en een overzicht van de mogelijkheden staat op de België-pagina.

Veelgestelde vragen

Is het ondernemingsnummer hetzelfde als het btw-nummer?
Bijna. Het btw-nummer is 'BE' gevolgd door de 10 cijfers van het ondernemingsnummer. Het ondernemingsnummer bestaat echter ook voor entiteiten zonder actief btw-nummer.
Waarom hebben oudere btw-nummers 9 cijfers?
Vroeger werden Belgische btw-nummers met 9 cijfers geschreven. Vandaag wordt een voorloopnul toegevoegd zodat het nummer 10 cijfers telt en gelijk is aan het ondernemingsnummer.
Welk nummer bewaar ik best in mijn database?
Bewaar het ondernemingsnummer als sleutel, als tekst van 10 cijfers. Bewaar het btw-nummer apart, samen met het resultaat en het tijdstip van de laatste validatie.
Waarom heeft mijn klant wel een ondernemingsnummer maar geen btw-nummer?
Niet elke entiteit is btw-plichtig. Sommige vzw's, bepaalde vrije beroepen zoals artsen en eenmanszaken onder de franchiseregeling hebben een ondernemingsnummer zonder actief btw-nummer.