Zum Inhalt springen
IBANforge

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. Länge und Aufbau jedes Landes, mit dem offiziellen Beispiel und dem geprüften Register, stehen unter IBAN nach Land.

Endpunkt

POST https://api.ibanforge.com/v1/iban/validate

Kosten: $0.005 USDC pro Anfrage

Anfrage

Header

HeaderWertErforderlich
Content-Typeapplication/jsonJa
AuthorizationBearer ifk_... (kostenloser API-Schlüssel)Einer von beiden
X-PAYMENTx402-ZahlungstokenEiner von beiden

Body

{
  "iban": "CH10 0023 0000 0000 1234 5"
}
FeldTypBeschreibung
ibanstringDie 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": "UBSWCHZH80A",
    "bic8": "UBSWCHZH",
    "bank_name": "UBS Switzerland AG",
    "city": "Zürich",
    "basis": "national_register",
    "authoritative": true
  },
  "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:

FeldTypVorhandenBeschreibung
ibanstringImmerBereinigte IBAN (Großbuchstaben, keine Leerzeichen)
validbooleanImmerOb die IBAN alle Validierungsprüfungen bestanden hat
countryobjectGültige IBANsLändercode und Name
check_digitsstringGültige IBANsDie zweistellige Prüfziffer
bbanobjectGültige IBANsAnalysierte BBAN-Bestandteile
bicobject | nullGültige IBANsBIC/SWIFT-Code und Institutsdaten (null, wenn keine Übereinstimmung gefunden)
sepaobjectGültige IBANsSEPA-Mitgliedschaft, Schemata und VoP-Anforderung
issuerobjectGültige IBANs mit BICInstitutsklassifizierung
bank_code_checkobjectGültige IBANsOb der Bankcode in Referenzdaten auflöst — und wie viel diese Antwort wert ist (siehe Abschnitt „verified" unten)
next_stepsarrayFallabhängigMaschinenlesbare Folgeschritte (Compliance-Screening, Empfängerprüfung …), jeweils mit Begründung
risk_indicatorsobjectGültige IBANsZusammengesetztes Risikosignal für Compliance
clearingobject | nullGültige CH/LI-IBANsSchweizer Clearing-Daten aus dem SIX BankMaster (BC-Nummer, Zahlungsschienen-Teilnahme, QR-IID); null, wenn die IID nicht gelistet ist
formattedstringGültige IBANsIBAN mit Leerzeichen alle 4 Zeichen
errorstringUngültige IBANsFehlercode
error_detailstringUngültige IBANsMenschenlesbare Fehlerbeschreibung
cost_usdcnumberImmerKosten dieser Anfrage in USDC
processing_msnumberImmerVerarbeitungszeit in Millisekunden

country-Objekt:

FeldTypBeschreibung
codestringISO 3166-1 Alpha-2-Ländercode
namestringVollständiger Ländername auf Englisch

bban-Objekt:

FeldTypBeschreibung
bank_codestringAus der BBAN extrahierte Bank-/Institutskennung
branch_codestring?Filialnummer (vorhanden bei Ländern wie FR, GB, ES, IT)
account_numberstringAus der BBAN extrahierte Kontonummer

bic-Objekt (vorhanden, wenn ein passender BIC gefunden wurde):

FeldTypBeschreibung
codestringBIC/SWIFT-Code, wie ihn die Quelle veröffentlicht, 8 oder 11 Zeichen; auf bic8 vergleichen
bic8stringDie acht Zeichen des Instituts — das Feld, gegen das ein gelieferter BIC zu vergleichen ist. Der Filialcode (die letzten drei Zeichen von code) ist informativ: in Genossenschaftsverbünden benennt er die lokale Bank und die ersten acht ihr Clearing-Institut
redirected_fromstring?Der angefragte Bankcode, wenn das Register für denjenigen geantwortet hat, der sein Clearing übernommen hat (CH und LI: SIX leitet eine konkatenierte IID um). Die IBAN bleibt gültig: eine Umleitung ist keine Stilllegung
bank_namestring | nullName des Finanzinstituts
citystring | nullStadt des Instituts
basisstringWoher die Zuordnung Bankcode → BIC stammt. national_register — das nationale Register des Landes veröffentlicht diesen BIC für diesen Bankcode (heute DE, AT, BE und BG); curated_map — unsere gepflegte Bankcode-Karte, ein exakter Schlüssel und kein Vergabeakt; directory_prefix — der BIC-Präfix-Rückfall, der mehrere Institute treffen kann (siehe bank_code_check.candidates)
authoritativebooleanOb dieser BIC gespeichert und zur Abwicklung verwendet werden darf. Aus basis abgeleitet, true nur bei national_register. Siehe den Abschnitt „Abwickeln oder nur als Hinweis behandeln?" unten

sepa-Objekt:

FeldTypBeschreibung
memberbooleanOb dieses Land zur SEPA-Zone gehört
schemesstring[]Verfügbare SEPA-Schemata: SCT (Überweisung), SDD (Lastschrift), SCT_INST (Sofortüberweisung)
vop_requiredbooleanOb die Verification of Payee verpflichtend ist (EU-Verordnung, seit Oktober 2025 für die Eurozone)
vop_participantboolean | nullVoP-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):

FeldTypBeschreibung
typestring | nullbank (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)
namestringInstitutsname — 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
classificationstringcurated — 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_issuerstring?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.type den Wert emi, digital_bank oder payment_institution hat, 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:

FeldTypBeschreibung
valuestringDer aus dem BBAN entnommene Bankcode, zurückgegeben für Ihre Logs
statusstringverified — 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 Aussage, entweder weil wir für dieses Land keine Referenzdaten halten oder weil wir gerade nicht antworten konnten (siehe reason)
reasonstring?Warum das Verdikt nicht verified lautet. Auf jedem not_in_register und jedem unavailable vorhanden, auf verified abwesend. not_allocated — ein nationales Register verneint den Code, und nur dieser Wert rechtfertigt ein „nicht senden"; absent_from_reference_data — unsere zusammengesetzte Karte führt ihn nicht, was nichts über das nationale Register des Landes aussagt; no_reference_data_for_country; register_names_no_holder — das Register definiert diesen Coderaum und veröffentlicht keinen Inhaber, das ist Schweigen und keine Verneinung; national_register_unavailable — das Register, gegen das dieses Land sonst entschieden wird, konnte nicht konsultiert werden, das Verdikt daneben hat daher nur das Gewicht der zusammengesetzten Karte; lookup_failed — die Abfrage konnte überhaupt nicht laufen. Die letzten beiden Werte sprechen über uns, nie über Ihren Empfänger
matchstring | nullregister — exakter Schlüssel im Referenzbestand (deterministisch); prefix — Rückfall über BIC-Präfixsuche, nur möglich, wo Bankcodes aus Buchstaben bestehen; siehe candidates
registerstring | nullName des konsultierten Referenzbestands
authoritativebooleantrue nur dort, wo der Referenzbestand das nationale Register IST — siehe unten
candidatesnumber?Bei match: "prefix": Anzahl passender Institute. Mehr als 1 heißt: nur ein Hinweis
institutionobject?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, BG nur der Name — in Kyrillisch, wie das Register ihn veröffentlicht —, SK nur der Name, mit slowakischen Diakritika wie veröffentlicht. 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_ofstringMonat der Referenzdaten

risk_indicators-Objekt:

FeldTypBeschreibung
issuer_typestring | nullIdentisch mit issuer.type; null, wenn kein Institut belegt wurde
country_riskstringstandard, elevated (FATF-Grauliste) oder high (FATF-Schwarzliste / EU-Hochrisikoliste)
test_bicbooleanOb der BIC ein Test-/Sandbox-Code ist
sepa_reachablebooleanOb das Land des Kontos in der SEPA-Zone liegt
sepa_reachable_scopestringcountry — die Erreichbarkeitsaussage betrifft die Verfahren des Landes, nie dieses konkrete Konto
vop_coveragebooleanOb 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 (Codeliste der Belgischen Nationalbank), BG (BAE-Register der Bulgarischen Nationalbank — das Urteil gilt dem Bankcode aus vier Buchstaben, IBAN-Positionen 5-8; Filialziffern werden nicht separat geprüft), SK (der prevodník der Identifikationscodes für den inländischen Zahlungsverkehr der Národná banka Slovenska). In diesen Ländern bedeutet not_in_register, dass der Code nicht vergeben ist — ein starker Grund, eine Zahlung zu stoppen. San Marino steht dort bewusst nicht: Die Liste der operativen Banken der Zentralbank nennt den Inhaber eines geführten Codes, ein Treffer ist also verified mit einem institution-Block, doch sie veröffentlicht nicht die Vergabe des ABI-Raums — ein Fehlen bleibt daher absent_from_reference_data und authoritative bleibt false. Siehe san-marinesische Bankleitzahlen.
  • 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ßt match: "prefix" mit candidates > 1: nur ein Hinweis.

Ein Fehler auf unserer Seite wird als unavailable gemeldet, nie als Verdikt. Wenn die Referenzdaten nicht gelesen werden können — unlesbare Datenbank, nach einem fehlgeschlagenen Deploy fehlende Tabelle, Zeitüberschreitung einer Abfrage — lautet die Antwort status: "unavailable" mit reason: "lookup_failed" und register: null. Nie not_in_register: Dieses Verdikt bedeutet „kein Institut hält diesen Code", und eine Störung bei uns ist kein Beleg über Ihren Empfänger. reason trennt beide Situationen in einem einzigen Token: lookup_failed und national_register_unavailable liegen bei uns, alles andere ist eine Aussage über den Code. Alle werden gleich behandelt: weitermachen und einen Namensabgleich des Empfängers entscheiden lassen.

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.

Abwickeln oder nur als Hinweis behandeln?

Der BIC in der Antwort ist aus dem Bankcode der IBAN abgeleitet, und was diese Ableitung wert ist, hängt vollständig davon ab, was sie erzeugt hat. bic.basis sagt, welche Quelle es war, und bic.authoritative macht daraus den einen booleschen Wert, auf den eine Zahlungsverarbeitung verzweigen kann:

  • basis: "national_register", authoritative: true — das nationale Register des Landes veröffentlicht diesen BIC für diesen Bankcode. Heute sind das die Schweiz, Liechtenstein, Deutschland, Österreich, Belgien, Bulgarien, die Slowakei und San Marino: Der SIX BankMaster führt für CH und LI den exakten 11-stelligen BIC je IID (BC-Nummer), die Bankleitzahlendatei der Bundesbank führt den exakten 11-stelligen BIC je BLZ, und die Register der OeNB, der Belgischen Nationalbank, das BAE-Register der Bulgarischen Nationalbank, der prevodník der Národná banka Slovenska sowie die Liste der Zentralbank von San Marino veröffentlichen den BIC des Instituts je Bankcode. San Marino ist die einzige Stelle, an der dieses Flag true ist, während bank_code_check.authoritative false ist: Die Liste der Zentralbank ordnet einem geführten Code einen BIC zu, veröffentlicht aber nicht die Vergabe des Coderaums. Das deutsche Register ist der Grund, weshalb eine Sparkasse zu ihrem eigenen BIC auflöst und nicht zum BIC8 der gemeinsamen Landesbank, und das Schweizer Register der Grund, weshalb die IID 30020 zu Crédit Mutuel de la Vallée SA (RBABCH22180) auflöst und nicht zu Entris Banking AG (RBABCH22) — das Feld benennt diese Zuordnung, es erzeugt sie nicht. Vergleichen Sie einen gelieferten BIC auf bic8: Der Filialcode ist informativ, und in einem Genossenschaftsverbund benennt er die lokale Bank, während die ersten acht Zeichen ihr Clearing-Institut benennen. Speicherbar und zur Abwicklung geeignet — mit einer Ausnahme: Ein Code, den das Register selbst als zurückgezogen führt, behält die Basis national_register, aber authoritative fällt auf false; lesen Sie bank_code_check.retired und superseded_by.
  • basis: "curated_map", authoritative: false — unsere eigene gepflegte Bankcode-Karte hat die Zuordnung über einen exakten Schlüssel hergestellt. Meistens richtig und kein Vergabeakt: Keine Behörde steht dahinter.
  • basis: "directory_prefix", authoritative: false — der BIC-Präfix-Rückfall. Er kann mehrere Institute gleichzeitig treffen; bank_code_check.candidates sagt wie viele, und next_steps meldet bic_is_advisory, sobald es mehr als eines ist.

Außerhalb einer national_register-Basis behandeln Sie den BIC als Hinweis: gut für Anzeige, Anreicherung und Routing-Hinweise, und vor der Speicherung als Abwicklungsanweisung mit dem Empfänger oder Ihrer Bank zu bestätigen.

bic.authoritative und bank_code_check.authoritative beantworten zwei verschiedene Fragen. In der Schweiz wurde der Unterschied früher sichtbar, heute nicht mehr: Der BIC stammt jetzt aus der Spalte des SIX BankMaster selbst, beide sind dort also true. In San Marino gehen sie weiterhin auseinander, in die andere Richtung — die Zuordnung ist die der Aufsicht (bic.authoritative: true), während der Coderaum nicht von ihr vergeben wird (bank_code_check.authoritative: false). Das eine betrifft die Existenz des Codes, das andere die Zuordnung, die den BIC erzeugt hat.

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

CodeBeschreibung
invalid_formatIBAN enthält ungültige Zeichen oder ist zu kurz
unsupported_countryLändercode wird nicht erkannt
wrong_lengthIBAN-Länge stimmt nicht mit der erwarteten Länge für dieses Land überein
checksum_failedMOD-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}`);
}

Nutzen Sie die Prüfungen für Ihren Anwendungsfall

Wählen Sie den ersten Schritt für Ihre Software oder Ihre Lieferantendatei.

IBAN-Prüfungen in Ihre Software integrieren

Testen Sie eine Validierung, sehen Sie sich die Antwort an und verbinden Sie Ihre Anwendung über die API oder eine vorhandene Integration.

API-Ablauf ansehen

Eine Lieferantendatei prüfen

Laden Sie eine CSV- oder Excel-Datei hoch und sehen Sie die Ergebnisse kostenlos in der Vorschau. Bei Bedarf kaufen Sie die kommentierte Arbeitsmappe. Ohne Konto oder Abonnement.

Dateiprüfung kennenlernen

Die verfügbaren Bankinformationen hängen von Land und Quelle ab. Diese Prüfungen bestätigen weder den Kontoinhaber noch die erfolgreiche Ausführung einer Zahlung.