EXPLAIN

HTTP API

Every tool on this site, callable directly. No key, no account and no rate limit: each request is answered from data bundled with the deployment, and nothing is stored.

/api/v1 OpenAPI

A wrong IBAN is not an HTTP error

GET /validate answers 200 with valid:false and an error_code naming which check failed. Only a missing parameter is a 400 — a caller checking a thousand accounts should not have to treat nine hundred failures as transport errors.

Null means unknown, never wrong

An unlisted bank leaves bank_name null. A country with no published check digit reports national_check_valid as null rather than guessing. Nothing here invents a value it does not have.

Nothing is stored

Account numbers are read from the query, answered, and discarded. There is no log of them, no database and no third party.

OPENAPI

The machine-readable description, generated from the same route table this page is. It cannot describe an endpoint that does not exist.

curl /api/openapi.json

VERIFY

GET /api/v1/validate

Validate one IBAN

Checks length, structure and mod-97, then the country's own check digits where one is published, and enriches the result from the bundled bank directory. A malformed IBAN is HTTP 200 with valid:false — only a missing iban parameter is a 400.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
curl /api/v1/validate?iban=DE89370400440532013000
POST /api/v1/validate

Validate one IBAN (body)

The same check, for callers that would rather not put an account number in a URL.

BODY

iban string · required
The IBAN to validate.

EXAMPLE BODY

{
  "iban": "DE89370400440532013000"
}
curl -X POST /api/v1/validate \
  -H 'content-type: application/json' \
  -d '{"iban":"DE89370400440532013000"}'
GET /api/v1/validate/bulk

Validate many IBANs

Repeat the iban parameter once per account. Returns the same result object for each, plus valid and invalid counts.

PARAMETERS

iban required · query
Repeatable. One IBAN per occurrence.
curl /api/v1/validate/bulk?iban=DE89370400440532013000&iban=GB29NWBK60161331926819
POST /api/v1/validate/bulk

Validate many IBANs (body)

The same, with the list in a JSON body. Preferred for more than a handful.

BODY

ibans string[] · required
The IBANs to validate.

EXAMPLE BODY

{
  "ibans": [
    "DE89370400440532013000",
    "GB29NWBK60161331926819",
    "NOPE"
  ]
}
curl -X POST /api/v1/validate/bulk \
  -H 'content-type: application/json' \
  -d '{"ibans":["DE89370400440532013000","GB29NWBK60161331926819","NOPE"]}'
POST /api/v1/extract

Find IBANs in free text

Scans prose — an email, an invoice, a chat log — and validates every candidate it finds. The text is processed in the request and discarded.

BODY

text string · required
The text to scan.

EXAMPLE BODY

{
  "text": "Please pay DE89 3704 0044 0532 0130 00 by Friday. Old account was GB29 NWBK 6016 1331 9268 19."
}
curl -X POST /api/v1/extract \
  -H 'content-type: application/json' \
  -d '{"text":"Please pay DE89 3704 0044 0532 0130 00 by Friday. Old account was GB29 NWBK 6016 1331 9268 19."}'
GET /api/v1/repair

Suggest a correction for a mistyped IBAN

Almost every real failure is one of four things — a wrong character, a missing one, an extra one, or two neighbours swapped. Returns only edits that produce a valid IBAN. unambiguous is true when exactly one does, which is the only case safe to apply without asking.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
limit optional · query
Maximum suggestions, 1-20. Defaults to 5.
curl /api/v1/repair?iban=DE89370400440532013001

BUILD

GET /api/v1/generate

Generate valid test IBANs

Structurally valid IBANs that satisfy mod-97 and, where one exists, the national check digit. They belong to no real account. Pass every_country=1 for one per country instead.

PARAMETERS

country required · query
ISO country code. Not required with every_country.
count optional · query
1-50. Defaults to 1.
letters optional · query
Allow letters where the structure permits them. Off by default.
every_country optional · query
One IBAN for every country that allows generation.
curl /api/v1/generate?country=DE&count=3
GET /api/v1/convert

Build an IBAN from a domestic account

Deterministic construction for AE, BE, DE, FR, GB, NL, TR. Field names match what is printed on the documents a person reads from. Pass bban instead to assemble any country's IBAN from a raw BBAN.

PARAMETERS

country required · query
ISO country code.
bban optional · query
A raw BBAN. Wins over the fields below.
blz optional · query
DE: the Bankleitzahl.
account_number optional · query
DE, TR, FR, GB, NL, AE.
bank_code optional · query
TR, FR, GB, NL, AE.
branch_code optional · query
FR.
rib_key optional · query
FR: the two-digit RIB key.
sort_code optional · query
GB.
domestic_number optional · query
BE: 999-9999999-99.
reserved_digit optional · query
TR. Defaults to 0.
curl /api/v1/convert?country=DE&blz=37040044&account_number=0532013000
GET /api/v1/qr

Build a payment QR

With a beneficiary name, an EPC069-12 payment payload a banking app can pre-fill. Without one, the plain IBAN — still scannable, and honest about carrying no payment. Returns the payload, its byte count and an SVG. The IBAN is validated first: a code built around a broken account number scans cleanly and fails at the bank.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
name optional · query
Beneficiary. Required for an EPC payload.
amount optional · query
Euro. Omit for an open amount.
bic optional · query
Defaults to the one derived from the IBAN.
remittance optional · query
Free text, up to 140 characters.
reference optional · query
ISO 11649. Excludes remittance.
purpose optional · query
ISO 20022 purpose code.
note optional · query
Up to 70 characters, for the beneficiary.
curl /api/v1/qr?iban=DE89370400440532013000&name=Example%20GmbH&amount=49.90
POST /api/v1/qr/decode

Read an EPC payload

Turns the twelve positional lines back into fields.

BODY

payload string · required
The EPC payload.

EXAMPLE BODY

{
  "payload": "BCD\n002\n1\nSCT\nCOBADEFFXXX\nExample GmbH\nDE89370400440532013000\nEUR49.9\n\n\nInvoice 2026-014\n"
}
curl -X POST /api/v1/qr/decode \
  -H 'content-type: application/json' \
  -d '{"payload":"BCD\n002\n1\nSCT\nCOBADEFFXXX\nExample GmbH\nDE89370400440532013000\nEUR49.9\n\n\nInvoice 2026-014\n"}'

LOOK UP

GET /api/v1/swift/:bic

Look up a BIC

The directory record behind a BIC. Unlike IBAN validation, a syntactically valid BIC that is not listed is a 404 rather than a 200 with null fields.

PARAMETERS

bic required · path
8 or 11 characters.
curl /api/v1/swift/COBADEFF
GET /api/v1/bic/parse

Split a BIC structurally

Bank, country, location and branch, from the code alone. No directory is consulted, so this answers for codes that are not listed.

PARAMETERS

bic required · query
8 or 11 characters.
curl /api/v1/bic/parse?bic=COBADEFFXXX
GET /api/v1/bic/of

Derive the BIC for an IBAN

The BIC the bundled directory holds for that bank code. Null when the bank is not listed — never a guess, because a wrong BIC routes money to the wrong institution.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
curl /api/v1/bic/of?iban=DE89370400440532013000
GET /api/v1/banks

Search the bank directory

By name, BIC or city. Pass country alone to list a country's institutions alphabetically — browsing a country is a different question from searching with a blank term.

PARAMETERS

q optional · query
Name, BIC or city.
country optional · query
ISO country code.
limit optional · query
1-200. Defaults to 25.
curl /api/v1/banks?q=commerzbank
GET /api/v1/banks/:slug

One institution

The directory entry and its full BIC record.

PARAMETERS

slug required · path
Directory slug.
curl /api/v1/banks/commerzbank-ag
GET /api/v1/bics

Search the SWIFT/BIC directory

The same search over BIC records rather than institutions.

PARAMETERS

q optional · query
Code, institution or city.
country optional · query
ISO country code.
limit optional · query
1-200. Defaults to 25.
curl /api/v1/bics?country=TR&limit=5
GET /api/v1/bank-info/:bic

Bank name for a BIC, tersely

The lookup the site's own interface uses. Never fails: an unknown BIC is found:false with HTTP 200.

PARAMETERS

bic required · path
8 or 11 characters.
curl /api/v1/bank-info/COBADEFF

EXPLAIN

GET /api/v1/countries

Every IBAN country

Length, currency, SEPA membership and a published example, per country.

curl /api/v1/countries
GET /api/v1/countries/:code

One country's format

The registered length, the BBAN field layout, and the format mask — k check digit, n digit, A letter, c alphanumeric.

PARAMETERS

code required · path
ISO country code.
curl /api/v1/countries/DE
GET /api/v1/domestic

The account in its domestic form

German BLZ and Kontonummer, a British sort code and account number, and so on. Null when the country publishes no domestic presentation — that is a property of the country, not a missing answer.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
curl /api/v1/domestic?iban=DE89370400440532013000
GET /api/v1/mask

Mask an IBAN for display

Keeps the country, the check digits and a configurable tail. For logs and screenshots.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
tail optional · query
Visible trailing characters, 0-8. Defaults to 4.
curl /api/v1/mask?iban=DE89370400440532013000&tail=4
GET /api/v1/describe

Describe an account in a sentence

One line for a confirmation screen. Degrades as detail runs out rather than inventing any.

PARAMETERS

iban required · query
The IBAN to act on. Spaces and punctuation are ignored.
curl /api/v1/describe?iban=DE89370400440532013000
GET /api/v1/coverage

What the datasets contain

Counts per dataset and per country. A caller deciding whether to trust a null needs to know how much of the directory exists.

curl /api/v1/coverage