IBAN Validator & Generator

Validate any IBAN with the official mod-97 (ISO 7064) check, dissect it into country code, check digits, bank code and account number, or generate test IBANs for any of the 75+ supported countries — all in your browser, no signup, no data sent anywhere.

Paste with or without spaces — any case. Validation runs as you type.
Paste an IBAN to begin

What Is an IBAN?

The International Bank Account Number (IBAN) is the global standard for identifying bank accounts across national borders. Introduced by the European Committee for Banking Standards in 1997 and formalized as ISO 13616, an IBAN is a single string that combines the country code, two check digits, and the country-specific Basic Bank Account Number (BBAN). It was designed to eliminate the routing errors that plagued cross-border SEPA and SWIFT transfers, especially when account numbers from different countries had wildly different lengths and formats.

An IBAN is not an account number — it is a wrapper around an existing domestic account number that adds validation and country identification on top. Today more than 75 countries use IBANs, including all EU/EEA states, Switzerland, the UK, Turkey, most of the Middle East and parts of Latin America. The United States, Canada, China and Australia do not use IBANs domestically — they rely on routing numbers (US ABA), transit numbers (Canada), or BSB codes (Australia).

How This IBAN Validator Works

This validator runs the official ISO 7064 mod-97-10 algorithm — the same check your bank performs server-side — fully in your browser. The IBAN is never sent to any server, and nothing about your input is logged or stored.

The validation goes through four steps, all of which you can inspect in the "Mod-97 check" panel on the right:

  1. Cleanup. Whitespace is stripped and letters are converted to uppercase. Anything outside A-Z, 0-9 is rejected immediately.
  2. Country & length check. The first two characters are matched against the ISO 3166 country table, and the total length is compared with the country's official IBAN length. A French IBAN must be 27 characters, a German one 22, a UK one 22, and so on.
  3. Rearrangement. The first four characters (country code + check digits) are moved to the end of the string. This is the ISO 7064 prescribed transformation.
  4. Letter-to-number conversion + mod-97. Each letter is replaced by a two-digit number where A=10, B=11, …, Z=35. The resulting decimal number is then reduced modulo 97. If the remainder equals 1, the IBAN is valid.

Anatomy of an IBAN

Every IBAN follows the same outer structure regardless of country, but the inner BBAN portion varies. The "Anatomy" card in the result panel breaks any IBAN you paste into colour-coded segments:

Example for France (27 chars): FR + 14 + 20041 + 01005 + 0500013M026 + 06 = country + check + bank + branch + account + national key.

Country-Specific IBAN Formats

A few of the most common formats you will encounter:

Generating Test IBANs for Development

The Generate mode creates random but mathematically valid IBANs for any supported country. They pass the mod-97 check and respect the country's structural rules, so they are useful for:

These IBANs do not correspond to any real bank account. Submitting one to a real payment processor will either be rejected by the bank's secondary checks (account number not found) or — if the routing matches a real branch by coincidence — fail when the bank tries to settle. Never use generated IBANs for real money.

Common IBAN Errors and How to Diagnose Them

IBAN Validation Examples

Valid French IBAN (BNP Paribas)
FR14 2004 1010 0505 0001 3M02 606
  Country: FR (France, 27 chars expected) ✓
  Check digits: 14
  Bank code: 20041 (La Banque Postale)
  Branch:    01005
  Account:   0500013M026
  Nat. key:  06
  Mod-97:    1 → VALID ✓
Valid German IBAN (Commerzbank)
DE89 3704 0044 0532 0130 00
  Country: DE (Germany, 22 chars expected) ✓
  Check digits: 89
  Bankleitzahl: 37040044 (Commerzbank Köln)
  Account:      0532013000
  Mod-97:       1 → VALID ✓
Invalid IBAN — single typo
FR14 2004 1010 0505 0001 3M02 607   ← last digit changed
  Country: FR (France, 27 chars expected) ✓
  Length: 27 ✓
  Mod-97: 28 → INVALID ✗
  Diagnosis: check digits don't match — one character is wrong.

Why ISO 7064 mod-97 was chosen over a simple checksum

An IBAN like FR76 3000 3035 4096 6001 4860 T20 looks arbitrary but every character is engineered. The two characters at positions 3–4 are check digits, and the algorithm used to compute them — ISO 7064 mod-97 — was specifically chosen over Luhn, over CRCs, over simple sum-of-digits. Here is why, and what it does (and does not) protect you against.

The problem ISO 13616 needed to solve

Cross-border bank transfers in the 1990s were a mess of national formats. The European Committee for Banking Standards needed an identifier that would (1) detect typing errors at the point of entry, before the wire was sent; (2) work across 70+ countries with widely varying account-number structures (length 14–34 characters, alphanumeric in some, numeric-only in others); (3) not require calling the bank for a syntactic check. ISO 13616 defined the structure; ISO 7064 defined the check-digit algorithm.

Why mod-97 specifically

97 is the largest prime under 100. That matters because the validity check is IBAN_as_integer mod 97 = 1. A prime modulus guarantees a uniform distribution of checksum values across all possible inputs, which minimises false positives. 97 is also large enough that the probability of a random IBAN passing the check by accident is 1/97 ≈ 1.03%. Critically: mod-97 detects every single-digit error and every adjacent-digit swap exhaustively — both errors that dominate human transcription mistakes.

Why not Luhn (the credit-card algorithm)?

Luhn was designed for 13–19 digit credit-card numbers. It catches single-digit errors and most adjacent-digit transpositions but misses roughly 2% of two-digit transpositions (specifically those that produce the same Luhn sum). For a 4-character bank routing slip, Luhn is fine. For a 22–34 character IBAN, mod-97 is dramatically more error-tolerant per character spent on checking.

Why not a CRC?

Cyclic redundancy checks excel at burst-error detection in machine-to-machine transmission. They are overkill (and wasteful of digit-budget) for human transcription. Mod-97 fits the check into exactly two decimal digits; a CRC-8 would consume the same two digits but provide weaker coverage of the error patterns humans actually make (transpositions, single-digit slips). For paper-to-screen typing, mod-97 wins.

What mod-97 does NOT protect against

It catches transcription errors. It does not verify that the bank code, branch code, or account number actually exists at a real bank. It does not check that the account is open, in good standing, or able to receive funds. Those answers come from the bank or from a SWIFT lookup — out of scope for ISO 13616. A valid IBAN is one that could be a real account, not one that is.

Takeaway: Mod-97 is the right primitive for a human-typed identifier where transcription errors dominate over malicious modification. The validator on this page implements the standard exactly: rearrange the IBAN (country code + check digits to the end), convert letters to numbers (A = 10, B = 11, ..., Z = 35), interpret the result as one large integer, check it modulo 97 equals 1. That is the entire algorithm. No proprietary magic, no per-country variants.

Sources: SWIFT IBAN Registry (ISO 13616) · ISO 7064 standard.

Frequently Asked Questions

They are positions 3 and 4 of the IBAN (right after the country code) and are computed using ISO 7064 mod-97-10. They are designed so that the entire IBAN, when rearranged and converted, gives a remainder of exactly 1 modulo 97. This catches single-digit typos and most transposition errors with very high probability.

Move the first four characters of the IBAN to the end. Replace every letter with two digits (A=10, B=11, ..., Z=35). The result is a long integer. Divide that integer by 97 and look at the remainder. If the remainder is 1, the IBAN is valid; anything else means at least one character is wrong. The math holds for any country because the country and check digits are part of the input — only their positions move.

No. The generator produces IBANs that pass the mod-97 mathematical check and respect the country's structural format, but the bank, branch and account portions are random. They do not correspond to any real account at any real bank. They are intended for testing payment forms, populating staging environments, demos and unit tests — never for real payments.

An IBAN identifies a specific bank account; a BIC (Business Identifier Code, also called SWIFT code) identifies a specific bank or branch. For SEPA transfers within the EU you typically need only the IBAN — the BIC is derived. For non-SEPA international transfers (USD, AED, JPY…) you need both: the IBAN tells the bank which account, the BIC tells the network which bank to route through.

The most common reasons are: a copy-paste error that swapped two characters or dropped one, an O/0 or I/1 confusion, mixing in a hidden whitespace or right-to-left marker, or the IBAN being from a country whose specification is not (yet) supported here. If your bank app printed it and you typed it manually, retype it character by character — that resolves the vast majority of cases.

All EU/EEA countries (FR, DE, ES, IT, NL, BE, AT, FI, IE, PT, GR, LU, MT, CY, EE, LV, LT, SK, SI, PL, CZ, HU, RO, BG, HR, SE, DK, IS, NO, LI), plus the United Kingdom, Switzerland, all Balkans, most of the Middle East and North Africa (TR, IL, JO, KW, QA, SA, BH, AE, TN, MR), and a handful of others (BR, CR, GT, DO, SV, MU, PK, SC, TL, VG, KZ, AZ, UA, BY, GE, MD, RS, ME, MK, XK, ST, LC, AD, MC, SM, FO, GL). The US, Canada, China and Australia use their own domestic routing systems instead.

Yes. The entire validation and generation logic runs in your browser — your IBAN is never sent to any server, never logged, and never persisted. There is no signup, no API key, no quota. The country specifications and bank code tables are embedded in the page itself.