How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
HWUPKR0MPOU8FGXBT394in LEI codes. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
LEI Lookup & Change Monitor checks Legal Entity Identifiers (LEI) in the public GLEIF data. Add up to 1,000 LEI codes, or search by legal name. You get one row per entity with the legal name, jurisdiction, legal form, entity status and registration status, renewal date, addresses, the issuer (LOU) and the direct and ultimate parent or the reporting exception. It can also show what changed since your last run.
- LEI lookup. Each LEI is an exact match. The Actor checks the ISO 17442 check digits first. A code with wrong check digits gets an
errorrow (INVALID_LEI) and no request. A valid code that GLEIF does not know gets anot_foundrow. No input is lost. - Name search. GLEIF searches the words in legal names and other names (trade, previous and transliterated names). The Actor reads up to 200 candidates, puts exact and close name matches first and returns
maxResultsrows. You can filter by country and registration status.
Good for
- Check the LEI of a counterparty, supplier or fund before onboarding or a trade report.
- Find LEIs that lapsed or must be renewed soon (
registrationStatus,daysUntilRenewal). - Find the LEI of a company when you only know its name.
- See the parent company, or the reason the entity gives for not reporting one.
- Watch a list of LEIs and get only the changes on each run.
Not a good fit
- This is reference data, not a counterparty approval. The Actor never says that an entity is safe, approved or risky.
- A missing LEI is not a risk signal. Many legal entities do not need an LEI.
LAPSEDmeans the LEI registration was not renewed on time. It does not mean that the company was dissolved. ReadentityStatusfor that.- A reporting exception is not proof that the entity has no parent. It is the reason the entity gave for not reporting one.
- No children list, no full ownership tree, no ISIN, BIC or other code mappings, and no bulk Golden Copy download.
Who uses it
Compliance and KYC teams
Check counterparty LEIs before onboarding or trade reports.
Operations teams
Find LEIs that lapsed or must be renewed soon.
Analysts
See the direct and ultimate parent of an entity.
Price
Prices will be shown after release.
Questions
Do I need a GLEIF account?
No. GLEIF data is open. You only need an Apify account.
Does LAPSED mean the company closed?
No. The LEI was not renewed on time. Check entityStatus for closure.
Does it tell me if a company is safe?
No. It gives reference data. Your own policy decides what it means.
How many LEIs can I check?
Up to 1,000 per run. In a test, this took about 20 seconds.
Why are some parents shown as an exception and not as a company?
Entities report their parents to their LEI issuer. When they do not, they give a reason, like NATURAL_PERSONS (owned by people) or NON_CONSOLIDATING. The Actor shows that reason. It does not guess a parent.
How fresh is the data?
Each run reads GLEIF live. goldenCopyDate is the date of the GLEIF data, and fetchedAt is when the Actor read it.
What licence does the data have?
GLEIF publishes LEI data under the CC0 1.0 licence. Read the GLEIF terms of use for your case. Do not use the GLEIF name or logo in a way that suggests a link with GLEIF.
Details
Step by step on Apify
- Open the Input tab. The form already has three LEIs: Apple Inc., Microsoft Corporation and Deutsche Bank AG.
- Click Start.
- Open the Overview view in the Output tab. Check
legalName,registrationStatus,entityStatusandnextRenewalDate. - Replace the codes with your own list (up to 1,000), or clear the list and type a name in
legalName.
Use cases
| Task | Input | You get | Key fields |
|---|---|---|---|
| Check counterparty LEIs (KYC, onboarding) | leis | one row per LEI | status, registrationStatus, entityStatus, legalName, jurisdiction |
| Find lapsed or soon-to-expire LEIs | leis | one row per LEI | registrationStatus, nextRenewalDate, daysUntilRenewal, managingLou |
| Find an LEI by company name | legalName + country | ranked rows | searchRank, lei, legalName, legalCity, registrationStatus |
| See the parent company | leis + includeParents | Ownership view | directParentType, directParentName, ultimateParentName, ultimateParentExceptionReason |
| Watch a list for changes | leis + monitorKey | Changes view | changeType, changedFields, previousValues |
Tips for better results
- Sort by daysUntilRenewal to find codes that need action first.
- Add a country code to a name search to get closer matches.
- Always check legalName and lei before you trust a search result.
Limits and good to know
- Up to 1,000 LEIs per run. In our test, 1,000 LEIs took about 20 seconds with parents
- Name search: up to 200 candidates are read and ranked;
maxResultsup to 200. If GLEIF has more matches,RUN_SUMMARY.search.truncatedistrue. Addcountry,registrationStatusor a longer name - The name search matches words. Symbols, HTML or very short words give unrelated results. Always check
legalNameandleibefore you use a search result - The Actor sends at most one request per second to GLEIF, and stops source work after 240 seconds
- Data is as fresh as the GLEIF API, which follows the daily Golden Copy.
goldenCopyDateshows the publish date
Troubleshooting
| Symptom | Check | Action |
|---|---|---|
INVALID_LEI error row | checksumValid, statusReason | The code has the wrong length, characters or check digits. Copy it again from the source. |
not_found for a code you trust | checksumValid is true | GLEIF has no record. The code may have a typo that still passes the check, or it is very new. Search by name to find the right LEI. |
LAPSED registration | entityStatus | The LEI was not renewed. The company may still be active. |
| Parent fields are empty | directParentType, directParentExceptionReason | Read the type: an exception reason, not_reported or not_available is a valid answer. |
partial rows | statusReason | Parent names could not be read this time. Run the same LEIs again. |
| Search found the wrong company | searchRank, legalName, legalCountry | Add country, use the full legal name, or look up by LEI. |
CAPPED | RUN_SUMMARY.counts.notWrittenCapped | Raise the maximum cost per run, or split the list. |
ERROR or SOURCE_UNAVAILABLE rows | RUN_SUMMARY.message, http | GLEIF did not answer. Run again later; error rows are free. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "complete",
"lei": "2549008YU9EOMHFUA249",
"checksumValid": true,
"legalName": "APPLE OPERATIONS INDIA PRIVATE LIMITED",
"jurisdiction": "IN",
"legalFormCode": "YSP9",
"entityStatus": "ACTIVE",
"registrationStatus": "ISSUED",
"nextRenewalDate": "2027-05-25T14:07:19Z",
"managingLou": "5493001KJTIIGC8Y1R12",
"legalCity": "Bangalore",
"legalCountry": "IN",
"directParentType": "parent",
"directParentLei": "HWUPKR0MPOU8FGXBT394",
"directParentName": "Apple Inc.",
"directParentCountry": "US",
"directParentExceptionReason": null,
"ultimateParentType": "parent",
"ultimateParentLei": "HWUPKR0MPOU8FGXBT394",
"ultimateParentName": "Apple Inc.",
"changeType": null,
"gleifRecordUrl": "https://search.gleif.org/#/record/2549008YU9EOMHFUA249",
"goldenCopyDate": "2026-10-12T00:00:00Z"
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
status | string | complete = record found (with parents if requested); partial = record found but some parent details are missing; not_found = valid LEI with no GLEIF record; error = invalid LEI (no request sent) or source failure. |
statusReason | string | Why the row is not complete, in plain words. |
errorCode | string | INVALID_LEI, SOURCE_UNAVAILABLE, SOURCE_TIMEOUT, RATE_LIMITED, DEADLINE_REACHED, ... for error rows. |
input | string | The LEI as you entered it, or the search text for search rows. |
inputType | string | lei = from the LEI list; search = from the name search. |
searchQuery | string | Name search text for search rows. |
searchRank | integer | Position in the name search results (1 = first). |
lei | string | Legal Entity Identifier (ISO 17442), upper case. |
checksumValid | boolean | True when the LEI has 20 valid characters and its ISO 17442 check digits match. |
legalName | string | Legal name as registered. |
legalNameLanguage | string | Language code of the legal name. |
otherNames | array | Other and transliterated names with their type (e.g. TRADING_OR_OPERATING_NAME, PREVIOUS_LEGAL_NAME, AUTO_ASCII_TRANSLITERATED_LEGAL_NAME). |
jurisdiction | string | Legal jurisdiction, ISO country or subdivision code (e.g. US-CA, DE). |
legalFormCode | string | ISO 20275 Entity Legal Form (ELF) code, e.g. 6QQB. |
legalFormOther | string | Legal form as free text when no ELF code applies. |
entityCategory | string | GENERAL, BRANCH, FUND, SOLE_PROPRIETOR, RESIDENT_GOVERNMENT_ENTITY or INTERNATIONAL_ORGANIZATION. |
entitySubCategory | string | Entity sub-category when published. |
entityStatus | string | Status of the legal entity: ACTIVE or INACTIVE; null when GLEIF publishes none (e.g. annulled records). Separate from registrationStatus. |
entityCreationDate | string | Date the entity was legally formed. |
entityExpirationDate | string | Date the entity ceased to exist, if published. |
entityExpirationReason | string | DISSOLVED, CORPORATE_ACTION or OTHER, if published. |
successorLei | string | LEI of the successor entity after a merger or other corporate action. |
successorName | string | Name of the successor entity. |
registrationStatus | string | Status of the LEI registration: ISSUED, LAPSED (not renewed on time; does not mean the entity was dissolved), RETIRED, MERGED, ANNULLED, DUPLICATE, PENDING_TRANSFER, PENDING_ARCHIVAL, TRANSFERRED or CANCELLED. |
initialRegistrationDate | string | When the LEI was first issued. |
lastUpdateDate | string | Last update of the LEI record. |
nextRenewalDate | string | Date the registration must be renewed by. |
daysUntilRenewal | integer | Days from the run date to nextRenewalDate; negative = overdue. |
managingLou | string | LEI of the Local Operating Unit (LEI issuer) that manages the record. |
corroborationLevel | string | How the LOU verified the data: FULLY_CORROBORATED, PARTIALLY_CORROBORATED, ENTITY_SUPPLIED_ONLY. |
registeredAt | string | Registration authority ID (GLEIF RA list code, e.g. RA000665). |
registeredAs | string | Entity ID in that business register. |
legalAddressLines | array | Legal address street lines. |
legalCity | string | Legal address city. |
legalRegion | string | Legal address region (ISO 3166-2). |
legalPostalCode | string | Legal address postal code. |
legalCountry | string | Legal address country (ISO 3166-1 alpha-2). |
hqAddressLines | array | Headquarters address street lines. |
hqCity | string | Headquarters city. |
hqRegion | string | Headquarters region. |
Input settings (9)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| LEI codes | leis | array | ["HWUPKR0MPOU8FGXBT394", "INR2EJN1ERAN0W5ZP974", "7LTWFZYICNSX8D621K86"] |
| Search by entity name | legalName | string | |
| Country (legal address) | country | string | |
| LEI registration status | registrationStatus | string | "ANY" |
| Max search results | maxResults | integer | 10 |
| Include direct and ultimate parent | includeParents | boolean | true |
| Monitor key (for scheduled runs) | monitorKey | string | |
| Compare with previous dataset | previousDatasetId | string | |
| Only output changes | onlyChanges | boolean | true |
Use cases with this tool
Each guide shows all the steps and the other tools.
