LEI Lookup & GLEIF API: Batch LEI, Name, BIC & ISIN Search
Pricing
from $1.20 / 1,000 lei records
LEI Lookup & GLEIF API: Batch LEI, Name, BIC & ISIN Search
LEI lookup on the public GLEIF API: batch-check Legal Entity Identifiers and find LEIs by company name, BIC, ISIN or registration number, with parents and subsidiaries. Every input gets a clear status row. From $0.002 per record found. GLEIF data is CC0; not endorsed by GLEIF.
Pricing
from $1.20 / 1,000 lei records
Rating
0.0
(0)
Developer
Clearpath Data
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Security
Limited permissionsShare
What is an LEI, and what does this LEI lookup do?
An LEI (Legal Entity Identifier) is the 20-character ISO 17442 code that identifies a legal entity in financial transactions and regulatory reports. The Global Legal Entity Identifier Foundation (GLEIF) publishes every LEI record through its official public API.
This Actor is an LEI lookup and LEI validator on top of the GLEIF API. Paste LEIs, legal names, BICs, ISINs or business register numbers and get one clean row per input, with a clear status (found, ambiguous, possible_match, not_found, invalid_input), the entity's registration status, and optionally its direct and ultimate parents and children. Independent tool; not affiliated with or endorsed by GLEIF.
Price: $0.002 per returned entity record. Invalid, not-found and error rows are free. You only pay for saved results. Set maxResults to cap the cost.
Quick start: GLEIF API and LEI lookup
- Click Try for free, keep the prefilled input and press Start.
- Or call it from code:
curl -X POST "https://api.apify.com/v2/acts/clearpath-data~lei-lookup/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" -d '{"leis": ["5493001KJTIIGC8Y1R12", "W38RGI023J3WT1HWRP32", "5493001KJTIIGC8Y1R13"], "names": ["Apple Inc.", "Deutsche Bank Aktiengesellschaft"], "bics": ["DEUTDEFF"], "isins": ["US0378331005"]}'
Sample output: LEI data
| input | status | lei | legalName | country |
|---|---|---|---|---|
| 5493001KJTIIGC8Y1R13 | invalid_input | |||
| 5493001KJTIIGC8Y1R12 | found | 5493001KJTIIGC8Y1R12 | Bloomberg Finance L.P. | US |
| W38RGI023J3WT1HWRP32 | found | W38RGI023J3WT1HWRP32 | Siemens Aktiengesellschaft | DE |
| DEUTDEFF | found | 7LTWFZYICNSX8D621K86 | DEUTSCHE BANK AKTIENGESELLSCHAFT | DE |
| US0378331005 | found | HWUPKR0MPOU8FGXBT394 | Apple Inc. | US |
Sample rows: real output of test run on 2026-10-09, trimmed to a few columns.
The invalid_input row was caught by the ISO 17442 checksum before any API call, so it was free.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
leis | array | 20-character LEI codes, one per line (commas also work). Checksums are verified before any request. Looked up 100 per API request. | |
names | array | Legal names, one per line. Exact matches (ignoring case, accents, punctuation and common legal-form spellings such as AG / Aktiengesellschaft) are returned as found or ambiguous. Without an exact match you get the closest names as possible_match rows for review. | |
bics | array | 8- or 11-character BICs. 8-character codes are treated as the head office (XXX). Uses the SWIFT BIC-to-LEI mapping published by GLEIF. | |
isins | array | 12-character ISINs of securities; returns the issuer's LEI record. Uses the ANNA ISIN-to-LEI mapping published by GLEIF (coverage depends on the issuing agency). | |
registrationNumbers | array | Business register numbers exactly as the register writes them (e.g. "HRB 6684"). The same number can exist in several registers, so add a country filter when you can. | |
nameMatching | string | "exact_then_similar" | With "Exact names only", inputs without an exact name match get a not_found row that lists the closest names. |
maxCandidatesPerName | integer | 3 | How many rows to return when a name or registration number is ambiguous or only has similar matches. Each row is a charged record. |
preferPrimaryRecord | boolean | true | If several records share the exact name but only one is an ACTIVE entity with an ISSUED LEI that is not a branch, return that one as found (the others are mentioned in statusDetail). Turn off to get every exact match as ambiguous. |
countries | array | 2-letter ISO country codes, e.g. DE, US. Applied to name and registration-number searches and checked on LEI, BIC and ISIN results (non-matching records get a free filtered_out row). | |
entityStatus | string | "ANY" | Whether the legal entity itself still exists. |
registrationStatuses | array | Keep only LEIs in these registration statuses. Empty = all. ISSUED means renewed and current; LAPSED means not renewed on time. | |
includeDirectParent | boolean | true | Add the direct accounting-consolidating parent, or the reason none is reported (e.g. NATURAL_PERSONS, NON_CONSOLIDATING). One extra API request per record; turn off for faster large batches. |
includeUltimateParent | boolean | true | Add the ultimate parent, or the reason none is reported. One extra API request per record; turn off for faster large batches. |
includeDirectChildren | boolean | false | Add the entities this one directly consolidates (LEI, name, country, statuses) and their total count. One request per 200 children; skipped when GLEIF reports none. |
includeUltimateChildren | boolean | false | Add the entities for which this one is the ultimate parent, and their total count. |
maxChildrenPerEntity | integer | 100 | Cap on listed children per record and type (max 1,000; GLEIF serves 200 per request). The total count is always reported. 0 = count only (one request). |
maxRequestsPerMinute | integer | 50 | GLEIF allows 60 requests per minute per user. The Actor never goes above 60 and backs off when GLEIF asks it to. |
includeRawRecord | boolean | false | Add the full original GLEIF record attributes as rawRecord. |
Find a company's LEI by name
List legal names in names. Exact matches (ignoring case, accents, punctuation and common legal-form spellings such as AG / Aktiengesellschaft) come back as found or ambiguous. Without an exact match you get the closest names as possible_match rows to review. Add countries (e.g. ["DE"]) to narrow the search, or set nameMatching to exact names only.
BIC to LEI
List 8- or 11-character BIC (SWIFT) codes in bics. 8-character codes are treated as the head office (XXX). The Actor uses the BIC-to-LEI mapping that GLEIF publishes with SWIFT, so a BIC that isn't in that mapping returns a free not_found row.
ISIN to LEI
List 12-character ISINs in isins to get the issuer's LEI record. This uses the ISIN-to-LEI mapping that GLEIF publishes with ANNA; coverage depends on the issuing national numbering agency, so some ISINs have no mapping.
Validate LEIs (ISO 17442 checksum)
Every code in leis is checked against the ISO 17442 check digits before any API call. Malformed codes get a free invalid_input row. Valid codes are looked up 100 per request, and registrationStatus tells you whether the LEI is ISSUED (current), LAPSED (not renewed on time), RETIRED and so on.
Parents and subsidiaries
includeDirectParent and includeUltimateParent (on by default) add the accounting-consolidating parents, or GLEIF's reason none is reported (e.g. NATURAL_PERSONS, NON_CONSOLIDATING). Turn on includeDirectChildren or includeUltimateChildren to list the entities a company consolidates; the total count is always reported and maxChildrenPerEntity caps the list.
Use cases
- KYC/KYB onboarding: check that a counterparty's LEI is valid, issued and current before you onboard it.
- Data quality: validate LEI columns in bulk; malformed codes are caught by the ISO 17442 checksum and cost nothing.
- Ownership and group structure: pull direct and ultimate parents, or an entity's children, for group-level reporting.
- Identifier mapping: match legal names, BICs, ISINs or registry numbers to LEIs.
Integrations, schedules and AI agents
- Schedules: Schedule it to re-check a list of LEIs and catch lapsed or retired registrations. See Apify schedules.
- No-code tools: send results to Google Sheets, Slack or a CRM with Apify's Make, Zapier or n8n integrations, or a webhook when a run finishes.
- AI agents and assistants (MCP): connect an MCP client to
https://mcp.apify.com?tools=clearpath-data/lei-lookupwith your Apify account (OAuth or API token) and the agent can run this Actor as a tool, charged per event at the prices under "How much does it cost?". Agents without an Apify account can use a prepaid token from Apify's agentic payments (experimental). See the Apify MCP server docs.
How much does it cost?
| Plan | Price per LEI record |
|---|---|
| Free / Bronze | $0.002 |
| Silver | $0.0016 |
| Gold and above | $0.0012 |
Plus Apify's standard Actor-start event ($0.00005 per GB of memory).
Example: 1,000 found records on the Free plan cost $2.00.
FAQ
Where does the data come from?
GLEIF's official public API (data under the CC0 licence). Each run queries the API live, so results are as current as GLEIF's own records. GLEIF collects the data from the LEI issuing organisations (LOUs); this Actor doesn't edit it.
What do ISSUED, LAPSED and RETIRED mean?
ISSUED: the LEI is current and its data was renewed on time. LAPSED: the entity didn't renew its registration by the due date (the LEI still identifies it, but the data may be out of date). RETIRED, MERGED, ANNULLED and the other statuses mean the LEI is no longer in normal use. Use registrationStatuses to keep only some of them.
Why did a name return "ambiguous"?
Several LEI records share the same legal name (often in different countries, or a branch next to its head office). You get up to maxCandidatesPerName rows; add countries to narrow it down. With preferPrimaryRecord on, a single ACTIVE, ISSUED, non-branch record is returned as found.
Is a not-found row charged?
No. You pay only for rows with entity data (found, ambiguous, possible_match). not_found, invalid_input, filtered_out and error rows are free.
Can I use it from Python or Excel?
Yes. From Python, use the Apify client:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("clearpath-data/lei-lookup").call(run_input={"bics": ["DEUTDEFF"], "isins": ["US0378331005"]})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["input"], row["status"], row.get("lei"))
For Excel, download the dataset as CSV or XLSX from the run page or the API.
Rate limits?
GLEIF allows 60 requests per minute. The Actor stays under that (maxRequestsPerMinute, default 50) and backs off when GLEIF asks it to. Parent and child lookups add requests, so large batches with relationships take longer; turn them off for plain validation.
Troubleshooting
A company I know has an LEI returns not_found
Check that you used the legal name, not a brand or trading name ("Alphabet Inc.", not "Google"). Try its business register number with a countries filter, or its BIC or an ISIN it issued. The not_found row lists the closest names it saw.
My BIC or ISIN returns not_found
GLEIF's BIC and ISIN mappings don't cover every code. Look the entity up by name or register number instead.
Limits
- Only entities that have an LEI are covered; many small companies don't have one.
- The data is what the LEI issuers reported to GLEIF; check the source for decisions that matter.
Further reading and example tasks
- BIC and ISIN to LEI in Python with the GLEIF API (tutorial on dev.to)
- gleif-lei-python-examples (example code on GitHub)
- Look up LEIs for a list of company names (public example task)
- BIC to LEI: find the LEI for a list of SWIFT codes (public example task)
- ISIN to LEI: find the issuer LEI for a list of ISINs (public example task)
- LEI validator: check a list of LEIs and flag lapsed ones (public example task)
- LEI parent and subsidiaries: Siemens group structure from GLEIF (public example task)
- LEI number for UK companies by Companies House number (public example task)
- Corporate hierarchy: direct and ultimate parent by LEI (public example task)
- KYB check: LEI and registration status by company name (public example task)
Combine with other Clearpath Data Actors
- UK company number → LEI. Use companies-house-new-companies to get
companyNumbervalues, then paste them intoregistrationNumbershere withcountries: ["GB"]to find each company's LEI. Example: LEI number for UK companies by Companies House number. - Sponsor licence holders → LEI. Organisation names from uk-visa-sponsor-register can go straight into
namesfor a KYB-style LEI and registration-status check. - New US entities. us-new-business-filings lists new LLCs and corporations; most new entities have no LEI yet, so expect
not_foundrows for them. - US private funding rounds. Issuer names from us-private-funding-rounds (daily Form D notices) can go into
nameshere to check for an LEI. Many young companies have none, so expectnot_foundrows.
Other Clearpath Data Actors
| Actor | What it does |
|---|---|
| remote-jobs-aggregator | Remote jobs from Remote OK and Himalayas |
| ats-jobs-by-company | Jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee boards |
| companies-house-new-companies | New UK companies from Companies House, with officers and PSCs |
| uk-visa-sponsor-register | UK visa sponsor licence list from the GOV.UK register, with a changes feed |
| hiring-changes-monitor | Jobs each company opened or closed since your last run, on the same six ATS boards |
| us-new-business-filings | New LLCs and corporations from the NY, CO and CT state registries, since your last run |
| us-private-funding-rounds | New US private funding rounds from Form D notices, only filings new since your last run |
| us-federal-contract-opportunities | Daily US federal contract opportunities and award notices from SAM.gov's public extract; awardee names can go into names here |