openfigi-client
Python wrapper for the OpenFIGI API v3.
Table of contents
About OpenFIGI
- The Financial Instrument Global Identifier (FIGI) is a universal system for identifying instruments globally and across all asset classes
- OpenFIGI is an application programming interface that provides automated access to mapping various symbols with their corresponding FIGI. It is available at https://www.openfigi.com/
- openfigi_client is a thin Python wrapper to access OpenFIGI
The API contains 3 endpoints:
| endpoint | description |
|---|---|
| /mapping | Map third-party identifiers to FIGIs |
| /filter | Filter for FIGIs using keywords and optional filters |
| /search | Search for FIGIs using keywords and optional filters |
Note: given that the /search endpoint is strictly superseded by the /filter endpoint, we choose not to include it in the wrapper.
Installation
openfigi_client is published on PyPI. To install it, simply run:
pip install openfigi_client
API key
The API can be used with or without API key. Getting an API key is free and loosens the rate limits.
When instantiating the wrapper, the API key is optional:
from openfigi_client import OpenFigiSync
client = OpenFigiSync()
client = OpenFigiSync(api_key="XXXXXXXXXX")
Async
In addition to the synchronous client, there is an equivalent asynchronous
client available. All examples below work equally, simply import
OpenFigiAsync instead and await the calls.
Mapping
The map() method takes a list of MappingJob as argument and returns a list
of MappingJobResult. The result of the request at index i in the list of
mapping jobs is located at index i in the list of results.
from openfigi_client import OpenFigiSync, MappingJob
mapping_job = MappingJob(id_type="TICKER", id_value="IBM", exch_code="US")
mapping_jobs = [mapping_job]
results = OpenFigiSync().map(mapping_jobs)
>>> results
[
MappingJobResultFigiList(
data = [
FigiResult(
figi='BBG000BLNNH6',
security_type='Common Stock',
market_sector='Equity',
ticker='IBM',
name='INTL BUSINESS MACHINES CORP',
exch_code='US',
share_class_figi='BBG001S5S399',
composite_figi='BBG000BLNNH6',
security_type2='Common Stock',
security_description='IBM',
metadata=None
)
]
)
]
A MappingJobResult can either be a MappingJobResultFigiList, a
MappingJobResultFigiNotFound or a MappingJobResultError.
The MappingJob object has 2 required properties which are id_type and
id_value. The other properties are optional but subject to specific rules in
case they are provided. These rules are modeled and checked using Pydantic.
Below is the full list of properties for MappingJob:
| property | required | type | example |
|---|---|---|---|
| id_type | X | str | "TICKER" |
| id_value | X | str | "IBM" |
| exch_code | str | "UN" |
|
| mic_code | str | "XNYS" |
|
| currency | str | "USD" |
|
| market_sec_des | str | "Equity" |
|
| security_type | str | "Common Stock" |
|
| security_type_2 | str | "Common Stock" |
|
| include_unlisted_equities | bool | ||
| option_type | str | "Call" |
|
| strike | list | [100, 200] |
|
| contract_size | list | [0, 100] |
|
| coupon | list | [0, 2.5] |
|
| expiration | list | [date(2023, 6, 1), date(2023, 12, 31)] |
|
| maturity | list | [date(2023, 6, 1), date(2023, 12, 31)] |
|
| state_code | str | "AZ" |
Some of the properties in the MappingJob are "enum-like". For each of these
properties, it is possible to retrieve the current list of accepted values via
specific methods:
| property | method | examples |
|---|---|---|
| id_type | get_id_types() |
|
| exch_code | get_exch_codes() |
|
| mic_code | get_mic_codes() |
|
| currency | get_currencies() |
|
| market_sec_des | get_market_sec_des() |
|
| security_type | get_security_types() |
|
| security_type_2 | get_security_types_2() |
|
| state_code | get_state_codes() |
For example, to retrieve the current values for id_type:
from openfigi_client import OpenFigiSync
id_types = OpenFigiSync().get_id_types()
Filtering
The filter() method takes a Filter object as argument and returns a list of
FigiResult.
- The
Filterobject is very similar to theMappingJobobject - The only difference are that the
id_typeandid_valueare replaced by a singlequeryproperty - All the "enum-like" properties are the same and the list of accepted values is the same
- The maximum number of results is limited to 15,000
| property | required | type | example |
|---|---|---|---|
| query | X | str | "SJIM" |
| exch_code | str | "UN" |
|
| mic_code | str | "XNYS" |
|
| currency | str | "USD" |
|
| market_sec_des | str | "Equity" |
|
| security_type | str | "Common Stock" |
|
| security_type_2 | str | "Common Stock" |
|
| include_unlisted_equities | bool | ||
| option_type | str | "Call" |
|
| strike | list | [100, 200] |
|
| contract_size | list | [0, 100] |
|
| coupon | list | [0, 2.5] |
|
| expiration | list | [date(2023, 6, 1), date(2023, 12, 31)] |
|
| maturity | list | [date(2023, 6, 1), date(2023, 12, 31)] |
|
| state_code | str | "AZ" |
Example
from openfigi_client import OpenFigiSync, Filter
query = Filter(query="SJIM")
results = OpenFigiSync().filter(query)
In order to know the total number of matches for a given query before starting
to request them, it is possible to use the get_total_number_of_matches()
method:
from openfigi_client import OpenFigiSync, Filter
query = Filter(query="SJIM")
number_of_results = OpenFigiSync().get_total_number_of_matches(query)
>>> number_of_results
36
Troubleshooting
Several kinds of errors can occur.
-
ValidationError: theMappingJobandFilterobjects are modelled using msgspec and therefore need to be properly instantiated. If an error occurs, amsgspec.ValidationErrorwill be raised. -
HTTPError: in case the status code of the HTTP response is not 200, an HTTPError exception will be raised. Note: in case a particular symbol is not found, the API will still respond with a status 200 and aMappingNotFoundobject. HTTP errors only occur if there is a real error like a malformedMappingJobrequest (which should not happen since allMappingJobobjects are checked by Pydantic prior to being sent), a rate limitation or an internal server error.
Here is how to check for ValidationError in case the mapping jobs are
instantiated programmatically:
from msgspec import ValidationError
from openfigi_client import MappingJob
tickers = ["IBM", "XRX", "TSLA", None, "MSFT"]
mapping_jobs = []
for ticker in tickers:
try:
mapping_job = MappingJob(id_type="TICKER", id_value=ticker, exch_code="US")
mapping_jobs.append(mapping_job)
except ValidationError:
print(f"Error when trying to build a MappingJob with {ticker=}")
# Do something
continue
And here is how to check for HTTPError in case exceptions need to be handled:
from openfigi_client import OpenFigiSync, MappingJob
from openfigi_client.exceptions import HTTPError
mapping_jobs = [MappingJob(id_type="TICKER", id_value="IBM", exch_code="US")]
try:
results = OpenFigiSync().map(mapping_jobs)
except HTTPError as e:
print(f"{e}")
# Do something
Metadata
Release files for openfigi-client 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openfigi_client-0.4.2.tar.gz | 13.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openfigi_client-0.4.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.4 kB
Release files / openfigi_client-0.4.2.tar.gz
| Download URL | openfigi_client-0.4.2.tar.gz |
|---|---|
| Size | 13.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
db55f044e75fb47e68ce19d6641c13ba8ca1870db7698e1ef5d5d6f6eb411df4
|
|
BLAKE2b-256 checksum How to use checksums |
f037f1a462f1afd5c05044ef61cf4ff8fedc399f4d619969df034369b57cd2f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.12
|
Release files / openfigi_client-0.4.2-py3-none-any.whl
| Download URL | openfigi_client-0.4.2-py3-none-any.whl |
|---|---|
| Size | 12.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
309f36a41d9bddfc4769079ba0d59adb59d7f198c72fbd708c91619a616d24da
|
|
BLAKE2b-256 checksum How to use checksums |
c1807405a6376e80a71920eb60868c4a2c59824408a580c69fea715113bbabc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.12
|