IBAN validation, bank lookup
and SEPA schemes as one binary

Validate IBANs, look up banks and SEPA scheme membership. Bank data is compiled in, no database or configuration needed. Serves the openiban.com routes unchanged.

Read Docs
terminal
response.json
$ curl https://iban.pizza/v2/iban/DE49500105179144355668

{
  "valid": false,
  "iban": { "formatted": "DE49 5001 0517 9144 3556 68", "bankCode": "50010517" },
  "checks": {
    "length":        { "ok": true,  "message": "Correct length for DE (22 characters)" },
    "bankCode":      { "ok": true,  "message": "Bank code 50010517 is valid" },
    "accountNumber": { "ok": false, "method": "C1",
                       "message": "Account number 9144355668 has a wrong check digit" },
    "ibanChecksum":  { "ok": true,  "message": "The IBAN checksum is correct" }
  },
  "bank": { "name": "ING-DiBa", "bic": "INGDDEFFXXX", "city": "Frankfurt am Main" },
  "schemes": { "level": "institution", "schemes": { "sctInst": { "status": "participant" } } },
  "dataAsOf": { "DE": "2026-09-02", "schemes": "2026-09-02" }
}

Try it

Parse, check the mod-97 checksum, resolve the bank code and verify the account check digit where a method is known.

try:
GET /v2/iban/DE89370400440532013000200

Answers come from the live API on this origin. If it is unreachable, the demo falls back to sample data inside the page; the shape is the same either way.

Endpoints

A v2 API with a structured answer per check. The v1 routes are compatible with openiban.com, so existing clients keep working.

v2/openapi.yaml
GET/v2/iban/{iban}validate and describe
POST/v2/iban:batchup to 100 at once
GET/v2/banks?country=&bic=&name=search banks
GET/v2/banks/{country}/{bankCode}one bank
GET/v2/banks/{country}/{bankCode}/logo.svgmonogram
GET/v2/countriesIBAN registry
GET/v2/datawhat is loaded, how old
GET/healthz /readyz /openapi.yamlhealth and spec
v1 · openiban.comunchanged
GET/validate/{iban}?validateBankCode=true&getBIC=true
GET/countries
GET/calculate/{countryCode}/{bankCode}/{accountNumber}
GET/v2/calculate/{countryCode}/{bankCode}/{accountNumber}
https://openiban.com → https://iban.pizzaAn existing client only changes its base URL. Same paths, same query parameters, same JSON.
ok can be null.
A check that could not be performed is not a failure. An account number whose check digit method is not implemented reports ok: null and the overall valid stays true.

Self-hosted

Static binary or container image. A snapshot of every registry is compiled in, so the first request answers without any download.

dockerno config
# FROM scratch, uid 65534, ~110 KB of data
docker run -p 8080:8080 ghcr.io/netzfabrikcom/iban-pizza:latest
curl http://localhost:8080/v2/iban/DE89370400440532013000

# with PostgreSQL, loader runs once
docker compose -f compose.yaml -f compose.postgres.yaml up
binarylinux · macos · windows
iban-pizza serve                        # embedded snapshot
iban-pizza serve -data-file data.gz     # refreshed snapshot, no rebuild
iban-pizza serve -database-url postgres://...

# fetch official registries at run time
iban-pizza update --write-snapshot /var/lib/iban-pizza/data.gz
Current data
iban-pizza update resolves the Bundesbank, OeNB and CNB endpoints at run time. /healthz reports the age of every dataset; a quarterly job opens a pull request.
Check digits verified
Eleven German account check digit methods, each tested against the Bundesbank specification. The upstream implemented none.
Registry-driven BBAN
Validation follows the IBAN registry structure per country, so DE89AB04… is rejected instead of accepted on length alone.
Closed by default
CORS is configured, not a wildcard. Input is rejected on length before anything is allocated. All output goes through json.Encoder.

Run it in a minute

Download a release or pull the image. No database, no data directory, no configuration.

ReleasesDeployment guide
Docs/MIT/Notice
GitHub·Not affiliated with openiban.com·© 2026 NETZFABRIK