# LEI Records Scraper (`parsebird/lei-records-scraper`) Actor

Scrape GLEIF Legal Entity Identifier records: legal name, address, registration status, entity category, and corporate ownership for 3.4M+ entities worldwide.

- **URL**: https://apify.com/parsebird/lei-records-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### LEI Records Scraper

LEI Records Scraper pulls **Legal Entity Identifier (LEI) data** straight from the [GLEIF](https://www.gleif.org/) Global LEI Index — the official registry behind every ISO 17442 LEI code, covering 3.4M+ companies, funds, branches, and government entities worldwide.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Pull LEI records in bulk by country, search by entity name, enrich a list of LEI codes you already hold, or map corporate ownership between parents and subsidiaries — with legal name, registered address, entity status, legal form, and 25+ other fields per record.
</td>
</tr></table>

##### Copy to your AI assistant

```
Use the Apify Actor "parsebird/lei-records-scraper" (LEI Records Scraper) via the ApifyClient. Example (Python): from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/lei-records-scraper").call(run_input={"mode": "registry", "countries": "DE", "maxResults": 5000}); items = client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: mode (registry|search|lookup|subsidiaries|parents, default "registry"), countries (ISO alpha-2 codes or "ALL", default "DE"), entityStatus/registrationStatus/entityCategory (optional filters), searchQuery (search mode), leiCodes (lookup mode, comma/newline-separated), parentLeiCodes (subsidiaries/parents mode), maxResults (default 5000), proxyConfiguration (optional, GLEIF's API is public). Output: one row per LEI record with lei, legalName, otherNames, entityCategory, entityStatus, legalFormCode, legalFormName, jurisdiction, registeredAs, registeredAtId, legalAddress/legalCity/legalRegion/legalCountry/legalPostalCode, hqAddress/hqCity/hqRegion/hqCountry/hqPostalCode, hqDiffersFromLegal, registrationStatus, initialRegistrationDate, lastUpdateDate, nextRenewalDate, isLapsed, managingLou, validationSources, validationAuthorityId, creationDate, successorLei, spglobal, conformityFlag, relatedLei, url, scrapedAt. Full API reference: https://apify.com/parsebird/lei-records-scraper/api. Get a token at https://console.apify.com/account/integrations.
```

### What does LEI Records Scraper do?

LEI Records Scraper is a **GLEIF API scraper** — it queries GLEIF's own LEI data endpoint directly, so results are always as current as the daily Golden Copy publish, with no scraping fragility. It supports five modes:

- 🌍 **Registry** — collect every LEI record for one or more countries, or the entire 3.4-million-record registry with `countries: "ALL"`
- 🔍 **Search** — full-text search across legal names and trade names, e.g. "siemens" or "deutsche bank"
- 📋 **Lookup** — paste a list of LEI codes and get the full record for each, 200 per request, to refresh a counterparty or KYC file
- 🌳 **Subsidiaries** — take a parent LEI and list every entity it directly owns
- 🔼 **Parents** — take a subsidiary LEI and return its direct parent

Records are collected using GLEIF's cursor-based pagination, so a large country query is **collected in full and never silently truncated** at the API's 10,000-result page ceiling. Every record also resolves the ELF legal-form code (e.g. `2HBR`) to a readable legal-form name (e.g. "Gesellschaft mit beschränkter Haftung").

### What data can you extract with the LEI Scraper?

| Field | Description |
|-------|-------------|
| `lei` | 20-character ISO 17442 Legal Entity Identifier |
| `legalName` | Registered legal name |
| `otherNames` | Trade names and previous names, pipe-separated |
| `entityCategory` | GENERAL, FUND, BRANCH, SOLE\_PROPRIETOR, and so on |
| `entityStatus` | ACTIVE or INACTIVE at the national registry |
| `legalFormCode` / `legalFormName` | ELF legal-form code and its resolved name |
| `jurisdiction` | Jurisdiction the entity is registered in |
| `registeredAs` / `registeredAtId` | Registration number and registry code — the join key to local company data |
| `legalAddress*` / `hqAddress*` | Legal and headquarters address, with a `hqDiffersFromLegal` flag |
| `registrationStatus` / `isLapsed` | LEI status: ISSUED, LAPSED, RETIRED, ANNULLED, DUPLICATE |
| `initialRegistrationDate` / `lastUpdateDate` / `nextRenewalDate` | LEI lifecycle dates |
| `managingLou` | LEI of the Local Operating Unit that maintains the record |
| `validationSources` / `validationAuthorityId` | How thoroughly the record was corroborated |
| `successorLei` | LEI of the successor entity after a merger |
| `spglobal` | S\&P Global company identifiers, where mapped |
| `relatedLei` | In subsidiary/parent modes, the anchor LEI the row relates to |

See the full 30-field list in the [Output tab](https://apify.com/parsebird/lei-records-scraper/output).

### How to use the LEI Scraper

**Option A — a country in bulk.** Keep `mode: "registry"`, enter one or more ISO country codes (`DE`, `US`, `GB`, `IN`, `IT`, `NL`), optionally restrict to `entityStatus: "ACTIVE"` and `registrationStatus: "ISSUED"`, and set `maxResults`. A large country is collected in full via cursor pagination rather than truncated at 10,000.

**Option B — the whole registry.** Enter `ALL` as the country to walk all 3.4 million records. Set `maxResults` to what you actually need; narrow the filters and run again to pick up more.

**Option C — enrich a list you already hold.** Switch to `mode: "lookup"` and paste your LEI codes into `leiCodes`. The Actor returns the full record for each, 200 per request — the fastest way to refresh a counterparty file.

**Option D — map a corporate group.** `mode: "subsidiaries"` takes a parent LEI in `parentLeiCodes` and returns every entity it owns; `mode: "parents"` takes a subsidiary LEI and returns what owns it. Each row records which anchor LEI it belongs to, so several groups can be mapped in one run.

1. Open the [LEI Records Scraper](https://apify.com/parsebird/lei-records-scraper) page and click **Try for free**.
2. Pick a mode and fill in its fields (see Options A–D above).
3. Set **Max Results** and click **Start**.
4. Download results as JSON, CSV, or Excel, or pull them via the [Apify API](https://docs.apify.com/api/v2).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| mode | string | No | registry | registry / search / lookup / subsidiaries / parents |
| countries | string | Registry mode | DE | ISO alpha-2 codes, comma-separated, or `ALL` |
| entityStatus | string | No | — | ACTIVE or INACTIVE |
| registrationStatus | string | No | — | ISSUED, LAPSED, and other LEI statuses |
| entityCategory | string | No | — | GENERAL, FUND, BRANCH, and so on |
| searchQuery | string | Search mode | — | Full-text search across entity names |
| leiCodes | string | Lookup mode | — | LEI codes, comma- or newline-separated |
| parentLeiCodes | string | Subsidiaries/Parents mode | — | Anchor LEI codes, comma- or newline-separated |
| maxResults | integer | No | 5000 | Stop after this many records |
| proxyConfiguration | object | No | Off | Optional — GLEIF's API is public and open |

### Output example

```json
{
  "lei": "5493001IN9FTPIHPPO54",
  "legalName": "WILKINSON SWORD GMBH",
  "otherNames": "Halde Zweiunddreißigste Verwaltungsgesellschaft mbH",
  "entityCategory": "GENERAL",
  "entityStatus": "ACTIVE",
  "legalFormCode": "2HBR",
  "legalFormName": "Gesellschaft mit beschränkter Haftung",
  "jurisdiction": "DE",
  "registeredAs": "HRB 16753",
  "registeredAtId": "RA000369",
  "legalAddress": "SCHUTZENSTR. 110",
  "legalCity": "SOLINGEN",
  "legalRegion": "DE-NW",
  "legalCountry": "DE",
  "legalPostalCode": "42659",
  "hqAddress": "SCHUTZENSTR. 110",
  "hqCity": "SOLINGEN",
  "hqRegion": "DE-NW",
  "hqCountry": "DE",
  "hqPostalCode": "42659",
  "hqDiffersFromLegal": false,
  "registrationStatus": "ISSUED",
  "initialRegistrationDate": "2012-12-18T16:18:00Z",
  "lastUpdateDate": "2026-03-03T08:57:16Z",
  "nextRenewalDate": "2027-03-31T16:35:29Z",
  "isLapsed": false,
  "managingLou": "5493001KJTIIGC8Y1R12",
  "validationSources": "FULLY_CORROBORATED",
  "validationAuthorityId": "RA000369",
  "creationDate": "2003-09-29T00:00:00Z",
  "successorLei": null,
  "spglobal": "5552822",
  "conformityFlag": "NON_CONFORMING",
  "relatedLei": null,
  "url": "https://search.gleif.org/#/record/5493001IN9FTPIHPPO54",
  "scrapedAt": "2026-08-16T09:39:45.488Z"
}
```

Download results as **JSON, CSV, XML, or Excel** from the Console, or fetch them programmatically via the [Apify API](https://docs.apify.com/api/v2) or the SDKs below.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/lei-records-scraper").call(run_input={
    "mode": "registry",
    "countries": "DE",
    "entityStatus": "ACTIVE",
    "maxResults": 5000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["lei"], item["legalName"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/lei-records-scraper').call({
    mode: 'lookup',
    leiCodes: '5493001KJTIIGC8Y1R12, 254900OPPU84GM83MG36',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **KYC / AML onboarding** — resolve a counterparty's LEI to legal name, address, and status before onboarding
- **Regulatory reporting** — cross-reference LEI records against EMIR, MiFID II, or SFTR filings
- **Corporate structure mapping** — walk `subsidiaries` and `parents` modes to build an ownership tree for a group
- **Sanctions and risk screening** — flag `LAPSED` registrations or `INACTIVE` entities as risk signals
- **Master data management** — bulk-refresh a counterparty file in `lookup` mode, 200 records per request
- **Market research** — pull every `FUND` or `BRANCH` entity in a country to size a market segment

### How it works

1. The Actor builds a GLEIF `lei-records` API query from your selected mode and filters.
2. It walks the result set using GLEIF's cursor pagination, which has no 10,000-result ceiling — a full country or the entire registry is collected without manual slicing.
3. Each record's ELF legal-form code is resolved to a readable name and cached for the rest of the run.
4. Records are normalized into a flat 30-field row and pushed to the dataset as each page arrives, so partial results are visible from the first request.

### How much does it cost to scrape LEI records?

LEI Records Scraper uses [pay-per-result pricing](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-result) — you pay only for records actually collected, nothing for setup or failed requests.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| record-collected | $0.0025 | **$2.50** |

Pricing is tiered by your Apify plan (Free $2.50, Bronze $2.30, Silver $2.00, Gold $1.70 per 1,000 records). A 5,000-record country pull costs roughly $12.50 on the Free plan. Every Apify account also gets a monthly platform usage credit that applies to Actor runs.

### FAQ

**How current is the data?**
Every request hits GLEIF's live API, refreshed daily from the official Golden Copy publish — this is not a cached or stale dataset.

**Can I collect more than 10,000 records for one country?**
Yes. The Actor uses cursor-based pagination internally, so a query is never truncated at GLEIF's 10,000-result page ceiling — set `maxResults` as high as you need.

**What does `relatedLei` mean?**
It only appears in `subsidiaries` and `parents` modes, and records which anchor LEI (from `parentLeiCodes`) that row belongs to — useful when mapping several corporate groups in one run.

**Does this need a proxy?**
No. The GLEIF API is public and unauthenticated. `proxyConfiguration` is available if you want requests routed through Apify Proxy, but it's off by default.

**Can I schedule recurring runs?**
Yes — use Apify's [scheduler](https://docs.apify.com/platform/schedules) to re-pull a country or refresh a counterparty list daily, weekly, or on any cron interval.

**Is there an API?**
Every Actor run is available through the [Apify API](https://docs.apify.com/api/v2), with client SDKs for [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js), plus integrations with Zapier, Make, and Google Sheets.

### Is it legal to scrape LEI records?

Yes. GLEIF publishes LEI data as an open, public reference dataset specifically for reuse, and this Actor queries GLEIF's own public API rather than scraping HTML. Scraping publicly accessible data is generally lawful; see the [Apify blog on web scraping legality](https://blog.apify.com/is-web-scraping-legal/) for a fuller discussion. You remain responsible for how you use the collected data under GDPR or other applicable regulations if it includes personal data.

### Related Actors

- [Dataroma SEC Insider Scraper](https://apify.com/parsebird/dataroma-sec-insider-scraper) — SEC Form 4 insider transaction data
- [Dataroma Superinvestor Portfolio Scraper](https://apify.com/parsebird/dataroma-superinvestor-scraper) — public-market portfolio holdings
- [Allabolag Scraper](https://apify.com/parsebird/allabolag-company-scraper) — Swedish company registry and B2B leads

Found an issue or have a feature request? Open a ticket on the Actor's **Issues** tab — feedback shapes what ships next.

# Actor input Schema

## `mode` (type: `string`):

Registry pulls entities in bulk by country. Search finds them by name. Lookup takes LEI codes. Subsidiaries returns what a LEI owns; Parents returns what owns it.

## `countries` (type: `string`):

Registry mode. ISO 3166-1 alpha-2 codes of the legal address, comma-separated, e.g. DE, US, GB, IN, IT, NL, FR. Enter ALL to walk the whole 3.4-million-record registry. Records are collected in full via cursor pagination, so a large country is never truncated at the API's 10,000-result page limit.

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

Optional. ACTIVE excludes entities that have been dissolved or merged away.

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

Optional. ISSUED is a live, renewed LEI; LAPSED means the holder stopped renewing it, which is itself a risk signal.

## `entityCategory` (type: `string`):

Optional. GENERAL is an ordinary company, FUND an investment fund, BRANCH a registered branch of a foreign entity.

## `searchQuery` (type: `string`):

Search mode. Full-text search across entity names, e.g. "deutsche bank" or "siemens".

## `leiCodes` (type: `string`):

Lookup mode. One or more 20-character LEI codes, comma- or newline-separated. Use this to enrich a list you already hold — the Actor returns the full record for each, 200 per request.

## `parentLeiCodes` (type: `string`):

Subsidiary and parent modes. One or more LEI codes, comma- or newline-separated. Each returned row records which anchor LEI it belongs to, so several groups can be mapped in one run.

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

Stop after this many records. Each request returns up to 200.

## `proxyConfiguration` (type: `object`):

Optional. The GLEIF API is public and open, so a proxy is not required; it is available if you want the requests routed through Apify Proxy.

## Actor input object example

```json
{
  "mode": "registry",
  "countries": "DE",
  "entityStatus": "",
  "registrationStatus": "",
  "entityCategory": "",
  "searchQuery": "deutsche bank",
  "leiCodes": "5493001KJTIIGC8Y1R12, 254900OPPU84GM83MG36",
  "parentLeiCodes": "5493001KJTIIGC8Y1R12",
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "mode": "registry",
    "countries": "DE",
    "searchQuery": "deutsche bank",
    "leiCodes": "5493001KJTIIGC8Y1R12, 254900OPPU84GM83MG36",
    "parentLeiCodes": "5493001KJTIIGC8Y1R12",
    "maxResults": 200,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/lei-records-scraper").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 = {
    "mode": "registry",
    "countries": "DE",
    "searchQuery": "deutsche bank",
    "leiCodes": "5493001KJTIIGC8Y1R12, 254900OPPU84GM83MG36",
    "parentLeiCodes": "5493001KJTIIGC8Y1R12",
    "maxResults": 200,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/lei-records-scraper").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 '{
  "mode": "registry",
  "countries": "DE",
  "searchQuery": "deutsche bank",
  "leiCodes": "5493001KJTIIGC8Y1R12, 254900OPPU84GM83MG36",
  "parentLeiCodes": "5493001KJTIIGC8Y1R12",
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/lei-records-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/bF37Jxc56OrwhvOLC/builds/I9dVpHhsGlSKotp0T/openapi.json
