BYTETOOLS

OpenFIGI API

Free OpenFIGI mapping API with no key: convert ISIN, CUSIP, SEDOL or ticker to FIGI identifiers with security type, exchange code and name. Tested POST example.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the OpenFIGI API?

OpenFIGI maps securities identifiers to Financial Instrument Global Identifiers through a free API that needs no key for moderate use. A POST with an identifier type and value returns every matching instrument across exchanges.

Securities identification is a mess of overlapping national schemes — ISIN, CUSIP, SEDOL, tickers — none of which map cleanly onto the others. FIGI is an open standard designed to sit underneath them, and OpenFIGI is the free service that resolves between them. Crucially the identifier scheme itself is open, so unlike CUSIP or ISIN there is no licensing question about storing or publishing a FIGI.

One request commonly returns many rows, and understanding why prevents a lot of confusion. Each row is one instrument on one exchange: `figi` identifies the security-on-venue, `compositeFIGI` groups every venue in a country, and `shareClassFIGI` groups every listing of the same share class worldwide. An ISIN for IBM resolves to dozens of exchange-level FIGIs sharing one composite and one share class. Requests are POSTs with a JSON array, which is a batch query rather than a write — up to 10 jobs per request unkeyed.

Quick facts

Base URL
https://api.openfigi.com/v3
Authentication
No key required, at a lower rate limit. A free API key raises the per-minute and per-request limits but is not needed to use the service.
Rate limit
Roughly 25 requests per minute and 10 mapping jobs per request without a key; substantially higher with a free key.
Pricing
Free. FIGI is an open standard with no licensing restriction on redistribution.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the OpenFIGI API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Map an ISIN to its FIGI identifiers

POST https://api.openfigi.com/v3/mapping

curl
curl -X POST 'https://api.openfigi.com/v3/mapping' \
  -H 'Content-Type: application/json' \
  -d '[{"idType":"ID_ISIN","idValue":"US4592001014"}]'
JavaScript (fetch)
const res = await fetch("https://api.openfigi.com/v3/mapping", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify([{"idType":"ID_ISIN","idValue":"US4592001014"}]),
});
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

headers = {
    "Content-Type": "application/json",
}

payload = [{"idType":"ID_ISIN","idValue":"US4592001014"}]

res = requests.post("https://api.openfigi.com/v3/mapping", headers=headers, json=payload, timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
[
  {
    "data": [
      {
        "figi": "BBG000BLNNH6",
        "name": "INTL BUSINESS MACHINES CORP",
        "ticker": "IBM",
        "exchCode": "US",
        "compositeFIGI": "BBG000BLNNH6",
        "securityType": "Common Stock",
        "marketSector": "Equity",
        "shareClassFIGI": "BBG001S5S399",
        "securityType2": "Common Stock",
        "securityDescription": "IBM"
      },
      {
        "figi": "BBG000BLNNV0",
        "name": "INTL BUSINESS MACHINES CORP",
        "ticker": "IBM",
        "exchCode": "UA",
        "compositeFIGI": "BBG000BLNNH6",
        "securityType": "Common Stock",
        "marketSector": "Equity",
        "shareClassFIGI": "BBG001S5S399",
        "securityType2": "Common Stock",
        "securityDescription": "IBM"
      },
      {
        "figi": "BBG000BLNPB7",
        "name": "INTL BUSINESS MACHINES CORP",
        "ticker": "IBM",
        "exchCode": "UC",
        "compositeFIGI": "BBG000BLNNH6",
        "securityType": "Common Stock",
        "marketSector": "Equity",
        "shareClassFIGI": "BBG001S5S399",
        "securityType2": "Common Stock",
        "securityDescription": "IBM"
      },
      {
        "figi": "BBG000BLNQ16",
        "name": "INTL BUSINESS MACHINES CORP",
        "ticker": "IBM",
        "exchCode": "UN",
        "compositeFIGI": "BBG000BLNNH6",
        "securityType": "Common Stock",
        "marketSector": "Equity",
        "shareClassFIGI": "BBG001S5S399",
        "securityType2": "Common Stock",
        "securityDescription": "IBM"
      },
      {
        "figi": "BBG000BLNQG0",
        "nam

Parameters

ParameterTypeRequiredDescription
idTypebodyRequiredIdentifier scheme — `ID_ISIN`, `ID_CUSIP`, `ID_SEDOL`, `TICKER`, `ID_BB_GLOBAL` and others. ID_ISIN
idValuebodyRequiredThe identifier value to map. US4592001014
exchCodebodyOptionalRestrict results to one exchange code. US
currencybodyOptionalRestrict results to listings in one currency. USD
marketSecDesbodyOptionalMarket sector filter, such as `Equity` or `Corp`. Equity
X-OPENFIGI-APIKEYheaderOptionalOptional free key that raises the rate limits.

Response fields

[].data[]array
Matches for the corresponding request job. One element per instrument-on-exchange.
[].data[].figistring
FIGI for this security on this specific exchange.
[].data[].compositeFIGIstring
Country-level composite grouping every venue in one market.
[].data[].shareClassFIGIstring
Global share class identifier, the same across every country listing.
[].data[].tickerstring
Exchange ticker symbol.
[].data[].exchCodestring
Exchange code the listing belongs to.
[].data[].securityType / securityType2string
Instrument classification, such as Common Stock.
[].data[].namestring
Issuer name as recorded in the FIGI database.
[].errorstring
Present instead of `data` when a job found no match. The array position still corresponds to your request.

What you can build with the OpenFIGI API

  • Resolve an ISIN to a ticker for display in a portfolio view
  • Normalise instrument identifiers arriving from several data sources
  • Group listings of the same share class across countries
  • Map a batch of identifiers in one request rather than looping

Common errors and how to fix them

405 Invalid HTTP method

The endpoint was called with GET.

Fix: Mapping is a POST carrying a JSON array. It is a batch query, not a write.

429

The unkeyed per-minute limit was hit.

Fix: Batch up to 10 jobs per request, cache results — identifier mappings rarely change — or register a free key.

`error` instead of `data` on one job

No instrument matched that identifier.

Fix: The response array is positional. Match by index against your request rather than assuming every job returned data.

Far more rows than expected

One security lists on many exchanges.

Fix: Filter with `exchCode`, or deduplicate on `compositeFIGI` or `shareClassFIGI` depending on the grouping you want.

OpenFIGI API — frequently asked questions

Is OpenFIGI free without an API key?

Yes. Mapping works with no key at a lower rate limit — roughly 25 requests per minute with up to 10 jobs each. A free key raises both limits.

What is the difference between FIGI, composite FIGI and share class FIGI?

The FIGI identifies a security on one exchange, the composite FIGI groups all venues within a country, and the share class FIGI groups every listing of the same share class worldwide. Choose according to the level you want to aggregate at.

Can I redistribute FIGI identifiers?

Yes. FIGI is an open standard with no licensing restriction on storing or publishing the identifiers, which is a meaningful difference from CUSIP and ISIN.

Why is the request a POST if nothing is written?

Because it is a batch query: one request carries an array of mapping jobs. Nothing on OpenFIGI's side is created or modified.

Tools that pair with this API

OpenFIGI is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.