---
title: "Validate an IBAN"
method: GET
path: "/api/iban/validate"
tags: ["IBAN"]
---

# Validate an IBAN

`GET /api/iban/validate`

## Request

- Base URL: `https://api.unirateapi.com`
- URL: `https://api.unirateapi.com/api/iban/validate`
- Auth: none declared
- TypeScript: <https://skmtc.dev/unirateapi/apis/unirate-api/docs/api/iban/validate/get.ts> (a function with typed inputs; its response is checked against the schema)

Validate an International Bank Account Number and split it according to the
country's registered IBAN structure (bank code, branch code, account number).
Available on the **Free** plan; each call counts against your normal daily
request quota.

Spaces, hyphens and lowercase letters are accepted and normalised, so both the
electronic form (`DE89370400440532013000`) and the print form
(`DE89 3704 0044 0532 0130 00`) work.

An invalid IBAN is **not** an HTTP error: the response is `200` with
`valid: false` and a machine-readable `failure_code`:

- `invalid_characters` – anything other than A-Z / 0-9 after normalisation
- `invalid_format` – does not start with a 2-letter country code + 2 check digits
- `unknown_country` – the country does not use IBAN (e.g. `US`)
- `invalid_length` – wrong length for that country (see `expected_length`)
- `invalid_structure` – the BBAN does not match the country's format
- `invalid_checksum` – the ISO 7064 mod 97-10 check digits do not match

Validation is structural and mathematical only. It confirms the IBAN is
well-formed; it cannot confirm the account exists or is open. Bank names and
BICs are not returned.

## Query parameters

- `api_key` string, required
- `iban` string, required
- `format` 'json' | 'xml' | 'csv' | 'tsv'
- `callback` string

## Response `200`

Validation result. Check the `valid` field — invalid IBANs also return 200.

- object
  - `iban` string: Input after removing spaces/hyphens and upper-casing
  - `valid` boolean
  - `electronic_format` string: Canonical form without spaces (null when invalid)
  - `print_format` string: Groups of four characters separated by spaces (null when invalid)
  - `country_code` string
  - `country_name` string
  - `check_digits` string
  - `bban` string: Basic Bank Account Number (the country-specific part)
  - `bank_code` string
  - `branch_code` string: Null for countries whose IBAN has no branch component
  - `account_number` string
  - `national_check_digits` string: Country-specific check digits inside the BBAN, where the structure defines them
  - `sepa` boolean: Whether the country is in the Single Euro Payments Area
  - `expected_length` integer: Registered IBAN length for the country
  - `length` integer
  - `failure_code` string
  - `failure_message` string

## Other responses

- `400`: Missing `iban` parameter, input longer than 64 characters, or invalid JSONP callback
- `401`: Missing or invalid API key
- `429`: Daily request limit reached (shared with the other Free-plan endpoints)

---

[API](https://skmtc.dev/unirateapi/apis/unirate-api.md) - [All operations](https://skmtc.dev/unirateapi/apis/unirate-api/llms.txt) - [OpenAPI document](https://skmtc.dev/unirateapi/apis/unirate-api/revisions/e5fd92902326?raw)
