Belgische leverancier controleren: checklist voor KYC-onboarding
Belgische leverancier controleren of een nieuwe klant onboarden: checklist met ondernemingsnummer, status, rechtsvorm, btw via VIES en een audit trail.
Een nieuwe klant of leverancier aanvaarden is een moment waarop fouten goedkoop te vermijden zijn en later duur om te herstellen. Een factuur aan een bedrijf dat niet meer bestaat, een betaling aan een vennootschap in vereffening, een btw-nummer dat niet blijkt te kloppen: het zijn allemaal dingen die je in een paar seconden kan zien, als je weet waar je moet kijken. Deze checklist is bedoeld voor wie een Belgische leverancier wil controleren of een Belgische klant wil onboarden, met zoveel mogelijk automatisering en een duidelijk beeld van wat handwerk blijft.
Wat je automatisch kan nakijken
De KVKBase API geeft officiële Belgische bedrijfsgegevens terug, op basis van één ondernemingsnummer. Eén lookup kost 1 token, de btw-controle via VIES nog eens 1. Geen enkele check hieronder garandeert op zich dat een partij betrouwbaar is: ze verkleinen vooral de kans op onaangename verrassingen.
| Stap | Veld in de API | Wat je wil zien |
|---|---|---|
| 1. Nummer geldig | controlegetal lokaal, INVALID_CBE_NUMBER | Tien cijfers, controlepaar klopt |
| 2. Onderneming bestaat | NOT_FOUND (404) of profiel | Profiel gevonden |
| 3. Nog actief | isActive | true |
| 4. Juridische situatie | juridicalSituation, juridicalSituationCode | Normale toestand |
| 5. Rechtsvorm | legalFormShort, legalForm | Past bij wat de partij zegt |
| 6. Activiteiten | activities[], isMain | Past bij het beweerde bedrijf |
| 7. Adres en vestigingen | address, establishments[] | Consistent met offerte of contract |
| 8. Btw | vat, VIES-endpoint | Geldig, naam en adres kloppen |
| 9. Handelsnamen | tradingNames[] | De naam op de factuur komt voor |
1. Nummer geldig
Vraag het ondernemingsnummer op, niet enkel de naam. Namen zijn dubbelzinnig, nummers niet. Controleer lokaal het controlepaar: de laatste twee cijfers zijn 97 min (de eerste acht modulo 97). Een misvormd nummer wordt trouwens geweigerd voor de lookup en kost dus geen token. Details over formaten staan in de gids over opzoeken.
2 en 3. Bestaat en actief
Een profiel met isActive: false is een rode vlag, een null betekent dat de status niet bekend is: behandel dat als “nakijken”, niet als “goed”. Ook een recent ingeschreven bedrijf is niet verdacht op zich, maar registrationDate laat je zien of een bedrijf dat zich als gevestigde speler voorstelt pas vorige maand bestaat.
4. Juridische situatie
Dit is het veld dat het meest oplevert. Een bedrijf kan actief ogen en toch in vereffening zijn of ontbonden. Let op termen als faillissement, ontbinding, vereffening of stopzetting. Het exacte label hangt van het geval af. Vraag je de lookup in één vaste taal op (hier lang=nl), dan kan je op die labels matchen, en bewaar je juridicalSituationCode mee voor je eigen administratie. Voor juridische zekerheid, bijvoorbeeld voor je een grote vordering inboekt, raadpleeg je altijd ook de officiële bronnen zoals het Belgisch Staatsblad. Onze gegevens zijn een snelle eerste filter, niet realtime en niet gegarandeerd volledig.
5 en 6. Rechtsvorm en activiteiten
Een BV met als hoofdactiviteit “bouwwerken” die plots beweert software te leveren, is niet per se fout, maar wel een vraag waard. Vergelijk activities[] (met de hoofdactiviteit gemarkeerd via isMain) met wat de partij zelf verkoopt. Hoe je die codes leest, zie je in de uitleg over rechtsvormen en NACE-codes.
7. Adres en vestigingen
Vergelijk address met het adres in je offerte of contract. Een afwijking is niet altijd erg (een maatschappelijke zetel is niet de leveradres), maar je wil het weten. Het veld establishments[] toont de vestigingseenheden met nummer, startdatum en adres. Vestigingseenheden hebben een eigen nummer dat met 2 begint.
8. Btw via VIES
Een btw-nummer in België is “BE” plus dezelfde tien cijfers, maar een ondernemingsnummer is niet automatisch een actief btw-nummer. Sommige vzw’s, artsen of eenmanszaken onder de vrijstellingsregeling hebben er geen. Bevestig dus via GET /v1/be/validate/vat/BE0821015819. Het antwoord bevat valid, name, address, validatedAt en status. Meer uitleg in de VIES-gids en het verschil tussen de twee nummers. Wil je dit eerst met de hand testen, gebruik dan /be/btw-nummer-controleren.
VIES zegt wel of het nummer geldig is. Het zegt niet of het bedrijf kredietwaardig is, en ook niet of degene die je aan de lijn hebt gemachtigd is.
9. Natuurlijke versus rechtspersoon
Bij entityType: "natural_person" (bijvoorbeeld een eenmanszaak) is er geen aparte vennootschap: de zaakvoerder is zelf aansprakelijk, en het adres kan een privéadres zijn. Dat beïnvloedt je risicobeoordeling en ook je verplichtingen onder de AVG. Bewaar enkel wat je nodig hebt en toon het niet verder dan nodig.
Een beslissing automatiseren
Het volgende voorbeeld zet het lookup-antwoord om in pass, review of fail. De logica is bewust voorzichtig: bij twijfel geen automatische goedkeuring.
const BAD_SITUATION = /faillissement|ontbinding|vereffening|stopzetting/i;
export function decide(company, { claimedName } = {}) {
const reasons = [];
let outcome = "pass";
const flag = (level, reason) => {
reasons.push(reason);
if (level === "fail") outcome = "fail";
else if (outcome !== "fail") outcome = "review";
};
if (company.isActive === false) flag("fail", "company is not active");
if (company.isActive === null) flag("review", "activity status unknown");
if (BAD_SITUATION.test(company.juridicalSituation ?? "")) {
flag("fail", `juridical situation: ${company.juridicalSituation}`);
}
if (company.vat && company.vat.valid === false) {
flag("review", "VAT number not valid in VIES");
}
if (!company.activities?.some((a) => a.isMain)) {
flag("review", "no main activity listed");
}
if (company.entityType === "natural_person") {
flag("review", "sole trader: check personal liability and GDPR");
}
if (claimedName) {
const names = [company.name, ...(company.tradingNames ?? [])];
const known = names.some(
(n) => n.toLowerCase() === claimedName.toLowerCase()
);
if (!known) flag("review", "claimed name not found among names");
}
return { outcome, reasons };
}
Koppel de uitkomst aan een proces: pass gaat door, review landt in een wachtrij voor een mens, fail stopt het onboarden met een uitleg. Zo houd je het aantal handmatige controles laag zonder risico’s weg te poetsen.
Wat handwerk blijft
De API dekt de bedrijfsgegevens. Een volledige KYC bevat meer:
- Uiteindelijk begunstigden (UBO) en wie het bedrijf werkelijk bestuurt.
- Screening op sanctielijsten en politiek prominente personen.
- Identiteitscontrole van de persoon met wie je spreekt.
- Kredietwaardigheid, betalingsgedrag en eigen risicobeleid.
Dat zijn aparte processen met eigen bronnen. Een groene automatische check is een goede eerste stap, geen vrijbrief.
Audit trail
Wie later moet kunnen aantonen waarom hij een partij aanvaard heeft, bewaart per controle:
- Het volledige JSON-antwoord van de lookup, met je eigen tijdstip.
- Het VIES-antwoord inclusief
validatedAt. - De uitkomst van
decide, met de redenen. - Wie de handmatige review deed en wat de beslissing was.
Herhaal de controle op een vast ritme voor lopende relaties, bijvoorbeeld jaarlijks of voor een grote bestelling. Hoe je dat technisch opzet (retries, caching, batch tot 25 nummers) lees je in de integratiegids.
Beginnen kan gratis: het plan bevat 50 tokens per maand, zonder kredietkaart. Maak een account via /signup, bekijk de prijzen of lees de API-referentie. Meer over het Belgische aanbod vind je op /be.