DEV Community

Russell Yapp
Russell Yapp

Posted on

Look up Legal Entity Identifiers (LEIs) with an API: by LEI, name or status

The Actor "LEI Lookup" returns Legal Entity Identifier records from the Global LEI Index, one fixed row per entity. You can look up a list of LEIs, search by name, or list the entities with a given registration status.

An LEI is a 20-character code that identifies a legal entity in financial and regulatory data. The records are published as a daily "Golden Copy", and the register has a search page and a JSON API. This Actor sits on top of that for the cases where a script or an AI agent needs a stable shape.

If you need a single LEI now and then, the register's own search page is free and is the better tool. This Actor is for batches (up to 1,000 LEIs a run), for names that need matching, and for pipelines that want the same fields every time.

What it answers

  • By LEI: what are the name, status, legal form, jurisdiction, address and renewal date of these LEIs? Each LEI is checked as ISO 17442 before any request, so a malformed one is refused on its own and costs nothing.
  • By name: which entities have a legal name matching "Tesco PLC", optionally within one country and one registration status? If nothing matches, similar names are tried and those rows are marked matchType: "similar".
  • By registration status: which entities in a country are LAPSED, ANNULLED or ISSUED, optionally filtered by category, such as funds?

Who it is for

Compliance and onboarding teams checking counterparties in bulk, data teams enriching a company table with a legal form and jurisdiction, analysts finding lapsed LEIs to chase, and developers who want an agent to be able to answer "is this LEI still valid?".

A worked input

The Actor's prefilled input looks up one LEI. With the Apify Python client and a hard spend cap:

from datetime import timedelta
from decimal import Decimal

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("yappman/lei-lookup").call(
    run_input={"mode": "lei", "leis": ["2138002P5RNKC5W2JZ46"]},
    max_total_charge_usd=Decimal("0.005"),
    run_timeout=timedelta(minutes=10),
)
rows = list(client.dataset(run.default_dataset_id).iterate_items())
Enter fullscreen mode Exit fullscreen mode

Rows come back in input order. This is the row for that LEI from a recorded response (Golden Copy of 8 October 2026), trimmed to the main fields:

{
  "lei": "2138002P5RNKC5W2JZ46",
  "legalName": "TESCO PLC",
  "registrationStatus": "ISSUED",
  "entityStatus": "ACTIVE",
  "jurisdiction": "GB",
  "legalForm": "B6ES",
  "legalAddress": {"country": "GB", "region": "GB-HRT", "city": "WELWYN GARDEN CITY"},
  "initialRegistrationDate": "2013-12-19T00:00:00Z",
  "lastUpdateDate": "2025-11-21T07:42:21Z",
  "nextRenewalDate": "2027-01-10T00:00:00Z",
  "registeredAt": "RA000585",
  "registeredAs": "00445790",
  "withheld": [],
  "goldenCopyDate": "2026-10-08T00:00:00Z"
}
Enter fullscreen mode Exit fullscreen mode

A missing value is null (or [] for lists), never an absent key. After the run, RUN_SUMMARY lists anything that was refused or not found: those cost nothing.

To search by name instead:

{"mode": "name", "name": "Tesco PLC", "country": "GB", "maxItems": 10}
Enter fullscreen mode Exit fullscreen mode

Pricing

Pay per event, flat on every plan, with no start fee and no separate run charge.

Event Charged Price
entity each row returned $0.004

The run above costs $0.004. A batch of 1,000 LEIs that are all found costs $4.00. An LEI that is invalid or not known, a refused input and a search with no results cost nothing. In name and status modes maxItems caps the rows; in LEI mode the list itself is the cap. Apify's maximum-charge setting caps the bill either way.

Limits

  • The data is the register's Golden Copy, published daily, so a change made today appears in a later copy. Every row carries goldenCopyDate.
  • Name matching is on the words in a legal name, not the exact string. Name searches return at most 200 rows and status searches at most 10,000.
  • Addresses are country, region and city only. No street, number or postcode is read.

Data source and licence

The Global LEI Index published by GLEIF, released as CC0, so no attribution is required. This Actor is not affiliated with or endorsed by GLEIF or any LEI issuer.

Personal data

Rows are built to hold no personal data. Where the entity is a person, such as a sole proprietor, the name, register number and addresses are withheld (null, and listed in withheld); the LEI, statuses and dates are still returned. In name and status modes such entities are left out and counted in RUN_SUMMARY.withheldPersons. In LEI mode the row for a sole proprietor is returned with those fields empty and is charged like any other row.

Where to find it

LEI Lookup on the Apify Store: https://apify.com/yappman/lei-lookup. Pay per event: $0.004 an entity record ($4.00 per 1,000), no start fee; invalid or unknown LEIs, refused inputs and empty searches cost nothing. Data from the Global LEI Index (CC0); not affiliated with or endorsed by GLEIF. The register is the authority: check an LEI there before relying on it for a regulatory filing.

If there is a field or a filter you need, tell me in the comments.

Top comments (0)