BIC / SWIFT Checker
ISO 9362Parse and validate BIC/SWIFT codes. Checks structural format, country code, and whether the BIC appears in a reference dataset of known institutions. Detects test BICs and passive participants.
8 characters (primary office) or 11 characters (specific branch). Input is normalised to uppercase.
Try an example:
Enter a BIC/SWIFT code above to validate it
What is checked
- Format — Verifies length (8 or 11 characters) and character pattern — 4 letters (bank), 2 letters (country), 2 alphanumeric (location), optional 3 alphanumeric (branch).
- Country code — Confirms the two-letter country segment is a recognised ISO 3166-1 alpha-2 code.
- Dataset lookup — Checks the BIC against a curated reference dataset of ~80 known institutions. A match provides stronger confidence but is not a live SWIFT registry check.
- Location code flags — Surfaces test BICs (second location character = 0) and passive participants (second location character = 1) per ISO 9362 convention.
BIC structure (ISO 9362)
BBBB — 4-letter bank code (institution identifier)
CC — 2-letter ISO 3166-1 country code
LL — 2-character location code (letters or digits)
BBB — optional 3-character branch code (omit or use XXX for primary office)
Common issues
- •Format valid ≠ registered. A BIC can pass all structural checks and still not correspond to any real institution. Always confirm with your bank or PSP before routing payments.
- •8 vs 11 characters.Sending to a primary BIC (8-char) routes to the bank's main office. An 11-char BIC targets a specific branch. Appending XXX to an 8-char BIC is equivalent to the primary office — some systems require the explicit 11-char form.
- •Location code second character.
0= test BIC (not for production).1= passive participant (may not be directly reachable on SWIFT). Both are flagged automatically.
Dev snippet — parse BIC (JavaScript)
function parseBic(raw) {
const bic = raw.trim().toUpperCase();
if (!/^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/.test(bic)) return null;
const locationCode = bic.slice(6, 8);
return {
bankCode: bic.slice(0, 4),
countryCode: bic.slice(4, 6),
locationCode,
branchCode: bic.length === 11 ? bic.slice(8) : "XXX",
isPrimary: bic.length === 8,
isTestBic: locationCode[1] === "0",
isPassive: locationCode[1] === "1",
};
}