# LEI Lookup – GLEIF Legal Entity Search (`sfoln/lei-lookup`)

Look up Legal Entity Identifiers (LEI) by code or company name in the official GLEIF database: legal name, status, legal form, addresses, registry id, BIC, renewal dates and direct and ultimate parent companies. $2 per 1,000 LEI records; no API key needed.

- Family: Compliance & public records
- Categories: Automation, Developer tools, AI
- Store: https://apify.com/sfoln/lei-lookup (Markdown: https://apify.com/sfoln/lei-lookup.md)
- JSON: https://www.sfoln.com/actors/lei-lookup.json
- MCP: https://mcp.apify.com?tools=sfoln/lei-lookup
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~lei-lookup/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~lei-lookup/runs

LEI Lookup – GLEIF Legal Entity Search looks up Legal Entity Identifiers (LEI) by code, or finds the LEI of a company by name, in the official GLEIF database and returns one record per lookup: legal name and other names, entity and registration status, jurisdiction, ISO 20275 legal form, legal and headquarters addresses, the company's id in its national register, BIC codes, renewal dates and the direct and ultimate parent companies. Built for onboarding and KYB checks, counterparty and vendor data, compliance tools and AI agents. $0.002 per LEI record found; no API key needed.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| LEI record (`lei-record`) | $0.002 | $2 / 1,000 | One LEI record found in the GLEIF database (by code, or the best match of a company name), with its parents. |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~lei-lookup/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"leis":["HWUPKR0MPOU8FGXBT394"],"companyNames":["Siemens Healthineers AG"]}'
```

MCP client configuration:

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

Example prompt: Look up the LEI HWUPKR0MPOU8FGXBT394 and find the LEI of Siemens Healthineers AG, including their parent companies.

## Input

LEI codes and/or company names to look up in the GLEIF LEI database. Each produces one dataset record.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `leis` | array | — | LEI codes: 20-character Legal Entity Identifiers, one per line (e.g. HWUPKR0MPOU8FGXBT394). Codes with wrong check digits are reported, not looked up. Accounts on the Apify free plan can process up to 10 LEIs or names per run. |
| `companyNames` | array | — | Company names: Company names to search, one per line; the best-matching LEI record is returned with the next candidates. Via the API an element can also be {"name": "…", "country": "DE"}. |
| `country` | string | — | Country (for names): Limit name searches to companies whose legal address is in this country (ISO code like DE or a country name). Leave empty to search worldwide. |
| `includeParents` | boolean | `true` | Include parent companies: Add the direct and ultimate accounting-consolidation parents (GLEIF level 2), or the reporting exception that explains why none is reported. |
| `resolveCodes` | boolean | `true` | Resolve legal form and registry names: Add the names of the ISO 20275 legal form and the registration authority (one extra GLEIF request per distinct code and run). |
| `maxCandidates` | integer | `3` | Other candidates per name: How many other matching LEI records to list (LEI, name, country, status, score) under candidates for a name search; they are not charged. |
| `minNameScore` | number | `0.8` | Minimum name score: How close (0.5–1) a GLEIF name must be to the searched name to be returned as the match; below it the record is not_found with the candidates. |
| `maxItems` | integer | `1000` | Max lookups: Safety cap on LEIs plus names per run; further inputs are ignored and counted in the OUTPUT record. |
| `concurrency` | integer | `3` | Concurrency: Lookups processed in parallel (GLEIF allows about 60 requests per minute; LEI codes are fetched 100 at a time). |
| `includeRaw` | boolean | `false` | Include raw GLEIF records: Attach the unmodified GLEIF JSON:API records (with the parent records) under raw. |

Example input:

```json
{
  "leis": [
    "HWUPKR0MPOU8FGXBT394"
  ],
  "companyNames": [
    "Siemens Healthineers AG"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The lookup this record corresponds to: { lei } or { name, country? }. |
| `status` | string | Status: Record status (see above); the entity status is entityStatus. |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record (present only when charged). |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Source: Upstream data source. |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `error` | object | Error: { code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; this Actor: invalid_lei, invalid_name, not_found, no_match; upstream: rate_limit, timeout, network, server, client, invalid_response. |
| `warnings` | array | Warnings: Notes about this record. |
| `found` | boolean | Found: Whether an LEI record was returned. |
| `query` | string | Query: The LEI code or company name looked up. |
| `lei` | string | LEI: Legal Entity Identifier (20 characters). |
| `legalName` | string | Legal name: Legal name as registered. |
| `legalNameLanguage` | string | null | Legal name language: Language of the legal name (ISO 639-1). |
| `otherNames` | array | Other names: { name, type (PREVIOUS_LEGAL_NAME, TRADING_OR_OPERATING_NAME …), language }. |
| `transliteratedNames` | array | Transliterated names: Latin-script forms of the names. |
| `registrationStatus` | string | null | Registration status: LEI registration status: ISSUED, LAPSED, RETIRED, ANNULLED, MERGED, DUPLICATE, PENDING_TRANSFER … |
| `entityStatus` | string | null | Entity status: ACTIVE or INACTIVE. |
| `jurisdiction` | string | null | Jurisdiction: Legal jurisdiction (ISO 3166 country or subdivision, e.g. US-CA). |
| `country` | string | null | Country: Legal address country (ISO 3166-1 alpha-2). |
| `category` | string | null | Category: GENERAL, BRANCH, FUND, SOLE_PROPRIETOR, RESIDENT_GOVERNMENT_ENTITY … |
| `subCategory` | string | null | Subcategory: Subcategory (government entities). |
| `legalForm` | object | Legal form: { code (ISO 20275 ELF), name }. |
| `legalAddress` | object | null | Legal address: { lines, city, region, postalCode, country, formatted }. |
| `headquartersAddress` | object | null | Headquarters address: { lines, city, region, postalCode, country, formatted }. |
| `registrationAuthority` | object | Registration authority: { id (GLEIF RA code), name, entityId (the entity's id in that register) }. |
| `entityCreationDate` | string | null | Entity created: When the legal entity was created. |
| `initialRegistrationDate` | string | null | LEI issued: When the LEI was first issued. |
| `lastUpdateDate` | string | null | Last update: Last update of the LEI record. |
| `nextRenewalDate` | string | null | Next renewal: When the LEI must be renewed. |
| `renewalOverdue` | boolean | Renewal overdue: The next renewal date has passed. |
| `managingLou` | string | null | Managing LOU: LEI of the issuer that manages the record. |
| `corroborationLevel` | string | null | Corroboration: FULLY_CORROBORATED, PARTIALLY_CORROBORATED, ENTITY_SUPPLIED_ONLY. |
| `bic` | array | BIC: SWIFT / BIC codes mapped to the LEI. |
| `mic` | array | MIC: Market identifier codes mapped to the LEI. |
| `ocid` | string | null | OpenCorporates id: OpenCorporates id mapped to the LEI, when GLEIF has one. |
| `successorEntity` | object | null | Successor: { lei, name } of the successor after a merger. |
| `expiration` | object | null | Expiration: { date, reason } when the entity ceased. |
| `directParent` | object | null | Direct parent: { lei, legalName, country, entityStatus, registrationStatus }. |
| `directParentException` | object | null | Direct parent exception: { category, reason } when no direct parent is reported (e.g. NATURAL_PERSONS). |
| `ultimateParent` | object | null | Ultimate parent: { lei, legalName, country, entityStatus, registrationStatus }. |
| `ultimateParentException` | object | null | Ultimate parent exception: { category, reason } when no ultimate parent is reported. |
| `gleifUrl` | string | GLEIF page: The record on search.gleif.org. |
| `goldenCopyPublishedAt` | string | null | Data as of: Publication time of the GLEIF golden copy that answered. |
| `match` | object | Name match: For a name search: { query, country, matchedName, score }. |
| `candidates` | array | Other candidates: For a name search: the next records { lei, legalName, country, entityStatus, registrationStatus, score } (not charged). |
| `raw` | object | Raw GLEIF record: The unmodified GLEIF records (only with includeRaw). |

Example record:

```json
{
  "input": {
    "lei": "HWUPKR0MPOU8FGXBT394"
  },
  "status": "ok",
  "charged": true,
  "chargedEvent": "lei-record",
  "source": "gleif",
  "fetchedAt": "2026-10-14T23:17:00.296Z",
  "found": true,
  "query": "HWUPKR0MPOU8FGXBT394",
  "lei": "HWUPKR0MPOU8FGXBT394",
  "legalName": "Apple Inc.",
  "legalNameLanguage": "en",
  "otherNames": [
    {
      "name": "Apple Computer, Inc.",
      "type": "PREVIOUS_LEGAL_NAME",
      "language": "en"
    }
  ],
  "transliteratedNames": [],
  "entityStatus": "ACTIVE",
  "registrationStatus": "ISSUED",
  "jurisdiction": "US-CA",
  "country": "US",
  "category": "GENERAL",
  "subCategory": null,
  "legalForm": {
    "code": "H1UM",
    "name": "For-Profit Corporation General Stock"
  },
  "legalAddress": {
    "lines": [
      "C/O C T Corporation System",
      "330 N. Brand Blvd",
      "Suite 700"
    ],
    "city": "Glendale",
    "region": "US-CA",
    "postalCode": "91203",
    "country": "US",
    "formatted": "C/O C T Corporation System, 330 N. Brand Blvd, Suite 700, 91203 Glendale, US"
  },
  "headquartersAddress": {
    "lines": [
      "One Apple Park Way"
    ],
    "city": "Cupertino",
    "region": "US-CA",
    "postalCode": "95014",
    "country": "US",
    "formatted": "One Apple Park Way, 95014 Cupertino, US"
  },
  "registrationAuthority": {
    "id": "RA000598",
    "name": "Business Entity Records",
    "entityId": "806592"
  },
  "entityCreationDate": "1977-01-03T00:00:00Z",
  "initialRegistrationDate": "2012-06-06T15:53:00Z",
  "lastUpdateDate": "2026-03-03T16:34:33Z",
  "nextRenewalDate": "2027-03-08T17:27:20Z",
  "renewalOverdue": false,
  "managingLou": "5493001KJTIIGC8Y1R12",
  "corroborationLevel": "FULLY_CORROBORATED",
  "bic": [
    "APLEUS66XXX"
  ],
  "mic": [],
  "ocid": null,
  "successorEntity": null,
  "expiration": null,
  "directParent": null,
  "directParentException": {
    "category": "DIRECT_ACCOUNTING_CONSOLIDATION_PARENT",
    "reason": "NATURAL_PERSONS"
  },
  "ultimateParent": null,
  "ultimateParentException": {
    "category": "ULTIMATE_ACCOUNTING_CONSOLIDATION_PARENT",
    "reason": "NATURAL_PERSONS"
  },
  "gleifUrl": "https://search.gleif.org/#/record/HWUPKR0MPOU8FGXBT394",
  "goldenCopyPublishedAt": "2026-10-14T08:00:00Z"
}
```

## FAQ

**Where does the data come from?**

From the GLEIF LEI database (api.gleif.org), the official global directory of Legal Entity Identifiers, published as open data (CC0). Every record carries the golden-copy publication time.

**What are direct and ultimate parents?**

GLEIF level-2 data: the companies that consolidate the entity in their accounts. When no parent is reported, the reporting exception (for example NATURAL_PERSONS or NON_CONSOLIDATING) is returned instead.

**What does a LAPSED registration mean?**

The LEI was not renewed on time (registrationStatus LAPSED, renewalOverdue true). The entity may still exist; many regulated counterparties require an ISSUED LEI.


## Related

- [KYB Company Check – Registry, LEI, VAT](https://www.sfoln.com/actors/kyb-company-check.md) (`sfoln/kyb-company-check`)
- [Sanctions Screening – OFAC, EU, UK, UN Lists](https://www.sfoln.com/actors/sanctions-screening.md) (`sfoln/sanctions-screening`)
- [EU VAT Number Validator (VIES)](https://www.sfoln.com/actors/vat-number-validator.md) (`sfoln/vat-number-validator`)
- [Website Contact Details Scraper](https://www.sfoln.com/actors/company-contacts-finder.md) (`sfoln/company-contacts-finder`)
- [Domain WHOIS & DNS Lookup](https://www.sfoln.com/actors/domain-intelligence.md) (`sfoln/domain-intelligence`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
