An ISIN identifies a security, an LEI identifies a legal entity and a FIGI identifies an instrument, down to the venue it trades on. Joins between company data and market data go wrong when one is treated as another. This comparison sets out what each code names, who issues it and on what terms, how its check digits work and how the three map to each other, with a worked example and the columns to join on.
The record behind a code is held by its registry: an entity's reference data and parents in GLEIF's index, the full ISIN records at the ANNA Service Bureau. Company data needs the codes themselves, on every row. Every listed company in Fokals carries its ticker, MIC, ISIN, LEI, FIGI and CIK, in data delivered direct by REST API and as bulk files, so each row joins to a security master you already hold.
Three codes, three things
The ISIN is the International Securities Identification Number of ISO 6166. ANNA, the Association of National Numbering Agencies and the registration authority for the standard, describes it as the code that identifies one financial or referential instrument and no other, such as an equity, a debt instrument, a derivative or an index. ANNA's ISIN Guidelines add the point that matters for joins: an ISIN identifies the instrument and not the market it trades on, except for options, futures and commodities. A share listed on several exchanges has one ISIN, and each category of share has its own.
The LEI is the Legal Entity Identifier of ISO 17442. GLEIF, the foundation that administers it, states that an LEI is unique and stands for one entity only. The record behind it answers two questions: who is who, with the official name and registered address, and who owns whom, with the direct and ultimate accounting consolidating parents that the entity reports.
The FIGI is the Financial Instrument Global Identifier, a standard of the Object Management Group for which Bloomberg acts as registration authority. OpenFIGI describes it as a 12-character code that carries no information about the instrument or its issuer. For equities, its allocation rules assign FIGIs at three levels: one for the instrument on a specific trading venue, a composite that links the venues of one country or market, and a share class that links the composites across countries.
| ISIN | LEI | FIGI | |
|---|---|---|---|
| Identifies | A security or other financial instrument | A legal entity | An instrument, by venue, by country and by share class |
| Standard | ISO 6166 | ISO 17442 | Object Management Group |
| Length | 12 characters | 20 characters | 12 characters |
| Issued by | National numbering agencies | LEI issuers accredited by GLEIF | Certified providers: Bloomberg and Kaiko |
| Check | One digit, modulus 10 double-add-double | Two digits, ISO/IEC 7064 MOD 97-10 | One digit, modulus 10 double-add-double |
| Meaning inside the code | A two-letter prefix set by allocation rules | None to rely on | None |
| Lifetime | Not re-used; some corporate actions bring a new one | Never given to another entity; reference data certified yearly | Never changes and is never reused |
| Using the data | Free look-up; complete records by subscription | Open data under CC0 | Free to use and redistribute |
Who issues each, and on what terms
ISIN. Only an official national numbering agency can issue a valid ISIN. ANNA's questions page says ISINs with basic information can be looked up free of charge in its lookup service and that a limited number of records can be downloaded. Complete records are another matter: the ANNA Service Bureau offers licensed exports, daily feeds and API connectivity as subscription services. National terms can apply as well. CUSIP Global Services, the numbering agency for the United States, states that a CUSIP or CINS identifier occupies positions 3 to 11 of every ISIN it assigns, and its terms of use say it has the right to license all proprietary rights to the CUSIP database, which contains CGS ISINs. Read the terms of the agency concerned before you redistribute ISINs in bulk.
LEI. An entity obtains its LEI from an issuer accredited by GLEIF, also called a Local Operating Unit. The Regulatory Oversight Committee says issuers generally charge the entity a fee for issuance and for each yearly certification of its reference data. GLEIF's terms of use provide LEIs and their reference data free of charge under the CC0 licence, for look-up and for download of the whole set. The same terms ask users not to suggest that their own products come from GLEIF or are supported by it.
FIGI. A FIGI is assigned by a certified provider. OpenFIGI's questions page says the symbology is free of charge, with no licensing or re-use restrictions on access, use or redistribution, and that the MIT open source licence is part of the standard. The same page calls its mapping API free, says bulk flat files are not available, and says the API does not return third-party proprietary identifiers because of licensing and redistribution restrictions. The API's documentation sets its rate limits, which differ with and without an API key. You can send an ISIN in, and you get FIGIs back.
Structure and check digits
An ISIN has a two-letter prefix, a national number padded to nine characters and one check digit. For shares the prefix is the country where the issuer is registered or domiciled. ANNA lists the other cases: the country of the allocating agency for debt, the country of the depositary for a depositary receipt, and a set of prefixes that are not countries at all. Do not read an issuer's home from an ISIN.
An LEI has 20 characters. The Regulatory Oversight Committee describes a four-character prefix for the issuer that first assigned the code, two reserved characters set to zero, twelve characters for the entity and two check digits, and it notes that the prefix does not identify the issuer of an LEI assigned before 30 November 2012. GLEIF's own LEI, 506700GE1G29325QX363, shows the pattern. The LEI in the worked example below has letters in the reserved positions, and an entity can move its LEI to another issuer, so the prefix does not name who maintains it today. Validate an LEI and look it up, and do not parse it.
A FIGI has two letters for the certified provider, a G, eight characters that are never vowels and a check digit. OpenFIGI's check digit document gives the two prefixes in use: BB for Bloomberg and KK for Kaiko.
ANNA and OpenFIGI name the same check, modulus 10 double-add-double, and the routines are not the same. For an ISIN each letter is first written as two digits, and every second digit is doubled. OpenFIGI's worked example doubles the whole value of every second character, so an L, worth 21, becomes 42. A validator written for ISINs therefore rejects valid FIGIs, including the one that document works through.
import re
def value(ch): # 0-9 as they are, A is 10, Z is 35
return int(ch, 36)
def isin_ok(code):
if not re.fullmatch(r"[A-Z]{2}[A-Z0-9]{9}[0-9]", code):
return False
digits = "".join(str(value(c)) for c in code) # letters become two digits
total = 0
for i, d in enumerate(reversed(digits)):
n = int(d) * (2 if i % 2 else 1) # every second digit, from the right
total += n // 10 + n % 10
return total % 10 == 0
def lei_ok(code):
if not re.fullmatch(r"[A-Z0-9]{18}[0-9]{2}", code):
return False
return int("".join(str(value(c)) for c in code)) % 97 == 1
def figi_ok(code):
if not re.fullmatch(r"[A-Z]{2}G[B-DF-HJ-NP-TV-Z0-9]{8}[0-9]", code):
return False
total = 0
for i, c in enumerate(code[:11]):
n = value(c) * (2 if i % 2 else 1) # the whole value of every second character
total += sum(int(d) for d in str(n))
return (10 - total % 10) % 10 == int(code[11])
assert isin_ok("US4592001014")
assert lei_ok("506700GE1G29325QX363")
assert figi_ok("BBG000BLNQ16") and not isin_ok("BBG000BLNQ16")A valid check digit shows that a code is well formed, not that it was ever issued or is still current. Look it up before you rely on it.
How the three map to each other
OpenFIGI's documentation uses IBM as its example, and the same company shows all three codes. The LEI and ISIN were confirmed in GLEIF's index and the FIGIs in OpenFIGI's mapping API on 4 October 2026.
| Level | Code | What it names |
|---|---|---|
| Legal entity | LEI VGRQXHF3J8VDLUA7XE92 | International Business Machines Corporation |
| Security | ISIN US4592001014 | Its common stock, wherever it trades |
| Share class | FIGI BBG001S5S399 | The same share class across countries |
| Country | FIGI BBG000BLNNH6 | The composite of its United States venues |
| Venue | FIGI BBG000BLNQ16 | The New York listing |
Read upwards, the relations are many to one in the usual case: a venue-level FIGI belongs to one composite, a composite to one share class and a share class to one issuer. OpenFIGI's rules note exceptions, such as multilateral trading facilities, whose venue-level FIGIs are not linked to the composite of the primary market. Read downwards, they fan out: one LEI has an ISIN for every share class and every bond the entity has issued, and one ISIN has a FIGI for every venue the security trades on.
GLEIF and ANNA publish daily ISIN-to-LEI relationship files, publicly available on GLEIF's website. The page says they currently include newly issued ISINs from the national numbering agencies that took part first, that ANNA's website lists the participating agencies, and that covering legacy ISINs is planned for the longer term. An ISIN that is absent from the files may therefore still have an issuer with an LEI. OpenFIGI's mapping API takes an ISIN and returns the listings, each with its FIGI, its composite FIGI and its share class FIGI.
curl 'https://api.openfigi.com/v3/mapping' \
--request POST \
--header 'Content-Type: application/json' \
--data '[{"idType":"ID_ISIN","idValue":"US4592001014"}]'One ISIN comes back as many rows, because an ISIN does not say where a share trades. Decide which level you want before you store the answer. A price belongs to a venue or a composite, and a holding belongs to a share class.
ANNA's guidelines keep the ISIN through a change of company name, let it stay through a stock split unless shares are exchanged, and require a new one after a reverse split. OpenFIGI says corporate actions do not change a FIGI and that delisting does not remove one. An LEI stays with its entity, and its record carries a registration status that tells you whether the entity has kept it current.
How Fokals carries them
The data dictionary sets the convention for every file. Each row carries a stable company ID and, for a listed company, the identifiers of its listing: ticker, exchange, MIC, ISIN, LEI and FIGI, with the SEC CIK where the company has one.
- The FIGI is the share class FIGI, the level that stays the same across venues and countries. Join it to a share class key, and every listing of a company rolls up to one line.
- The MIC is the market identifier code of the venue. A ticker is unique only on a venue, so join on ticker with MIC and never on ticker alone.
- Every ISIN and LEI delivered has passed its check digits, so the codes that reach your join are well formed.
- A brand or subsidiary carries the identifiers of its listed parent, so the rows of a group's brands meet at the listed issuer.
The company index holds one record for each equity listing, in 79 countries, with the listing's own FIGI, the share class FIGI, the ISIN and the issuer's LEI. A delisted security is marked and kept, so older joins still resolve.
-- Positions keyed by ISIN: join straight to a Fokals table
select p.portfolio, h.day, h.open_postings, h.new_postings
from positions p
join company_hiring_daily h on h.isin = p.isin
where h.day >= date '2026-09-01';
-- Positions keyed by share class FIGI: replace the join condition
-- on h.figi = p.share_class_figiIf your positions carry venue-level FIGIs, map them to a share class first, with the shareClassFIGI that OpenFIGI returns, or join on ISIN. The guide to mapping alternative data to a security master works through the cases, and the identifiers that make company data joinable adds the domain, the ticker and the CIK.
Where identifiers stop
A company that has issued no security has no ISIN and no FIGI, and it has an LEI only if it registered for one. Every company in Fokals, listed or private, has one stable company ID, so a private company joins on that key and a listed company joins on its security identifiers as well. The public mapping sources have gaps to plan for. The ISIN-to-LEI files link newly issued ISINs from the agencies that take part, and OpenFIGI's rules say its website and APIs return active instruments by default and show delisted ones only when unlisted equities are included. Count the codes that find no match instead of dropping them.
Frequently asked questions
What is the difference between an ISIN and an LEI?
An ISIN identifies a security, such as one class of a company's shares or one of its bonds. An LEI identifies the legal entity that issued it. One entity therefore has one LEI and many ISINs. GLEIF and ANNA publish daily files that link newly issued ISINs to the LEIs of their issuers, for the numbering agencies that take part.
What is the difference between an ISIN and a FIGI?
An ISIN names a security and is the same on every exchange where it trades. A FIGI is assigned at three levels for equities: the trading venue, the composite of one country and the share class worldwide. One ISIN therefore maps to many venue-level FIGIs. Use the ISIN to name the security and a FIGI when you need to say which listing or which market.
Are ISIN, LEI and FIGI free to use?
LEI data is published by GLEIF free of charge under the CC0 licence. OpenFIGI states that the FIGI symbology is free to access, use and redistribute. An ISIN can be looked up free in ANNA's lookup service, while complete ISIN records are offered by subscription through the ANNA Service Bureau, and a national numbering agency can attach its own licence terms.
Can one company have more than one ISIN?
Yes. An ISIN belongs to a security and not to a company, so each class of shares and each bond has its own. ANNA's guidelines also require a new ISIN after some corporate actions, such as a reverse split. To group a company's securities, use the issuer's LEI or a company identifier, and keep old ISINs with their dates.
How do I convert an ISIN to a FIGI or an LEI?
For a FIGI, send the ISIN to OpenFIGI's mapping API, which is free and returns the listings it holds, each with its FIGI, composite FIGI and share class FIGI. For an LEI, use the ISIN-to-LEI relationship files that GLEIF publishes daily, which link newly issued ISINs, or search GLEIF's index for the issuer. Both cover what their sources hold, so expect some ISINs without a match.
Does a private company have an ISIN, an LEI or a FIGI?
Only if it has issued a security or obtained an LEI. An ISIN and a FIGI exist where there is an instrument, such as a bond a private company has issued. An LEI exists where the entity obtained one from an accredited issuer. Many private companies have none of the three, and a domain or an internal company identifier serves in their place.
Which identifiers should company data carry to join to a security master?
One at each level you hold: the ISIN or the share class FIGI for the security, the LEI for the issuer, and the ticker with its MIC for the listing. Every listed company in Fokals carries its ticker, MIC, ISIN, LEI, FIGI and CIK, a brand or subsidiary carries the identifiers of its listed parent, and every company has one stable company ID, so rows join to a security master with no matching by name.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.
What this page says about the products it names was checked against their public documentation on 4 October 2026. Product and company names are trademarks of their owners. Fokals is not affiliated with them or endorsed by them.