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.
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
BEplus 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:
| Identificator | Voorbeeld | Opbouw |
|---|---|---|
| Ondernemingsnummer | 0821.015.819 | 10 cijfers, begint met 0 of 1 |
| Zonder punten | 0821015819 | alleen cijfers, handig voor opslag |
| Btw-nummer | BE0821015819 | BE plus dezelfde 10 cijfers |
| Vestigingseenheid | 2.xxx.xxx.xxx | begint 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:
- 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.
- Bewaar het btw-nummer in een apart veld, met het resultaat van de laatste validatie en het tijdstip.
- Bewaar vestigingen in een aparte tabel met hun eigen nummer en een verwijzing naar de onderneming.
- 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.