# ISIN, LEI, CIK, FIGI & Ticker Resolver API (crosswalk) (`bosco_labs/identifier-resolver`) Actor

Issuer legal name, LEI, CIK, tickers, ISINs, FIGIs, CFI code and EU trading venues for one ISIN, LEI, CIK, ticker, FIGI or company name. Check digits validated first; a source URL per value. Data from GLEIF, OpenFIGI, SEC and ESMA FIRDS.

- **URL**: https://apify.com/bosco_labs/identifier-resolver.md
- **Developed by:** [Bosco Labs](https://apify.com/bosco_labs) (community)
- **Categories:** Business, AI, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 identifier resolveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ISIN, LEI, CIK, FIGI & Ticker Resolver API (crosswalk)

**One identifier in, the whole crosswalk out:** give an ISIN, LEI, SEC CIK, ticker, FIGI or
company name and get the issuer's legal name, LEI, CIK, tickers per exchange, ISINs, FIGIs, CFI
code and the EU trading venues, each value with its source URL. Built for **AI agents** and
people who join datasets keyed by different identifiers (KYC, portfolio data, filings research).

**Pricing (pay per event):** $0.002 per resolved identifier (`resolve`). A malformed identifier
(wrong ISIN/LEI/FIGI check digit), an identifier nobody knows, or a failed source costs nothing.

### What you get

One JSON row per call. Real output for `{"identifier": "NL0010273215"}` (ASML), run on
2026-11-06 (48 venues and 12 tickers shortened):

```json
{
  "schema_version": "1",
  "query": "NL0010273215",
  "query_type": "isin",
  "exchange_filter": null,
  "issuer_name": "ASML Holding N.V.",
  "issuer_name_latin": null,
  "lei": "724500Y6DUVHQD6OXN27",
  "lei_status": "ISSUED",
  "issuer_country": "NL",
  "issuer_jurisdiction": "NL",
  "cik": "937966",
  "tickers": [
    { "ticker": "ASML", "exchange": "Nasdaq", "source": "SEC", "composite_figi": null },
    { "ticker": "ASMLF", "exchange": "OTC", "source": "SEC", "composite_figi": null },
    { "ticker": "ASML", "exchange": "NA", "source": "OpenFIGI", "composite_figi": "BBG000C1HSN8" },
    { "ticker": "ASME", "exchange": "GR", "source": "OpenFIGI", "composite_figi": "BBG000H4D9Z0" },
    { "ticker": "ASMLF", "exchange": "US", "source": "OpenFIGI", "composite_figi": "BBG000MW4W72" }
  ],
  "isin": "NL0010273215",
  "issuer_isins": ["NL0010273215", "USN070592100"],
  "issuer_isin_count": 2,
  "composite_figi": "BBG000C1HSN8",
  "share_class_figi": "BBG001S7Q066",
  "security_type": "Common Stock",
  "instrument_name": "ASML HOLDING",
  "cfi_code": "ESVUFN",
  "currency": "EUR",
  "eu_trading_venues": [
    { "mic": "AQEA", "trading_start": "2020-11-12" },
    { "mic": "XAMS", "trading_start": "2012-11-26" },
    { "mic": "XETB", "trading_start": "2012-11-27" }
  ],
  "eu_venue_count": 48,
  "eu_venues_terminated_count": 37,
  "match_confidence": 1.0,
  "match_note": "linked by identifiers only",
  "alternatives": [],
  "sources": {
    "cik": "https://www.sec.gov/files/company_tickers_exchange.json",
    "figi": "https://www.openfigi.com/id/BBG000C1HSN8",
    "instrument": "https://registers.esma.europa.eu/solr/esma_registers_firds/select?q=isin%3ANL0010273215&fq=latest_received_flag%3A1&rows=500&fl=isin%2Cmic%2Clei%2Cgnr_full_name%2Cgnr_cfi_code%2Cgnr_notional_curr_code%2Cmrkt_trdng_start_date%2Cmrkt_trdng_trmination_date%2Cstatus_label&wt=json",
    "issuer_isins": "https://api.gleif.org/api/v1/lei-records/724500Y6DUVHQD6OXN27/isins?page%5Bsize%5D=20",
    "issuer_name": "https://api.gleif.org/api/v1/lei-records?filter%5Bisin%5D=NL0010273215",
    "lei": "https://api.gleif.org/api/v1/lei-records?filter%5Bisin%5D=NL0010273215",
    "tickers": "https://data.sec.gov/submissions/CIK0000937966.json"
  },
  "source_url": "https://api.gleif.org/api/v1/lei-records?filter%5Bisin%5D=NL0010273215",
  "provided_by": "Bosco Labs (boscolabs.dev)",
  "notices": [
    "LEI data: GLEIF, CC0. No endorsement by GLEIF is implied.",
    "FIGIs: OpenFIGI (public domain); security descriptions as is.",
    "Instrument data (cfi_code, instrument_name, currency, eu_trading_venues) come from ESMA's FIRDS register and may be obtained free of charge through the ESMA website: https://registers.esma.europa.eu/publication/searchRegister?core=esma_registers_firds. ESMA does not endorse this service."
  ],
  "warnings": [],
  "retrieved_at": "2026-11-06T08:39:04+00:00",
  "duration_seconds": 0.67
}
```

- **lei, issuer_name, issuer_country**: from GLEIF. **cik** only when the issuer files with the
  SEC. **issuer_isins**: up to 20 ISINs GLEIF maps to the LEI (shares and bonds), with the total.
- **isin**: the ISIN you gave, or else the issuer's main share ISIN (its equity shares on the
  most EU venues in ESMA FIRDS).
- **tickers**: the SEC's tickers (exchange = Nasdaq, NYSE, OTC) plus up to 10 OpenFIGI listings
  (exchange = Bloomberg composite code: US, NA, GR, LN...), the home or US listing first.
- **composite_figi / share_class_figi**: the home-market (or US) composite FIGI and the global
  share-class FIGI. **cfi_code, currency, eu_trading_venues**: from FIRDS, current venues only.
- **match_confidence / match_note**: 1.0 when every link is by identifier. When a link had to be
  made by name (e.g. LEI to CIK by exact legal name and state of incorporation), the note says
  so and the confidence drops (0.9 exact name and jurisdiction, 0.6 ambiguous name).
- **sources**: a URL per value; **warnings**: a source that failed or was rate-limited.

### Input

```json
{ "identifier": "US0378331005" }
```

| Field | Meaning |
|---|---|
| `identifier` | One of: ISIN `US0378331005`, LEI `HWUPKR0MPOU8FGXBT394`, CIK `320193`, ticker `AAPL` / `BRK.B`, FIGI `BBG000B9XRY4`, or a name `Siemens AG` |
| `idType` | `auto` (default), `isin`, `lei`, `cik`, `ticker`, `figi`, `name` |
| `exchange` | For non-US tickers: Bloomberg code (`LN`, `GR`, `NA`, `FP`, `JT`) or MIC (`XLON`). Empty = US ticker. With an exchange, digits are a ticker (`7974` + `JT` = Nintendo), not a CIK |

ISIN, LEI and FIGI check digits are verified before any lookup. `US0378331006` fails at once
with "the last digit must be 5, not 6", at no charge.

### Use from an AI agent (MCP)

Agents can call this Actor as a tool through the
[Apify MCP server](https://github.com/apify/apify-mcp-server). Add this server URL to your MCP
client (Claude, Cursor, VS Code, ...):

```text
https://mcp.apify.com?tools=bosco_labs/identifier-resolver
```

It loads this Actor as a tool, plus the tools that read its results. The hosted server signs you
in with OAuth, or accepts your Apify token as `Authorization: Bearer <APIFY_TOKEN>`.

Example prompt: *"What is the LEI, CIK and home-market FIGI of ISIN NL0010273215, and on how
many EU venues does it trade? Cite the sources."* The agent passes:

```json
{ "identifier": "NL0010273215" }
```

**Output for agents:** one small row (typically 3-8 KB), stable `snake_case` fields, `null` for
unknown, a source URL per value. A resolve takes about 0.5-3 seconds (measured 0.3-1.7 s for
ISINs, LEIs and CIKs; up to 6 s for names). **Cost:** $0.002 per resolved identifier, billed to
the Apify account the MCP server is signed in with.

### FAQ

**Where does the data come from?** Four official or openly licensed sources, called live:
GLEIF (LEI records and the ISIN-to-LEI map), OpenFIGI (FIGIs and listings), the SEC (CIKs and
US tickers) and ESMA's FIRDS register (CFI code, instrument name, EU trading venues).

**Can I reuse the output?** The sources allow it, with these terms, quoted:

- GLEIF: "The data available through the Access Service are provided under the CC0 licence".
  You must not create the impression that the data or this service are "provided or supported
  or authorized" by GLEIF. GLEIF calls its ISIN-to-LEI files "open source" and names no
  separate licence for them; this Actor reads them through the same API.
- OpenFIGI: Bloomberg "hereby dedicates FIGI Identifiers to the public domain", including
  "redistribution of the FIGI Identifiers to your customers". Names, tickers and exchange codes
  come with OpenFIGI's "as is" disclaimer.
- SEC: "Information presented on sec.gov is considered public information and may be copied
  or further distributed".
- ESMA: reproduction is "authorised ... provided the source is acknowledged", and where it is
  sold "the publisher must inform buyers that it may be obtained free of charge through ESMA
  website". **So: the FIRDS fields in this output are available free of charge from ESMA** at
  https://registers.esma.europa.eu/publication/searchRegister?core=esma_registers_firds. You pay
  for the join, the validation and the speed, not for ESMA's data. ESMA does not endorse this
  service.

**What is not covered?** CUSIP and SEDOL (licensed identifiers; not used or returned). FIRDS
covers only instruments admitted to or traded on EU/EEA venues, so a US-only small cap has no
CFI code or venues. CIKs exist only for SEC registrants. FIRDS is searched by ISIN, LEI and share
name only (one query each, no bulk download); derivatives with thousands of venue records are
cut at 500 records.

**How good is name matching?** Best with the full legal name ("Siemens AG", "Toyota Motor
Corporation"). A name is matched to an exact SEC company name, else to the issuer whose shares
carry that name on the most EU venues, else to an exact GLEIF name. `match_confidence`,
`match_note` and `alternatives` say how sure the match is; for certainty pass an ISIN or LEI.

**What if OpenFIGI is busy?** OpenFIGI allows 25 mapping requests a minute per caller. Answers
are cached for 6 hours. When the limit is hit, the row still comes back with the GLEIF, SEC
and FIRDS fields, FIGI fields `null` and a warning saying when to retry. A FIGI or a non-US
ticker can only be resolved through OpenFIGI, so those fail (no charge) while it is limited.

**How fresh is it?** Live on every call: GLEIF updates daily, FIRDS publishes daily, the SEC
ticker list is cached for at most 6 hours per run.

**Personal data?** None. GLEIF records of sole proprietors (natural persons) are never used for
name matches.

**Is this investment advice?** No. It returns identifiers and reference data as the sources
publish them.

# Actor input Schema

## `identifier` (type: `string`):

ONE identifier of a security or company: an ISIN ("US0378331005"), an LEI ("HWUPKR0MPOU8FGXBT394"), an SEC CIK ("320193"), a ticker ("AAPL", "BRK.B"; add exchange for non-US markets), a FIGI ("BBG000B9XRY4") or a company name ("Siemens AG"). The type is detected automatically; ISIN, LEI and FIGI check digits are verified before any lookup, and a bad one fails in seconds with the correct digit, at no charge. Required.

## `idType` (type: `string`):

What the identifier is. Default "auto": digits only = CIK, 20 characters = LEI, 12 characters = ISIN or FIGI (by check digit), up to 6 characters without spaces = ticker (read as a name if no US ticker matches), anything else = company name. Set it for short names; numeric tickers just need exchange ("7203" with "JT").

## `exchange` (type: `string`):

Only for a ticker outside the US: a Bloomberg exchange code ("LN" London, "GR" Germany, "NA" Amsterdam, "FP" Paris, "JT" Tokyo, "SW" Swiss) or a 4-letter MIC ("XLON", "XAMS"). Empty (default) = US tickers from the SEC's list. With an exchange, an all-digit identifier is read as a ticker ("7974" + "JT" = Nintendo), not a CIK.

## Actor input object example

```json
{
  "identifier": "US0378331005",
  "idType": "auto"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "identifier": "US0378331005"
};

// Run the Actor and wait for it to finish
const run = await client.actor("bosco_labs/identifier-resolver").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "identifier": "US0378331005" }

# Run the Actor and wait for it to finish
run = client.actor("bosco_labs/identifier-resolver").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "identifier": "US0378331005"
}' |
apify call bosco_labs/identifier-resolver --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bosco_labs/identifier-resolver"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aP2MRWnm91nY2fVrA/builds/z2LlQgi6djwp2uUYu/openapi.json
