# LEI Lookup & Changes — Legal Entity Identifier Data, No API Key (`rein8/lei-legal-entity-lookup`) Actor

LEI company data from the Global LEI Index (GLEIF): look up LEI codes by number, name, UK company number or SIREN; list new, lapsed or renewed LEIs by country and date; ultimate parent groups. CC0 open data, no API key, no sole proprietors. Unofficial: not affiliated with or endorsed by GLEIF.

- **URL**: https://apify.com/rein8/lei-legal-entity-lookup.md
- **Developed by:** [Rein X](https://apify.com/rein8) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 lei records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 and LEI search by company name — LEI company data from the Global LEI Index: look up Legal Entity Identifiers by code, legal name or company registry number (a UK company number, a SIREN, an HRB number), list new, lapsed or renewing LEIs by country, and get every entity's direct and ultimate parent LEI — CC0 open data, no API key. $2 per 1,000 LEI records, the first 10 rows free.**

- 📄 **What you get** — one row per LEI record: the LEI, legal name and other names, city / country / postal code of the legal and headquarters addresses, the business register and the entity's number in it (a UK company number, a SIREN, an HRB number) with a link to its register page (Companies House, annuaire-entreprises), jurisdiction, category, legal-form code and its plain name (Ltd, GmbH, SAS, LLC…), entity status, LEI registration status, first-issue, last-update and next-renewal dates, BIC codes, successor LEI, and the direct and ultimate parent LEIs when a parent is reported.
- 🏛️ **Source** — GLEIF's Global LEI Index through its documented, key-less API (3.44 million records). The data is published under the *CC0 1.0* licence (public domain); the source line is on every row.
- 💵 **Price** — $2 per 1,000 LEI records; $4 per 1,000 ultimate-parent records fetched; $10 per 1,000 changes on a watch; the first 10 rows are free (Preview).
- 🔑 **No API key, no account** — GLEIF's documentation says "There is no charge for the use of GLEIF's LEI data"; the Actor declares who it is and stays under the published rate limit of 60 requests a minute.
- 🔒 **No personal data** — legal entities only: sole-proprietor LEIs (natural persons) are never returned and no street address line is delivered; every row names its source and licence.
- ⏱️ **Time to first result** — a lookup of 200 LEIs is one request: seconds. Preview: 10 records, free.

| LEI | Legal name | Country | Register no. | LEI status | Ultimate parent LEI |
|---|---|---|---|---|---|
| 213800WSGIIZCXF1P572 | JAGUAR LAND ROVER LIMITED | GB | 01672070 | ISSUED | 335800BO2LHWJJ8TZI32 |
| 2138002P5RNKC5W2JZ46 | TESCO PLC | GB | 00445790 | ISSUED | — (none reported) |
| 969500KMUQ2B6CBAF162 | DANONE | FR | 552032534 | ISSUED | — (none reported) |
| 7ZW8QJWVPR4P1J1KQY45 | GOOGLE LLC | US | 3582691 | ISSUED | 5493006MHB84DD0ZWV18 |

*Real rows from a test run on 26 Sep 2026 with `{"leis": ["213800WSGIIZCXF1P572", "2138002P5RNKC5W2JZ46", "969500KMUQ2B6CBAF162", "7ZW8QJWVPR4P1J1KQY45"], "includeParents": true}` — one request, 7 seconds. With **Fetch the ultimate parent** on, the first row also carries `ultimateParentName: TATA MOTORS PASSENGER VEHICLES LIMITED` (IN, register number L28920MH1945PLC004520) and the last `ultimateParentName: ALPHABET INC.` (US). Every row also carries the city and postal code, the registration-authority code (RA000585 = Companies House, RA000189 = Sirene, RA000602 = Delaware) with the register page where one exists (`registerUrl`: TESCO PLC → find-and-update.company-information.service.gov.uk/company/00445790, DANONE → annuaire-entreprises.data.gouv.fr/entreprise/552032534), the legal form in words (`legalFormText`: "Public Limited Company (PLC, United Kingdom)", "Limited Liability Company (LLC, Delaware, USA)"), the BIC codes, the next renewal date, the managing LOU, and links to the record on GLEIF's LEI Search.*

**Price:** $2 per 1,000 LEI records — 10 rows free. Apify's free plan ($5 of credit a month) covers about 2,500 records a month at no cost to you.

#### Try it in 60 seconds

1. Press **Start** — the input is pre-filled with 5 well-known LEIs (Apple, Google, Jaguar Land Rover, Tesco, Danone).
2. Open the **Output** tab: one row per LEI with status, register number, renewal date and parent LEIs.
3. Replace the list with your own LEIs, or clear it and paste **UK company numbers / SIRENs** into *Business-register numbers*, or set a **country + date** to list new LEIs.

### What does this LEI lookup do?

It reads GLEIF's Global LEI Index — the public register of Legal Entity Identifiers used in KYB onboarding, payments (ISO 20022), securities reporting (MiFID II, EMIR, SFTR) and sanctions screening — and returns clean rows:

- **Lookup** — by LEI code (up to 200 per run in one request), by legal name, or by **business-register number**: paste UK company numbers or French SIRENs and get each company's LEI, its current LEI status and its parent group. Turn a company number into an LEI, or an LEI back into the register number.
- **Lists** — every LEI in a country or jurisdiction, by registration status (ISSUED, LAPSED, RETIRED…), entity status, category (companies, funds, branches…), first-issue date, last-update date or next-renewal date.
- **Changes** — on a schedule with *Only LEIs not delivered before*, only the LEIs that are new or whose status, name, renewal date, successor or parent changed since the last run, each with a `changes` list. Lapsed LEIs, re-parented entities, renewals due.
- **Parent groups** — the direct and ultimate parent LEIs are on every row at no extra charge; *Fetch the ultimate parent* adds the group head's name, country, register number and status.

It uses only two documented API routes, declares its identity on every request, stays under GLEIF's published rate limit and never bypasses anything.

### Why use LEI data from the Global LEI Index?

The LEI is the one identifier that spans every business register: a UK company, a French SA, a Delaware LLC and a Cayman fund all carry the same 20-character code, mapped to their local register number. The Global LEI Index is maintained by GLEIF from the reports of the LEI issuers, corroborated against the national registers, and published under CC0 — you may copy it, redistribute it and build products on it without asking.

Who uses this Actor: **KYB and onboarding teams** (verify a counterparty's LEI and status before payment or trade), **banks and payment providers** (ISO 20022 messages carry LEIs; a LAPSED LEI is a compliance flag), **fintech and data teams** (enrich a customer table with LEI, parent group and register number), **fund administrators and treasury desks** (renewal reminders, parent-chain checks), **researchers** (who owns whom, by country).

#### Why this one

- **Register numbers in, LEIs out.** `registerIds` maps to GLEIF's `entity.registeredAs`: a UK company number, a SIREN, an HRB number or a US state file number returns the LEI record registered under it. Combine with the [UK company search](https://apify.com/rein8/uk-companies-house-snapshot) or the [France company search](https://apify.com/rein8/france-company-search) to go from a company list to LEIs and parent groups.
- **Parents without extra requests.** Every list request asks the API for the parent linkage, so `directParentLei` and `ultimateParentLei` are on every row for the price of the row. The parent's own record is fetched only when you ask, one request per entity that reports a parent.
- **A changes feed, not a snapshot.** The watch remembers what it delivered and returns only what moved — a LAPSED status, a new group head — priced per change.
- **No personal data by design.** Sole-proprietor LEIs (individuals) are excluded by a fixed rule; the street line of the address is never mapped.
- **Register links and readable legal forms.** A UK number gets its Companies House page, a SIREN its annuaire-entreprises page (`registerUrl`); the ISO 20275 legal-form code comes with its plain name (`legalFormText`: "Private Limited Company (Ltd, United Kingdom)", "Gesellschaft mit beschränkter Haftung (GmbH, Germany)") for the 43 most common forms.
- **Honest limits.** The API's own filters, its 200-row pages, its 60-requests-a-minute limit; nothing scraped, nothing guessed.

#### Common searches this Actor answers

- **LEI lookup** / **LEI check** — paste LEI codes, get the record with its status and renewal date.
- **LEI search by company name** — `names`: a case-insensitive contains-match on the legal name ("TESCO" finds 64 records, "TESCO PLC" 11); corroborate with the register number on the row.
- **Find the LEI for a company number** — `registerIds` + `country` (a UK company number, a SIREN, an HRB number).
- **Who is the parent company of …** — every row carries `directParentLei` and `ultimateParentLei`; *Fetch the ultimate parent* adds the group head's name and country.
- **LEI renewal** — `renewalDueFrom` / `renewalDueTo` for the LEIs due to renew; `status: LAPSED` + a last-update window for the ones that did not.
- **New LEIs by country** — `registeredSince` + `country`, on a daily schedule with the watch.

#### How this compares

Other GLEIF Actors on the Store return one-off searches or a single record per call. This one adds the register-number lookup, the parent linkage on every row, the changes feed, date windows on issue / update / renewal dates, and a real-time Standby endpoint — with a CC0 licence line on every row and no key to manage.

### Examples — ready-made inputs

#### Examples (one click)

Each example below is also a public Task with its own page — open it, press **Start**, and the input is already filled in:

- [LEIs that lapsed this week (UK)](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-lapsed-this-week)
- [New LEIs in the United Kingdom — daily feed](https://apify.com/rein8/lei-legal-entity-lookup/examples/new-leis-united-kingdom-daily)
- [Find the LEI for UK company numbers](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-for-uk-company-numbers)
- [LEI parent group lookup — direct and ultimate parent](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-parent-group-lookup)
- [LEI renewals due in the next 30 days (UK)](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-renewals-due-30-days)
- [LEI search by company name](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-search-by-company-name)
- [LEI for French SIREN numbers](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-for-french-siren-numbers)
- [New LEIs in Germany — daily feed](https://apify.com/rein8/lei-legal-entity-lookup/examples/new-leis-germany-daily)
- [LEIs retired or merged this month (GB, DE, FR, NL, IE, LU)](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-retired-or-merged-this-month)
- [Watch counterparty LEIs weekly — status and parent changes](https://apify.com/rein8/lei-legal-entity-lookup/examples/lei-watch-counterparties-weekly)

Or copy one into the **JSON** tab of the input, or save it as a Task. The counterparties watch (last JSON block but one) is not a public Task yet: paste its JSON and save it as your own Task.

| Task name | SEO title (≤ 60) | SEO description (≤ 160) |
|---|---|---|
| `lei-lapsed-this-week` | LEIs That Lapsed This Week — UK Legal Entities | UK legal entities whose LEI record moved to LAPSED this week, from the Global LEI Index: name, company number, renewal date, parent LEI. CC0, no API key. |
| `new-leis-united-kingdom-daily` | New LEIs in the United Kingdom — Daily Feed | Legal entities that received an LEI in the UK, only the ones you have not seen yet, every day: name, company number, city, parent LEI. No API key. |
| `lei-for-uk-company-numbers` | Find the LEI for UK Company Numbers | Paste UK company numbers, get each company's LEI, LEI status, renewal date and ultimate parent group from the Global LEI Index. CC0 data, no API key. |
| `lei-parent-group-lookup` | LEI Parent Group Lookup — Direct & Ultimate Parent | Paste LEI codes and get the direct and ultimate parent LEIs plus the group head's name, country and register number. Global LEI Index, CC0, no key. |
| `lei-renewals-due-30-days` | LEI Renewals Due in the Next 30 Days — UK | Active UK LEIs whose renewal date falls in the next 30 days, from the Global LEI Index: renewal reminders and KYB refresh lists. No API key. |
| `lei-search-by-company-name` | LEI Search by Company Name — Global LEI Index | Type legal names, get every matching LEI record with status, country, register number and parent LEIs from the Global LEI Index. CC0 data, no API key. |
| `lei-for-french-siren-numbers` | Find the LEI for French SIREN Numbers | Paste SIRENs, get each company's LEI, LEI status, renewal date, Sirene link and ultimate parent from the Global LEI Index. CC0 data, no API key. |
| `lei-watch-counterparties-weekly` | Watch Counterparty LEIs Weekly — Status & Parent Changes | Paste your counterparties' LEIs: each week only the ones whose LEI status, name, renewal date or parent changed, with what changed. No API key. |
| `new-leis-germany-daily` | New LEIs in Germany — Daily Feed | Legal entities that received an LEI in Germany, only the ones you have not seen yet, every day: name, HRB number, city, parent LEI. No API key. |
| `lei-retired-or-merged-this-month` | LEIs Retired or Merged This Month — Europe | Entities in GB, DE, FR, NL, IE and LU whose LEI moved to RETIRED or MERGED this month: name, successor LEI, register number. CC0, no API key. |

**LEIs that lapsed this week** (the last-update window is the week; move both dates forward each week):

```json
{ "status": "LAPSED", "country": "GB", "updatedSince": "2026-09-19", "updatedUntil": "2026-09-26", "maxItems": 5000 }
```

**New LEIs in the United Kingdom — daily feed** (schedule daily; the first run is the baseline, later runs only LEIs not delivered before; move `registeredSince` forward once a month to keep runs short):

```json
{ "country": "GB", "registeredSince": "2026-09-25", "incremental": true, "stateKey": "new-leis-gb", "maxItems": 3000 }
```

**LEI for UK company numbers** (one number per line, as Companies House writes it, with leading zeros):

```json
{ "registerIds": ["00445790", "01672070", "07656305"], "country": "GB", "includeParents": true, "maxItems": 100 }
```

**Parent group lookup** (paste LEIs; the group head's record is fetched for each entity that reports one):

```json
{ "leis": ["213800WSGIIZCXF1P572", "HWUPKR0MPOU8FGXBT394", "969500KMUQ2B6CBAF162"], "includeParents": true, "maxItems": 100 }
```

**Renewals due in the next 30 days** (2,930 UK LEIs on 26 Sep 2026; move the two dates forward each month):

```json
{ "country": "GB", "status": "ISSUED", "renewalDueFrom": "2026-09-27", "renewalDueTo": "2026-10-27", "maxItems": 5000 }
```

**Watch your counterparties weekly** (paste LEIs; run weekly; only status, name, renewal, successor or parent changes come back, with `changes:[{field,from,to}]`):

```json
{ "leis": ["213800WSGIIZCXF1P572", "2138002P5RNKC5W2JZ46"], "incremental": true, "stateKey": "counterparties", "maxItems": 1000 }
```

**LEI search by company name** (a contains-match on the legal name; add a country to narrow it):

```json
{ "names": ["JAGUAR LAND ROVER", "DANONE"], "maxItems": 100 }
```

**LEI for French SIREN numbers** (9 digits, as Sirene writes them; `register` keeps only the Sirene record):

```json
{ "registerIds": ["552032534", "632012100"], "country": "FR", "register": "RA000189", "includeParents": true, "maxItems": 100 }
```

**New LEIs in Germany — daily feed**:

```json
{ "country": "DE", "registeredSince": "2026-09-25", "incremental": true, "stateKey": "new-leis-de", "maxItems": 3000 }
```

**LEIs retired or merged this month** (six countries; the successor LEI is on the row; move both dates forward each month):

```json
{ "status": "RETIRED,MERGED", "country": "GB,DE,FR,NL,IE,LU", "updatedSince": "2026-09-01", "updatedUntil": "2026-09-30", "maxItems": 5000 }
```

### How to scrape LEI data with this Actor

1. Enter **LEI codes**, **legal names** or **business-register numbers** (one per line) — or leave them empty and set filters (country, jurisdiction, status, category, dates).
2. Optionally turn on **Fetch the ultimate parent** to add the group head's name, country and register number.
3. Set **Max rows** (default 1,000; each query reads up to 100,000 records).
4. Press **Start**. Rows land in the dataset as pages are read (200 records per request, at most 55 requests a minute).
5. For a feed, turn on **Only LEIs not delivered before**, save the input as a **Task** and schedule it: the first run is the baseline, each later run returns only new LEIs and changed rows.

### Input

| Field | What it does |
|---|---|
| `leis` | LEI codes, one per line (up to 200 per run — one request) |
| `names` | Legal names, one per line (up to 50); a partial name matches ("TESCO PLC" also finds TESCO PLC PENSION SCHEME); leave commas out |
| `registerIds` | Business-register numbers, one per line (up to 200): UK company number with leading zeros (a bare 445790 finds nothing; 00445790 or GB:445790 does), SIREN, HRB number, US state file number… A `GB:` / `UK:` or `FR:` prefix is understood: it is removed, a UK number is padded and written as Companies House writes it (GB:sc12345 → SC012345), spaces are ignored (FR:552 032 534), and `register` gains Companies House / Sirene. Otherwise add `country`, `jurisdiction` or `register` when a number could exist in several registers |
| `register` | Keep only records from these business registers, as GLEIF RA codes: RA000585,RA000586,RA000587 = Companies House; RA000189 = Sirene; RA000602 = Delaware. Applied after reading — use it with numbers or LEIs, not alone |
| `country` | Legal-address country code(s): GB, FR, DE, US… (comma-separated for several) |
| `jurisdiction` | Jurisdiction of formation: GB, FR, US-DE, CA-ON… |
| `status` | LEI registration status, in capitals: ISSUED, LAPSED, RETIRED, ANNULLED, MERGED, DUPLICATE, PENDING\_TRANSFER, PENDING\_ARCHIVAL (comma-separated for several; the form refuses other spellings because the API does) |
| `entityStatus` | ACTIVE or INACTIVE — the legal entity itself |
| `category` | GENERAL, FUND, BRANCH, INTERNATIONAL\_ORGANIZATION, RESIDENT\_GOVERNMENT\_ENTITY (empty = all five; sole proprietors are never returned) |
| `updatedSince` / `updatedUntil` | Last-update window of the record (YYYY-MM-DD, inclusive) |
| `registeredSince` / `registeredUntil` | First-issue window of the LEI — new legal entities in the index |
| `renewalDueFrom` / `renewalDueTo` | Next-renewal window — LEIs about to lapse |
| `includeParents` | Fetch the ultimate parent's own record (name, country, jurisdiction, category, register number, status) — one `parent` event per row that reports a parent |
| `maxItems` | Rows delivered in total (default 1,000); only delivered rows are charged |
| `incremental` | Off (default): every run returns everything that matches. On (the watch): baseline first, then only new LEIs and rows whose watched fields changed |
| `watchFields` | Narrow the watched fields for a run (default: registration status, entity status, legal name, next renewal date, successor, direct and ultimate parent) |
| `stateKey` | The memory of the watch; left at the default, one per saved Task automatically |
| `allowStateFallback` | Off (default): an incremental run whose memory cannot be opened stops before any charge |
| `preview` | 10 rows, free |

Give the "since / from" date of a window together with its "until / to" date: the API filters closed ranges, so an until-date on its own is applied after each page is read.

### What data can this Actor extract?

#### All fields

| Field | Meaning |
|---|---|
| `lei` | Legal Entity Identifier (20 characters, ISO 17442) |
| `legalName`, `legalNameLanguage`, `otherNames` | Registered legal name, its language, other and previous names (`\|`-separated) |
| `city`, `region`, `country`, `postalCode` | Legal address — no street line |
| `headquartersCity`, `headquartersCountry` | Headquarters address |
| `registerId`, `registeredAs`, `registerUrl` | The business register (GLEIF Registration Authority code: RA000585 Companies House, RA000189 Sirene…), the entity's number in it, and its page on the register where the URL follows from the number (Companies House for RA000585/586/587, annuaire-entreprises for RA000189; null elsewhere) |
| `jurisdiction`, `category`, `subCategory`, `legalFormCode`, `legalFormText` | Jurisdiction of formation, entity category, sub-category, ISO 20275 legal-form code and its plain name for the 43 most common codes ("Société par actions simplifiée (SAS, France)"; null for the rest — the code is always there) |
| `entityStatus`, `entityCreationDate`, `expirationDate`, `expirationReason`, `successorLei` | The legal entity: ACTIVE / INACTIVE, formation date, when and why it ceased, its successor |
| `registrationStatus` | ISSUED, LAPSED, RETIRED, ANNULLED, MERGED, DUPLICATE, PENDING\_TRANSFER, PENDING\_ARCHIVAL |
| `initialRegistrationDate`, `registeredOn` | When the LEI was first issued (timestamp, and the date) |
| `lastUpdateDate`, `lastUpdatedOn` | When the record was last updated (timestamp, and the date) |
| `nextRenewalDate`, `nextRenewalOn` | When the LEI must be renewed (timestamp, and the date) |
| `managingLou`, `corroborationLevel`, `validatedAtRegisterId`, `validatedAs` | Issuing organisation, how far the data was corroborated, the register and number it was validated against |
| `bic` | SWIFT BIC codes mapped to the LEI, when any |
| `directParentLei`, `ultimateParentLei` | Parent LEIs when a parent is reported; null when the entity reports an exception (non-consolidating, no known person, natural persons) |
| `directParentRelationshipUrl`, `ultimateParentRelationshipUrl`, `ultimateParentRecordUrl` | API links to the relationship records and to the ultimate parent's record |
| `ultimateParentName`, `ultimateParentCountry`, `ultimateParentJurisdiction`, `ultimateParentCategory`, `ultimateParentRegisteredAs`, `ultimateParentEntityStatus`, `ultimateParentRegistrationStatus` | The ultimate parent's own record — only with `includeParents` |
| `recordUrl`, `searchUrl` | The record on the API and on GLEIF's public LEI Search |
| `summary` | One plain-English sentence per row for AI agents and chat tools |
| `changes`, `changedFrom`, `changedAt`, `_changed` | Incremental runs only: what changed, since when, found when |
| `scrapedAt`, `_source`, `_licence`, `_sourceUrl` | When the row was read; the attribution (GLEIF — Global LEI Index, CC0 1.0) |

#### Example output

```json
{
  "lei": "213800WSGIIZCXF1P572",
  "legalName": "JAGUAR LAND ROVER LIMITED",
  "legalNameLanguage": "en",
  "otherNames": "JAGUAR CARS LIMITED",
  "city": "COVENTRY",
  "region": null,
  "country": "GB",
  "postalCode": "CV3 4LF",
  "registerId": "RA000585",
  "registeredAs": "01672070",
  "registerUrl": "https://find-and-update.company-information.service.gov.uk/company/01672070",
  "jurisdiction": "GB",
  "category": "GENERAL",
  "legalFormCode": "H0PO",
  "legalFormText": "Private Limited Company (Ltd, United Kingdom)",
  "entityStatus": "ACTIVE",
  "registrationStatus": "ISSUED",
  "registeredOn": "2013-08-21",
  "lastUpdatedOn": "2026-08-21",
  "nextRenewalOn": "2027-08-28",
  "bic": "JLRXGB22XXX",
  "directParentLei": "529900L73GEWN1O5NH84",
  "ultimateParentLei": "335800BO2LHWJJ8TZI32",
  "ultimateParentName": "TATA MOTORS PASSENGER VEHICLES LIMITED",
  "ultimateParentCountry": "IN",
  "searchUrl": "https://search.gleif.org/#/record/213800WSGIIZCXF1P572",
  "summary": "JAGUAR LAND ROVER LIMITED (LEI 213800WSGIIZCXF1P572) is ISSUED, entity ACTIVE, GENERAL in COVENTRY GB, registered as 01672070, renewal due 2027-08-28T00:00:00Z, ultimate parent 335800BO2LHWJJ8TZI32 (TATA MOTORS PASSENGER VEHICLES LIMITED).",
  "_source": "GLEIF — Global LEI Index (Global Legal Entity Identifier Foundation)",
  "_licence": "CC0 1.0 Universal (public domain dedication) — LEI data from the Global LEI Index, provided by GLEIF under the CC0 licence; not affiliated with or endorsed by GLEIF"
}
```

*Shortened: the other fields (headquarters, dates as timestamps, managing LOU, BIC, relationship links, changes) are on the row too.*

### Output

- **Dataset** — one item per LEI record, in three views: *LEI records* (name, LEI, statuses, legal form, country, register number and page, renewal date, BIC, successor and parent LEI), *Group (who owns whom)* (direct and ultimate parent LEIs and the group head's record) and *Changes* (incremental runs: what changed and when). Export as JSON, CSV, Excel, XML or RSS from the dataset page, or add `?format=csv` to the dataset URL.
- **STATS** (key-value store) — records delivered, pages read, the API's own total for the query, the declared identity and pacing, the incremental summary, any throttling.

#### Real-time API (Standby)

The Actor also runs as a **Standby** endpoint: one HTTP call, one page of mapped records, no run to start. Pass the GLEIF list URL you want read (it must be an `https://api.gleif.org/api/v1/lei-records?…` URL; anything else is refused) URL-encoded as `startUrl`, and `maxItems` (up to 200):

```
GET https://rein8--lei-legal-entity-lookup.apify.actor/?maxItems=1&startUrl=https%3A%2F%2Fapi.gleif.org%2Fapi%2Fv1%2Flei-records%3Ffilter%5Blei%5D%3D213800WSGIIZCXF1P572%26include%3Ddirect-parent%2Cultimate-parent
Authorization: Bearer APIFY_TOKEN
```

The answer is `{ "count": 1, "records": [ { …the same fields as a dataset row… } ] }`; one `api-call` event ($0.005) per call. The same rules apply as in a run: sole-proprietor records are filtered out (counted in `filteredOut` — a `startUrl` that asks for `filter[entity.category]=SOLE_PROPRIETOR` returns `count: 0` and is still one call), no street line, licence on every record. A `startUrl` carrying a `fields[…]` (sparse-fieldset) parameter is refused with 403. `GET /health` answers without a charge. A shorthand such as `?lei=…` is not offered: the endpoint reads only `startUrl`, `maxItems` and the optional `register` filter, so that what is read is always visible.

### How much will it cost to get LEI data?

Pay per event, nothing per hour:

| Event | Price | When |
|---|---|---|
| `result` | $0.002 | each LEI record delivered (or a record new to a watch list) |
| `parent` | $0.004 | the ultimate parent's record, for each row that reports a parent (`includeParents`); rows without one cost nothing extra |
| `change` | $0.01 | a watched row that changed since the previous incremental run |
| `api-call` | $0.005 | one Standby HTTP call |

Worked examples: 200 LEIs looked up = one request = **$0.40**; the same with `includeParents` where 60 of them report a parent = $0.40 + 60 × $0.004 = **$0.64**; a weekly watch of 500 counterparties = $1.00 once for the baseline, then $0.01 per change (a quiet week costs nothing); "new LEIs in GB" ≈ 50–60 a day = **about $0.12 a day**; "renewals due in 30 days, GB" ≈ 2,900 rows = **$5.80**. Preview (10 rows) is free; a run that delivers nothing charges nothing beyond Apify's per-run start fee. Filtered-out rows (a sole proprietor, an until-date applied after reading) are never charged.

Apify adds its own **Actor start** event on top of these prices: $0.00005 per GB of run memory, once per run (about $0.0001 at 2 GB, $0.0002 at 4 GB). It is the platform's charge, not this Actor's, and it shows as "Actor start" on your bill.

### Integrations and automation

Schedule a Task (daily for new LEIs, weekly for a watch) and connect the dataset to Google Sheets, Airtable, Slack, Make, Zapier or a webhook from the Integrations tab. The Apify API returns the dataset as JSON or CSV for your own pipelines: `https://api.apify.com/v2/datasets/<datasetId>/items?format=csv`. The Standby endpoint above serves single lookups from any HTTP client.

### Use with AI agents (MCP, Claude, Cursor)

This Actor is a tool on Apify's hosted MCP server. Add it to Claude Desktop, Claude.ai, Cursor, VS Code or ChatGPT with one URL — the server signs you in with OAuth on first connect, so no API token goes into the config:

`https://mcp.apify.com?tools=rein8/lei-legal-entity-lookup`

```json
{ "mcpServers": { "apify": { "type": "http", "url": "https://mcp.apify.com?tools=rein8/lei-legal-entity-lookup" } } }
```

Every input field has a full description and every row carries a `summary` sentence, so an agent can call this Actor through the Apify MCP server and read the result without a schema. Typical asks: "find the LEI and parent group for company number 00445790", "which of these LEIs are lapsed?", "list the LEIs first issued in France this week". The dataset schema documents every field; `.actor/standby-openapi.json` describes the Standby endpoint.

### Where the data comes from — and why it is clean

**Source:** GLEIF — Global LEI Index (Global Legal Entity Identifier Foundation), read through the documented GLEIF API at `api.gleif.org`. GLEIF's Open Data page: "The data on GLEIF's website is provided under a Creative Commons (CC0) license." The LEI Data Terms of Use: "The data available through the Access Service are provided under the CC0 licence, see CC0 1.0 Universal (CC0 1.0)." CC0 1.0 places the data in the public domain: it may be copied, redistributed and used commercially, with no attribution condition — the source and licence are named on every row anyway.

**Attribution line (on every row and in the dataset views):** *Source: GLEIF — Global LEI Index, CC0 1.0. Unofficial: not affiliated with or endorsed by GLEIF.*

**Unofficial:** this Actor is not affiliated with, provided, supported, authorised or endorsed by GLEIF; GLEIF's Terms of Use ask exactly that no such impression be created, and no proprietary right in the LEI data is claimed.

**Clean by construction:** only two API routes are read; the identity is declared on every request; pacing stays under the documented 60 requests a minute; nothing is bypassed. Sole-proprietor LEIs (natural persons) are excluded by a fixed rule and the street line of every address is left out.

### Limits and honest notes

- **Page size 200, 60 requests a minute** are the API's rules: 1,000 rows take about 6 seconds of requests, 100,000 rows about 9 minutes. Each query reads at most 500 pages (100,000 records) — narrow with a country, a status or a date window to go deeper.
- **Lists:** up to 200 LEIs, 200 register numbers or 50 names per run (a longer filter makes an over-long URL). A comma inside a name splits it in two.
- **Register numbers are exact-match** in the register's own format (UK: 8 characters with leading zeros; SIREN: 9 digits). The same number can exist in several registers: add `country` or `jurisdiction`.
- **Parent coverage is partial.** Most entities report a *reporting exception* (non-consolidating, no known person, natural persons) instead of a parent: `directParentLei` / `ultimateParentLei` are then null and no `parent` event is charged. The direct parent's own name needs a second lookup: paste the `directParentLei` column into `leis`.
- **Date windows are closed ranges** on the API. Give both ends; an until-date alone is applied after each page is read and does not shorten the read.
- **A "changed today" bulk feed** (GLEIF's daily golden-copy delta file, about 12,000 records a day) is not part of this version; the watch and the date windows cover the same need on the API. A future bulk variant would read that one file instead of paging.
- **Errors from the API stop the query.** An unknown filter value (a lower-case status, a date without its end) is refused by the API with HTTP 400; the input form checks the spelling of `status`, `country`, `jurisdiction` and `register` before the run starts.
- **Freshness:** the API reflects the Global LEI Index as GLEIF publishes it (updated continuously; the golden copy is cut daily at 08:00 UTC).

### FAQ, Disclaimers, and Support

#### Do I need an API key or an account?

No. The GLEIF API is public and key-less ("There is no charge for the use of GLEIF's LEI data"). You need only an Apify account to run the Actor.

#### Can I use LEI data commercially?

The data is published under CC0 1.0 (public domain dedication), which permits commercial use and redistribution. This README quotes GLEIF's own pages and is not legal advice; read the LEI Data Terms of Use yourself for your use case.

#### Is this an official GLEIF product?

No. Unofficial: not affiliated with, provided, supported, authorised or endorsed by GLEIF. LEI and the GLEIF name are theirs; no proprietary right in the data is claimed.

#### How do I turn UK company numbers or SIRENs into LEIs?

Paste them into *Business-register numbers* (one per line, as the register writes them) and add the country. Each row returns the LEI, its status and the parent LEIs; turn on *Fetch the ultimate parent* for the group head's name. Numbers without an LEI simply return no row — most small companies have no LEI.

#### Which entities are excluded, and why?

Sole-proprietor LEIs (category SOLE\_PROPRIETOR: individuals trading under their own name, often at a home address) are never returned, by a fixed rule with no input to switch it off — and, belt and braces, records whose ISO 20275 legal form is itself a natural person trading — all 51 such forms on the ELF list (4QIE India, OL20 Germany, ZY9X France, 1SL4 Spain, AZA0 Switzerland, 4QXM Netherlands, EQAQ / AREY / XHT1 / 88XU USA, every other "sole proprietorship / sole trader", Einzelunternehmen, eenmanszaak, empresario individual, impresa individuale, enkeltpersonforetak…) — are dropped even if a registrar filed them under another category. The street line of every address is never mapped. No officer, owner or contact field exists in the source record.

#### How do I find a company's LEI by name?

Type the legal name into *Legal names* (a contains-match, case-insensitive: "DANONE" finds DANONE and its funds and subsidiaries whose name contains it). Check the `registeredAs` and `country` columns to pick the right one, or add `country`. A name search never guesses: it returns the index's own matches.

#### Who is the parent company of an LEI?

Every row carries `directParentLei` and `ultimateParentLei` when the entity reports a parent. Turn on *Fetch the ultimate parent* for the group head's name, country and register number; paste `directParentLei` values into `leis` for the direct parent's name. Most entities report an exception instead of a parent (non-consolidating, no known person): both fields are then null and nothing extra is charged.

#### When does an LEI need renewal, and how do I get reminders?

An LEI is renewed yearly; `nextRenewalDate` is the deadline, after which the status becomes LAPSED. Use `renewalDueFrom` / `renewalDueTo` for the renewal-reminder list (Task `lei-renewals-due-30-days`), or the watch on your own LEIs: a renewal moves `nextRenewalDate` a year on and comes back as a change.

#### GDPR and personal data

The output is company-level data about legal entities under the GDPR's meaning of a legal person. Intended use: B2B — KYB and onboarding checks, compliance, market research and monitoring. A registered legal name can still contain a person's name (a partnership, a family trust); if you combine the output with personal data from elsewhere, you are the controller of that processing. Removal requests about a specific row: contact rein8.actors@gmail.com and the row is dropped from future deliveries.

#### Why did an LEI I pasted return no row?

Either the code is not in the index (check it on GLEIF's LEI Search), or the record is a sole proprietor's (excluded), or a filter you left set (country, status, category, a date) does not match it.

#### How do I get only the changes?

Turn on *Only LEIs not delivered before*, save as a Task and schedule it. The first run is the baseline (every row, charged as `result`); every later run returns only new LEIs and rows whose watched fields changed, each with `changes:[{field,from,to}]`, `changedFrom` and `changedAt`, charged as `change`. Use the *Changes* dataset view or filter on `_changed`.

#### How do I export to Google Sheets, CSV or Excel?

From the run's dataset page choose the format, or add `?format=csv` / `?format=xlsx` to the dataset URL; the Google Sheets integration appends each run to a sheet.

#### What does this Actor NOT do?

It does not read GLEIF's full-text or fuzzy-search routes, the golden-copy bulk files, ISIN/BIC mapping files, or any person-level data; it does not renew or register LEIs; it does not guess an LEI from a name (a name search returns the index's matches, which you corroborate against the register number).

### More official-data Actors by rein8

- [UK company search — Companies House monthly data, no API key](https://apify.com/rein8/uk-companies-house-snapshot) — 5.7 M live UK companies by SIC code, postcode, status, incorporation date or overdue accounts; pair its company numbers with this Actor's `registerIds` for LEIs and parent groups.
- [UK company watch](https://apify.com/rein8/uk-company-watch) — paste company numbers, get only the changes each month.
- [France company search — Sirene, SIREN/SIRET, no API key](https://apify.com/rein8/france-company-search) — the official French register; its SIRENs are this Actor's `registerIds` for French entities.
- [UK company accounts data — Companies House accounts, net assets](https://apify.com/rein8/uk-company-financials) — net assets, cash and employees from the accounts UK companies file; join on the company number this Actor returns as `registeredAs`.
- [Public tenders UK & EU](https://apify.com/rein8/public-tenders-uk-eu) — contract awards with the winning suppliers' register numbers, which resolve to LEIs here.
- [SEC Form D funding rounds](https://apify.com/rein8/sec-form-d-funding-rounds) — every private raise filed with the SEC, daily.
- [New business filings by state — Secretary of State data](https://apify.com/rein8/us-state-business-filings) — new LLCs and corporations from state open-data portals; their state file numbers are this Actor's `registerIds` for US entities (RA000602 Delaware, RA000598 California, RA000628 New York).

### Changelog

- **0.2.2 (26 Sep 2026, unpublished)** — two stray empty columns (`_registerUrl`, `_legalFormText`: maintainer notes read as fields) removed from every row.
- **0.1 (26 Sep 2026)** — first version: lookups by LEI, legal name and business-register number; country, jurisdiction, status, entity-status and category filters; last-update, first-issue and next-renewal date windows; parent LEIs on every row; the ultimate parent's record on request; the incremental watch with `changes`; Standby endpoint; CC0 attribution on every row; sole proprietors and street lines excluded. Validation pass the same day: `registerUrl`, `legalFormText`, the `register` filter, the legal-form privacy rules, `fields[…]` refused on the Standby endpoint, strict spelling checks on `status` / `country` / `jurisdiction`, the *Group* view, five more ready-made Tasks.

# Actor input Schema

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

One LEI (20 characters) per line, up to 200 per run: the rows come back in one request. Leave empty to search by name, register number or filters instead.

## `names` (type: `array`):

One legal name per line (up to 50): an exact or partial legal-name match in the index ("TESCO PLC" also finds TESCO PLC PENSION SCHEME). A comma inside a name splits it in two (the API's list separator): leave commas out.

## `registerIds` (type: `array`):

One business-register number per line (up to 200), as the register writes it: a UK company number with leading zeros (00445790 — a bare 445790 finds nothing, GB:445790 does), a French SIREN (552032534), a German HRB number (HRB 32768), a US state file number. A GB: / UK: or FR: prefix is removed and normalised (GB:445790 → 00445790, GB:sc12345 → SC012345; spaces ignored) and narrows the register filter below. Other countries: set the country or the register below.

## `register` (type: `string`):

Keep only records registered in these registers, as GLEIF RA codes separated by commas: RA000585,RA000586,RA000587 = Companies House (England & Wales, Northern Ireland, Scotland), RA000189 = Sirene (France), RA000602 = Delaware Division of Corporations. Applied after reading (the API has no such filter): use it with register numbers or LEIs, not alone.

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

ISO 3166-1 alpha-2 code of the legal address (GB, FR, DE, US…), or several separated by commas (GB,IE).

## `jurisdiction` (type: `string`):

Jurisdiction of formation as GLEIF codes it: a country code (GB, FR) or a country-subdivision code (US-DE for Delaware, CA-ON for Ontario), or several separated by commas.

## `status` (type: `string`):

ISSUED (current), LAPSED (not renewed), RETIRED (entity ceased), ANNULLED, MERGED, DUPLICATE, PENDING\_TRANSFER, PENDING\_ARCHIVAL — one, or several separated by commas (LAPSED,RETIRED), in capitals as written here (the API refuses 'issued'). Leave empty for any status.

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

Whether the legal entity itself is ACTIVE or INACTIVE (dissolved, merged) as recorded in the index. Independent of the LEI registration status above.

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

GENERAL (companies and other legal entities), FUND, BRANCH (a branch of a foreign entity), INTERNATIONAL\_ORGANIZATION, RESIDENT\_GOVERNMENT\_ENTITY. Leave empty for all five. Sole-proprietor LEIs (natural persons) are never returned.

## `updatedSince` (type: `string`):

YYYY-MM-DD: only LEI records whose last update (a new registration, a renewal, a status or parent change) is on or after this date. With a country and a daily schedule this is the feed of new and changed LEIs; with status LAPSED, the LEIs that lapsed recently.

## `updatedUntil` (type: `string`):

YYYY-MM-DD: the end of the last-update window (inclusive). Give 'updated on or after' too: on its own this filter is applied after reading each page, so a broad search reads pages up to Max rows.

## `registeredSince` (type: `string`):

YYYY-MM-DD: only LEIs first registered on or after this date (registration.initialRegistrationDate) — the list of NEW legal entities in the index. With a country and a daily schedule plus 'Only LEIs not delivered before', a feed of new LEIs.

## `registeredUntil` (type: `string`):

YYYY-MM-DD: the end of the first-registration window (inclusive). Give 'first issued on or after' too, or the filter is applied after reading each page.

## `renewalDueFrom` (type: `string`):

YYYY-MM-DD: only LEIs whose next renewal date (registration.nextRenewalDate) is on or after this date. With 'Renewal due on or before' 30 days later and status ISSUED: the LEIs about to lapse — renewal-reminder and KYB refresh lists.

## `renewalDueTo` (type: `string`):

YYYY-MM-DD: the end of the renewal-due window (inclusive). Give 'due on or after' too, or the filter is applied after reading each page.

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

Every row already carries the direct and ultimate parent LEIs when a parent is reported (no extra charge). On, the ultimate parent's own record is fetched — name, country, jurisdiction, category, register number, status — one request per entity that reports a parent, charged as a 'parent' event ($0.004). Entities without a reported parent cost nothing extra.

## `maxItems` (type: `integer`):

Maximum number of LEI records delivered in total; only delivered rows are charged. Each query reads at most 100,000 records (500 pages of 200).

## `incremental` (type: `boolean`):

Remember which LEIs were delivered (per 'State key') and return only new ones or those whose WATCHED fields changed: registration status, entity status, legal name, next renewal date, successor, direct or ultimate parent. A changed row comes back with changes:\[{field,from,to}] and is charged as a 'change' event ($0.01). Save the input as a Task and schedule it: the first run is the baseline, every later run only the changes.

## `watchFields` (type: `array`):

Narrow what counts as a change for this run. Empty = all seven watched fields.

## `stateKey` (type: `string`):

Name of the memory used by 'Only LEIs not delivered before'. Left as 'default', every saved Task gets its own memory automatically (a run started by hand remembers per set of filters). Type a name to share one memory between schedules on purpose.

## `allowStateFallback` (type: `boolean`):

Off (default): an incremental run whose memory cannot be opened stops before any charge. On: it runs as a one-off and delivers everything again.

## `preview` (type: `boolean`):

Return 10 LEI records without any charge, to check the output format.

## Actor input object example

```json
{
  "leis": [
    "HWUPKR0MPOU8FGXBT394",
    "7ZW8QJWVPR4P1J1KQY45",
    "213800WSGIIZCXF1P572",
    "2138002P5RNKC5W2JZ46",
    "969500KMUQ2B6CBAF162"
  ],
  "includeParents": false,
  "maxItems": 1000,
  "incremental": false,
  "stateKey": "default",
  "allowStateFallback": false,
  "preview": false
}
```

# Actor output Schema

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

One item per LEI record. Add ?format=csv or ?format=xlsx to the URL for other formats.

## `stats` (type: `string`):

Counts, pages read, the declared identity and pacing, the incremental summary and any errors.

# 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": [
        "HWUPKR0MPOU8FGXBT394",
        "7ZW8QJWVPR4P1J1KQY45",
        "213800WSGIIZCXF1P572",
        "2138002P5RNKC5W2JZ46",
        "969500KMUQ2B6CBAF162"
    ],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("rein8/lei-legal-entity-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": [
        "HWUPKR0MPOU8FGXBT394",
        "7ZW8QJWVPR4P1J1KQY45",
        "213800WSGIIZCXF1P572",
        "2138002P5RNKC5W2JZ46",
        "969500KMUQ2B6CBAF162",
    ],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("rein8/lei-legal-entity-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": [
    "HWUPKR0MPOU8FGXBT394",
    "7ZW8QJWVPR4P1J1KQY45",
    "213800WSGIIZCXF1P572",
    "2138002P5RNKC5W2JZ46",
    "969500KMUQ2B6CBAF162"
  ],
  "maxItems": 1000
}' |
apify call rein8/lei-legal-entity-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rein8/lei-legal-entity-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/rHU8CfO4VamTE5YOa/builds/ISlqdXRdImJZaehPy/openapi.json
