KVKBase Team

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.

belgiquekycconformitéfournisseur

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).

SituationLecture
isActive: true, situation normaleAucun 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: nullInformation 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.cachedAt et vat.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.

Questions fréquentes

Que faut-il vérifier avant d'accepter un fournisseur belge ?
Au minimum : un numéro d'entreprise valide, une entreprise active, une situation juridique normale, une forme juridique cohérente, un numéro de TVA confirmé via VIES et des activités qui correspondent à ce que le fournisseur prétend faire.
Un numéro de TVA valide prouve-t-il que l'entreprise est fiable ?
Non. VIES indique seulement que le numéro est enregistré pour des opérations intracommunautaires. Il ne dit rien de la solvabilité, ni de l'identité réelle de la personne avec laquelle vous traitez.
Les bénéficiaires effectifs et les listes de sanctions sont-ils couverts ?
Non, ces contrôles restent séparés. Les données d'entreprise vous aident à identifier la société, mais l'identification des bénéficiaires effectifs et le filtrage des sanctions demandent leurs propres sources.
Comment conserver la preuve de mes vérifications ?
Enregistrez la réponse reçue, la date et l'heure de l'appel, le numéro contrôlé et la décision prise. Pour VIES, conservez le champ validatedAt et le statut renvoyé.