# LEI Lookup — Bulk GLEIF Company Search, Parents & BIC/ISIN (`plumbline-data/gleif-lei-lookup`) Actor

Bulk LEI lookup & search from official GLEIF data (3.4M+ entities). Match company names, registration numbers, BIC/SWIFT or ISIN to LEIs, or pull new LEI registrations. Returns addresses, status, renewal date, legal form, direct & ultimate parent. KYC-ready. No API key.

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

## Pricing

from $2.00 / 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 & Company Search — bulk GLEIF Legal Entity Identifier data

### What does LEI Lookup & Company Search do?

**LEI Lookup & Company Search** pulls official **Legal Entity Identifier (LEI)** data from the **GLEIF** global index (3.4M+ companies, funds and branches in 200+ jurisdictions). Look up thousands of LEIs in one run, **match company names, registration numbers, BIC/SWIFT or ISIN codes to LEIs**, or get a feed of **newly registered LEIs** by country. Each record comes with legal name, legal and HQ address, entity and LEI status, **renewal date and overdue flag**, legal form, registration authority and number, BIC codes, and the **direct and ultimate parent company**.

Data comes straight from GLEIF's free public API (CC0 licence) — **no API key, no scraping, no login**. The Actor handles GLEIF's 60-requests-per-minute limit, retries, batching (200 LEIs per call) and enrichment for you.

### What can you use LEI data for?

- 🏦 **KYC / KYB onboarding** — verify a counterparty's legal name, address, registration number and status in seconds
- ⚠️ **Compliance monitoring** — flag **lapsed LEIs** (`renewalOverdue`), inactive or merged entities across your client book
- 🧬 **Ownership mapping** — direct and ultimate parent from GLEIF Level 2 data, number of subsidiaries
- 🧾 **Regulatory reporting** — EMIR, MiFID II, SFTR, Dodd-Frank all require valid LEIs
- 🔗 **Entity resolution** — map BIC ↔ LEI ↔ ISIN ↔ national company number across your datasets
- 🎯 **Lead generation** — new LEI registrations signal companies about to trade, issue securities or raise funding

### How to look up LEIs in bulk

1. Paste LEI codes, company names, registration numbers, BICs or ISINs into the matching fields (any combination).
2. Optional: set **Country** (e.g. `GB`) and status filters to narrow name searches.
3. For new-company feeds, pick a **New LEI registrations since** date.
4. Click **Start** and export to CSV, Excel, JSON, Google Sheets, or call it from your code via the Apify API.

### Input example

```json
{
  "leiCodes": ["7LTWFZYICNSX8D621K86", "HWUPKR0MPOU8FGXBT394"],
  "companyNames": ["Siemens Aktiengesellschaft", "Barclays Bank PLC"],
  "registrationNumbers": ["01026167"],
  "bicCodes": ["DEUTDEFFXXX"],
  "isinCodes": ["US0378331005"],
  "maxResultsPerQuery": 2,
  "minNameMatchPercent": 80,
  "includeParents": true
}
```

### Output example

```json
{
  "lei": "G5GSEF7VJP5I7OUK5573",
  "legalName": "BARCLAYS BANK PLC",
  "entityStatus": "ACTIVE",
  "registrationStatus": "ISSUED",
  "category": "GENERAL",
  "legalFormCode": "B6ES",
  "legalFormName": "Public Limited Company",
  "jurisdiction": "GB",
  "registeredAs": "01026167",
  "entityCreationDate": "1971-10-04T00:00:00Z",
  "legalAddress": "1 CHURCHILL PLACE, LONDON, GB-LND, E14 5HP, GB",
  "legalAddressCountry": "GB",
  "hqAddress": "1 CHURCHILL PLACE, LONDON, GB-LND, E14 5HP, GB",
  "initialRegistrationDate": "2012-06-06T15:51:54Z",
  "nextRenewalDate": "2027-04-30T00:00:00Z",
  "daysUntilRenewal": 206,
  "renewalOverdue": false,
  "corroborationLevel": "FULLY_CORROBORATED",
  "bic": ["BARCGB22XXX", "BARCGB21CHP", "BARCUS33XXX", "…"],
  "mic": ["BPLC"],
  "directParentLei": "213800LBQA1Y9L22JB70",
  "directParentName": "BARCLAYS PLC",
  "ultimateParentLei": "213800LBQA1Y9L22JB70",
  "ultimateParentName": "BARCLAYS PLC",
  "ultimateParentCountry": "GB",
  "queryType": "registrationNumber",
  "query": "01026167",
  "gleifRecordUrl": "https://search.gleif.org/#/record/G5GSEF7VJP5I7OUK5573",
  "retrievedAt": "2026-10-06T16:56:17+00:00"
}
```

(Real record from a test run on 6 Oct 2026, abbreviated — see the *Output* tab for all ~50 fields.) Name searches add a **`nameMatchScore`** from 0 to 1 that ignores legal suffixes (Inc, Ltd, GmbH, AG…) and also checks other and transliterated names — so *Toyota Motor Corporation* correctly finds トヨタ自動車株式会社. Ties are broken in favour of active, head-office (non-branch) entities, so *Barclays Bank PLC* returns the London head office rather than its Monaco branch. Auto-accept strong matches and review weak ones.

Queries with no match, unknown LEIs and malformed codes come back as **error rows that are not charged**:

```json
{ "queryType": "lei", "query": "BADLEI123", "isError": true, "error": "INVALID_LEI_FORMAT",
  "errorMessage": "An LEI is 20 characters: 18 letters/digits + 2 check digits." }
```

### How much does LEI lookup cost?

**$3 per 1,000 LEI records** returned (pay per result), plus Apify's tiny start fee. Error rows and "no match" rows are free.

| Job | Records | Cost |
|---|---|---|
| Verify 100 counterparties | 100 | $0.30 |
| Match 2,000 supplier names (top 1 match) | ~2,000 | ~$6 |
| All new UK LEIs this week | ~400 | ~$1.20 |

The free Apify plan's monthly credits cover hundreds of lookups. Use **Max results** or **Maximum cost per run** to cap spending.

### Speed

GLEIF allows 60 API requests per minute. LEI-code lookups are batched 200 per request, so 10,000 LEIs take a few minutes. Parent enrichment adds up to two requests per record that has a parent (records without a reported parent cost no extra calls) — switch **Include direct & ultimate parent** off for maximum speed on very large jobs.

### Use it via API (Python, JavaScript, Make, Zapier, n8n)

Run the Actor and get results in one HTTP call (replace `YOUR_TOKEN` with your [Apify API token](https://console.apify.com/settings/integrations)):

```bash
curl -X POST "https://api.apify.com/v2/acts/plumbline-data~gleif-lei-lookup/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"leiCodes":["7LTWFZYICNSX8D621K86"],"companyNames":["Siemens Aktiengesellschaft"]}'
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("plumbline-data/gleif-lei-lookup").call(run_input={"leiCodes":["7LTWFZYICNSX8D621K86"],"companyNames":["Siemens Aktiengesellschaft"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

You can also **schedule** it (e.g. daily at 7 am) in Apify Console and send results to Google Sheets, Slack, a webhook or your database with built-in integrations.

### FAQ

#### Where does the data come from? Is it legal to use?

From the Global Legal Entity Identifier Foundation's official public API. GLEIF publishes LEI data free of charge under the **CC0** licence, so you may use it for any purpose, including commercially.

#### How fresh is the data?

Live — every run queries GLEIF directly, which publishes its golden copy several times a day.

#### What does LAPSED mean?

The entity didn't renew its LEI on time. Many regulations require a valid (ISSUED) LEI for trading, so lapsed LEIs are a common compliance flag.

#### Why is a parent missing?

Entities can declare a *reporting exception* (e.g. owned by natural persons, or no consolidating parent). You'll see `REPORTING_EXCEPTION` in `directParentException` / `ultimateParentException`.

#### Can I call this from Python, Make or Zapier?

Yes — via the Apify API, the Python/JS clients, or any of Apify's integrations.

#### Other Actors by Plumbline Data

- [UK Public Tenders — Find a Tender + Contracts Finder](https://apify.com/plumbline-data/uk-public-tenders)
- [Sitemap URL Extractor](https://apify.com/plumbline-data/sitemap-url-extractor)

Questions or a field you need? Open an issue on the **Issues** tab.

# Changelog

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

# Actor input Schema

## `leiCodes` (type: `array`):

20-character Legal Entity Identifiers to look up in bulk (200 per API call - fast for large lists).

## `companyNames` (type: `array`):

Legal names to match to LEIs. Each result includes a nameMatchScore (0-1). Use 'Country' to narrow matches.

## `registrationNumbers` (type: `array`):

National business-register numbers (e.g. UK Companies House number, German HRB). Best combined with 'Country'.

## `bicCodes` (type: `array`):

Find the LEI behind a BIC (e.g. DEUTDEFFXXX).

## `isinCodes` (type: `array`):

Find the issuer LEI for a security ISIN (e.g. US0378331005).

## `newRegistrationsSince` (type: `string`):

Return every LEI first registered on/after this date (YYYY-MM-DD), newest first. Combine with Country/Category for fresh lead lists or onboarding monitoring.

## `country` (type: `string`):

Two-letter ISO country of the legal address, e.g. US, GB, DE. Applies to name, registration-number and new-registration searches.

## `entityStatus` (type: `string`):

ACTIVE = legal entity still exists; INACTIVE = dissolved/merged.

## `registrationStatus` (type: `string`):

ISSUED = LEI valid and renewed; LAPSED = renewal overdue (common KYC red flag).

## `category` (type: `string`):

Type of legal entity.

## `maxResultsPerQuery` (type: `integer`):

How many candidate entities to return for each search value (best matches first).

## `minNameMatchPercent` (type: `integer`):

Drop name matches scoring below this percentage (0-100, e.g. 85). Legal suffixes like Inc/Ltd/GmbH are ignored when scoring. 0 keeps all.

## `maxResults` (type: `integer`):

Stop after this many LEI records in total. 0 = no limit.

## `includeParents` (type: `boolean`):

Add the direct and ultimate parent company (LEI, name, country) from GLEIF Level 2 data. Adds API calls, so very large runs are slower.

## `includeLegalFormName` (type: `boolean`):

Translate the ISO 20275 legal form code (e.g. 6QQB) into a readable name (e.g. Aktiengesellschaft).

## `includeChildrenCount` (type: `boolean`):

Add how many entities report this LEI as their direct parent. One extra API call per record.

## `requestsPerMinute` (type: `integer`):

GLEIF allows 60 requests/minute per client. The default stays safely under it.

## `maxRetries` (type: `integer`):

Retries on timeouts, 429 and 5xx responses with exponential backoff.

## Actor input object example

```json
{
  "leiCodes": [
    "7LTWFZYICNSX8D621K86",
    "HWUPKR0MPOU8FGXBT394"
  ],
  "companyNames": [
    "Siemens Aktiengesellschaft"
  ],
  "registrationNumbers": [],
  "bicCodes": [],
  "isinCodes": [],
  "entityStatus": "ANY",
  "registrationStatus": "ANY",
  "category": "ANY",
  "maxResultsPerQuery": 3,
  "minNameMatchPercent": 0,
  "maxResults": 0,
  "includeParents": true,
  "includeLegalFormName": true,
  "includeChildrenCount": false,
  "requestsPerMinute": 55,
  "maxRetries": 4
}
```

# Actor output Schema

## `records` (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 = {
    "leiCodes": [
        "7LTWFZYICNSX8D621K86",
        "HWUPKR0MPOU8FGXBT394"
    ],
    "companyNames": [
        "Siemens Aktiengesellschaft"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("plumbline-data/gleif-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 = {
    "leiCodes": [
        "7LTWFZYICNSX8D621K86",
        "HWUPKR0MPOU8FGXBT394",
    ],
    "companyNames": ["Siemens Aktiengesellschaft"],
}

# Run the Actor and wait for it to finish
run = client.actor("plumbline-data/gleif-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 '{
  "leiCodes": [
    "7LTWFZYICNSX8D621K86",
    "HWUPKR0MPOU8FGXBT394"
  ],
  "companyNames": [
    "Siemens Aktiengesellschaft"
  ]
}' |
apify call plumbline-data/gleif-lei-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plumbline-data/gleif-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/OekdgVFVIc077k9Bi/builds/tnjaeLNYASR2orCY3/openapi.json
