Finance.Foundation
Open definitions

Standards

The identifier standards of global finance, and the open Finance Foundation Schema for entities and relationships.

Identifiers — the four questions

Every financial fact needs four resolutions: who (entity), what (security), where (venue) and in what unit (currency). These are the standards that answer them.

CodeStandardAnswersSteward
LEILegal Entity Identifier20-char code identifying any legal entity party to a financial transaction. Free and open by G20 mandate.Who — the legal entityGLEIF (open, ISO 17442)
ISINInternational Securities Identification Number12-char code identifying a security across venues. Openly usable; allocation is per-country.What — the securityISO 6166 via national agencies
MICMarket Identifier Code4-char code identifying exchanges and trading venues (XNYS, XNAS, XLON…).Where — the venueISO 10383 (open registry)
FIGIFinancial Instrument Global IdentifierOpen, free alternative to licensed instrument codes; mappable via the OpenFIGI API.What+where — instrument at venueOMG / OpenFIGI (open)
TickerExchange ticker symbolVenue-local and ambiguous across markets — convenient for humans, unsafe as a primary key.Local shorthandEach venue
ISO 4217Currency codesUSD, EUR, JPY… the one identifier layer finance fully agrees on.Unit of accountISO (open)

Coverage — what is actually filled in

A standard is only useful to the extent the dataset carries it. This is every collection against every identifier we hold, counted from the data on each request rather than written down. 1,286 codes across 13 standards are resolvable at /identifiers and through /api/v1/resolve.

An empty cell is not automatically a gap. A sovereign wealth fund has no ticker because it is not traded, and an index has no ISIN we can publish because index identifiers sit behind the same licence as index values. The note on each row says which it is.

companies · ISO 17442

LEI 119/121 98%

Checked against GLEIF: every stored LEI resolves to a live record naming an entity of the right kind, in the country we file the company under. Five carry a registration status other than ISSUED — four LAPSED, meaning the holder has not renewed and the reference data behind the code is unmaintained, and one PENDING_ARCHIVAL, which despite the name is a transfer between LEI issuers rather than a retirement. In each case the code still identifies the company, so it stays. Where a company has none at all, GLEIF publishes no record for the listed parent and we do not substitute a subsidiary's.

companies · ISO 6166

ISIN 121/121 100%

Allocation is national, so coverage follows the numbering agencies rather than our effort. Where we track a US ADR line, the ISIN is the ADR's — a different security from the ordinary share.

companies · OMG FIGI

FIGI 121/121 100%

Share-class level, confirmed by lookup in OpenFIGI. Composite and venue-level FIGIs exist for the same company and are not what we store.

companies · ANSI X9.6

CUSIP 61/121 50%

Never stored. CUSIP is a licensed identifier; for US and Canadian securities it is characters 3–11 of the ISIN, so the resolver derives it rather than republishing a licensed database.

companies · SEC registrant number

CIK 79/121 65%

Read back out of the EDGAR URL on each filing we cite. Only companies that file with the SEC have one, which excludes most non-US issuers without a US listing.

markets · ISO 10383

MIC 48/48 100%

Every venue validated against the ISO 10383 registry, segment MICs included.

markets · ISO 17442

LEI 46/48 96%

The operator's LEI, taken from the ISO 10383 registry itself for 25 of the 27. Two are not the registry's own binding and say so on the venue page: Toronto and the London Metal Exchange, where the registry leaves the column blank and the LEI comes from GLEIF directly. Shenzhen has none at all — three registries were checked, and GLEIF holds no record for the exchange under any spelling.

funds · venue-local

Ticker 21/32 66%

Only the 18 exchange-listed funds have one. An institutional pool such as a sovereign wealth fund is not traded and has no ticker.

funds · ISO 17442

LEI 25/32 78%

The LEI of the fund itself, not of its manager — GLEIF issues these to funds as entities in their own right. The seven without one are not an oversight: three genuinely have none (Norway's oil fund, Temasek and the SPDR gold trust, each checked by name and by ISIN), and four name a strategy or a family rather than a legal person, where the candidates that exist belong to a feeder, a Cayman vehicle or a subsidiary. Publishing one of those would put a real code against the wrong entity, which is the failure this dataset has already had once.

funds · SEC investment-company series

SEC series ID 16/32 50%

Applies to US registered investment companies only (20 of ours file with the SEC). A series ID names one fund inside a trust that may hold dozens.

banks · ISO 9362

BIC 15/20 75%

Who to pay, as distinct from who the institution is. A large bank publishes a code per branch and desk — JPMorgan's record carries 141 — so one is chosen by rule: the only head-office code registered in the entity's own country. Where several survive that test the standard does not rank them and neither do we, so five banks carry the reason instead of a code.

banks · ISO 17442

LEI 18/20 90%

The operating bank, not its listed parent — for most of these that is a different legal entity with a different LEI, and the point of the field is to say which one the page is about. Morgan Stanley is the exception and carries none: the figures on its page describe the group rather than a bank subsidiary, so the page falls back to the parent's LEI and says so.

countries · ISO 3166-1

Country code 37/37 100%

ISO 3166-1, alpha-2 and alpha-3. Twenty of the alpha-3 codes come from World Bank Open Data, a source already credited here. Taiwan's does not: the World Bank does not list Taiwan at all, so TWN is recorded by hand from ISO 3166-1 itself — one value on a different footing from the other twenty, which is worth saying rather than letting the column look uniform.

countries · ISO 4217

Currency code 37/37 100%

ISO 4217 alphabetic.

assets · ISO 24165

DTI 5/9 56%

ISO 24165, the one identifier standard written for digital tokens, read from the registry that maintains it. The four without one are stablecoins whose registry entries we could not match to the token this row means with enough confidence to publish.

assets ·

iso4217 4/14 29%

ISO 4217 treats precious metals as currencies and gives four of them codes. It stops there: copper, oil and grain have no identifier standard at all, and the symbol shown for those is an exchange contract root rather than a code anyone is obliged to recognise.

assets · OMG FIGI

FIGI 17/17 100%

Index identifiers are open even though index levels are licensed — a distinction worth keeping straight. Hang Seng is deliberately absent: its candidate ISIN resolved to two different instruments, and a code that resolves to two things is wrong about at least one.

assets · venue-local

Ticker 56/56 100%

A symbol, not a standard identifier. Assets in this set are reference concepts — an index, a benchmark yield, a metal — and most have no security identifier because they are not securities.

Every stored LEI, ISIN and FIGI is re-checked against its issuing registry by scripts/identifiers/verify.py, which CI runs before a deploy. It tests three things a checksum cannot: that the LEI names an entity of the right kind, that it is registered in the country we file the company under, and that GLEIF’s own ISIN-to-LEI mapping agrees with the LEI we hold. On 31 August 2026 that check found four LEIs which passed every check digit and resolved to live records, and named the wrong company — a same-named Australian sole trader for Coca-Cola, the Russian subsidiary for Abbott, and the French and Norwegian branches for Adyen and Tata Consultancy Services. They have been corrected.

Finance Foundation Schema v0.1

A minimal, open schema for financial entities and their relationships — the shape this site and its API are built on. Machine-readable at /api/v1/schema. Published under CC BY 4.0.

Entity types

EntityFieldsExternal identifiers
Companyid, name, legal_name, ticker, exchange, country, sector, industry, market_cap_usd_bn, currency, website, founded, descriptionticker, LEI, ISIN, FIGI, CUSIP (derived, not redistributed)
Marketid, mic, name, country, type, currency, timezone, operator, notemic
Assetid, name, symbol, type, category, currency, market, issuer, descriptionsymbol
Fundid, name, symbol, type, manager, strategy, country, aum_usd_bn, descriptionsymbol
Bankid, name, company, country, type, gsib, total_assets_usd_tn, description—
Countryid, code, name, currency, gdp_usd_tn, central_bank, marketsISO 3166-1 alpha-2
Indicatorid, name, unit, frequency, sources, description—

Relationship types

RelationshipDirectionNote
lists_onCompany → Marketprimary listing venue
domiciled_inCompany → Countrycountry of incorporation / HQ
located_inMarket → Country
managed_byFund → Companywhere the manager is a covered listed company
domiciled_inFund → Country
operated_byBank → Companywhere the bank is a covered listed company
chartered_inBank → Country
denominated_inAsset → Currency
member_ofCompany → Assetindex membership (covered subset, not the full index)
holdsFund → Company | Assettop holdings among covered entities, approximate

Cheat sheets — parse and validate

Copy-paste implementations of the check-digit algorithms each standard defines. Same logic runs in the validator.

ISIN — ISO 6166 (12 chars, modulus-10 check digit)

# Python def isin_valid(isin: str) -> bool: if len(isin) != 12 or not isin[:2].isalpha(): return False digits = "".join(str(int(c, 36)) for c in isin) total, dbl = 0, True for ch in reversed(digits[:-1]): d = int(ch) * (2 if dbl else 1) total += d - 9 if d > 9 else d dbl = not dbl return (10 - total % 10) % 10 == int(digits[-1]) # isin_valid("US0378331005") -> True (Apple) # chars 3-11 of a US/CA ISIN are its CUSIP
// TypeScript export function isinValid(isin: string): boolean { if (!/^[A-Z]{2}[A-Z0-9]{9}[0-9]$/.test(isin)) return false; const digits = [...isin] .map(c => (/[0-9]/.test(c) ? c : String(c.charCodeAt(0) - 55))) .join(""); let sum = 0, dbl = true; for (let i = digits.length - 2; i >= 0; i--) { let d = +digits[i]; if (dbl) { d *= 2; if (d > 9) d -= 9; } sum += d; dbl = !dbl; } return (10 - (sum % 10)) % 10 === +digits.at(-1)!; }

LEI — ISO 17442 (20 chars, ISO 7064 MOD 97-10)

# Python def lei_valid(lei: str) -> bool: if len(lei) != 20 or not lei.isalnum(): return False n = int("".join(str(int(c, 36)) for c in lei.upper())) return n % 97 == 1 # lei_valid("HWUPKR0MPOU8FGXBT394") -> True (Apple) # resolve it: api.gleif.org/api/v1/lei-records/{lei}
// TypeScript — streaming mod-97 (no BigInt) export function leiValid(lei: string): boolean { if (!/^[A-Z0-9]{20}$/.test(lei)) return false; let r = 0; for (const c of lei) { const v = /[0-9]/.test(c) ? c : String(c.charCodeAt(0) - 55); for (const d of v) r = (r * 10 + +d) % 97; } return r === 1; }

MIC — ISO 10383 (4 chars, operating vs segment)

# MICs carry no check digit — validate by registry lookup. # Operating MIC = the exchange; segment MIC = one of its venues. import requests r = requests.get("https://finance.foundation/api/v1/markets", timeout=20) for m in r.json()["data"]: print(m["mic"], "operating —", m["name"]) for s in m.get("segment_mics", []): print(" ", s["mic"], "segment —", s["name"])
// Reverse lookup: any code → its entity await fetch("https://finance.foundation/mic/XNGS"); // → 302 to the Nasdaq venue page (segment of XNAS) await fetch("https://finance.foundation/isin/US0378331005"); // → 302 to /companies/apple await fetch("https://finance.foundation/lei/HWUPKR0MPOU8FGXBT394"); // → 302 to /companies/apple

Classifications

Sectors

Finance Foundation uses an 11-sector taxonomy aligned with common market practice (GICS/ICB are the licensed industry standards; our taxonomy is open and mappable to both): Technology, Financials, Healthcare, Consumer Discretionary, Consumer Staples, Energy, Industrials, Materials, Communication Services, Utilities, Real Estate.

Asset classes

Assets are typed as Equity Index, Government Bond, Currency, Commodity, or Crypto, with a free-form category beneath (e.g. Crypto → Stablecoin). Typed assets keep filters and agent queries unambiguous.