# Company Domain Enrichment API | CRM Firmographics (`aeonkosmos/company-domain-enrichment-api`) Actor

Enrich company domains with collision-safe, CRM-ready records: description, founding year, employee count, HQ details, funding signals, website, logo and LinkedIn context. Only unique identity matches are returned; ambiguous records are never guessed.

- **URL**: https://apify.com/aeonkosmos/company-domain-enrichment-api.md
- **Developed by:** [Eugene Volper](https://apify.com/aeonkosmos) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 enriched company records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Company Domain Enrichment API | CRM Firmographics

Turn a company domain into one collision-safe, CRM-ready company record.

This Actor is deliberately strict. The identity lookup can return several companies
that all echo the requested domain. It emits a dataset item only when one candidate
has a unique exact company-name or LinkedIn-company-slug match to the domain label.
It then joins the matched record to an exact-domain company profile from the private
company database. It never chooses a lookalike result. Missing and ambiguous domains
are counted in `OUTPUT.json`, not placed in the dataset.

### Input

Provide 1–100 company domains or website URLs.

```json
{
  "domains": ["stripe.com", "https://openai.com/"]
}
```

Duplicate, malformed, and blank values are removed before lookup. The run summary
reports their count.

Free Apify accounts receive 500 results shared across all eight Actors. The private links in `SUPPORTER_ACCESS` let a user submit honest feedback for 50 additional results valid for 30 days, or report a reproducible bug for 2,500 results after confirmation. No public review or positive feedback is required. Any paid Apify plan is uncapped by this internal result allowance; normal Apify platform and Actor charges still apply.

### Dataset output

Every dataset record is a confirmed exact-domain match and includes:

| Group | Fields |
|---|---|
| Match safety | `inputDomain`, `status`, `matchMethod`, `matchScore`, `candidateCount`, `dataCompleteness`, `retrievedAt` |
| Identity | `companyId`, `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `logoUrl` |
| Company profile | `companyDescription`, `industry`, `foundedYear` |
| Size | `employeeCount`, `employeeSizeBand` |
| Headquarters | `location`, `hqLocality`, `hqRegion`, `hqPostalCode`, `countryCode` |
| Funding signal | `hasFunding`, `lastFundingRoundType`, `lastFundingRoundDate` |

`dataCompleteness` is a transparent percentage of the 18 populated company facts;
it is not an accuracy score. A blank field means the private database did not provide
that fact, or its richer profile could not be uniquely joined to the already-confirmed
company identity.

### Why this is safer than a field dump

The store already contains broad company-data products. This Actor competes on a
reliable workflow: domain in, collision-safe selection, and a stable CRM schema.
It does not claim emails, phones, contacts, revenue, total funding, tech stack,
hiring, investor data, or job openings.

### Pricing

Pay per enriched company record written to the default dataset. Missing and ambiguous
domains are kept out of the dataset and are not charged as results. The current
per-record prices reward higher Apify plan tiers:

| Apify plan | Price per enriched company | Discount from Free |
|---|---:|---:|
| Free | $0.00200 | — |
| Bronze | $0.00190 | 5% |
| Silver | $0.00180 | 10% |
| Gold | $0.00170 | 15% |
| Platinum | $0.00170 | 15% |
| Diamond | $0.00170 | 15% |

### Run summary

`OUTPUT.json` contains counts for `found`, `notFound`, `ambiguous`, `failed`, and
the non-dataset status rows. This lets a bulk workflow audit misses without turning
them into result rows.

### Operator configuration before deployment

Set these Actor environment variables in the private Actor configuration; do not
put credentials in this repository or in the dataset.

| Variable | Required | Purpose |
|---|---:|---|
| `COMPANY_DATA_API_KEY` | Yes | Private upstream access token |
| `COMPANY_DATA_API_BASE_URL` | Yes | Private company-data API base URL |

### Pre-launch gate — not optional

The private company-data routes are live. A Stripe schema fixture established all
listed field names and revealed the domain-collision behavior. Pricing is configured
privately; the Actor is **not ready to publish**. Before public launch, run a redacted
live fixture and verify:

1. exact response shape and field coverage for found, missing, and collision cases;
2. the per-found-result upstream-unit count and actual balance delta for the two-query join;
3. 100-domain latency and rate-limit behaviour; and
4. per-found-result economics before any Apify pricing event is configured.

The code already protects result integrity. Billing uses Apify's built-in default
dataset-item event, so only a delivered dataset row is charged; the Actor contains no
manual `Actor.charge()` call and no publication mutation.

# Actor input Schema

## `domains` (type: `array`):

Enter up to 100 company domains or website URLs. Duplicates are removed. Free Apify accounts receive 500 results shared across all eight Actors; private feedback adds 50 for 30 days, and a confirmed bug adds 2,500. Paid Apify plans are uncapped by this internal allowance. Normal Apify charges apply.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "openai.com"
  ]
}
```

# Actor output Schema

## `companies` (type: `string`):

Normalized company firmographic records

# 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 = {
    "domains": [
        "stripe.com",
        "openai.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aeonkosmos/company-domain-enrichment-api").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 = { "domains": [
        "stripe.com",
        "openai.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aeonkosmos/company-domain-enrichment-api").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 '{
  "domains": [
    "stripe.com",
    "openai.com"
  ]
}' |
apify call aeonkosmos/company-domain-enrichment-api --silent --output-dataset

```

## MCP server setup

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

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/PE79eTxLIDEkEwtfR/builds/9kBvu7XEeS8FJ5WRx/openapi.json
