Tool
IBAN Validator
Checks format, per-country length, and MOD 97 check digits per ISO 13616. Runs 100% in your browser.
100% Client-SideNo Server LogsNo Signup
Valid IBAN — passes all checks
Country
HR · Croatia
Check digits
70
BBAN
01234560123456789
Format pattern
7!n10!n
Length
21 chars
Formatted
HR70 0123 4560 1234 5678 9
- ✓Character set (2 letters + 2 digits + BBAN)
- ✓Country code HR · Croatia
- ✓Length 21/21
- ✓MOD 97 check digits
⚠️ This tool only verifies the format and check digits against ISO 13616. A valid IBAN does not guarantee the account exists, is open, or belongs to a specific person or institution. Always confirm with the recipient or their bank before initiating a transfer.
Validate IBANs in your own code
The same MOD 97-10 check this site runs in your browser. Copy a self-contained snippet — no API key, no network call for the JS/Python versions.
// Validate an IBAN client-side — no API, no data leaves the browser.
// Full per-country length table: https://ibantool.com/iban
const LENGTHS = { DE: 22, FR: 27, IT: 27, ES: 24, GB: 22, NL: 18, BE: 16,
CH: 21, AT: 20, PL: 28, SE: 24, NO: 15, DK: 18, FI: 18, IE: 22, PT: 25 };
function cleanIban(s) {
return s.replace(/[^A-Z0-9]/gi, "").toUpperCase();
}
function mod97(iban) {
const rearranged = iban.slice(4) + iban.slice(0, 4);
const digits = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString());
let rem = 0;
for (const d of digits) rem = (rem * 10 + Number(d)) % 97;
return rem;
}
function validateIban(input) {
const iban = cleanIban(input);
if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(iban)) return { valid: false, reason: "bad format" };
const len = LENGTHS[iban.slice(0, 2)];
if (len && iban.length !== len) return { valid: false, reason: `length should be ${len}` };
if (mod97(iban) !== 1) return { valid: false, reason: "check digits" };
return { valid: true, iban };
}
validateIban("DE89 3704 0044 0532 0130 00");
// { valid: true, iban: "DE89370400440532013000" }Note: the curl example calls a third-party service (openiban.com) because ibantool itself has no server API — everything here runs in the browser. Structural validation does not confirm an account exists.
IBAN validation FAQ
- How does the IBAN validator work?
- It checks three things per ISO 13616: the character set (2 letters, 2 digits, then A–Z / 0–9), the per-country length, and the MOD 97-10 check digits. An IBAN passes only when all three checks succeed. Everything runs in your browser.
- What is the MOD 97 check?
- MOD 97-10 is the checksum algorithm ISO 13616 uses. The IBAN is rearranged and letters converted to numbers, then the whole thing is taken mod 97 — a valid IBAN has a remainder of 1. This catches single-digit errors and most swap errors.
- Does validation tell me the account exists?
- No. The validator only confirms the IBAN is structurally well-formed and the check digits are correct. It does not verify the account exists, is open, or belongs to anyone. Confirm with the recipient’s bank before sending money.
- Why does my IBAN fail the length check?
- Each country has a fixed IBAN length. A German IBAN is always 22 characters, a Belgian one 16. If your IBAN is too short or too long for its country code, the length check fails — usually a typo or a missing/extra character.
- Is this IBAN validator free and private?
- Yes. It is free with no signup, and validation runs entirely client-side. The IBAN you paste never leaves your browser and is not logged or stored.
- Can I use it for payment integration testing?
- Yes. Paste a test IBAN to confirm it passes format and MOD 97 checks, then inspect the breakdown. For sample IBANs per country, see the IBAN example pages.