EXPLAIN
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.
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.
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.
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
/api/v1/validate
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
curl /api/v1/validate?iban=DE89370400440532013000
/api/v1/validate
The same check, for callers that would rather not put an account number in a URL.
BODY
iban
string ·
required
EXAMPLE BODY
{
"iban": "DE89370400440532013000"
}
curl -X POST /api/v1/validate \
-H 'content-type: application/json' \
-d '{"iban":"DE89370400440532013000"}'
/api/v1/validate/bulk
Repeat the iban parameter once per account. Returns the same result object for each, plus valid and invalid counts.
PARAMETERS
iban
required ·
query
curl /api/v1/validate/bulk?iban=DE89370400440532013000&iban=GB29NWBK60161331926819
/api/v1/validate/bulk
The same, with the list in a JSON body. Preferred for more than a handful.
BODY
ibans
string[] ·
required
EXAMPLE BODY
{
"ibans": [
"DE89370400440532013000",
"GB29NWBK60161331926819",
"NOPE"
]
}
curl -X POST /api/v1/validate/bulk \
-H 'content-type: application/json' \
-d '{"ibans":["DE89370400440532013000","GB29NWBK60161331926819","NOPE"]}'
/api/v1/extract
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
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."}'
/api/v1/repair
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
limit
optional ·
query
curl /api/v1/repair?iban=DE89370400440532013001
BUILD
/api/v1/generate
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
count
optional ·
query
letters
optional ·
query
every_country
optional ·
query
curl /api/v1/generate?country=DE&count=3
/api/v1/convert
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
bban
optional ·
query
blz
optional ·
query
account_number
optional ·
query
bank_code
optional ·
query
branch_code
optional ·
query
rib_key
optional ·
query
sort_code
optional ·
query
domestic_number
optional ·
query
reserved_digit
optional ·
query
curl /api/v1/convert?country=DE&blz=37040044&account_number=0532013000
/api/v1/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
name
optional ·
query
amount
optional ·
query
bic
optional ·
query
remittance
optional ·
query
reference
optional ·
query
purpose
optional ·
query
note
optional ·
query
curl /api/v1/qr?iban=DE89370400440532013000&name=Example%20GmbH&amount=49.90
/api/v1/qr/decode
Turns the twelve positional lines back into fields.
BODY
payload
string ·
required
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
/api/v1/swift/: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
curl /api/v1/swift/COBADEFF
/api/v1/bic/parse
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
curl /api/v1/bic/parse?bic=COBADEFFXXX
/api/v1/bic/of
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
curl /api/v1/bic/of?iban=DE89370400440532013000
/api/v1/banks
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
country
optional ·
query
limit
optional ·
query
curl /api/v1/banks?q=commerzbank
/api/v1/banks/:slug
The directory entry and its full BIC record.
PARAMETERS
slug
required ·
path
curl /api/v1/banks/commerzbank-ag
/api/v1/bics
The same search over BIC records rather than institutions.
PARAMETERS
q
optional ·
query
country
optional ·
query
limit
optional ·
query
curl /api/v1/bics?country=TR&limit=5
/api/v1/bank-info/:bic
The lookup the site's own interface uses. Never fails: an unknown BIC is found:false with HTTP 200.
PARAMETERS
bic
required ·
path
curl /api/v1/bank-info/COBADEFF
EXPLAIN
/api/v1/countries
Length, currency, SEPA membership and a published example, per country.
curl /api/v1/countries
/api/v1/countries/:code
The registered length, the BBAN field layout, and the format mask — k check digit, n digit, A letter, c alphanumeric.
PARAMETERS
code
required ·
path
curl /api/v1/countries/DE
/api/v1/domestic
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
curl /api/v1/domestic?iban=DE89370400440532013000
/api/v1/mask
Keeps the country, the check digits and a configurable tail. For logs and screenshots.
PARAMETERS
iban
required ·
query
tail
optional ·
query
curl /api/v1/mask?iban=DE89370400440532013000&tail=4
/api/v1/describe
One line for a confirmation screen. Degrades as detail runs out rather than inventing any.
PARAMETERS
iban
required ·
query
curl /api/v1/describe?iban=DE89370400440532013000
/api/v1/coverage
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