# Company Data Enrichment: Firmographics from Public Registries (`datadesk-io/company-data-enrichment`) Actor

Domains, names, tickers or LEIs in; firmographics out: industry, founded, HQ, employees, revenue, CEO, parent, subsidiaries, LinkedIn, GLEIF legal entity and SEC EDGAR data. Open data, never blocked. $3 per 1,000 companies.

- **URL**: https://apify.com/datadesk-io/company-data-enrichment.md
- **Developed by:** [DataDesk](https://apify.com/datadesk-io) (community)
- **Categories:** Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 company enricheds

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 Data Enrichment: Firmographics from Public Registries

Turn a list of **company domains, names, stock tickers or LEI codes** into firmographics: industry, founding date, headquarters, employees, revenue, founders, CEO, parent and subsidiaries, tickers, LinkedIn/X/Crunchbase links, **the official legal entity (GLEIF LEI registry)** and **SEC EDGAR filer data** (CIK, SIC code, EIN, phone, business address, latest annual report).

A **Crunchbase/Apollo-style company lookup built only on open, official data**: Wikidata, the Global LEI Index (GLEIF) and the US SEC. No login, no cookies, no proxies, no scraping walls, so runs do not break or get blocked.

### Pricing

- **$3.00 per 1,000 companies found** ($0.003 per company). No start fee.
- **Inputs that match nothing are free**, and duplicates are skipped (including two inputs that resolve to the same company).
- For comparison, Crunchbase scrapers in the Store charge $8–$15 per 1,000 companies and often get blocked.

### Why this one

| Problem with other lead/company Actors (from their public issues) | Here |
|---|---|
| "Duplicate 5,000 lead run" refund requests, "90% same leads" | Inputs deduplicated, and one row per real company (matched by ID) |
| "Max result doesn't work", "keeps using tokens after abort" | `maxCompanies` hard cap. Each lookup has a 90 s time limit |
| "Bad data", "70% of the leads are invalid", filters ignored | Every field comes from a named source (`sources`, `matchMethod`, `wikidataUrl`, `gleifUrl`, `secUrl`), so you can audit it |
| Crunchbase scrapers blocked or rated 1–1.5★ | Open APIs only, nothing to block |

### Input (all optional)

```json
{"companies": ["stripe.com", "Siemens", "NVDA", "Nubank", "529900ODI3047E2LIV03"], "language": "en"}
```

- **Domain** → matched on the official website registered in Wikidata (most precise).
- **Ticker** (1–5 capital letters) → stock ticker, then SEC.
- **LEI** (20 characters) → GLEIF registry.
- **Name** → best business match among Wikidata results (must look like a company), else GLEIF legal-name lookup.

Empty input runs 5 sample companies in a few seconds.

### Output example (real run, 2026-10-21, input `hubspot.com`, shortened)

```json
{
  "input": "hubspot.com",
  "name": "HubSpot",
  "matchMethod": "wikidata-official-website",
  "description": "American marketing software company",
  "domain": "hubspot.com",
  "industries": [
    "software industry",
    "software as a service",
    "marketing",
    "customer relationship management",
    "..."
  ],
  "foundedDate": "2006-01-01",
  "headquarters": [
    "Cambridge"
  ],
  "country": [
    "United States"
  ],
  "founders": [
    "Brian Halligan",
    "Dharmesh Shah"
  ],
  "ceo": [
    "Yamini Rangan"
  ],
  "employees": 8246,
  "employeesAsOf": "2024-01-01",
  "revenue": 2630000000,
  "revenueCurrency": "United States dollar",
  "revenueAsOf": "2024-01-01",
  "tickers": [
    "HUBS"
  ],
  "stockExchanges": [
    "New York Stock Exchange"
  ],
  "linkedinUrl": "https://www.linkedin.com/company/hubspot",
  "sources": [
    "wikidata",
    "gleif",
    "sec-edgar"
  ],
  "registry": {
    "lei": "529900BLNVEW0MVKJB37",
    "legalName": "HUBSPOT, INC.",
    "jurisdiction": "US-DE",
    "entityStatus": "ACTIVE",
    "registeredAs": "3950045",
    "headquartersAddress": "2nd Floor, 25 First Street, Cambridge, US-MA, 02141, US",
    "entityCreationDate": "2005-04-04"
  },
  "sec": {
    "cik": "0001404655",
    "sicDescription": "Services-Prepackaged Software",
    "ein": "202632791",
    "phone": "(888) 482-7768",
    "businessAddress": "2 CANAL PARK, CAMBRIDGE, MA, 02141",
    "latestAnnualReportDate": "2026-02-11"
  }
}
```

All fields are described in the dataset schema. Fields that a source does not publish are `null`.

### Ready-made presets

| Preset | Input |
|---|---|
| Public companies by ticker (adds SEC EDGAR + LEI) | `{"companies": ["AAPL", "MSFT", "NVDA", "MELI", "GLOB"]}` |
| Latin American companies by name, Spanish labels | `{"companies": ["Bancolombia", "Falabella", "Rappi", "Corporación Favorita", "Totvs"], "language": "es", "includeNotFound": true}` |
| Firmographics from domains (most precise) | `{"companies": ["stripe.com", "shopify.com", "hubspot.com"]}` |

### Workflow: domain → company + contacts (with Company Data Enrichment)

[Website Contact Finder](https://apify.com/datadesk-io/website-contact-finder) and [Company Data Enrichment](https://apify.com/datadesk-io/company-data-enrichment) are built to be used together on the same list of domains. Join their outputs on `domain`:

| Step | Actor | Gives you | Price |
|---|---|---|---|
| 1 | Company Data Enrichment | Who the company is: industry, HQ, employees, revenue, CEO, legal entity (LEI), SEC data | $3 / 1,000 companies found |
| 2 | Website Contact Finder | How to reach them: emails with MX check, phones, social profiles, tech stack | $2 / 1,000 sites with contacts |

Real output for `hubspot.com` from both Actors (runs on 2026-10-21, shortened):

Contacts (Website Contact Finder):

```json
{
  "domain": "hubspot.com",
  "companyName": "HubSpot",
  "primaryEmail": null,
  "primaryPhone": "+16178125820",
  "phonesTotal": 58,
  "linkedin": [
    "https://www.linkedin.com/company/hubspot",
    "... 17 more (company + people pages)"
  ],
  "twitter": [
    "https://x.com/HubSpot",
    "..."
  ],
  "facebook": [
    "https://www.facebook.com/hubspot"
  ],
  "techHints": [
    "Cloudflare",
    "Google Analytics",
    "HubSpot"
  ]
}
```

Company (Company Data Enrichment):

```json
{
  "name": "HubSpot",
  "industries": [
    "software industry",
    "software as a service",
    "..."
  ],
  "foundedDate": "2006-01-01",
  "headquarters": [
    "Cambridge"
  ],
  "employees": 8246,
  "revenue": 2630000000,
  "revenueCurrency": "United States dollar",
  "ceo": [
    "Yamini Rangan"
  ],
  "tickers": [
    "HUBS"
  ],
  "registry": {
    "lei": "529900BLNVEW0MVKJB37",
    "legalName": "HUBSPOT, INC."
  },
  "sec": {
    "cik": "0001404655",
    "sicDescription": "Services-Prepackaged Software"
  }
}
```

**No-code:** run both on the same domain list (or chain them with an Apify integration / webhook on "run succeeded"), export both datasets and merge on `domain`.

**API (Python):**

```python
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
domains = ["hubspot.com", "calendly.com", "stripe.com"]
companies = client.actor("datadesk-io/company-data-enrichment").call(run_input={"companies": domains})
contacts = client.actor("datadesk-io/website-contact-finder").call(run_input={"websites": domains})
by_domain = {r["domain"]: r for r in client.dataset(contacts["defaultDatasetId"]).iterate_items()}
for c in client.dataset(companies["defaultDatasetId"]).iterate_items():
    lead = {**c, "contacts": by_domain.get(c.get("domain"))}
    print(lead["name"], lead.get("employees"), (lead["contacts"] or {}).get("primaryEmail"))
```

**AI agents (MCP):** load both tools in one MCP server:

`https://mcp.apify.com/?tools=datadesk-io/company-data-enrichment,datadesk-io/website-contact-finder`

Then ask, for example: *"For hubspot.com, calendly.com and stripe.com, get industry, employee count and CEO, then the best contact email (deliverable domains only) and LinkedIn page, and give me one table."* The agent calls Company Data Enrichment with `{"companies": [...]}` and Website Contact Finder with `{"websites": [...]}`, then joins the results on `domain`. Use `maxCompanies` / `maxWebsites` to cap the cost of each call.

### Limits

- Coverage is best for **mid-size and large companies, public companies, banks and regulated entities** (anything with a Wikidata item, an LEI or SEC filings). Very small local businesses are often not in these registries. They return "not found" and cost nothing. For small-business contacts, combine with [Website Contact Finder](https://apify.com/datadesk-io/website-contact-finder).
- Employee counts and revenue are the latest values published in Wikidata, with their date (`employeesAsOf`, `revenueAsOf`).
- Name matching can pick the wrong company for ambiguous names. Use domains when you have them.

### Use with AI agents (MCP)

Add it to Claude, ChatGPT, Cursor, VS Code or any MCP client through the Apify MCP server:

`https://mcp.apify.com/?tools=datadesk-io/company-data-enrichment`

Authenticate with OAuth or `Authorization: Bearer <APIFY_TOKEN>`. Local stdio config:

```json
{"mcpServers": {"companies": {"command": "npx", "args": ["-y", "@apify/actors-mcp-server", "--tools", "datadesk-io/company-data-enrichment"], "env": {"APIFY_TOKEN": "<token>"}}}}
```

**Example prompt:** "Get industry, HQ, employee count, CEO and legal entity (LEI) for stripe.com, siemens.com and nubank.com.br."

The agent sees the input schema and the documented output fields. Use `maxCompanies` to cap the cost of one call. Plain REST: `POST https://api.apify.com/v2/acts/datadesk-io~company-data-enrichment/run-sync-get-dataset-items?token=...`.

### Data sources and licensing

Wikidata (CC0), GLEIF LEI data (CC0) and SEC EDGAR (US public domain), all accessed through their official public APIs with a descriptive User-Agent and within their rate limits.

# Actor input Schema

## `companies` (type: `array`):

Company domains (stripe.com), names (Siemens), stock tickers (NVDA) or LEI codes (20 characters). Duplicates are processed and charged once.

## `language` (type: `string`):

Language of labels (industry, city, description) when available. Falls back to English.

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

Hard cap on unique companies processed in this run.

## `includeNotFound` (type: `boolean`):

Also output inputs that matched nothing. These rows are never charged.

## Actor input object example

```json
{
  "companies": [
    "stripe.com",
    "Siemens",
    "NVDA",
    "Nubank",
    "Mercado Libre"
  ],
  "language": "en",
  "includeNotFound": false
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per company found (see dataset schema for field descriptions).

# 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 = {
    "companies": [
        "stripe.com",
        "Siemens",
        "NVDA",
        "Nubank",
        "Mercado Libre"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datadesk-io/company-data-enrichment").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 = { "companies": [
        "stripe.com",
        "Siemens",
        "NVDA",
        "Nubank",
        "Mercado Libre",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datadesk-io/company-data-enrichment").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 '{
  "companies": [
    "stripe.com",
    "Siemens",
    "NVDA",
    "Nubank",
    "Mercado Libre"
  ]
}' |
apify call datadesk-io/company-data-enrichment --silent --output-dataset

```

## MCP server setup

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

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/ptqZrm20fnmCLuVMQ/builds/iTRoUZJxCEaSwVf0H/openapi.json
