# LEI Lookup & GLEIF API: Batch LEI, Name, BIC & ISIN Search (`clearpath-data/lei-lookup`) Actor

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.

- **URL**: https://apify.com/clearpath-data/lei-lookup.md
- **Developed by:** [Clearpath Data](https://apify.com/clearpath-data) (community)
- **Categories:** Developer tools, Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 lei records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### LEI Lookup & GLEIF API: Batch LEI, Name, BIC & ISIN Search

Validate and enrich Legal Entity Identifiers in bulk from the official GLEIF API: by LEI, legal name, BIC, ISIN or registry number, with parent and child relationships.

**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

1. Click **Try for free**, keep the prefilled input and press **Start**.
2. Or call it from code:

```bash
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) |
| `names` | array |  | Legal names, one per line |
| `bics` | array |  | 8- or 11-character BICs |
| `isins` | array |  | 12-character ISINs of securities; returns the issuer's LEI record |
| `registrationNumbers` | array |  | Business register numbers exactly as the register writes them (e.g |
| `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 |
| `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 ( |
| `countries` | array |  | 2-letter ISO country codes, e.g |
| `entityStatus` | string | "ANY" | Whether the legal entity itself still exists. |
| `registrationStatuses` | array |  | Keep only LEIs in these registration statuses |
| `includeDirectParent` | boolean | true | Add the direct accounting-consolidating parent, or the reason none is reported (e.g |
| `includeUltimateParent` | boolean | true | Add the ultimate parent, or the reason none is reported |
| `includeDirectChildren` | boolean | false | Add the entities this one directly consolidates (LEI, name, country, statuses) and their total count |
| `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) |
| `maxRequestsPerMinute` | integer | 50 | GLEIF allows 60 requests per minute per user |
| `includeRawRecord` | boolean | false | Add the full original GLEIF record attributes as rawRecord. |

### 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](https://docs.apify.com/platform/schedules).
- **No-code tools:** send results to Google Sheets, Slack or a CRM with Apify's [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier) or [n8n](https://docs.apify.com/platform/integrations/n8n) integrations, or a [webhook](https://docs.apify.com/platform/integrations/webhooks) when a run finishes.
- **AI agents (MCP):** connect an MCP client such as Claude Code or Cursor to `https://mcp.apify.com?tools=clearpath-data/lei-lookup` and the agent can run this Actor directly. See the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) 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 public API (CC0 licence).

**Rate limits?** GLEIF allows 60 requests per minute. The Actor stays under that and backs off automatically.

**Ambiguous names?** You get up to `maxCandidatesPerName` ranked candidates with a matchScore.

### Other Clearpath Data Actors

| Actor | What it does |
|---|---|
| [remote-jobs-aggregator](https://apify.com/clearpath-data/remote-jobs-aggregator) | Remote jobs from Remote OK and Himalayas |
| [ats-jobs-by-company](https://apify.com/clearpath-data/ats-jobs-by-company) | Jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee boards |
| [companies-house-new-companies](https://apify.com/clearpath-data/companies-house-new-companies) | New UK companies from Companies House, with officers and PSCs |
| [uk-visa-sponsor-register](https://apify.com/clearpath-data/uk-visa-sponsor-register) | UK visa sponsor licence list from the GOV.UK register, with a changes feed |
| [hiring-changes-monitor](https://apify.com/clearpath-data/hiring-changes-monitor) | Jobs each company opened or closed since your last run, on the same six ATS boards |
| [us-new-business-filings](https://apify.com/clearpath-data/us-new-business-filings) | New LLCs and corporations from the NY, CO and CT state registries, since your last run |

# Changelog

This Actor's version history is a separate document: https://apify.com/clearpath-data/lei-lookup/changelog.md

# Actor input Schema

## `leis` (type: `array`):

20-character LEI codes, one per line (commas also work). Checksums are verified before any request. Looked up 100 per API request.

## `names` (type: `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` (type: `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` (type: `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` (type: `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` (type: `string`):

With "Exact names only", inputs without an exact name match get a not_found row that lists the closest names.

## `maxCandidatesPerName` (type: `integer`):

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` (type: `boolean`):

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` (type: `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` (type: `string`):

Whether the legal entity itself still exists.

## `registrationStatuses` (type: `array`):

Keep only LEIs in these registration statuses. Empty = all. ISSUED means renewed and current; LAPSED means not renewed on time.

## `includeDirectParent` (type: `boolean`):

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` (type: `boolean`):

Add the ultimate parent, or the reason none is reported. One extra API request per record; turn off for faster large batches.

## `includeDirectChildren` (type: `boolean`):

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` (type: `boolean`):

Add the entities for which this one is the ultimate parent, and their total count.

## `maxChildrenPerEntity` (type: `integer`):

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` (type: `integer`):

GLEIF allows 60 requests per minute per user. The Actor never goes above 60 and backs off when GLEIF asks it to.

## `includeRawRecord` (type: `boolean`):

Add the full original GLEIF record attributes as rawRecord.

## Actor input object example

```json
{
  "leis": [
    "5493001KJTIIGC8Y1R12",
    "W38RGI023J3WT1HWRP32",
    "5493001KJTIIGC8Y1R13"
  ],
  "names": [
    "Apple Inc.",
    "Deutsche Bank Aktiengesellschaft"
  ],
  "bics": [
    "DEUTDEFF"
  ],
  "isins": [
    "US0378331005"
  ],
  "nameMatching": "exact_then_similar",
  "maxCandidatesPerName": 3,
  "preferPrimaryRecord": true,
  "entityStatus": "ANY",
  "includeDirectParent": true,
  "includeUltimateParent": true,
  "includeDirectChildren": false,
  "includeUltimateChildren": false,
  "maxChildrenPerEntity": 100,
  "maxRequestsPerMinute": 50,
  "includeRawRecord": false
}
```

# Actor output Schema

## `records` (type: `string`):

One or more rows per input with a status (found, ambiguous, possible_match, not_found, filtered_out, invalid_input, error).

## `termsNotice` (type: `string`):

CC0 licence, suggested attribution, GLEIF non-endorsement disclaimer and SWIFT notice for BICs.

## `runReport` (type: `string`):

Counts by status, API requests, retries and rate-limit waits.

# 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 = {
    "leis": [
        "5493001KJTIIGC8Y1R12",
        "W38RGI023J3WT1HWRP32",
        "5493001KJTIIGC8Y1R13"
    ],
    "names": [
        "Apple Inc.",
        "Deutsche Bank Aktiengesellschaft"
    ],
    "bics": [
        "DEUTDEFF"
    ],
    "isins": [
        "US0378331005"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath-data/lei-lookup").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 = {
    "leis": [
        "5493001KJTIIGC8Y1R12",
        "W38RGI023J3WT1HWRP32",
        "5493001KJTIIGC8Y1R13",
    ],
    "names": [
        "Apple Inc.",
        "Deutsche Bank Aktiengesellschaft",
    ],
    "bics": ["DEUTDEFF"],
    "isins": ["US0378331005"],
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath-data/lei-lookup").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 '{
  "leis": [
    "5493001KJTIIGC8Y1R12",
    "W38RGI023J3WT1HWRP32",
    "5493001KJTIIGC8Y1R13"
  ],
  "names": [
    "Apple Inc.",
    "Deutsche Bank Aktiengesellschaft"
  ],
  "bics": [
    "DEUTDEFF"
  ],
  "isins": [
    "US0378331005"
  ]
}' |
apify call clearpath-data/lei-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearpath-data/lei-lookup"
        }
    }
}
```

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/iDg8O2fY3WWYUg6a0/builds/uQ6CmK6ydadX8WUhW/openapi.json
