IBAN validieren
Validieren Sie eine einzelne IBAN mit vollständiger Prüfsummenverifizierung, länderspezifischer BBAN-Strukturanalyse, automatischer BIC/Instituts-Abfrage, SEPA-Konformitätsdaten, Emittentenklassifizierung (Bank vs. E-Geld-Institut/Neobank) und Risikoindikatoren für Compliance-Agenten.
Endpunkt
POST https://api.ibanforge.com/v1/iban/validate
Kosten: $0.005 USDC pro Anfrage
Anfrage
Header
| Header | Wert | Erforderlich |
|---|---|---|
Content-Type | application/json | Ja |
Authorization | Bearer ifk_... (kostenloser API-Schlüssel) | Einer von beiden |
X-PAYMENT | x402-Zahlungstoken | Einer von beiden |
Body
{
"iban": "CH10 0023 0000 0000 1234 5"
}| Feld | Typ | Beschreibung |
|---|---|---|
iban | string | Die zu validierende IBAN. Leerzeichen und Bindestriche werden automatisch entfernt. Groß-/Kleinschreibung wird nicht unterschieden. |
Antwort
Erfolg (200)
{
"iban": "CH1000230000000012345",
"valid": true,
"country": {
"code": "CH",
"name": "Switzerland"
},
"check_digits": "10",
"bban": {
"bank_code": "00230",
"account_number": "000000012345"
},
"bic": {
"code": "UBSWCHZH",
"bank_name": "UBS Switzerland AG",
"city": "Zürich"
},
"sepa": {
"member": true,
"schemes": ["SCT", "SDD"],
"vop_required": false,
"vop_participant": false
},
"issuer": {
"type": "bank",
"name": "UBS Switzerland AG",
"classification": "default"
},
"bank_code_check": {
"value": "00230",
"status": "verified",
"match": "register",
"register": "SIX BankMaster (Swiss IID / BC-Nummer register)",
"authoritative": true,
"institution": {
"name": "UBS Switzerland AG",
"street": "Bahnhofstrasse 45",
"post_code": "8098",
"town": "Zürich",
"country": "CH"
},
"as_of": "2026-08"
},
"risk_indicators": {
"issuer_type": "bank",
"country_risk": "standard",
"test_bic": false,
"sepa_reachable": true,
"sepa_reachable_scope": "country",
"vop_coverage": false
},
"clearing": {
"iid": "00230",
"name": "UBS Switzerland AG",
"type": "bank",
"town": "Zürich",
"sic": true,
"instant_payments_chf": true,
"eurosic": true,
"qr_iid": null
},
"formatted": "CH10 0023 0000 0000 1234 5",
"cost_usdc": 0.005,
"processing_ms": 1.23
}Antwortfelder
Felder auf oberster Ebene:
| Feld | Typ | Vorhanden | Beschreibung |
|---|---|---|---|
iban | string | Immer | Bereinigte IBAN (Großbuchstaben, keine Leerzeichen) |
valid | boolean | Immer | Ob die IBAN alle Validierungsprüfungen bestanden hat |
country | object | Gültige IBANs | Ländercode und Name |
check_digits | string | Gültige IBANs | Die zweistellige Prüfziffer |
bban | object | Gültige IBANs | Analysierte BBAN-Bestandteile |
bic | object | null | Gültige IBANs | BIC/SWIFT-Code und Institutsdaten (null, wenn keine Übereinstimmung gefunden) |
sepa | object | Gültige IBANs | SEPA-Mitgliedschaft, Schemata und VoP-Anforderung |
issuer | object | Gültige IBANs mit BIC | Institutsklassifizierung |
bank_code_check | object | Gültige IBANs | Ob der Bankcode in Referenzdaten auflöst — und wie viel diese Antwort wert ist (siehe Abschnitt „verified" unten) |
next_steps | array | Fallabhängig | Maschinenlesbare Folgeschritte (Compliance-Screening, Empfängerprüfung …), jeweils mit Begründung |
risk_indicators | object | Gültige IBANs | Zusammengesetztes Risikosignal für Compliance |
clearing | object | null | Gültige CH/LI-IBANs | Schweizer Clearing-Daten aus dem SIX BankMaster (BC-Nummer, Zahlungsschienen-Teilnahme, QR-IID); null, wenn die IID nicht gelistet ist |
formatted | string | Gültige IBANs | IBAN mit Leerzeichen alle 4 Zeichen |
error | string | Ungültige IBANs | Fehlercode |
error_detail | string | Ungültige IBANs | Menschenlesbare Fehlerbeschreibung |
cost_usdc | number | Immer | Kosten dieser Anfrage in USDC |
processing_ms | number | Immer | Verarbeitungszeit in Millisekunden |
country-Objekt:
| Feld | Typ | Beschreibung |
|---|---|---|
code | string | ISO 3166-1 Alpha-2-Ländercode |
name | string | Vollständiger Ländername auf Englisch |
bban-Objekt:
| Feld | Typ | Beschreibung |
|---|---|---|
bank_code | string | Aus der BBAN extrahierte Bank-/Institutskennung |
branch_code | string? | Filialnummer (vorhanden bei Ländern wie FR, GB, ES, IT) |
account_number | string | Aus der BBAN extrahierte Kontonummer |
bic-Objekt (vorhanden, wenn ein passender BIC gefunden wurde):
| Feld | Typ | Beschreibung |
|---|---|---|
code | string | BIC/SWIFT-Code (8 Zeichen) |
bank_name | string | null | Name des Finanzinstituts |
city | string | null | Stadt des Instituts |
sepa-Objekt:
| Feld | Typ | Beschreibung |
|---|---|---|
member | boolean | Ob dieses Land zur SEPA-Zone gehört |
schemes | string[] | Verfügbare SEPA-Schemata: SCT (Überweisung), SDD (Lastschrift), SCT_INST (Sofortüberweisung) |
vop_required | boolean | Ob die Verification of Payee verpflichtend ist (EU-Verordnung, seit Oktober 2025 für die Eurozone) |
vop_participant | boolean | null | VoP-Bereitschaft auf Bankebene: true, wenn das aufgelöste Institut im EPC-Register des VoP-Schemes als ready gelistet ist; null, wenn kein Institut aufgelöst wurde |
issuer-Objekt (vorhanden, wenn BIC aufgelöst wurde):
| Feld | Typ | Beschreibung |
|---|---|---|
type | string | null | bank (traditionell), digital_bank (Neobank), emi (E-Geld-Institut), payment_institution — oder null, wenn sich kein Institut belegen lässt (z. B. weil der Bankcode kein gelisteter IBAN-Emittent ist) |
name | string | Institutsname — der Inhaber des passenden BIC. Kann auch gesetzt sein, wenn type den Wert null hat: den BIC-Inhaber zu nennen ist ein Fakt; ihn zur Bank Ihrer Gegenpartei zu erklären wäre eine Vermutung |
classification | string | curated — der Typ ist eine positive Identifikation aus gepflegten Listen (EMI/Neobanken/Zahlungsinstitute); default — der Typ fällt auf bank zurück, weil die meisten BIC-Inhaber Banken sind. Verlassen Sie sich auf curated; behandeln Sie default als Vermutung |
iban_issuer | string? | Nur für Länder mit veröffentlichter Liste IBAN-ausgebender Zahlungsdienstleister (heute: NL). confirmed — der Code steht auf dieser Liste; not_listed — nicht gelistet, type wird null, und next_steps weist darauf hin, dass das Konto möglicherweise nicht existiert |
vIBAN-Erkennung: Wenn
issuer.typeden Wertemi,digital_bankoderpayment_institutionhat, handelt es sich mit höherer Wahrscheinlichkeit um eine virtuelle IBAN (vIBAN). Dies ist nützlich für die AML/CFT-Compliance gemäß der EU-AMLR-Verordnung (Juli 2027).
bank_code_check-Objekt:
| Feld | Typ | Beschreibung |
|---|---|---|
value | string | Der aus dem BBAN entnommene Bankcode, zurückgegeben für Ihre Logs |
status | string | verified — der Code löst zu einem benennbaren Institut auf; not_in_register — nicht auflösbar in den Referenzdaten, die wir für dieses Land halten; unavailable — keine Referenzdaten für dieses Land, keine Aussage |
match | string | null | register — exakter Schlüssel im Referenzbestand (deterministisch); prefix — Rückfall über BIC-Präfixsuche, nur möglich, wo Bankcodes aus Buchstaben bestehen; siehe candidates |
register | string | null | Name des konsultierten Referenzbestands |
authoritative | boolean | true nur dort, wo der Referenzbestand das nationale Register IST — siehe unten |
candidates | number? | Bei match: "prefix": Anzahl passender Institute. Mehr als 1 heißt: nur ein Hinweis |
institution | object? | Was das nationale Register über das Institut veröffentlicht: Name, Sitzadresse, LEI wo vorhanden. Nur bei autoritativen Antworten. Tiefe variiert: CH/LI und AT volle Adresse, DE nur PLZ + Ort (das Register führt keine Straße), BE nur der Name. Fehlende Felder sind null, nie geraten. Es ist das Institut, das den Bankcode hält — keine Filiale und kein Beleg für ein Konto |
as_of | string | Monat der Referenzdaten |
risk_indicators-Objekt:
| Feld | Typ | Beschreibung |
|---|---|---|
issuer_type | string | null | Identisch mit issuer.type; null, wenn kein Institut belegt wurde |
country_risk | string | standard, elevated (FATF-Grauliste) oder high (FATF-Schwarzliste / EU-Hochrisikoliste) |
test_bic | boolean | Ob der BIC ein Test-/Sandbox-Code ist |
sepa_reachable | boolean | Ob das Land des Kontos in der SEPA-Zone liegt |
sepa_reachable_scope | string | country — die Erreichbarkeitsaussage betrifft die Verfahren des Landes, nie dieses konkrete Konto |
vop_coverage | boolean | Ob VoP für dieses Land verpflichtend ist |
Was „verified" bedeutet — und was nicht
bank_code_check.status: "verified" bedeutet: Der Bankcode löst in den konsultierten Referenzdaten zu einem Institut auf, das wir benennen können. Wie viel das wert ist, sagt genau authoritative:
authoritative: true— der Referenzbestand ist das nationale Register selbst. Heute: CH und LI (SIX BankMaster), DE (Bankleitzahlendatei der Bundesbank), FI (Finance-Finland-Codes — an Bankengruppen vergeben, ein Treffer bestätigt die Gruppe), AT (OeNB-Verzeichnis), BE (BNB-Codeliste). In diesen Ländern bedeutetnot_in_register, dass der Code nicht vergeben ist — ein starker Grund, eine Zahlung zu stoppen.authoritative: false— der Referenzbestand ist unsere zusammengesetzte Bankcode-Karte aus BIC-Verzeichnissen. Ein Treffer benennt den Inhaber des passenden BIC; er beweist nicht, dass dieses Institut IBANs ausgibt. Wo Bankcodes aus Buchstaben bestehen, heißtmatch: "prefix"mitcandidates > 1: nur ein Hinweis.
Nichts davon bestätigt, dass das Konto existiert, geführt wird oder einer bestimmten Person gehört. Eine strukturell gültige IBAN mit real existierendem Institut kann dennoch fabriziert sein. Zur Empfängerprüfung nutzen Sie die Verification of Payee der Banken (sepa.vop_required zeigt, wann sie vorgeschrieben ist) oder einen Namensabgleich mit Ihrer Gegenpartei — wo eine Antwort diese Lücke offenlässt, sagt next_steps es ausdrücklich.
Ungültige IBAN (200)
Wenn die IBAN ungültig ist, gibt die Antwort dennoch den Statuscode 200 zurück, jedoch mit valid: false:
{
"iban": "CH5604835012345678000",
"valid": false,
"error": "checksum_failed",
"error_detail": "Modulo 97 check returned 42, expected 1.",
"cost_usdc": 0.005
}Fehlercodes
| Code | Beschreibung |
|---|---|
invalid_format | IBAN enthält ungültige Zeichen oder ist zu kurz |
unsupported_country | Ländercode wird nicht erkannt |
wrong_length | IBAN-Länge stimmt nicht mit der erwarteten Länge für dieses Land überein |
checksum_failed | MOD-97-Prüfsummenverifizierung fehlgeschlagen |
Codebeispiele
cURL
curl -X POST https://api.ibanforge.com/v1/iban/validate \
-H "Content-Type: application/json" \
-d '{"iban": "DE89 3704 0044 0532 0130 00"}'Python
import requests
response = requests.post(
"https://api.ibanforge.com/v1/iban/validate",
json={"iban": "DE89370400440532013000"},
)
data = response.json()
if data["valid"]:
print(f"Bank: {data['bic']['bank_name']}")
print(f"Country: {data['country']['name']}")
print(f"SEPA: {data['sepa']['member']}")
print(f"Issuer type: {data['issuer']['type']}")
print(f"Risk: {data['risk_indicators']['country_risk']}")
else:
print(f"Invalid: {data['error_detail']}")TypeScript
const response = await fetch(
"https://api.ibanforge.com/v1/iban/validate",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ iban: "DE89370400440532013000" }),
}
);
const data = await response.json();
if (data.valid) {
console.log(`Bank: ${data.bic.bank_name}`);
console.log(`SEPA: ${data.sepa.member}, VoP: ${data.sepa.vop_required}`);
console.log(`Issuer: ${data.issuer.type} — ${data.issuer.name}`);
console.log(`Country risk: ${data.risk_indicators.country_risk}`);
} else {
console.log(`Invalid: ${data.error_detail}`);
}