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.
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:
- Zet de eerste acht cijfers om naar een getal: 08210158 wordt 8210158.
- Deel door 97: 8210158 / 97 is ongeveer 84640,8. Het grootste hele getal daarin is 84640.
- Vermenigvuldig terug: 84640 x 97 = 8210080.
- Trek af voor de rest: 8210158 min 8210080 = 78.
- 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:
| Schrijfwijze | Voorbeeld |
|---|---|
| Aaneengesloten | BE0821015819 |
| Met punten | BE0821.015.819 |
| Met spaties | BE 0821 015 819 |
| Met punten en spatie | BE 0821.015.819 |
| Zonder voorvoegsel | 0821.015.819 |
| Oud formaat | BE821015819 |
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.