# GLEIF LEI Lookup & Company LEI Search - Bulk, $1 per 1,000 (`pennydata/lei-company-lookup-bulk`) Actor

LEI lookup in bulk from the GLEIF index: find the LEI for a company by name, or look up an LEI code. Returns legal name, status, jurisdiction, legal form, addresses, registration ID and parent LEI. No API key. $1 per 1,000 records, no-match inputs free.

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

## Pricing

from $0.70 / 1,000 company record returneds

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 Bulk: Company Search by Name or LEI (GLEIF)

Look up legal entities in bulk by company name or 20-character LEI and get flat rows: legal name, status, jurisdiction, legal form, legal and headquarters address, registration authority and ID, direct parent LEI and next renewal date. You are charged only for records that are returned; names with no match, invalid LEIs and failed requests are free. Built with AI assistance (Claude); maintained by the publisher. Not affiliated with, endorsed by or sponsored by GLEIF.

### Quickstart (one API call)

```bash
curl -X POST "https://api.apify.com/v2/acts/pennydata~lei-company-lookup-bulk/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"names":["Apple Inc."],"maxPerName":3}'
```

Or open the Actor in the Console and click **Start**: the prefilled input (one name, `Apple Inc.`) runs as-is. Store page: https://apify.com/pennydata/lei-company-lookup-bulk

### Try it (no code)

Open the [Store page](https://apify.com/pennydata/lei-company-lookup-bulk) and click **Try for free**. The input form opens with the schema prefill (`names`: `Apple Inc.`, `maxPerName`: 3), so **Start** runs as-is. There is no URL parameter that pre-fills custom input; type your own names into **names** instead.

Sample output of a real local run (2026-10-22) with `{"names":["Apple Inc.","Microsoft Corporation","Tesla, Inc."],"maxPerName":1}`, 3 rows:

| lei | legalName | jurisdiction | registrationStatus | nextRenewalDate |
|---|---|---|---|---|
| HWUPKR0MPOU8FGXBT394 | Apple Inc. | US-CA | ISSUED | 2027-03-08 |
| INR2EJN1ERAN0W5ZP974 | MICROSOFT CORPORATION | US-WA | ISSUED | 2027-05-04 |
| 54930043XZGB27CTOV49 | TESLA, INC. | US-TX | ISSUED | 2027-05-14 |

### Input

| field | meaning |
|---|---|
| `names` | Company names to search (one list entry each). Up to `maxPerName` records per name. |
| `leis` | 20-character LEIs to fetch directly. |
| `country` | Optional ISO country code of the legal address (e.g. `US`, `DE`). |
| `status` | Optional `ACTIVE` or `INACTIVE`. |
| `fuzzy` | `true` = GLEIF fuzzy matching, tolerates typos and near-misses. Default `false`. |
| `maxPerName` | Max records per name, 1-50. Default 3. |
| `query`, `queries`, `companyNames` | Aliases for `names` (a single string / a list), for drop-in use from other LEI actors. |
| `lei` | Alias for `leis` (a list or a single string). |
| `maxResults` | Alias for `maxPerName`; wins if both are set. |

Use `names`, `leis` or both. Every row has a `matchedInput` field naming the name or LEI that produced it. Duplicate LEIs are returned once.

### Output

One row per legal entity:

```json
{
  "lei": "HWUPKR0MPOU8FGXBT394",
  "legalName": "Apple Inc.",
  "jurisdiction": "US-CA",
  "legalForm": "H1UM",
  "status": "ACTIVE",
  "legalAddress": { "lines": ["C/O C T Corporation System", "330 N. Brand Blvd", "Suite 700"], "city": "Glendale", "region": "US-CA", "country": "US", "postalCode": "91203" },
  "hqAddress": { "lines": ["One Apple Park Way"], "city": "Cupertino", "region": "US-CA", "country": "US", "postalCode": "95014" },
  "registrationAuthority": "RA000598",
  "registrationId": "806592",
  "directParentLei": null,
  "nextRenewal": "2027-03-08T17:27:20Z",
  "renewalStatus": "ISSUED",
  "daysUntilRenewal": 138,
  "matchedInput": "Apple Inc."
}
```

`renewalStatus` is the GLEIF registration status (`ISSUED`, `LAPSED`, ...). `daysUntilRenewal` is the whole days from today to `nextRenewal` (negative when overdue, `null` if unknown). `directParentLei` is `null` when GLEIF holds no direct-parent relationship for the entity (it may carry a reporting exception instead). `legalForm` is the ISO 20275 entity legal form code.

### Pricing

Pay per event, no subscription. **$1 per 1,000 records ($0.001 per record).**

| Event | When it is charged | Price |
|---|---|---|
| `company-row` | One legal entity record was returned. | $0.001 |

The first 2 records of every run are free, so the default one-name run costs nothing. Names with no match, invalid LEIs, unknown LEIs and errors are never charged. Set a maximum cost per run in the Console to cap spend; the Actor stops when the cap is reached.

### Data source and licence

All data comes from the public GLEIF Global LEI Index API (https://api.gleif.org/api/v1/lei-records, no key). GLEIF publishes it under the CC0 licence: https://www.gleif.org/en/meta/lei-data-terms-of-use and https://www.gleif.org/en/about/open-data. The Actor makes at most 2 requests per second. Data reflects the GLEIF golden copy at query time; this Actor does not alter or reinterpret it, so check the official record before relying on it for compliance decisions.

### Notes

- LEI records cover entities that registered for an LEI (mostly financial-market participants and larger companies), not every company in a country.
- Name matching uses GLEIF's own search on legal names; enable `fuzzy` for typos.
- Built with AI assistance (Claude); maintained by the publisher.

### Switching from another LEI actor

Saved tasks and integrations written for other LEI lookup actors can usually run here by changing only the Actor ID. These input names are accepted next to the canonical ones and return the same rows:

| Input you may already have | Treated as |
|---|---|
| `lei` (string or list) | `leis` |
| `companyNames`, `queries`, `query` | `names` |
| `maxResults` | `maxPerName` |

Rows use this Actor's own output fields (see Output), so check downstream field names once. Other actors' filters and options that are not listed here are ignored. Price: $1 per 1,000 records, the first 2 records of every run free, no match is free.

### Use from Claude or Cursor (MCP)

Apify hosts an MCP server, so an AI agent can run this Actor from a plain-English prompt. Add it to your MCP client (OAuth is the recommended sign-in, see the [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp)):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=pennydata/lei-company-lookup-bulk"
    }
  }
}
```

`?tools=` limits the server to this Actor. Using a token instead of OAuth? Add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }` next to `url`. The configurator at https://mcp.apify.com/ writes client-specific snippets; for Cursor you can also run `apify mcp install cursor`.

Example prompt: *"Use lei-company-lookup-bulk to look up the companies Apple Inc and Siemens AG. Give me each legal name, LEI, jurisdiction and registration status in a table, and say so if a name returns no match."*

Runs started by an agent are billed like any other run, at the prices above.

### Related actors

- [Bulk Domain WHOIS & DNS Lookup](https://apify.com/pennydata/bulk-domain-whois-dns-lookup): adds domain registration data to a company you found by LEI.
- [Website Contact Extractor](https://apify.com/pennydata/website-contact-extractor): finds public contact details on the company's website.
- [Website Tech Stack Detector](https://apify.com/pennydata/website-tech-stack-detector): shows what technology the company's site uses.

### Lapsed and renewal-due screening

Set **Only lapsed registrations** (`onlyLapsed`) to keep only LEIs whose registration status is LAPSED, or **Renewal due within (days)** (`renewalDueWithinDays`) to keep LEIs whose next renewal date is within N days (overdue ones included). Set both to get either. Filtered-out records are not charged. Output adds `registrationStatus`, `nextRenewalDate` and `daysToRenewal`.

# Actor input Schema

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

Legal entity names to look up, one per line, e.g. Apple Inc. Each name returns up to 'Max records per name' matches.

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

20-character Legal Entity Identifiers to look up, one per line, e.g. HWUPKR0MPOU8FGXBT394.

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

Optional ISO 3166 country code (e.g. US, DE, GB) to keep only entities with a legal address in that country. Applies to name searches.

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

Optional: keep only ACTIVE or INACTIVE entities. Applies to name searches.

## `onlyLapsed` (type: `boolean`):

Keep only records whose LEI registration status is LAPSED (renewal overdue). Other records are skipped and not charged.

## `renewalDueWithinDays` (type: `integer`):

Keep only records whose next renewal date is within this many days (already overdue renewals count). Combine with 'Only lapsed' to get either. Skipped records are not charged.

## `fuzzy` (type: `boolean`):

Use GLEIF fuzzy matching so near-misses and typos still match. Off = names are matched as given.

## `maxPerName` (type: `integer`):

Maximum records returned (and charged) for each name (1-50).

## `query` (type: `string`):

Single company name; alias for 'names'.

## `queries` (type: `array`):

Alias for 'names'.

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

Alias for 'names', for drop-in use from other LEI actors.

## `lei` (type: `array`):

Alias for 'leis' (one LEI per line).

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

Alias for 'Max records per name' (1-50). Used if set.

## Actor input object example

```json
{
  "names": [
    "Apple Inc."
  ],
  "status": "",
  "onlyLapsed": false,
  "fuzzy": false,
  "maxPerName": 3
}
```

# Actor output Schema

## `results` (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 = {
    "names": [
        "Apple Inc."
    ],
    "maxPerName": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("pennydata/lei-company-lookup-bulk").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 = {
    "names": ["Apple Inc."],
    "maxPerName": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("pennydata/lei-company-lookup-bulk").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 '{
  "names": [
    "Apple Inc."
  ],
  "maxPerName": 3
}' |
apify call pennydata/lei-company-lookup-bulk --silent --output-dataset

```

## MCP server setup

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

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/DAHdKmlzkxPn0J2TT/builds/KTxS9ll32eU9G1zqO/openapi.json
