# LEI Monitor · GLEIF Renewal & Status Alerts (`thequietstack/gleif-lei-monitor`) Actor

Monitor Legal Entity Identifiers of your counterparties on GLEIF: renewal due soon, lapsed LEIs, entity status, legal name, address and ultimate-parent changes since the last run. Look up LEIs by company name. CC0 data, legal entities only.

- **URL**: https://apify.com/thequietstack/gleif-lei-monitor.md
- **Developed by:** [TheQuietStack](https://apify.com/thequietstack) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 lei checkeds

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 Monitor: GLEIF renewal & status alerts for your counterparties

Watch the **Legal Entity Identifiers (LEIs)** of your clients, counterparties or own group companies and get alerted when a
**renewal is due**, an LEI has **lapsed**, or the entity's **status, legal name, address or ultimate parent** changed since the last run.
Data comes from **GLEIF**, the official global LEI system, published under **CC0**.

**Why it matters:** under MiFID II / EMIR and similar rules, trades and reports with counterparties need a *valid* (ISSUED) LEI. A lapsed LEI is
an operational and compliance problem, so it is good to know a month before it happens, not after.

### What you get per LEI

`lei` · `legalName` · `otherNames` · `registrationStatus` (ISSUED, LAPSED, RETIRED, DUPLICATE, …) · `nextRenewalDate` · `daysToRenewal` ·
`entityStatus` · `category` · `legalFormId` · `jurisdiction` · `legalAddress` · `headquartersAddress` · `registeredAt` / `registeredAs` ·
`managingLou` · `ultimateParentLei` / `ultimateParentName` · `alerts[]` · `changes[]` · `gleifUrl`

**Alerts:** `renewal_due_soon` · `lapsed` · `entity_inactive` · `registration_retired / annulled / merged / duplicate` · `registration_status_changed` ·
`legal_name_changed` · `legal_address_changed` · `ultimate_parent_changed`

### Example (real run, 13.10.2026)

Search `"Volkswagen AG"` → the Actor expands the legal form (AG → Aktiengesellschaft), finds the exact legal name and flags two things a compliance team wants to know:
an old **DUPLICATE** registration, and the valid LEI with its **renewal due in 31 days**:

```json
{
 "lei": "529900NNUPAGGOMPXZ31",
 "legalName": "VOLKSWAGEN AKTIENGESELLSCHAFT",
 "registrationStatus": "ISSUED",
 "nextRenewalDate": "2026-11-14T10:04:05Z",
 "daysToRenewal": 31,
 "entityStatus": "ACTIVE",
 "legalAddress": {
  "city": "Wolfsburg",
  "region": "DE-NI",
  "country": "DE",
  "postalCode": "38440"
 },
 "alerts": [
  "renewal_due_soon"
 ],
 "changes": [],
 "gleifUrl": "https://search.gleif.org/#/record/529900NNUPAGGOMPXZ31"
}
```

Same run: a real Japanese LEI that lapsed 5 days earlier → `["lapsed"]`; Deutsche Bank and Siemens → no alert.
Second run in `changes_and_alerts` mode → only the LEIs that still need attention.

### Input

```json
{ "leis": ["7LTWFZYICNSX8D621K86"], "companyNames": ["Volkswagen AG"], "renewalWarningDays": 60, "outputMode": "changes_and_alerts" }
```

- `companyNames` finds LEIs by legal name. Exact legal-name matches are preferred (common legal forms like AG, GmbH, Ltd, Inc, SA, plc are expanded);
  if none match exactly, full-text candidates are returned (`SUMMARY.nameSearches[].matchType` tells you which). Check the `legalName`.
- Up to 100 LEIs per request to GLEIF. `includeParents` adds one lookup per LEI.

### Pricing

Pay per event: **$0.002 per LEI row** on the free plan, −10/−20/−30 % on higher Apify plans. Invalid, unknown and excluded LEIs, and quiet LEIs in
`changes_and_alerts` mode, are never charged.

### Data, license and limits

- Source: GLEIF Global LEI Index (api.gleif.org). GLEIF: "The data available through the Access Service are provided under the CC0 licence."
  This Actor is not endorsed by or affiliated with GLEIF.
- **Legal entities only:** LEIs in the category *SOLE_PROPRIETOR* (natural persons) are skipped and only counted in `SUMMARY`.
- `ultimateParentName` is empty when GLEIF has no parent relationship (e.g. the entity is the top of its group or reported an exception).

# Actor input Schema

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

20-character Legal Entity Identifiers, one per line.

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

Looks up LEIs by legal name (exact legal name first, then full-text). Each match is monitored like a listed LEI.

## `maxMatchesPerName` (type: `integer`):

Many companies have several LEIs (branches, funds, subsidiaries).

## `renewalWarningDays` (type: `integer`):

Adds the alert renewal_due_soon for ISSUED LEIs whose next renewal date is within this window.

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

One extra lookup per LEI for the ultimate parent (name + LEI), so parent changes are detected.

## `outputMode` (type: `string`):

For scheduled monitoring use 'changes_and_alerts': quiet LEIs are not written or charged.

## `stateStoreName` (type: `string`):

Named key-value store that remembers the last state per LEI. Use different names for different watch lists.

## Actor input object example

```json
{
  "leis": [
    "7LTWFZYICNSX8D621K86",
    "529900YDAG61JYILJZ53"
  ],
  "maxMatchesPerName": 3,
  "renewalWarningDays": 60,
  "includeParents": true,
  "outputMode": "all",
  "stateStoreName": "gleif-lei-monitor-state"
}
```

# Actor output Schema

## `leis` (type: `string`):

No description

## `summary` (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 = {
    "leis": [
        "7LTWFZYICNSX8D621K86",
        "529900YDAG61JYILJZ53"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("thequietstack/gleif-lei-monitor").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 = { "leis": [
        "7LTWFZYICNSX8D621K86",
        "529900YDAG61JYILJZ53",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("thequietstack/gleif-lei-monitor").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 '{
  "leis": [
    "7LTWFZYICNSX8D621K86",
    "529900YDAG61JYILJZ53"
  ]
}' |
apify call thequietstack/gleif-lei-monitor --silent --output-dataset

```

## MCP server setup

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

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/J9ZrKKzGCexHYAfSS/builds/DX2foMZhb4lzv622T/openapi.json
