# Company KYB Verification: LEI (GLEIF) + SEC EDGAR | Johto Data (`johto.data/company-kyb-verification`) Actor

Verify companies in one call: GLEIF LEI records (status, registration no., jurisdiction, address, direct/ultimate parent) + SEC EDGAR identity (CIK, ticker, EIN, SIC, last filing). Fresh, clean company data. $0.40 per 1,000 rows.

- **URL**: https://apify.com/johto.data/company-kyb-verification.md
- **Developed by:** [Jo](https://apify.com/johto.data) (community)
- **Categories:** Agents, MCP servers, Business
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Company KYB Verification: LEI (GLEIF) + SEC EDGAR Lookup | Johto Data

Verify a company in one call. You get GLEIF LEI records (legal name, status, registration number, jurisdiction, legal and HQ address, direct and ultimate parent LEI with relationship status) and SEC EDGAR identity (CIK, ticker, exchange, EIN, SIC, state of incorporation, latest filing) in one flat schema. **$0.40 per 1,000 company rows ($0.0004 per row) plus $0.00005 per run start.**

### For AI agents

**Call it when:**

- The user wants to confirm that a company exists and is active, or wants its LEI, registration number, jurisdiction, registered address or parent company.
- The user wants a company's direct or ultimate parent LEI (GLEIF Level 2), or the reason GLEIF records no parent.
- The user has an LEI, an SEC CIK or a US ticker and wants the matching legal entity record.
- The user wants KYB / counterparty checks for listed US companies and any LEI-registered entity worldwide (fund, bank, corporate).

**Don't call it when:**

- You need EU VAT validation. VIES terms forbid retransmission, so this Actor doesn't offer it.
- You need UK Companies House officers or PSC, or a private company without an LEI or SEC filings. It will return nothing for those.
- You need sanctions or PEP screening, credit scores or beneficial-owner people data. None of these are included.

**Input: by name (GLEIF top matches plus the SEC listed-company match):**

```json
{"query": "Tesla, Inc.", "matchesPerQuery": 3, "maxItems": 10}
```

**Input: by identifier:**

```json
{"lei": ["7ZW8QJWVPR4P1J1KQY45"], "ticker": ["AAPL"], "cik": ["1318605"]}
```

**Output:** one row per entity per source. Every row also has 8 flat parent fields, so agents can read ownership without walking nested objects. Example for a subsidiary (Google LLC, LEI 7ZW8QJWVPR4P1J1KQY45, local run 2026-10-22):

```json
{"directParentLei": "5493006MHB84DD0ZWV18", "directParentName": "ALPHABET INC.", "directParentRelationshipStatus": "ACTIVE", "directParentReportingException": null,
 "ultimateParentLei": "5493006MHB84DD0ZWV18", "ultimateParentName": "ALPHABET INC.", "ultimateParentRelationshipStatus": "ACTIVE", "ultimateParentReportingException": null}
```

When GLEIF records no parent, the LEI and name are null and the exception reason is filled, e.g. `"directParentReportingException": "NO_KNOWN_PERSON"` (GLEIF code meaning no parent entity is known to consolidate it). Full rows: These rows come from a local run of this source on 2026-10-22. GLEIF row:

```json
{
 "source": "gleif",
 "matchedBy": "query:Tesla, Inc.",
 "name": "TESLA, INC.",
 "otherNames": [],
 "identifiers": {
  "lei": "54930043XZGB27CTOV49",
  "companyNumber": "0805587591",
  "registrationAuthorityId": "RA000637",
  "cik": null,
  "ticker": null,
  "bic": [
   "TSLAUS66XXX"
  ]
 },
 "status": "ACTIVE",
 "incorporationDate": "2024-06-14",
 "jurisdiction": "US-TX",
 "registeredAddress": {
  "lines": [
   "C/O C T Corporation System",
   "1999 Bryan Street",
   "Suite 900"
  ],
  "city": "Dallas",
  "region": "US-TX",
  "postalCode": "75201",
  "country": "US",
  "text": "C/O C T Corporation System, 1999 Bryan Street, Suite 900, Dallas, US-TX, 75201, US"
 },
 "headquartersAddress": {
  "lines": [
   "1 Tesla Road"
  ],
  "city": "Austin",
  "region": "US-TX",
  "postalCode": "78725",
  "country": "US",
  "text": "1 Tesla Road, Austin, US-TX, 78725, US"
 },
 "sic": [],
 "sicDescription": null,
 "stateOfIncorporation": null,
 "lei": {
  "registrationStatus": "ISSUED",
  "entityStatus": "ACTIVE",
  "legalFormCode": "C5K7",
  "legalFormOther": null,
  "category": "GENERAL",
  "initialRegistrationDate": "2018-01-04",
  "lastUpdateDate": "2026-05-04",
  "nextRenewalDate": "2027-05-14",
  "managingLou": "5493001KJTIIGC8Y1R12",
  "corroborationLevel": "FULLY_CORROBORATED",
  "parent": {
   "lei": null,
   "name": null,
   "country": null,
   "relationshipType": null,
   "relationshipStatus": null,
   "reportingException": "NO_KNOWN_PERSON",
   "exceptionCategory": "DIRECT_ACCOUNTING_CONSOLIDATION_PARENT"
  },
  "ultimateParent": {
   "lei": null,
   "name": null,
   "country": null,
   "relationshipType": null,
   "relationshipStatus": null,
   "reportingException": "NO_KNOWN_PERSON",
   "exceptionCategory": "ULTIMATE_ACCOUNTING_CONSOLIDATION_PARENT"
  }
 },
 "directParentLei": null,
 "directParentName": null,
 "directParentRelationshipStatus": null,
 "directParentReportingException": "NO_KNOWN_PERSON",
 "ultimateParentLei": null,
 "ultimateParentName": null,
 "ultimateParentRelationshipStatus": null,
 "ultimateParentReportingException": "NO_KNOWN_PERSON",
 "lastFilingAt": null,
 "sourceUrl": "https://search.gleif.org/#/record/54930043XZGB27CTOV49",
 "apiUrl": "https://api.gleif.org/api/v1/lei-records/54930043XZGB27CTOV49",
 "notice": "LEI data from GLEIF under CC0; this product is not affiliated with, endorsed or supplied by GLEIF or any LOU. SEC data from EDGAR (public domain). Not legal advice; verify before relying on it.",
 "checkedAt": "2026-10-22T09:47:19Z"
}
```

SEC row. `identifiers.lei` is attached only when a US GLEIF match in the same run has the same normalized legal name, and `leiMatchedBy` says so:

```json
{
 "source": "sec",
 "matchedBy": "query:Tesla, Inc.",
 "name": "Tesla, Inc.",
 "otherNames": [
  "TESLA MOTORS INC"
 ],
 "identifiers": {
  "lei": "54930043XZGB27CTOV49",
  "companyNumber": null,
  "registrationAuthorityId": null,
  "cik": "1318605",
  "ticker": "TSLA",
  "tickers": [
   "TSLA"
  ],
  "exchanges": [
   "Nasdaq"
  ],
  "ein": "912197729",
  "leiMatchedBy": "same normalized legal name + US legal address (GLEIF row in this run)"
 },
 "status": "FILING",
 "incorporationDate": null,
 "jurisdiction": "US-TX",
 "registeredAddress": {
  "lines": [
   "1 TESLA ROAD"
  ],
  "city": "AUSTIN",
  "region": "TX",
  "postalCode": "78725",
  "country": "US",
  "text": "1 TESLA ROAD, AUSTIN, TX, 78725"
 },
 "headquartersAddress": {
  "lines": [
   "1 TESLA ROAD"
  ],
  "city": "AUSTIN",
  "region": "TX",
  "postalCode": "78725",
  "country": "US",
  "text": "1 TESLA ROAD, AUSTIN, TX, 78725"
 },
 "sic": [
  "3711"
 ],
 "sicDescription": "Motor Vehicles & Passenger Car Bodies",
 "stateOfIncorporation": "TX",
 "entityType": "operating",
 "category": "Large accelerated filer",
 "fiscalYearEnd": "1231",
 "phone": "512-516-8177",
 "website": null,
 "lei": null,
 "lastFilingAt": "2026-10-21",
 "lastFilingForm": "8-K",
 "sourceUrl": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=1318605",
 "apiUrl": "https://data.sec.gov/submissions/CIK0001318605.json",
 "notice": "LEI data from GLEIF under CC0; this product is not affiliated with, endorsed or supplied by GLEIF or any LOU. SEC data from EDGAR (public domain). Not legal advice; verify before relying on it.",
 "checkedAt": "2026-10-22T09:47:31Z"
}
```

**Price:** $0.0004 per company row (event `company`) + $0.00005 per run start. You pay only for rows returned, and `maxItems` caps both rows and cost.

**Limits (checkable):**

- Name search uses GLEIF's legal-name ranking, so check `name` and `jurisdiction` before trusting a match. Raise `matchesPerQuery` to see more candidates.
- The SEC name match covers only companies in SEC company_tickers.json (listed companies), by exact or prefix match on the normalized name.
- `status` for GLEIF is the GLEIF entity status (ACTIVE/INACTIVE), with the LEI registration status in `lei.registrationStatus` (ISSUED, LAPSED…). For SEC it's FILING if any recent filing exists.
- Parents come from GLEIF Level 2 relationship records (IS_DIRECTLY_CONSOLIDATED_BY / IS_ULTIMATELY_CONSOLIDATED_BY). If none are reported, you get the reporting-exception reason (for example NON_CONSOLIDATING or NO_KNOWN_PERSON). SEC rows carry the same parent fields as null.
- Rate limits: GLEIF ≤60 requests/min, SEC ≤5 requests/s, with a declared User-Agent. `includeParents` adds 2 to 4 GLEIF calls per row (fewer when the parent's name is already cached in the run), so the empty-input demo takes about 15 s.

**Call it:** `POST https://api.apify.com/v2/acts/johto.data~company-kyb-verification/run-sync-get-dataset-items` with `Authorization: Bearer <APIFY_TOKEN>` and the JSON input, or through Apify MCP.

### Output fields

| Field | Type | Meaning |
|---|---|---|
| `source` | string | `gleif` or `sec` |
| `matchedBy` | string | The input that produced the row, e.g. `lei:...`, `ticker:AAPL`, `query:Tesla, Inc.` |
| `name`, `otherNames[]` | string, array | Legal name and other or former names |
| `identifiers` | object | `lei`, `companyNumber`, `registrationAuthorityId`, `cik`, `ticker`, `tickers[]`, `exchanges[]`, `ein`, `bic`, `leiMatchedBy` |
| `status` | string | GLEIF entity status (ACTIVE/INACTIVE) or SEC `FILING` / `NO_RECENT_FILINGS` |
| `incorporationDate` | string or null | GLEIF entity creation date |
| `jurisdiction`, `stateOfIncorporation` | string or null | Jurisdiction code, US state for SEC rows |
| `registeredAddress`, `headquartersAddress` | object or null | Company addresses as filed |
| `sic[]`, `sicDescription` | array, string | SEC industry code (SEC rows) |
| `directParentLei` | string or null | LEI of the direct accounting-consolidation parent (GLEIF Level 2) |
| `directParentName` | string or null | Legal name of the direct parent |
| `directParentRelationshipStatus` | string or null | GLEIF relationship status, e.g. ACTIVE or INACTIVE |
| `directParentReportingException` | string or null | Why no direct parent is reported, e.g. NO_KNOWN_PERSON, NON_CONSOLIDATING, NATURAL_PERSONS, NON_PUBLIC |
| `ultimateParentLei` | string or null | LEI of the ultimate parent |
| `ultimateParentName` | string or null | Legal name of the ultimate parent |
| `ultimateParentRelationshipStatus` | string or null | GLEIF relationship status of the ultimate parent link |
| `ultimateParentReportingException` | string or null | Why no ultimate parent is reported |
| `lei` | object or null | GLEIF details: `registrationStatus`, `entityStatus`, `legalFormCode`, `category`, `initialRegistrationDate`, `lastUpdateDate`, `nextRenewalDate`, `managingLou`, `corroborationLevel`, `parent{lei, name, country, relationshipType, relationshipStatus, reportingException, exceptionCategory}`, `ultimateParent{...}` |
| `lastFilingAt`, `lastFilingForm` | string or null | Latest SEC filing date and form (SEC rows) |
| `sourceUrl`, `apiUrl` | string | Registry record links |
| `notice`, `checkedAt` | string | Licence notice and check time |

Parent fields are company-level only. When GLEIF reports that a company has no parent entity (for example NATURAL_PERSONS), only the reason code is returned, never a person.

### Data sources and licences

- **GLEIF Global LEI Repository API** (api.gleif.org). The data is CC0 ([GLEIF LEI Data Terms of Use](https://www.gleif.org/en/meta/lei-data-terms-of-use)). This product is not affiliated with, endorsed or supplied by GLEIF or any LOU.
- **SEC EDGAR** (company_tickers.json and the submissions API). SEC EDGAR content is in the US public domain and is accessed under SEC fair-access rules.
- **Not used:** EU VIES (its terms forbid retransmission). UK Companies House is planned once an API key is set up.

This is not legal advice, and the source registries don't guarantee accuracy. Verify before relying on a result.

# Actor input Schema

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

Legal name to look up in GLEIF (top matches) and SEC listed companies (exact or prefix match). Empty input runs the demo 'Tesla, Inc.'. Use when: you only have a company's legal name. Don't use when: you have an LEI, CIK or ticker (use those fields for an exact match).

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

Several names; each gets its own matches. Use when: you check a batch of names in one run.

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

20-character Legal Entity Identifiers, e.g. 54930043XZGB27CTOV49. Use when: you have the LEI and want the exact GLEIF record plus parents.

## `cik` (type: `array`):

SEC Central Index Keys, e.g. 1318605. Use when: the company files with the SEC and you have its CIK.

## `ticker` (type: `array`):

US tickers resolved to a CIK via SEC company_tickers.json, e.g. TSLA. Use when: the company is US-listed. Don't use when: it is private or non-US (use query or lei).

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

Only GLEIF entities whose legal address is in this country, e.g. US, DE, GB. Any value other than US also skips the SEC name match. Use when: a common name returns entities from many countries.

## `sources` (type: `array`):

Empty = both. EU VIES is not offered because its terms forbid retransmission. Use gleif only for non-US entities; use sec only for US-listed identity (CIK, EIN, SIC, last filing).

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

Adds the direct and ultimate parent (or the reporting exception) to GLEIF rows. 2-4 extra GLEIF calls per row. Turn off when you need speed and no ownership data.

## `matchesPerQuery` (type: `integer`):

How many GLEIF matches to return per company name, ranked by GLEIF relevance. Raise it when the top match may be the wrong entity.

## `maxItems` (type: `integer`):

Hard cap on rows returned (and billed, $0.0004 per row, $0.40 per 1,000). Use it to cap spend.

## Actor input object example

```json
{
  "query": "Tesla, Inc.",
  "includeParents": true,
  "matchesPerQuery": 3,
  "maxItems": 10
}
```

# 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 = {
    "query": "Tesla, Inc."
};

// Run the Actor and wait for it to finish
const run = await client.actor("johto.data/company-kyb-verification").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 = { "query": "Tesla, Inc." }

# Run the Actor and wait for it to finish
run = client.actor("johto.data/company-kyb-verification").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 '{
  "query": "Tesla, Inc."
}' |
apify call johto.data/company-kyb-verification --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johto.data/company-kyb-verification"
        }
    }
}
```

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/GbzLMmWjiYkL04NXK/builds/1pMLksQvuj70ETdF4/openapi.json
