---
name: openfigi-ingestion
description: "How to get OpenFIGI data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Map a ticker to FIGI via OpenFIGI into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/openfigi
Provider: https://www.openfigi.com/
Checked against the provider's documentation: 2026-11-05

## Access
- No account or key required for Mapping at the free unauthenticated rate.
- Optional free OpenFIGI API key (X-OPENFIGI-APIKEY header) raises Mapping to 250 requests/minute and 100 jobs/request.
- Use API v3; v2 was deprecated around 2026-06-30.

## Request
```bash
curl -X POST -H 'Content-Type: application/json' -d '[{"idType":"TICKER","idValue":"IBM","exchCode":"US"}]' 'https://api.openfigi.com/v3/mapping'
```

## Format
JSON array aligned to the request jobs. Each element has data (list of matches with figi, name, ticker, exchCode, compositeFIGI, shareClassFIGI, marketSector, securityType) or error / warning fields when a job fails.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""OpenFIGI Mapping (IBM US ticker -> FIGI) -> pandas -> Parquet. No key."""
import requests
import pandas as pd

URL = "https://api.openfigi.com/v3/mapping"
jobs = [{"idType": "TICKER", "idValue": "IBM", "exchCode": "US"}]
r = requests.post(URL, json=jobs, timeout=60)
r.raise_for_status()
rows = []
for job, result in zip(jobs, r.json()):
    for hit in result.get("data") or []:
        rows.append({
            "request_idType": job["idType"],
            "request_idValue": job["idValue"],
            "request_exchCode": job.get("exchCode"),
            "figi": hit.get("figi"),
            "name": hit.get("name"),
            "ticker": hit.get("ticker"),
            "exchCode": hit.get("exchCode"),
            "compositeFIGI": hit.get("compositeFIGI"),
            "shareClassFIGI": hit.get("shareClassFIGI"),
            "marketSector": hit.get("marketSector"),
            "securityType": hit.get("securityType"),
        })
df = pd.DataFrame(rows)
df.to_parquet("openfigi_ibm_us.parquet", index=False)
print(len(df), "matches;", ",".join(df["figi"].dropna().astype(str).tolist()))
```
Run by us on 2026-11-05 (python 3.13 | pandas | pyarrow | requests (box probe)). Result: 1 matches; BBG000BLNNH6

## Limits
- Unauthenticated Mapping: 25 requests/minute, 10 jobs/request.
- With free X-OPENFIGI-APIKEY: 250 requests/minute, 100 jobs/request.
- Search and Filter endpoints have lower rate limits than Mapping.
- Does not return prices, fundamentals, news or third-party proprietary IDs (e.g. CUSIP).
- Unlisted equities need includeUnlistedEquities: true.
- No public bulk flat-file dump; UI CSV export is capped.

## Quirks
- Symbology / identifier mapping only — not a market-data price feed.
- Prefer API v3 (/v3/mapping); v2 was deprecated around 2026-06-30.
- Unlisted equities are omitted unless includeUnlistedEquities is true.
- The API does not return third-party proprietary IDs such as CUSIP.

## Terms and attribution
- FIGI Open Symbology under OMG / X9; OpenFIGI FAQ states no cost recovery, licensing fee or re-use restriction for FIGI symbology.
- Do not treat returned fields as a licence to redistribute third-party proprietary identifier schemes the API deliberately withholds.
- Terms page: https://www.openfigi.com/

## Sources
- https://www.openfigi.com/api/overview: "The API is free to use without daily, weekly or monthly limitations."
- https://www.openfigi.com/api/documentation: "Max Number of Requests 25 Per Minute 250 Per Minute Max Jobs Per Request 10 Jobs 100 Jobs"
- https://www.openfigi.com/: "OpenFIGI: Unlock the Power of Efficiency with Open Symbology"

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
