Free tool
ISIN validator and check digit calculator
Paste an ISIN to check its format and Luhn check digit, or paste the first 11 characters to compute the twelfth. The tool also explains the country prefix and national code.12 characters: 2-letter country, 9-character national code, 1 check digit. Case and spaces are ignored.
Try:
Common prefixes for funds and ETFs
The first two characters are the ISO 3166 code of the numbering agency that issued the code, which for funds is almost always the domicile.| Prefix | Country | Typical use |
|---|---|---|
IE | Ireland | Home of most UCITS ETFs (ICAVs and plcs) and many Irish-domiciled funds. |
LU | Luxembourg | Largest cross-border UCITS fund domicile (SICAVs, FCPs). |
FR | France | French FCPs and SICAVs, including many Amundi and Carmignac funds. |
DE | Germany | German Sondervermögen and some ETFs; the WKN is a separate 6-character code. |
GB | United Kingdom | UK OEICs and unit trusts; the NSIN is the SEDOL. |
NL | Netherlands | Dutch funds and some ETFs listed on Euronext Amsterdam. |
CH | Switzerland | Swiss funds; the national code is the Valorennummer. |
JE | Jersey | Often used for physically backed commodity ETCs. |
US | United States | US mutual funds and ETFs; the NSIN is the CUSIP. Not UCITS: no KID, different document set. |
CA | Canada | Canadian funds and ETFs (CUSIP-based). |
AT | Austria | Austrian investment funds. |
BE | Belgium | Belgian SICAVs and funds. |
Validate an ISIN in code
The same check in TypeScript, useful before spending an API request on a typo:export function isValidIsin(raw: string): boolean {
const isin = raw.trim().toUpperCase();
if (!/^[A-Z]{2}[A-Z0-9]{9}\d$/.test(isin)) return false;
const digits = [...isin].map((c) => (c >= "A" ? String(c.charCodeAt(0) - 55) : c)).join("");
let sum = 0, double = false;
for (let i = digits.length - 1; i >= 0; i--) {
let d = Number(digits[i]);
if (double) { d *= 2; if (d > 9) d -= 9; }
sum += d; double = !double;
}
return sum % 10 === 0;
}The API applies the same rule and answers 400 invalid_isin for anything that fails it, without counting the request against your quota.Frequently asked questions
How is the ISIN check digit calculated?
Letters are converted to numbers (A=10 … Z=35), the resulting digit string is run through the Luhn algorithm from the right, and the check digit is the value that makes the total a multiple of ten. This tool performs that calculation locally in your browser.Does a valid check digit mean the fund exists?
No. The check digit only catches typing errors. A syntactically valid ISIN may never have been issued or may belong to a share class that has since been closed. Resolving the ISIN through the API confirms whether a live fund document set exists.Why does my ETF have several tickers but one ISIN?
Tickers identify a listing on one exchange. The same share class listed on Xetra, the London Stock Exchange and Borsa Italiana has three tickers and a single ISIN, which is why fund data APIs key on the ISIN.Is the ISIN I type stored anywhere?
No. Validation runs entirely in your browser; this page does not send the value to a server. Only if you continue to sign up and request the fund through the API is the ISIN processed there.Valid ISIN? Turn it into data.
One request returns key facts, holdings, risk and performance for that share class as JSON. Free plan, no card.Keep reading
ISINIdentifiers
What is an ISIN? A developer's guide to fund and ETF identifiers
ISIN format, check digit, how it differs from tickers, SEDOL, CUSIP and WKN, and how to validate an ISIN in code before you look up fund data.TutorialAPI
How to get fund data from an ISIN with a REST API (curl, JavaScript, Python)
Step-by-step: call a fund data API with an ISIN and get key facts, holdings, risk and performance as JSON. Includes curl, fetch and requests examples and error handling.DomicileISIN