Vérifier un client ou un fournisseur belge : liste KYC
Comment vérifier un fournisseur belge à l'entrée en relation : numéro, statut, faillite, TVA via VIES, activités, adresse, et ce qu'il faut garder manuel.
Accepter un nouveau client ou un nouveau fournisseur belge, c’est prendre un risque que quelques contrôles simples réduisent beaucoup. La plupart de ces contrôles peuvent être automatisés à partir d’un seul appel API, à condition de savoir quoi lire dans la réponse et où l’automatisation doit s’arrêter. Voici une liste de contrôle en sept étapes, avec un exemple de code qui produit une décision « accepter », « à revoir » ou « refuser ».
Ce que l’automatisation couvre, et ce qu’elle ne couvre pas
Les données officielles belges d’entreprises répondent à une question : cette entité existe-t-elle, sous quel nom, avec quel statut et quelle activité ? Elles ne disent pas si la personne qui vous écrit est mandatée par l’entreprise, ni si l’entreprise paiera. Restent donc hors périmètre : l’identification des bénéficiaires effectifs (UBO), le filtrage des listes de sanctions, l’analyse financière et la vérification de l’identité du signataire. Ces contrôles sont séparés et dépendent de vos obligations légales.
Étape 1 : le numéro est-il valide ?
Un numéro d’entreprise a dix chiffres, commence par 0 ou 1, et ses deux derniers chiffres sont une paire de contrôle : 97 moins (les huit premiers chiffres modulo 97). Un numéro qui échoue à ce test est presque toujours une faute de frappe, pas une fraude. Sur l’API, un numéro malformé est rejeté avant tout appel et ne coûte rien (erreur INVALID_CBE_NUMBER). Pour les formats acceptés, voyez le guide de recherche par numéro.
Étape 2 : l’entreprise existe-t-elle ?
Appelez GET /v1/be/lookup/{numero}?lang=fr. Un NOT_FOUND (404) signifie que le numéro est bien formé mais que l’API ne connaît aucune entreprise sous ce numéro. Ne concluez pas à la fraude trop vite : demandez le numéro correct, et vérifiez qu’il ne s’agit pas d’un numéro d’unité d’établissement (il commence par 2 et ne désigne pas la société).
Étape 3 : est-elle encore en activité ?
Deux champs comptent : isActive et juridicalSituation (avec juridicalSituationCode).
| Situation | Lecture |
|---|---|
isActive: true, situation normale | Aucun signal |
isActive: false | À refuser ou à revoir selon votre politique |
| En liquidation, dissolution | À revoir : l’entreprise peut encore honorer ses engagements en cours, mais sans nouveau contrat à la légère |
| Faillite, cessation | À refuser pour un nouveau contrat à crédit |
isActive: null | Information inconnue : à revoir |
Les libellés varient selon la langue : fixez lang=fr dans tous vos appels si votre logique lit le texte (comme l’exemple de code ci-dessous), et enregistrez aussi juridicalSituationCode dans votre trace. Pour une certitude juridique, consultez aussi le Moniteur belge : les données de l’API sont un point de départ, pas un acte officiel, et elles ne sont pas en temps réel (voyez source.cachedAt et source.stale).
Étape 4 : forme juridique et type d’entité
legalFormShort (SRL, SA, ASBL…) doit être cohérente avec ce que le partenaire affirme. Un « grand groupe » enregistré comme entreprise individuelle mérite une question. Le champ entityType distingue legal_person et natural_person. Pour une personne physique, l’adresse peut être un domicile : limitez ce que vous copiez dans vos systèmes et respectez le RGPD. Les formes juridiques sont expliquées dans ce guide.
Étape 5 : activités, adresse et établissements
Comparez activities[] (l’activité marquée isMain en premier) à ce que le partenaire dit faire. Un fournisseur de « services informatiques » dont l’unique activité déclarée est du commerce de détail alimentaire est un signal à examiner, pas une preuve. Comparez ensuite address avec l’adresse sur le bon de commande ou le devis, et regardez establishments[] : un entrepôt ou un magasin supplémentaire explique souvent une différence d’adresse. Les tradingNames[] expliquent pourquoi la dénomination commerciale d’un site web ne correspond pas à name.
Étape 6 : la TVA, via VIES
Le numéro de TVA belge est « BE » suivi du numéro d’entreprise, mais il n’est pas toujours actif : certaines ASBL, professions libérales ou indépendants sous franchise n’en ont pas. Dérivez le candidat, puis confirmez avec GET /v1/be/validate/vat/BE0123456789 (numéro illustratif). La réponse donne valid, souvent le nom et l’adresse, validatedAt et status. Détails dans le guide VIES, ou avec l’outil gratuit. Un résultat valide ne prouve ni la solvabilité ni l’identité de votre interlocuteur.
Étape 7 : garder une trace
En cas de litige ou de contrôle, vous devez pouvoir montrer ce que vous saviez et quand. Pour chaque vérification, conservez :
- le numéro contrôlé et la date de l’appel ;
- la réponse brute, y compris
source.cachedAtetvat.validatedAt; - la décision (accepter, revoir, refuser), son motif et la personne qui l’a prise.
Les entreprises individuelles contiennent des données personnelles : définissez une durée de conservation.
Exemple : une décision en code
const BAD = /faillite|cessation/i;
const WATCH = /liquidation|dissolution/i;
export function decide(company, claimedDivision) {
const reasons = [];
if (company.isActive === false) return { decision: "fail", reasons: ["inactive"] };
if (BAD.test(company.juridicalSituation ?? "")) {
return { decision: "fail", reasons: ["insolvency_or_cessation"] };
}
if (company.isActive === null) reasons.push("status_unknown");
if (WATCH.test(company.juridicalSituation ?? "")) reasons.push("winding_up");
if (company.source?.stale) reasons.push("stale_data");
if (company.vat && company.vat.valid === false) reasons.push("vat_not_valid");
if (claimedDivision) {
const divisions = (company.activities ?? []).map((a) =>
String(a.sbiCode).replace(/\D/g, "").slice(0, 2)
);
if (!divisions.includes(claimedDivision)) reasons.push("activity_mismatch");
}
return reasons.length
? { decision: "review", reasons }
: { decision: "pass", reasons: [] };
}
Adaptez les seuils à votre politique. Stockez le résultat de decide avec la réponse complète, pas à la place de celle-ci. Si l’appel échoue (502, 503), la décision par défaut est « à revoir », jamais « accepter ». Pour la partie technique des appels, voyez le guide d’intégration.
Ce qui reste manuel
- Confirmer que le signataire représente l’entreprise.
- Identifier les bénéficiaires effectifs et filtrer les listes de sanctions, selon vos obligations.
- Évaluer la solvabilité pour les montants importants.
- Trancher les cas « à revoir » : un humain doit signer la décision.
Chaque vérification (consultation, VIES) coûte 1 token. Le plan gratuit offre 50 tokens par mois sans carte bancaire : créez un compte pour essayer, consultez les prix pour dimensionner un usage régulier, ou commencez par l’outil de recherche gratuit.