API de validation IBAN
Un seul POST contrôle un IBAN comme un paiement en a besoin : la clé de contrôle et la structure du pays, puis la banque qui se trouve derrière, lue dans le registre national avec sa source et sa date.
- 89 pays IBAN
- Banque et BIC avec leur source
- Premiers appels sans clé
Ce qu'un appel vérifie
POST /v1/iban/validate répond par un seul objet JSON. Chaque contrôle a son propre champ : votre code lit exactement ce qui a été vérifié, et ce qui ne l'a pas été.
Clé de contrôle
checks.iban_checksum
Le contrôle modulo 97 de la norme ISO 13616 sur les deux chiffres qui suivent le code pays. Un seul caractère mal saisi le fait échouer.
Structure par pays
checks.iban_structure
La longueur et le découpage de la partie compte, pour chacun des 89 pays du registre IBAN. Un IBAN invalide n'est pas une erreur HTTP : la réponse est un 200 avec valid: false et la raison.
Clés nationales
checks.national_check_digits
Là où un pays place sa propre clé dans le numéro de compte : France et Monaco (clé RIB), Belgique, Italie et Saint-Marin (CIN), Espagne (DC) et Royaume-Uni (modulus check). Une clé fausse apparaît dans ce champ et ne rend jamais valid faux. En Pologne, le chiffre de contrôle du numéro de règlement accompagne le code banque, dans bank_code_check.check_digit.
La banque et son BIC
bank_code_check · bic.source · as_of
Le code banque est cherché dans le registre national là où nous le lisons en entier : Allemagne, Autriche, Belgique, Slovaquie, République tchèque, Bulgarie, Suisse et Liechtenstein. Là, un code que le registre ne contient pas revient not_allocated. Ailleurs, un registre partiel ou une table composite nomme la banque, et la réponse précise qu'elle ne peut pas exclure un code. Le registre et la date de son édition accompagnent la réponse.
SEPA et vérification du bénéficiaire
sepa · risk_indicators.vop_coverage
Les schémas SEPA qui atteignent la banque (virement, virement instantané, prélèvement), tirés des registres de l'EPC quand ils la listent et du pays sinon, avec la base indiquée. Et si le registre EPC de la vérification du bénéficiaire (VoP) liste la banque comme prête.
Criblage de la banque, sur demande
POST /v1/iban/compliance
Un appel séparé confronte la banque du bénéficiaire (BIC8) aux listes OFAC, UE et ONU, contrôle le pays auprès du GAFI et d'une liste fixe de juridictions sanctionnées, et rend un score de risque de 0 à 100. Il est indicatif et ne crible jamais le nom du bénéficiaire.
Ce qu'elle ne vous dit pas
- Si le compte existe ou s'il est ouvert. Aucun registre ne le publie : seule la banque du bénéficiaire le sait.
- Au nom de qui est le compte. Ce contrôle, c'est la vérification du bénéficiaire, faite par sa banque ; l'API dit seulement si cette banque est listée comme prête.
- Si le bénéficiaire est sanctionné. Le criblage optionnel porte sur la banque et le pays, pas sur la personne ou l'entreprise que vous payez.
- Les méthodes allemandes de contrôle du numéro de compte et les clés nationales des pays qui ne sont pas cités plus haut : elles ne sont pas encore contrôlées.
Votre premier appel
Copiez l'un de ces blocs tel quel. L'IBAN est l'exemple du bac à sable : un IBAN suisse valide qui mène à une vraie banque.
L'essai sans clé sert 25 validations par semaine sur POST /v1/iban/validate, comptées pour l'adresse d'où vient l'appel, semaine ISO en UTC, remise à zéro le lundi à 00:00 UTC.
curl -X POST https://api.ibanforge.com/v1/iban/validate \
-H "Content-Type: application/json" \
-d '{"iban":"CH1000230000000012345"}'const res = await fetch("https://api.ibanforge.com/v1/iban/validate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ iban: "CH1000230000000012345" }),
});
const answer = await res.json();
console.log(answer.valid, answer.bank_code_check?.status, answer.bic?.code);import requests
r = requests.post(
"https://api.ibanforge.com/v1/iban/validate",
json={"iban": "CH1000230000000012345"},
timeout=10,
)
answer = r.json()
print(answer["valid"], answer["bank_code_check"]["status"])La réponse, telle que l'API l'a rendue
Extrait de la réponse de l'API pour cet IBAN, le 25 septembre 2026 : les champs qui disent ce qui a été contrôlé, et dans quel registre. La réponse complète porte aussi l'émetteur, les données de clearing suisses, les indicateurs de risque et l'étape suivante conseillée. Appelée sans clé, elle porte aussi un bloc trial qui indique combien d'appels restent cette semaine et quand le compteur repart.
{
"iban": "CH1000230000000012345",
"valid": true,
"checks": {
"iban_structure": "pass",
"iban_checksum": "pass",
"bank_code": "pass",
"bic": "pass",
"national_check_digits": "not_checked",
"account_exists": "not_checked",
"payee_name": "not_checked",
"institution_sanctions": "not_checked",
"country_sanctions": "not_checked",
"payee_sanctions": "not_checked"
},
"country": {
"code": "CH",
"name": "Switzerland"
},
"bic": {
"code": "UBSWCHZH80A",
"bank_name": "UBS Switzerland AG",
"city": "Zürich",
"source": "SIX BankMaster (Swiss IID / BC-Nummer register)",
"as_of": "2026-09",
"basis": "national_register",
"authoritative": true
},
"bank_code_check": {
"value": "00230",
"status": "verified",
"register": "SIX BankMaster (Swiss IID / BC-Nummer register)",
"authoritative": true,
"as_of": "2026-09"
},
"sepa": {
"member": true,
"schemes": [
"SCT",
"SDD"
],
"vop_required": false
}
}Au-delà de l'essai sans clé, envoyez la même requête avec l'en-tête Authorization: Bearer ifk_… et votre clé.
Pourquoi le modulo 97 ne suffit pas
L'exemple suisse officiel du registre IBAN, CH93 0076 2011 6238 5295 7, a une clé de contrôle juste. Son code banque n'est attribué à personne dans le SIX BankMaster, et l'API le dit :
{
"iban": "CH9300762011623852957",
"valid": true,
"bank_code_check": {
"value": "00762",
"status": "not_in_register",
"reason": "not_allocated",
"match": null,
"register": "SIX BankMaster (Swiss IID / BC-Nummer register)",
"authoritative": true,
"as_of": "2026-09"
}
}Réponse de l'API pour cet IBAN, exportée le 29 septembre 2026.
Commencer gratuitement, puis payer à l'usage
Trois entrées gratuites, chacune avec son propre quota. Aucune ne demande de carte.
L'essai sans clé
25 validations par semaine sur POST /v1/iban/validate, pour l'adresse d'où vient l'appel, à titre d'essai. Remise à zéro le lundi à 00:00 UTC.
Une clé en un clic
25 requêtes par mois, sur tous les endpoints. Un POST vide vers /v1/keys/generate, ou le bouton ci-dessous : sans e-mail, sans carte.
200 requêtes par mois
Réclamez la même clé avec un code à six chiffres envoyé à une adresse que vous lisez, ou donnez l'adresse en la créant. Même clé, même préfixe, sans carte.
Quand il en faut davantage
- Pro : 29 $ par mois pour 10 000 requêtes, remise à zéro le 1er, résiliable à tout moment.
- Packs de crédits qui n'expirent jamais, par carte ou en USDC : 1 000 crédits pour 4 $, 5 000 pour 20 $, 25 000 pour 80 $.
- x402 : paiement à l'appel en USDC sur Base, sans aucun compte, 0,005 $ par validation et 0,002 $ par IBAN dans un lot.
Tout ce qui entoure l'API
- Bac à sableLa vraie API dans votre navigateur, avec des IBAN d'exemple de plusieurs pays.
- Prise en mainDe l'appel sans clé au lot de 100 IBAN, chaque bloc de la réponse sous son vrai nom.
- Référence de l'endpointPOST /v1/iban/validate, champ par champ, avec les codes d'erreur.
- OpenAPI 3.1Le contrat, pour générer un client ou l'importer dans Postman.
- npm : @ibanforge/sdk ↗Le SDK TypeScript et JavaScript.
- PyPI : ibanforge ↗Le SDK Python, clients synchrone et asynchrone.
- Serveur MCPibanforge-mcp pour Claude, Cursor et les autres clients MCP, ou le point d'accès hébergé.
- n8n ↗Le nœud communautaire pour n8n auto-hébergé.
Essayez-la sur vos propres IBAN
Le bac à sable appelle la vraie API. Quand vous êtes prêt, prenez une clé : sans e-mail, sans carte.