KVKBase Team

Btw-nummer België: opbouw en controlegetal stap voor stap berekend

Hoe is een Belgisch btw-nummer opgebouwd en hoe werkt het controlegetal (modulo 97)? Met een uitgewerkt voorbeeld en uitleg over VIES en notatievarianten.

belgiebtwcontrolegetalvies

Een Belgisch btw-nummer ziet er eenvoudig uit, maar er zit meer logica in dan je denkt. Het heeft een vaste opbouw, een ingebouwde controle en meerdere schrijfwijzen. Wie facturen verwerkt, een webshop beheert of klantgegevens opschoont, vangt met een goede validatie veel fouten op. In deze gids reken je het controlegetal zelf na, met een volledig uitgewerkt voorbeeld.

De opbouw van een Belgisch btw-nummer

Een Belgisch btw-nummer is BE gevolgd door 10 cijfers. Die 10 cijfers zijn precies het ondernemingsnummer van de onderneming. Een voorbeeld: BE0821015819.

De regels op een rij:

  • Het voorvoegsel is BE, de landcode.
  • Er volgen 10 cijfers, in totaal dus 12 tekens.
  • Het eerste cijfer is 0 of 1.
  • De laatste twee cijfers zijn een controlegetal.

Vroeger bestonden Belgische btw-nummers uit 9 cijfers zonder voorloopnul. Daarom zie je soms nog nummers als BE821015819. Door een 0 voor te zetten krijg je het huidige formaat met 10 cijfers. Dat verklaart ook waarom spreadsheets nogal eens een cijfer te weinig tonen: ze strippen de voorloopnul.

Meer over het verband tussen beide nummers staat in het verschil tussen ondernemingsnummer en btw-nummer.

Het controlegetal uitgelegd

De laatste twee cijfers worden berekend uit de eerste acht. De regel is: deel de eerste acht cijfers door 97, neem de rest en trek die af van 97. Het resultaat is het controlegetal.

Waarom 97? Het is een priemgetal, waardoor de controle bijna alle fouten van een cijfer en de meeste omwisselingen van twee cijfers opvangt. Eén typfout leidt altijd tot een ander controlegetal.

Een volledig uitgewerkt voorbeeld

We nemen het nummer BE0821015819. De 10 cijfers zijn 0821015819. Het basisgedeelte (de eerste acht cijfers) is 08210158, als getal 8.210.158. Het controlegetal staat op de laatste twee posities: 19.

Stap voor stap:

  1. Zet de eerste acht cijfers om naar een getal: 08210158 wordt 8210158.
  2. Deel door 97: 8210158 / 97 is ongeveer 84640,8. Het grootste hele getal daarin is 84640.
  3. Vermenigvuldig terug: 84640 x 97 = 8210080.
  4. Trek af voor de rest: 8210158 min 8210080 = 78.
  5. Bereken het controlegetal: 97 min 78 = 19.

De uitkomst, 19, komt overeen met de laatste twee cijfers van het nummer. Het nummer is dus wiskundig correct.

Nu een fout nummer: BE0821015818. De eerste acht cijfers zijn dezelfde, dus het verwachte controlegetal blijft 19. Het nummer eindigt op 18, dus de controle faalt. Eén verkeerd cijfer is genoeg om dat te zien.

De controle in code

In JavaScript is de berekening kort:

function isValidBelgianVatFormat(input) {
  let digits = String(input).toUpperCase().replace(/^BE/, "").replace(/\D/g, "");
  if (digits.length === 9) digits = "0" + digits;
  if (!/^[01]\d{9}$/.test(digits)) return false;
  const base = Number(digits.slice(0, 8));
  const check = Number(digits.slice(8));
  return 97 - (base % 97) === check;
}

console.log(isValidBelgianVatFormat("BE0821015819")); // true
console.log(isValidBelgianVatFormat("BE0821015818")); // false

In Python:

import re

def is_valid_be_vat_format(value: str) -> bool:
    digits = re.sub(r"\D", "", value.upper().removeprefix("BE"))
    if len(digits) == 9:
        digits = "0" + digits
    if not re.fullmatch(r"[01]\d{9}", digits):
        return False
    return 97 - (int(digits[:8]) % 97) == int(digits[8:])

De API doet dezelfde controle. Een misvormd nummer krijgt INVALID_CBE_NUMBER (HTTP 400) en kost niets.

Een geldig controlegetal is geen bewijs

Dit is het belangrijkste punt van deze gids. Een nummer dat de modulo-97-controle haalt, is correct opgebouwd. Dat zegt niets over de vraag of er een onderneming met dat nummer bestaat, en nog minder of die btw-plichtig is.

Vier situaties waarin een correct nummer toch niet bruikbaar is:

  • Het nummer is nooit uitgegeven. Er zijn veel nummers die wiskundig kloppen, maar bij niemand horen.
  • De onderneming bestaat, maar is niet btw-plichtig en heeft dus geen btw-nummer.
  • Het btw-nummer is stopgezet.
  • De onderneming is gestopt of in vereffening.

Voor intracommunautaire handel controleer je de status daarom bij VIES, de officiële btw-databank van de EU. Hoe dat werkt, lees je in een btw-nummer controleren in België via VIES. Een VIES-controle op KVKBase kost 1 token, en het gratis plan geeft 50 tokens per maand. Ook VIES kan tijdelijk onbereikbaar zijn. Behandel een foutmelding dan als “onbekend”, niet als “ongeldig”.

Schrijfwijzen en variaties

Een btw-nummer komt in veel vormen voor:

SchrijfwijzeVoorbeeld
AaneengeslotenBE0821015819
Met puntenBE0821.015.819
Met spatiesBE 0821 015 819
Met punten en spatieBE 0821.015.819
Zonder voorvoegsel0821.015.819
Oud formaatBE821015819

Voor opslag en vergelijking normaliseer je altijd: verwijder spaties, punten en streepjes, zet in hoofdletters en controleer het voorvoegsel. Bewaar daarna BE plus 10 cijfers als tekst, nooit als getal. Toon het nummer aan gebruikers met punten, dat leest makkelijker.

Veelgemaakte fouten

  • Het nummer als getal opslaan. De voorloopnul verdwijnt.
  • Niet normaliseren. Twee schrijfwijzen van hetzelfde nummer worden dan twee klanten.
  • Alleen het formaat controleren. Zonder VIES weet je niet of het nummer actief is.
  • Een vestigingsnummer als btw-nummer gebruiken. Nummers die met 2 beginnen, horen bij een vestigingseenheid, niet bij de onderneming.

Verder lezen

Je kunt een nummer direct nakijken met de btw-nummer-controle of de tool om een ondernemingsnummer op te zoeken. Voor de volledige procedure bij een nieuwe klant is er een Belgische klant of leverancier controleren, en voor automatisering Belgische bedrijfsgegevens via een API integreren. Controleer je veel nummers, lees dan bedrijven in bulk controleren.

Veelgestelde vragen

Hoe is een Belgisch btw-nummer opgebouwd?
Het bestaat uit het landvoorvoegsel BE gevolgd door 10 cijfers. Die 10 cijfers zijn het ondernemingsnummer en beginnen met 0 of 1. De laatste twee cijfers zijn het controlegetal.
Hoe bereken ik het controlegetal van een btw-nummer?
Neem de eerste acht cijfers als getal, deel door 97 en bewaar de rest. Het controlegetal is 97 min die rest. Het moet gelijk zijn aan de laatste twee cijfers.
Bewijst een geldig controlegetal dat het btw-nummer actief is?
Nee. Het controlegetal bewijst alleen dat het nummer wiskundig klopt. Of er een actief btw-nummer bestaat, controleer je via VIES.
Mag ik punten of spaties in een btw-nummer zetten?
Voor weergave wel, bijvoorbeeld BE 0821.015.819. Verwijder ze voor je het nummer opslaat of controleert, zodat je enkel BE en 10 cijfers overhoudt.