# Company Profile: financials, filings, events (`companyfacts/company-profile`) Actor

US, UK and Indian company profiles by name, ticker, CIK, Companies House number or CIN: financials, filings, officers, beneficial owners, group structure, sanctions screening and change alerts — every fact with its source. Standby REST API + MCP server.

- **URL**: https://apify.com/companyfacts/company-profile.md
- **Developed by:** [Jhutan Debnath](https://apify.com/companyfacts) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 us company profiles

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Company Profile — financials, filings, events, MCP-ready

Give it company names, tickers, CIKs or LEIs. Get back one profile per company:
identity and identifiers, business details, **normalised financial statements
(10 years, annual)**, the filing index with document links, and a timeline of
name changes — **every fact with its source document**. Built from SEC EDGAR
bulk data, refreshed nightly. UK Companies House coverage is next.

Works two ways: as a normal Actor run (paste a list, export JSON/CSV/Excel), and
as a **Standby API + MCP server** so agents and pipelines can query one company
at a time.

***

### What you get per company

| Block | Contents |
|---|---|
| `identity` | `id` (`cik:0000320193`), legal name, ticker, exchange, LEI, EIN, state of incorporation |
| `business` | SIC code and description, fiscal year end, website, business & mailing address, phone |
| `financials` | 30 concepts — Revenue, CostOfRevenue, GrossProfit, OperatingIncome, NetIncome, EPS, TotalAssets, TotalLiabilities, Equity, Cash, OperatingCashFlow, CapitalExpenditure, DividendsPaid, ShareRepurchase… — per fiscal year, as reported in the **latest restatement**, with the accession number of the filing it came from |
| `filings` | most recent filings: form (10-K, 10-Q, 8-K…), filing date, period, direct document URL |
| `events` | timeline: former names with dates (more event types as sources are added) |
| `match` | how the query was resolved: score, method (id / ticker / normalised name), evidence |
| `coverage` | what was **not** found — so silence never reads as "none" |

Three output views: **Profiles** (one row per company), **Financials** (one row
per fact — pivot-table ready), and **Unresolved** (queries we could not match
with confidence, with the candidates we considered — **not charged**).

### How to use it

1. Paste companies into **Companies**, one per line — names (`Apple Inc`),
   tickers (`AAPL`), CIKs (`0000320193` or `cik:0000320193`), or LEIs.
2. Run. Export from the Output tab or read the dataset via API.

Names are matched on a normalised legal name. If the top match isn't clear-cut
(two candidates within 0.15 of each other, or below your **auto-pick
threshold**), the row goes to *Unresolved* with the candidates instead of
guessing. Getting the wrong company's financials into a decision is worse than
a blank.

#### Standby API and MCP

Standby is on. Base URL `https://companyfacts--company-profile.apify.actor`,
authenticated with your Apify token (`?token=…` or `Authorization: Bearer …`):

```
GET  /resolve?q=Nvidia            ranked candidates with scores and evidence (free)
GET  /profile?id=cik:0001045810   full profile (charged as one US company profile)
POST /mcp                         MCP, Streamable HTTP: resolve_company, get_company,
                                  get_financials, get_filings, get_events
```

Time-travel (`/profile?…&as_of=YYYY-MM-DD`) works on the portal and on Actor
runs with 4 GB memory or more; the default Standby container returns
`503 as_of_unavailable` for it today (the dated snapshot needs more memory/disk
than Standby provides).

MCP client config (Claude Desktop / Cursor / any MCP client):

```json
{ "mcpServers": { "company-profile": {
    "url": "https://companyfacts--company-profile.apify.actor/mcp",
    "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" } } } }
```

Tool descriptions carry the field semantics, so an agent can chain
`resolve_company` → `get_company` without guessing.

#### Risk, relationships and monitoring (all countries)

| Block | Contents |
|---|---|
| `sanctions` + `risk_flags.sanctions_hit` | OFAC (SDN + consolidated), UK HMT/OFSI, UN and EU consolidated lists, refreshed nightly. Corroborated matches only: a person needs name **and** date of birth; a company needs name **and** country. Candidates without corroboration are never asserted. |
| `group` | ultimate parent, the ownership path (registry ids all the way up), effective shareholding band, direct-subsidiary count — built from the PSC register, GLEIF Level 2 consolidation and EX-21 subsidiary lists, cross-border (a UK company's Indian parent resolves to its CIN). |
| `commercial` | US: key customers and suppliers with revenue share, from XBRL concentration-risk disclosures and 10-K text — each with the evidence sentence and accession number (e.g. Cirrus Logic → Apple, 91% of sales). |
| `segments` | US: revenue and operating income by business segment, geography and product line (FSDS), latest two fiscal years. |
| `GET /changes?since=…` | registry-wide change feed: status changes, new charges, officer appointments/resignations, new PSC owners, insolvency, SEC 8-K items (bankruptcy, officer departures, material agreements), results filings. Priced as `change-detected` per 25 events. Also an MCP tool (`get_changes`), plus `screen_name` for sanctions candidates. |

### United Kingdom — Companies House

UK profiles come from Companies House's own bulk products (Open Government
Licence, express permission to reuse): **5.6 million live companies**, the
**daily iXBRL accounts** product, the **PSC (beneficial owner) register**, and
the **officer appointments snapshot** (Product 195 — 29.5M appointments across
18M current and dissolved companies). Per company:

| Block | Contents |
|---|---|
| `identity` | `ch:00445790`, registered name, status, company category, incorporation date, SIC codes, registered office |
| `financials` | latest iXBRL accounts: equity, net assets, current assets, cash, creditors, debtors, fixed assets, average headcount — and turnover/profit **where the company files them** |
| `people` | current directors, secretaries, LLP members: role, appointment date, month of birth, service address, occupation, nationality |
| `control` | persons with significant control, with the statutory **band** (`{min, max}`) and nature of control |
| `charges` | registered charges/mortgages: lender, status (outstanding / satisfied), dates |
| `insolvency` | liquidation, administration, winding-up cases with practitioners and dates |
| `risk_flags` | `disqualified_officer`, `insolvency_event`, `outstanding_charges`, `receiver_appointed`, `status_not_active` — the questions a KYB check asks first |
| `secured_lending` | UK only. Who the company's secured creditors are, what they are secured on, and whether the charge was repaid — from the Companies House mortgage register (3.5M charges over 825k companies). The one place the register names a company's banks. |
| `coverage` | `financials: ixbrl_accounts`, `people: registry`, `ownership: psc_register`, `charges`, `insolvency`, `disqualifications` — each `registry`, `ch_api_live`, `none` or `not_loaded`, said plainly |

Officers are checked against the **Register of Disqualifications** (matched on
name *and* month of birth — a name match alone never asserts a ban).

**Read this before buying UK financials.** Only **0.9%** of daily accounts
filings disclose turnover (measured 28 Aug 2026 on 18,881 filings): micro-entities
and small companies are legally allowed to file balance-sheet totals only, and
the same rule survives the April 2028 filing reforms (small companies may file a
P\&L but opt out of publishing it). What nearly every filer *does* disclose is the
balance sheet and average headcount, so a UK profile is always a real picture
of size and solvency; revenue is a bonus for the medium and large filers.

### India — Ministry of Corporate Affairs

India profiles come from the MCA **company master data** published on
data.gov.in (Government Open Data License – India, attribution carried in every
profile's `coverage.attribution`): **3.67 million companies and LLPs**, ids
`cin:L17110MH1973PLC019786` / `llpin:AAA-1234`. Per company:

| Block | Contents |
|---|---|
| `identity` | registered name, CIN/LLPIN, status, class (public/private/OPC), category, RoC, date of registration, registered office, listed flag, NIC activity |
| `capital` | authorised and paid-up capital (INR) |
| `address.meta` | the CIN decoded: listing, NIC code, state, year, company type |
| `coverage` | `financials: none`, `people: none`, `ownership: none` — said plainly; MCA has **no free bulk source** for directors or financials |

Struck-off companies are not served. India profiles are charged as `profile-in`
($0.01): identity for every company, plus quarterly and annual financials, shareholding
and market data for listed filers.

### Pricing

Pay per result. **Unresolved queries are free.**

| Event | Price |
|---|---|
| US company profile | $0.005 |
| UK company profile (accounts + officers + PSC) | $0.03 |
| Officer / person record — coming | $0.005 |
| Change detected (monitoring) — coming | $0.01 |

For comparison: sec-api.io starts at $49/month, FMP at $15/month with daily
caps. Here there is no subscription and nothing expires.

### Limitations — read this

**US public filers and UK companies only.** ~48,000 US operating, listed or
XBRL-filing companies from SEC EDGAR; 5.6M live UK companies from Companies
House. Private US companies and other countries are not covered yet.

**Annual figures only.** Quarterly (10-Q) facts exist in the pipeline and will
be enabled next; today the profile carries fiscal-year values for the last 10
years.

**Officers and directors are not yet loaded.** They live in Form 3/4/5 and
proxy statements, which are parsed in a later stage. `coverage.people` says
`not_loaded` so you know.

**XBRL is what the company tagged.** We pick the best-known tag per concept
and the latest restatement; when a filer uses an unusual tag, a concept can be
missing rather than wrong. Our extraction agrees with the SEC's own Financial
Statement Data Sets on 98.7% of overlapping facts.

**Detection is not proof.** Every value links to its source filing — check it
before it goes into a credit or compliance decision.

### FAQ

**How fresh?** Built from the SEC's nightly bulk files (`submissions.zip`,
`companyfacts.zip`); each profile carries `coverage.data_as_of`, the date of
the snapshot it was served from.

**Can I use it with an agent?** Yes — Standby mode exposes `/mcp`.

**Batch size?** Up to 5,000 companies per run; lower the auto-pick threshold
to 100 if you only want identifier and ticker matches.

**Licence of the data?** SEC EDGAR is public domain; redistribution of derived
data is long-standing practice. Every record keeps its provenance.

### Changelog

**0.1.28** — Screens (`/screen` + `screen_companies` MCP tool, $0.01/query);
batch entity resolution (`/resolve/batch`, `resolveOnly` runs, $0.01/matched row,
unmatched free); receipts: every fact links its source document; person
due-diligence reports (`/person`, uncapped counts, co-director network); derived
analytics (ratios, growth, peers, percentiles behind `?peers=1`); negative-space
signals (accounts overdue/never filed, no officers, gone-quiet, revenue
withheld); India: shareholding pattern (Reg 31), EOD market data (bhavcopy),
documents hub (announcements/annual reports/credit ratings), IBBI CIRP +
SEBI-debarment flags; UK/US/IN government contracts; former-name aliases in
resolve.

**0.1.25** — Sanctions screening (OFAC/UK/UN/EU) with corroborated `sanctions_hit`;
cross-border `group` block (ultimate parent via PSC + GLEIF + EX-21); US key
customers/suppliers (`commercial`); `/changes` feed + `get_changes`/`screen_name`
MCP tools; India: bank-taxonomy financials (ICICI etc.), BSE-only companies
(1,427) with quarterly P\&L, Q4 balance sheets in quarterly view.

**0.1.22** — India: 3.67M MCA companies/LLPs (`cin:`/`llpin:`), listed
companies' SEBI results via NSE where crawled. UK: director networks
(`other_appointments_count`, `network.co_directors`, `risk_flags.serial_insolvency`)
and accounts history (every period retained). US: `segments` block — revenue
and operating income by business segment, geography and product (FSDS).
Resolve treats Indian `L`-prefixed CINs as listed.

**0.1** — US profiles from SEC EDGAR: identity, business, 30 annual financial
concepts (10 years), filing index, name-change events; Standby REST + MCP.

# Actor input Schema

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

One per line: a company name, ticker (AAPL), CIK (0000320193 or cik:0000320193) or LEI. Up to 10,000 per run.

## `resolveOnly` (type: `boolean`):

Batch entity matching: write ranked registry-id candidates per query to the dataset — score, match method and evidence, with a caution flag on inexact matches — without fetching profiles. Charged as `resolve-match` ($0.01) per row that gets a best candidate; unmatched and ambiguous rows are free.

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

ISO country to restrict name matches (US, GB). Leave blank for all.

## `autoPickThreshold` (type: `integer`):

Take the top candidate only when its score ≥ this AND it is not ambiguous (top two within 0.15). Otherwise the row is written to the Unresolved view with all candidates, uncharged. 100 = identifiers and tickers only.

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

Attach the most recent 200 filings with document URLs.

## `includeQuarterly` (type: `boolean`):

Attach 10-Q quarterly facts alongside annual 10-K facts.

## Actor input object example

```json
{
  "queries": [
    "Apple Inc",
    "0000789019"
  ],
  "resolveOnly": false,
  "country": "",
  "autoPickThreshold": 90,
  "includeFilings": true,
  "includeQuarterly": true
}
```

# Actor output Schema

## `profiles` (type: `string`):

No description

## `financials` (type: `string`):

No description

## `unresolved` (type: `string`):

No description

## `all` (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 = {
    "queries": [
        "AAPL",
        "MSFT",
        "cik:0001652044"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("companyfacts/company-profile").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 = { "queries": [
        "AAPL",
        "MSFT",
        "cik:0001652044",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("companyfacts/company-profile").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 '{
  "queries": [
    "AAPL",
    "MSFT",
    "cik:0001652044"
  ]
}' |
apify call companyfacts/company-profile --silent --output-dataset

```

## MCP server setup

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

```

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/se2OfGkyBrUyp0THx/builds/OmJ0v7AueqEkvuHt2/openapi.json
