# LEI Lookup & GLEIF API Scraper: Legal Entity Search (`mrslm_data/gleif-lei-companies`) Actor

Find legal entities in the GLEIF index by name, LEI code or country, with legal names, registration details, addresses and reported parent links.

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

## Pricing

from $1.20 / 1,000 companies

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 Scraper: Legal Entity Search

**Search 2.5M+ legal entities in the global LEI index by name, country or LEI: legal name, legal form, registry ID, addresses, parent and ultimate parent. $1.50 per 1,000 companies.**

The Legal Entity Identifier (LEI) is the global ID that banks, regulators and trading venues use for companies. The GLEIF index covers more than 2.5 million entities in 200+ countries, with the official legal name, the company-registry ID and, for many, who owns them.

### Quick start

1. Press **Start**. The form is already filled with this example input, so the first run returns real rows in under a minute:

```json
{
  "searchTerms": [
    "Siemens Energy"
  ],
  "countries": [
    "DE"
  ],
  "maxResults": 20
}
```

2. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
3. Download the results as JSON, CSV or Excel from the **Output** tab, or schedule the run to repeat.

**Full guide: How to Look Up LEI Codes and Find Newly Registered Companies in the GLEIF Database (Real Runs: Ireland and Three Global Banks)**

### What the GLEIF LEI Company Search Actor does

The Actor reads GLEIF's public API, the same data behind search.gleif.org. You can find entities in three ways, and combine them in one run:

1. **By LEI code**: paste exact 20-character codes, and the Actor looks them up in batches of 100.
2. **By name**: full-text search on legal and other names, for example `Siemens` or `Brookfield`, optionally limited to countries.
3. **By country and date**: every entity whose legal address is in a country, optionally only those that got their LEI in the last N days. This is how you build a "new entities" feed.

Each entity becomes one row with the LEI, legal name and other names, entity status and category, legal form (code and name), jurisdiction, the local registration number and the GLEIF code of the register it is in, the date the entity was created, legal and headquarters addresses, LEI status, issue, last update and next renewal dates, corroboration level, the managing LEI issuer, BIC codes, successor LEI and expiration reason, the direct and ultimate parent (when reported), and a link to the record on search.gleif.org.

The LEI database also holds sole proprietors, who are natural persons. The Actor skips those records and logs how many it skipped, so the output contains only companies, funds and other legal entities.

### Who it is for

- **KYC, onboarding and compliance teams** who need to verify a counterparty's legal name, registration number, address and parent from an official source.
- **Banks, brokers and fund administrators** who check LEI status and renewal dates for regulatory reporting.
- **Sales teams that sell to finance**: a new LEI often means a new fund, SPV or company that is about to trade, borrow or issue.
- **Data teams** who enrich a CRM with LEIs, BICs and parent links, or match company names to a global ID.
- **Researchers and journalists** who map corporate groups or track new fund launches by country.

### Real example 1: every Irish entity that got its LEI in the last 30 days

Ireland is home to many funds, aircraft leasing companies and securitisation vehicles, so its LEI feed shows a lot of financial activity. The goal: list Irish entities that received an LEI in the last 30 days, newest first, with parents.

#### Step 1: Enter the input

Open the [GLEIF LEI Company Search](https://apify.com/mrslm_data/gleif-lei-companies) in Apify Console, switch the input form to **JSON** and paste:

```json
{
    "countries": [
        "IE"
    ],
    "registeredWithinDays": 30,
    "activeOnly": true,
    "includeParents": true,
    "newestFirst": true,
    "maxResults": 25
}
```

What each setting does:

- `countries`: ISO 2-letter codes of the **legal address** country. `IE` is Ireland; you can list several, for example `["IE", "LU"]`.
- `registeredWithinDays`: `30` keeps only entities whose LEI was first issued in the last 30 days. 0 means any date.
- `activeOnly`: `true` (the default) skips entities marked inactive, for example dissolved or merged ones.
- `includeParents`: `true` (the default) adds the direct and ultimate accounting parent (LEI, name and country). It costs two extra API calls per entity, so runs are slower.
- `newestFirst`: `true` (the default) sorts by LEI issue date, newest first.
- `maxResults`: `25` stops after 25 entities, which also caps the cost.

The other inputs:

- `searchTerms`: names to search, one per line. With `countries`, each search is limited to those countries.
- `leis`: exact LEI codes to look up (example 2).
- `maxResultsPerSearch`: a cap per search term. 0 means no cap.

#### Step 2: Run it

Press **Start**. The run finished with status `SUCCEEDED` and saved 25 entities, charged as 25 `company` events plus the start event: $0.0376 on the Free/Bronze tier. It took about 230 seconds, most of it the parent lookups. With `includeParents` off, the same run needs far fewer API calls.

#### Step 3: Read the output

All 25 rows, cut to the most useful columns:

| legalName | legalForm | category | city | entityCreationDate | leiIssuedDate | corroborationLevel |
|---|---|---|---|---|---|---|
| Seven Horizons Limited Partnership | Limited Partnership | GENERAL | Dublin 6 | 2026-06-12 | 2026-10-30 | FULLY_CORROBORATED |
| STAR STONE PROPERTY INVESTMENT FUND 1 LIMITED PART | Limited Partnership | GENERAL | Dublin | 2021-09-15 | 2026-10-30 | FULLY_CORROBORATED |
| GREEN SPARROW 9 LIMITED | Private Company Limited by Shares | GENERAL | Dublin | 2026-09-21 | 2026-10-30 | FULLY_CORROBORATED |
| GOURYELLA LIMITED | Private Company Limited by Shares | GENERAL | DUBLIN | 2023-12-07 | 2026-10-30 | FULLY_CORROBORATED |
| MARSHALL CAPITAL HOLDINGS LIMITED | Private Company Limited by Shares | GENERAL | DUBLIN | 2025-08-27 | 2026-10-30 | FULLY_CORROBORATED |
| VANTAGE AVIATION FUNDING DESIGNATED ACTIVITY COMPA | Designated Activity Company | GENERAL | Dublin | 2026-09-02 | 2026-10-29 | FULLY_CORROBORATED |
| FILLMORE CORPORATION LIMITED | Private Company Limited by Shares | GENERAL | CORK | 2026-10-01 | 2026-10-29 | FULLY_CORROBORATED |
| NUVEEN GLOBAL EQUITY FUND | SUB-FUND | FUND | DUBLIN | 2026-10-23 | 2026-10-29 | ENTITY_SUPPLIED_ONLY |
| TEMGAR LIMITED | Private Company Limited by Shares | GENERAL | DUBLIN | 2020-08-07 | 2026-10-29 | FULLY_CORROBORATED |
| DONPAK PACKAGING LIMITED | Private Company Limited by Shares | GENERAL | BANDON, CORK, Ireland | 2012-09-18 | 2026-10-29 | FULLY_CORROBORATED |
| FINNAUN WINDFARM LIMITED | Private Company Limited by Shares | GENERAL | Cork | 2025-06-18 | 2026-10-29 | FULLY_CORROBORATED |
| EPONA AVIATION 1 LIMITED | Private Company Limited by Shares | GENERAL | Dublin | 2026-10-08 | 2026-10-29 | FULLY_CORROBORATED |
| KKR ROSELLA FUND I DESIGNATED ACTIVITY COMPANY | Designated Activity Company | GENERAL | Dublin | 2026-10-16 | 2026-10-28 | FULLY_CORROBORATED |
| MCMAHON & CARROLL CONSTRUCTION KILLARNEY LIMITED | Private Company Limited by Shares | GENERAL | Killarney | 2023-10-18 | 2026-10-28 | FULLY_CORROBORATED |
| APPLEWOOD FINANCIAL LIMITED | Private Company Limited by Shares | GENERAL | Celbridge | 2023-04-19 | 2026-10-28 | FULLY_CORROBORATED |
| OHA EURO CREDIT FUNDING WAREHOUSE A DESIGNATED ACT | Designated Activity Company | GENERAL | Dublin | 2026-10-08 | 2026-10-28 | FULLY_CORROBORATED |
| iShares Robotics & Physical AI Active UCITS ETF | Undertakings for Collective Investment i | FUND | Dublin | 2026-10-27 | 2026-10-28 | ENTITY_SUPPLIED_ONLY |
| DESINO LIMITED | Private Company Limited by Shares | GENERAL | BALBRIGGAN | 2016-03-03 | 2026-10-28 | FULLY_CORROBORATED |
| MARNS ADVISORY LIMITED | Private Company Limited by Shares | GENERAL | Fenor | 2025-11-26 | 2026-10-28 | FULLY_CORROBORATED |
| AMUNDI MSCI WORLD SMALL CAP UCITS ETF | SUB FUND | FUND | DUBLIN | 2026-10-23 | 2026-10-28 | ENTITY_SUPPLIED_ONLY |
| AMUNDI MSCI HARDWARE UCITS ETF | SUB FUND | FUND | DUBLIN | 2026-07-08 | 2026-10-28 | ENTITY_SUPPLIED_ONLY |
| SUNRISE STRATEGIES LIMITED | Private Company Limited by Shares | GENERAL | Dublin | 2025-08-28 | 2026-10-27 | FULLY_CORROBORATED |
| NQC IRELAND LIMITED | Private Company Limited by Shares | GENERAL | Dublin 17 | 2026-10-09 | 2026-10-27 | FULLY_CORROBORATED |
| Holtend Limited | Private Company Limited by Shares | GENERAL | Dublin | 2012-08-17 | 2026-10-27 | FULLY_CORROBORATED |
| SMOKE SIGNALS LIMITED | Private Company Limited by Shares | GENERAL | BLESSINGTON, WICKLOW, IRELAND | 2010-09-13 | 2026-10-27 | FULLY_CORROBORATED |

One full row as JSON:

```json
{
    "lei": "984500F07BB3B3AEA587",
    "legalName": "Seven Horizons Limited Partnership",
    "otherNames": [],
    "entityStatus": "ACTIVE",
    "category": "GENERAL",
    "legalFormCode": "HNJK",
    "legalForm": "Limited Partnership",
    "jurisdiction": "IE",
    "registeredAs": "LP4147",
    "registrationAuthorityId": "RA000402",
    "entityCreationDate": "2026-06-12",
    "legalAddress": {
        "street": "Westmoreland House, Wesmoreland Park, Ranelagh",
        "city": "Dublin 6",
        "region": "IE-D",
        "postalCode": "D06 RX46",
        "country": "IE"
    },
    "headquartersAddress": {
        "street": "Westmoreland House, Wesmoreland Park, Ranelagh",
        "city": "Dublin 6",
        "region": "IE-D",
        "postalCode": "D06 RX46",
        "country": "IE"
    },
    "country": "IE",
    "city": "Dublin 6",
    "leiStatus": "ISSUED",
    "leiIssuedDate": "2026-10-30",
    "leiLastUpdate": "2026-10-30",
    "leiNextRenewal": "2027-10-30",
    "corroborationLevel": "FULLY_CORROBORATED",
    "managingLou": "529900T8BM49AURSDO55",
    "bic": [],
    "successorLei": null,
    "expirationReason": null,
    "directParent": null,
    "ultimateParent": null,
    "gleifUrl": "https://search.gleif.org/#/record/984500F07BB3B3AEA587"
}
```

What the 25 rows show:

- **All 25 LEIs were issued between 27 and 30 October 2026**, the newest first. Irish entities receive LEIs every day, so 25 rows cover only the last four days of the 30-day window. Raise `maxResults` to get the whole month.
- **A new LEI is not always a new company.** 12 of the 25 entities were created in 2026, such as Seven Horizons Limited Partnership (created 12 June 2026) and several funds and designated activity companies set up in October. But 9 were created before 2025, for example Smoke Signals Limited (2010) and Donpak Packaging Limited (2012): established companies that only now needed an LEI. Use `entityCreationDate` to tell them apart.
- **The mix of legal forms:**
- Private Company Limited by Shares: 16
- Designated Activity Company: 3
- SUB-FUND: 3
- Limited Partnership: 2
- Undertakings for Collective Investment in Transferable Securities (UCITS): 1
- **Funds are a big share.** The iShares Robotics & Physical AI Active UCITS ETF, two Amundi MSCI UCITS ETFs and the Nuveen Global Equity Fund are category `FUND`, plus funding and warehouse vehicles such as KKR Rosella Fund I DAC and OHA Euro Credit Funding Warehouse A DAC.
- **Corroboration differs.** 21 of 25 are `FULLY_CORROBORATED`: the LEI issuer checked the data against the Companies Registration Office (`registrationAuthorityId` RA000402). The 4 funds are `ENTITY_SUPPLIED_ONLY`, with register RA999999 (no register available), which marks entities that are not in a company register, as is common for funds.
- **No parents were reported.** `directParent` and `ultimateParent` are null in all 25 rows. GLEIF has parent data only when the entity reports a consolidating parent. New entities often report it later or report an exception instead, so do not read null as "independent".
- **Addresses are as filed.** City spellings vary ("DUBLIN", "Dublin", "Dublin 6", "BANDON, CORK, Ireland"). Normalise `city` before grouping.

### Real example 2: look up LEI codes in bulk

If you already have LEI codes, for example from trade reports, a fund prospectus or a client list, paste them into `leis`. This run looked up three:

```json
{
    "leis": [
        "HWUPKR0MPOU8FGXBT394",
        "8I5DZWZKVSZI1NUHU748",
        "7LTWFZYICNSX8D621K86"
    ],
    "includeParents": true
}
```

It finished in about 15 seconds and was charged 3 `company` events plus the start event: $0.0046.

| lei | legalName | legalForm | jurisdiction | city | hq city | BICs |
|---|---|---|---|---|---|---|
| HWUPKR0MPOU8FGXBT394 | Apple Inc. | For-Profit Corporation General Stock | US-CA | Glendale | Cupertino | 1 |
| 8I5DZWZKVSZI1NUHU748 | JPMORGAN CHASE & CO. | Corporation | US-DE | WILMINGTON | NEW YORK | 1 |
| 7LTWFZYICNSX8D621K86 | DEUTSCHE BANK AKTIENGESELLSCHAFT | Aktiengesellschaft | DE | Frankfurt am Main | Frankfurt am Main | 72 |

What these show:

- **Legal and head office addresses can differ.** Apple Inc.'s legal address is its registered agent, C/O C T Corporation System, 330 N. Brand Blvd, Glendale, while its headquarters address is One Apple Park Way, Cupertino. Use `headquartersAddress` for where a company operates and `legalAddress` for where it is registered.
- **Other names keep history.** Apple's `otherNames` is "Apple Computer, Inc.", its name until 2007.
- **BIC codes come with the LEI.** Apple has one BIC (APLEUS66XXX); Deutsche Bank has 72 mapped to its LEI. That makes the Actor useful for LEI-to-BIC matching.
- **Big groups are top parents.** Parents are null for all three: they are top-level entities with no consolidating parent above them. For a subsidiary, the direct and ultimate parent fields hold the parent's LEI, name and country when reported.
- **The LEIs date from 2012**, the year the global LEI system started, and all three are `ISSUED` with a next renewal date in 2027.
- **Direct lookups ignore filters.** When you ask for exact LEIs, the Actor returns them even if they are inactive or outside your date window.

### Output fields

| Field | What it means | Example |
|---|---|---|
| `lei` | The 20-character LEI. | 984500F07BB3B3AEA587 |
| `legalName / otherNames` | Legal name and other or former names. | Apple Inc. / \["Apple Computer, Inc."] |
| `entityStatus` | ACTIVE or INACTIVE. | ACTIVE |
| `category` | GENERAL, FUND, BRANCH and so on. | GENERAL |
| `legalFormCode / legalForm` | ISO 20275 legal form code and its name. | HNJK / Limited Partnership |
| `jurisdiction` | Jurisdiction of the legal form. | IE, US-CA |
| `registeredAs / registrationAuthorityId` | Number in the local register and the GLEIF code for that register. | LP4147 / RA000402 |
| `entityCreationDate` | When the entity was created. | 2026-06-12 |
| `legalAddress / headquartersAddress` | street, city, region, postalCode, country. | Dublin 6, IE |
| `country / city` | Legal address country and city, for easy filtering. | IE / Dublin 6 |
| `leiStatus` | ISSUED, LAPSED (not renewed), RETIRED and so on. | ISSUED |
| `leiIssuedDate / leiLastUpdate / leiNextRenewal` | LEI dates. | 2026-10-30 / … / 2027-10-30 |
| `corroborationLevel` | How the data was checked. | FULLY_CORROBORATED |
| `managingLou` | LEI of the issuer that manages the record. | 529900T8BM49AURSDO55 |
| `bic` | BIC codes mapped to the LEI. | \["APLEUS66XXX"] |
| `successorLei / expirationReason` | For merged or dissolved entities. | null |
| `directParent / ultimateParent` | LEI, name and country of the parent, when reported and includeParents is on. | null |
| `gleifUrl` | The record on search.gleif.org. | https://search.gleif.org/#/record/… |
| `scrapedAt` | When the row was read. | 2026-10-30T23:16:43.387Z |

A tip on `leiStatus`: `LAPSED` means the entity did not renew. Many lapsed LEIs belong to entities that still exist, but a lapsed LEI cannot be used for regulatory reporting, so it is worth flagging in a KYC check.

### Export LEI records to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format without code.

**From Apify Console.** Open the run, go to the **Output** tab and click **Export**. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS, and tick only the columns you want. Nested values such as lists and objects are flattened into columns like `name/0` or `object/field` in CSV and Excel.

**From a URL.** The same export is a plain HTTPS link. Replace `<DATASET_ID>` with the dataset ID shown on the run's **Storage** tab:

```bash
## CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=lei,legalName,legalForm,country,city,entityCreationDate,leiIssuedDate,leiStatus,leiNextRenewal,corroborationLevel,gleifUrl" -o gleif-lei.csv

## Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o gleif-lei.xlsx
```

**Into Google Sheets.** Three options, from simplest to most automatic:

1. **One-off:** download the CSV and use **File > Import > Upload** in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
2. **Automatic, no code:** use Make, Zapier or n8n as described in the next section, ending in a Google Sheets "Add row" step.
3. **Formula:** `=IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>")` always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

### Use it from Make, Zapier or n8n

All three automation tools have an official Apify app, so you can run this Actor and pass its rows on without writing code.

1. **Trigger.** Use a schedule in the automation tool, or Apify's "Watch Actor runs" / "Watch task runs" trigger if you already schedule the task in Apify.
2. **Run.** Add the Apify "Run Actor" (or "Run task") action, choose `mrslm_data/gleif-lei-companies` and paste the JSON input from Step 1. Turn on "wait for finish" so the next step gets the data.
3. **Get the rows.** Add "Get dataset items" and map the run's default dataset ID from the previous step.
4. **Send them on.** Add a Google Sheets "Add row" step for a new-funds tracker, a CRM step that writes the LEI, legal name and registration number onto an account, or a Slack message for every new LEI in your countries.

Each module only moves data; the Actor's pricing is the same as when you run it in Console.

### Schedule a daily new-LEI feed

Set `registeredWithinDays` to 1 or 2 and the countries you care about, and run it each morning. Each run returns the entities that got an LEI in that window; remove repeats by `lei` if the windows overlap. Turn `includeParents` off for faster daily runs.

1. In the Actor's input form, set up the input from Step 1 and click **Save as new task**. Give it a clear name such as `gleif-new-leis-daily`.
2. Go to **Schedules > Create new**, set the cron expression to `0 7 * * *` and pick your timezone, so it runs at 7 AM every day.
3. Add the task to the schedule and save. Each run gets its own fresh dataset.
4. Optional: on the task's **Integrations** tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: `https://api.apify.com/v2/actor-tasks/<USERNAME>~gleif-new-leis-daily/runs/last/dataset/items?status=SUCCEEDED&format=json`.

### Call it from the API (Python, JavaScript or curl)

Start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called `APIFY_TOKEN` rather than in the code.

**Python** (`pip install "apify-client>=3"`):

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
    "leis": [
        "HWUPKR0MPOU8FGXBT394",
        "8I5DZWZKVSZI1NUHU748",
        "7LTWFZYICNSX8D621K86"
    ],
    "includeParents": true
}

run = client.actor("mrslm_data/gleif-lei-companies").call(run_input=run_input)

## apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["lei"], item["legalName"], item["leiStatus"], item["leiNextRenewal"])
```

In apify-client 3.x, `call()` returns a typed object. Older examples that use `run["defaultDatasetId"]` were written for 1.x and 2.x and fail in 3.x with `TypeError: 'Run' object is not subscriptable`.

**JavaScript / Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
    "leis": [
        "HWUPKR0MPOU8FGXBT394",
        "8I5DZWZKVSZI1NUHU748",
        "7LTWFZYICNSX8D621K86"
    ],
    "includeParents": true
};

const run = await client.actor('mrslm_data/gleif-lei-companies').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0].legalName);
```

**curl**, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

```bash
curl -X POST "https://api.apify.com/v2/acts/mrslm_data~gleif-lei-companies/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"leis": ["HWUPKR0MPOU8FGXBT394", "8I5DZWZKVSZI1NUHU748", "7LTWFZYICNSX8D621K86"], "includeParents": true}' -o gleif-lei.csv
```

### Use it from AI agents and chat assistants (MCP)

Apify runs a hosted Model Context Protocol (MCP) server, so assistants such as Claude Desktop, Cursor, VS Code or any other MCP client can call this Actor as a tool. Add this server URL to your MCP client and sign in with your Apify account (or send your API token as a Bearer header):

```
https://mcp.apify.com/?tools=mrslm_data/gleif-lei-companies
```

The assistant then sees the Actor's input fields, can start a run with the input it builds from your request, and reads the dataset rows back. A prompt like this works well:

> Using GLEIF, look up the LEI, legal form, headquarters address and ultimate parent of Deutsche Bank AG.

Runs started through MCP are billed exactly like any other run, per row saved, so it is worth asking the assistant to set `maxResults`.

### What it costs

The Actor uses pay-per-event pricing: one `company` event per entity saved. Sole proprietors that are skipped, parent lookups and searches with no matches cost nothing beyond the start fee.

#### Price per event

| Event (per 1,000) | Free / Bronze | Silver | Gold / Platinum / Diamond |
|---|---|---|---|
| Company saved (`company`) | $1.50 | $1.35 | $1.20 |
| Actor start (once per run at the default memory, not per 1,000) | $0.00005 | $0.00005 | $0.00005 |

You are charged only for the events in this table: nothing for compute, and nothing for searches that return no rows beyond the start fee.

| Scenario | Free / Bronze | Silver | Gold |
|---|---|---|---|
| Example 1: 25 new Irish LEIs | $0.0376 | $0.0338 | $0.0301 |
| Example 2: 3 LEI lookups | $0.0046 | $0.0041 | $0.0037 |
| Monthly KYC check of 2,000 counterparty LEIs | $3.00 | $2.70 | $2.40 |
| Daily new-LEI feed, ~40 entities a day (30 runs a month) | $1.80 | $1.62 | $1.44 |

The last two rows are estimates; your counts depend on the codes and countries you choose. To cap spending, set **Maximum cost per run** in the run options (or `maxTotalChargeUsd` in the API), or use `maxResults`.

### Tips

- **Turn `includeParents` off when you do not need parents.** Each entity then needs no extra calls, so large runs finish much faster. The price is the same either way.
- **Search by name with a country.** A name like `Brookfield` matches hundreds of entities worldwide; `countries: ["CA"]` narrows it.
- **Use `maxResultsPerSearch`** when you search many names, so one common name does not use up `maxResults`.
- **Check `leiStatus` and `leiNextRenewal`** in KYC flows: a lapsed or soon-to-lapse LEI is a reporting risk.
- **Join on `registeredAs`** to link an LEI to a national register record, such as a Companies House or Irish CRO number.
- **For company details beyond the LEI**, such as officers or financials, use a national register Actor, for example [Norway Company Registry](https://apify.com/mrslm_data/norway-company-registry) or [Estonia Company Registry](https://apify.com/mrslm_data/estonia-company-registry).

### Limits

- Only entities that have an LEI. Most small companies never need one.
- A name or country search reads at most 50 pages of up to 200 records each, so very broad searches are cut off. Narrow them with a country or date window.
- Parent data is only as good as what entities report; many have none.
- Sole proprietors are skipped on purpose.
- The data is what GLEIF publishes; corrections must go through the entity's LEI issuer.

### FAQ

**Where does the data come from?**
From GLEIF's free public API, which publishes every LEI record and its reported parents.

**Do I need a GLEIF account or API key?**
No. The data is open and needs no key.

**Is this the official LEI data?**
Yes, it is GLEIF's own record, the global source the LEI issuers feed into.

**Can I find newly registered companies with it?**
You can find entities that newly received an LEI. Check `entityCreationDate` to see if the entity itself is new; in example 1, 9 of 25 were created years earlier.

**Does it include people?**
No. Sole-proprietor records, which are natural persons, are skipped and counted in the log.

**How many LEIs can I look up at once?**
As many as you like; they are looked up in batches of 100.

**Why are the parent fields null?**
Either the entity reported no parent (often with an exception reason), or `includeParents` was off. Top-level groups such as Apple have no parent.

**Does it work with Make, Zapier or n8n?**
Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows on.

**Can AI agents use it?**
Yes, through Apify's MCP server at `https://mcp.apify.com/?tools=mrslm_data/gleif-lei-companies`, as shown above.

### Is it legal?

This Actor only reads official open-data APIs that the publisher offers to everyone without a login or key. It obeys robots.txt, stays under the published rate limits, and never tries to get past logins, paywalls, captchas or bot checks. Sole proprietors (natural persons who hold an LEI) are skipped, so every row is a company, fund, government body or other legal entity. You are responsible for how you use the data: follow the source's licence and terms and the privacy and marketing laws that apply to you (GDPR, CAN-SPAM, PECR, etc.). This tool is independent and not affiliated with or endorsed by the data publisher.

# Actor input Schema

## `searchTerms` (type: `array`):

Full-text search on legal and other names. One per line. Leave everything empty to run the example search (Siemens Energy in DE, 20 entities).

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

Look up exact 20-character LEI codes (batches of 100 per request).

## `countries` (type: `array`):

ISO 2-letter country codes of the legal address, e.g. DE, GB, US. Combine with names or use alone with a date window.

## `registeredWithinDays` (type: `integer`):

Only entities that got their LEI in the last N days: a feed of newly registered companies. 0 = any date.

## `activeOnly` (type: `boolean`):

Skip entities marked inactive (dissolved, merged, etc.).

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

Add the direct and ultimate accounting parent (LEI, name, country). Costs extra API calls, so runs are slower.

## `newestFirst` (type: `boolean`):

Sort by LEI registration date, newest first.

## `maxResultsPerSearch` (type: `integer`):

Cap per search term (or per source). 0 = no cap.

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

Safety cap on saved companies across the whole run. 0 = no cap. Your max cost per run is always respected.

## Actor input object example

```json
{
  "searchTerms": [
    "Siemens Energy"
  ],
  "countries": [
    "DE"
  ],
  "registeredWithinDays": 0,
  "activeOnly": true,
  "includeParents": true,
  "newestFirst": true,
  "maxResultsPerSearch": 0,
  "maxResults": 20
}
```

# Actor output Schema

## `results` (type: `string`):

All companies as a dataset (JSON, CSV, Excel and more via the API or Console).

## `summary` (type: `string`):

Matches and saved rows per search, failures and the stop reason.

# 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 = {
    "searchTerms": [
        "Siemens Energy"
    ],
    "countries": [
        "DE"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrslm_data/gleif-lei-companies").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 = {
    "searchTerms": ["Siemens Energy"],
    "countries": ["DE"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("mrslm_data/gleif-lei-companies").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 '{
  "searchTerms": [
    "Siemens Energy"
  ],
  "countries": [
    "DE"
  ],
  "maxResults": 20
}' |
apify call mrslm_data/gleif-lei-companies --silent --output-dataset

```

## MCP server setup

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

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/8cWq2Lum0wGzFvY4N/builds/cl7IAb7MGBxZhSLPB/openapi.json
