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.

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": "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:

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 (8 Zeichen)
bank_namestring | nullName des Finanzinstituts
citystring | nullStadt des Instituts

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 Referenzdaten für dieses Land, keine Aussage
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. 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 (BNB-Codeliste). In diesen Ländern bedeutet not_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ßt match: "prefix" mit candidates > 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

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}`);
}