# SiteVerdict — Global Company Registries (SEC EDGAR, GLEIF LEI) (`siteverdict/siteverdict-company-registries`) Actor

Company profiles, SEC filings, XBRL financials (revenue, net income, assets, shares) and GLEIF corporate trees from official open registries. Search by name, ticker, CIK, LEI or country; LEI-CIK cross-reference; monitor new 8-K/10-K/10-Q filings. No API key needed.

- **URL**: https://apify.com/siteverdict/siteverdict-company-registries.md
- **Developed by:** [Aman Thakran](https://apify.com/siteverdict) (community)
- **Categories:** Business, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.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

## SiteVerdict — Global Company Registries (SEC EDGAR, GLEIF LEI)

**Know who a company really is in one call: official identifiers, addresses, industry, SEC filings, key financials and its corporate family tree, straight from the SEC and the Global LEI index. No API key, no scraping.**

Type `AAPL`, `Microsoft`, `320193` or `HWUPKR0MPOU8FGXBT394` and get back one clean, normalised profile that joins the **SEC** record (CIK, tickers, SIC, filings, XBRL financials) and the **GLEIF** record (LEI, legal and HQ address, legal form, status, parents and subsidiaries). Each value names its source and date.

### Who it is for

- **KYB / onboarding / procurement teams**: check legal name, LEI status, jurisdiction, registered address and ultimate parent before you sign.
- **Analysts and investors**: revenue, net income, assets, equity, cash and shares for several years, with the exact XBRL concept and filing behind each number.
- **Sales and research**: build company lists by name and country across 200+ jurisdictions (GLEIF) and see which ones are SEC registrants.
- **Monitoring**: get every new 8-K, 10-K, 10-Q, 20-F or 6-K for a watch list on a schedule.
- **AI agents**: one tool call returns a structured company dossier (see MCP section).

### What you get

| View | One row per | Highlights |
|---|---|---|
| **Profiles** | company | CIK, LEI, tickers/exchanges, EIN, country, LEI status, legal form, jurisdiction, SIC (+NAICS via OpenCorporates), legal/HQ/SEC addresses, former names, latest filing, parents, LEI↔CIK link with confidence and reasons, UK Companies House number when the LEI is registered there |
| **Filings** | SEC filing | form, filed/period dates, acceptance time, 8-K item numbers, description, links to the document and the filing index |
| **Financials** | company | latest fiscal year: revenue, net income, operating income, total assets/liabilities, equity, cash, shares outstanding; plus `annual[]` (N years) and `quarterly[]` (3-month periods) with period start/end, form, filed date, accession and XBRL concept for every value |
| **Corporate tree** | company with an LEI | direct and ultimate accounting-consolidation parent (or the reported exception, e.g. `NATURAL_PERSONS`), direct children (and optionally the whole group), totals |
| **Monitor checks** | watched company | baseline / new filings found / previous check time |
| **Errors** | failed input | never charged |

### Examples

**Profile + 3 years of financials + tree for a ticker**

```json
{ "queries": ["AAPL"] }
```

**UK group by LEI, no SEC data**

```json
{ "queries": ["lei:213800JBW23QIB8OWZ72"], "sources": ["gleif"], "maxChildren": 100 }
```

**Find companies by name in Germany and the UK**

```json
{ "queries": ["name:Siemens"], "countries": ["DE", "GB"], "maxResultsPerName": 5 }
```

**Daily filing monitor** (schedule it; first run saves a baseline)

```json
{ "mode": "monitor", "queries": ["AAPL", "MSFT", "0001306965"], "monitorForms": ["8-K", "10-K", "10-Q", "20-F", "6-K"], "monitorStateName": "my-watchlist" }
```

**Full-text search**

```json
{ "mode": "full-text-search", "fullTextQuery": "\"going concern\"", "fullTextForms": ["10-K"], "fullTextStartDate": "2026-01-01", "maxFullTextResults": 200 }
```

Sample output (financials, trimmed):

```json
{ "recordType": "financials", "name": "Apple Inc.", "cik": "0000320193", "fiscalYear": 2025, "periodEnd": "2025-09-27",
  "currency": "USD", "revenue": 416161000000, "netIncome": 112010000000, "totalAssets": 359241000000,
  "sharesOutstanding": 14594180000, "sharesOutstandingAsOf": "2026-07-17",
  "conceptsUsed": { "revenue": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax" } }
```

### How the financials are picked (and why you can trust them)

SEC "companyfacts" contains every number a company ever tagged, including comparatives and quarterly figures inside annual reports. The actor:

1. treats a value as **annual** only if its period is 340–400 days and it comes from a 10-K/20-F/40-F (or amendment); **quarterly** = 75–105 days from 10-Q/6-K;
2. chooses the XBRL concept with the **most recent data** (companies switch, e.g. `Revenues` → `RevenueFromContractWithCustomer…`), fills older years from other candidates, and names the concept on every value;
3. uses the **latest filed** value for each period (restatements and amendments win) and labels the fiscal year from the original report;
4. matches cover-page shares outstanding to the report they came from.
   US-GAAP and IFRS (foreign filers such as Shell) are both supported. Values are in full units (not thousands).

### LEI ↔ CIK cross-reference

- **confirmed**: the SEC record itself states the LEI.
- **high**: exact legal name (after removing legal-form suffixes) **and** matching incorporation state / postcode / city. Linked automatically.
- **medium**: name matches but corroboration is weak; shown as a candidate only, never merged.
  All reasons are listed in `crossReference`.

### Pricing (pay per event)

| Event | When it is charged |
|---|---|
| `company` | one delivered company profile (corporate tree included free) |
| `filing` | one delivered filing row (lookup, monitor or full-text) |
| `financials-extract` | one financials record for a company that has XBRL data |

No charge for errors, not-found inputs, empty results, monitor runs with nothing new, or sample mode. The run stops cleanly at your **max cost per run**: the free corporate tree of a company already paid for is still delivered, every input not reached gets a free `not-processed-charge-limit` row, an input whose company was delivered but whose requested filings or financials did not fit gets a free `partly-processed-charge-limit` row, and the status message says how many were not processed or partly processed. A resumed run never re-charges rows already delivered. Your SEC contact e-mail and OpenCorporates token are removed from error rows, logs and status messages. See PRICING.md for amounts.

### FAQ

**Do I need an API key?** No. SEC and GLEIF are open. OpenCorporates enrichment is optional and needs your own token.
**Why add my e-mail?** The SEC fair-access policy asks automated tools to declare a contact in the User-Agent. It is sent only to sec.gov.
**Does it cover private companies?** GLEIF covers any entity with an LEI (banks, funds, large private companies, subsidiaries worldwide). SEC covers SEC registrants. Companies with neither are not found.
**UK companies?** You get the Companies House number and link from GLEIF. For officers, PSCs, charges and filings use the separate SiteVerdict Companies House actor.
**NAICS?** The SEC publishes SIC only. NAICS appears when your OpenCorporates data has it.
**How fresh?** Live API calls each run. GLEIF golden copy is published several times a day; SEC submissions update within minutes of filing.

### Limits

- SEC rate: ≤10 requests/second (default 5). GLEIF: default 50/minute. Large batches take time by design.
- Full-text search covers 2001+ and returns at most 10,000 hits per query.
- XBRL financials exist only for filers that tag them (most since 2009–2011); small or old filers may have none.
- Non-dimensional facts only: multi-class share counts may show one class.
- GLEIF parents are **accounting consolidation** parents as reported by the entity, not beneficial ownership.
- Name/ticker look-ups and full-text search use the index behind the SEC's public EDGAR search pages (efts.sec.gov). It is public, but not one of the documented data.sec.gov APIs, so it may change; you can switch it off and use CIKs.

### Sources, licences and compliance

- **US SEC EDGAR**: data.sec.gov submissions and XBRL companyfacts APIs; efts.sec.gov EDGAR search. US government work, public domain. Accessed under the SEC fair-access policy (declared User-Agent, ≤10 req/s). Not affiliated with or endorsed by the SEC.
- **GLEIF**: api.gleif.org LEI and Level 2 relationship data, **CC0 1.0** (GLEIF LEI Data Terms of Use). Not affiliated with or endorsed by GLEIF.
- **OpenCorporates** (optional): only with your own API token and under your OpenCorporates licence. Open-data use requires attribution and ODbL share-alike; commercial use needs a paid OpenCorporates plan. Off by default.
- **Personal data**: company data only. No personal contact details are collected. Some registry fields (e.g. sole-trader names, addresses) can relate to individuals: if you process them you are the controller under UK GDPR / GDPR and must have a lawful basis; do not use them for unsolicited marketing (PECR).
- **Disclaimer**: data is provided as published by the registries and may be incomplete or out of date. **Not legal, financial or investment advice.** Check the linked source filing before relying on any number.

# Changelog

This Actor's version history is a separate document: https://apify.com/siteverdict/siteverdict-company-registries/changelog.md

# Actor input Schema

## `mode` (type: `string`):

<b>Lookup</b>: profiles, filings, financials and corporate trees for names, tickers, CIKs or LEIs. <b>Monitor</b>: report new SEC filings (8-K, 10-K, 10-Q...) since the last run for a watch list. <b>Full-text search</b>: find filings that mention a phrase (EDGAR full-text search, 2001+).

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

One per line. Auto-detected: 1-10 digits = SEC CIK (e.g. 320193); 20-character code with valid check digits = LEI (e.g. HWUPKR0MPOU8FGXBT394); short ALL-CAPS = ticker (e.g. AAPL, BRK.B), falling back to a name search; anything else = company name. Force a type with a prefix: cik:, lei:, ticker:, name:.

## `countries` (type: `array`):

Optional ISO 3166-1 alpha-2 codes (US, GB, DE, IN...). Restricts NAME searches to companies whose legal address (GLEIF) or SEC business address is in these countries. Explicit CIKs/LEIs are never filtered.

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

sec = US SEC EDGAR (US-listed and SEC-registered companies, including foreign issuers filing 20-F/40-F/6-K). gleif = Global LEI index (millions of legal entities in 200+ jurisdictions).

## `maxResultsPerName` (type: `integer`):

A name can match several companies; each delivered company is one 'company' event.

## `maxCompanies` (type: `integer`):

Safety cap across all queries.

## `includeFilings` (type: `boolean`):

Filing rows with form type, dates, 8-K items and links to the document and index on sec.gov. Each row is one 'filing' event.

## `filingForms` (type: `array`):

Only these forms (amendments '/A' included automatically). Default: key corporate forms (8-K, 10-K, 10-Q, 20-F, 40-F, 6-K, S-1, S-3, S-4, F-1, DEF 14A, SC 13D/G). Clear the list to get ALL forms, including insider Forms 3/4/5 and 144.

## `filingsSince` (type: `string`):

Optional. Older filing pages are fetched only when needed.

## `maxFilingsPerCompany` (type: `integer`):

0 = no filings.

## `includeFinancials` (type: `boolean`):

Revenue, net income, operating income, total assets, liabilities, equity, cash and shares outstanding, with periods, units and the exact XBRL concept, from SEC companyfacts. One 'financials-extract' event per company with data (never charged when the company has no XBRL facts).

## `financialYears` (type: `integer`):

How many most recent fiscal years to include in the annual\[] history.

## `financialQuarters` (type: `integer`):

3-month periods from 10-Q/6-K. 0 = annual only.

## `includeCorporateTree` (type: `boolean`):

Direct and ultimate accounting-consolidation parents (or the reported exception, e.g. NATURAL_PERSONS) and direct children. Bundled with the 'company' event - no extra charge.

## `maxChildren` (type: `integer`):

The full child count is always reported.

## `includeUltimateChildren` (type: `boolean`):

Also list every entity that GLEIF reports as consolidated into this one at the top of the group (can be large; capped by Max children).

## `crossReference` (type: `boolean`):

Links SEC registrants to their LEI (SEC's own 'lei' field when present = confirmed; otherwise exact legal name + incorporation state + postcode = high confidence). Uncertain matches are listed as candidates, never merged.

## `monitorForms` (type: `array`):

Forms that count as 'new filings' in monitor mode. Empty = all forms. Default: key corporate forms.

## `monitorStateName` (type: `string`):

Name of the key-value store that remembers what was already reported. Use different names for different watch lists.

## `monitorLookbackDays` (type: `integer`):

On the very first run, also report filings from the last N days (0 = baseline only).

## `fullTextQuery` (type: `string`):

Words or "exact phrase" (quotes), as in the SEC's own EDGAR full-text search. Add CIKs/tickers above to restrict to those companies.

## `fullTextForms` (type: `array`):

Optional form types, e.g. 8-K, 10-K. Empty = all forms.

## `fullTextStartDate` (type: `string`):

Optional first filing date.

## `fullTextEndDate` (type: `string`):

Optional last filing date.

## `maxFullTextResults` (type: `integer`):

EDGAR returns at most 10,000 hits per query.

## `secContactEmail` (type: `string`):

The SEC fair-access policy asks automated tools to declare a contact in the User-Agent header. Your e-mail is sent ONLY to sec.gov in that header, never logged or written to output.

## `openCorporatesApiToken` (type: `string`):

Adds OpenCorporates company data (status, incorporation date, industry codes incl. NAICS where available) for LEIs that carry an OpenCorporates ID or a UK company number. Commercial service: you must hold an OpenCorporates licence that covers your use (open-data use requires ODbL attribution and share-alike). Stored encrypted, never logged.

## `useEdgarSearchIndex` (type: `boolean`):

Name and ticker look-ups and full-text search use the index behind the SEC's public EDGAR search pages (efts.sec.gov). Turn off to use only the documented data.sec.gov APIs (then give CIKs for SEC data).

## `secRequestsPerSecond` (type: `integer`):

SEC fair-access maximum is 10/s. Default 5.

## `gleifRequestsPerMinute` (type: `integer`):

Polite request rate for api.gleif.org. Default 50/minute; the actor also backs off automatically on HTTP 429.

## `concurrency` (type: `integer`):

How many queries are processed in parallel. Rate limits are shared, so more parallelism does not exceed the SEC/GLEIF limits.

## `sampleMode` (type: `boolean`):

Runs offline on real responses recorded on 11 Oct 2026 (Apple, Shell, Tesco). No network calls, nothing charged. Good for testing integrations.

## Actor input object example

```json
{
  "mode": "lookup",
  "queries": [
    "AAPL",
    "lei:213800JBW23QIB8OWZ72"
  ],
  "sources": [
    "sec",
    "gleif"
  ],
  "maxResultsPerName": 3,
  "maxCompanies": 100,
  "includeFilings": true,
  "filingForms": [
    "8-K",
    "10-K",
    "10-Q",
    "20-F",
    "6-K"
  ],
  "maxFilingsPerCompany": 20,
  "includeFinancials": true,
  "financialYears": 3,
  "financialQuarters": 4,
  "includeCorporateTree": true,
  "maxChildren": 25,
  "includeUltimateChildren": false,
  "crossReference": true,
  "monitorStateName": "default",
  "monitorLookbackDays": 0,
  "maxFullTextResults": 100,
  "useEdgarSearchIndex": true,
  "secRequestsPerSecond": 5,
  "gleifRequestsPerMinute": 50,
  "concurrency": 3,
  "sampleMode": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `output` (type: `string`):

No description

## `files` (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 = {
    "mode": "lookup",
    "queries": [
        "AAPL",
        "lei:213800JBW23QIB8OWZ72"
    ],
    "filingForms": [
        "8-K",
        "10-K",
        "10-Q",
        "20-F",
        "6-K"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-company-registries").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 = {
    "mode": "lookup",
    "queries": [
        "AAPL",
        "lei:213800JBW23QIB8OWZ72",
    ],
    "filingForms": [
        "8-K",
        "10-K",
        "10-Q",
        "20-F",
        "6-K",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-company-registries").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 '{
  "mode": "lookup",
  "queries": [
    "AAPL",
    "lei:213800JBW23QIB8OWZ72"
  ],
  "filingForms": [
    "8-K",
    "10-K",
    "10-Q",
    "20-F",
    "6-K"
  ]
}' |
apify call siteverdict/siteverdict-company-registries --silent --output-dataset

```

## MCP server setup

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

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/j6aWs1l1Xdw9k8FOx/builds/chFePK7B5LblmqXo4/openapi.json
