# Company Enrichment by Domain | from $0.696/1k (`b2bdata/company-firmographics-by-domain`) Actor

Domain in, firmographics out: industry, employee count and size band, HQ city and country, founding year, funding signal, LinkedIn page. Ambiguous domains skipped. Bulk, failed lookups free, per-run spend cap. JSON/CSV, Clay, HubSpot, n8n. Free plan: 100 domains per run.

- **URL**: https://apify.com/b2bdata/company-firmographics-by-domain.md
- **Developed by:** [Open Enrich](https://apify.com/b2bdata) (community)
- **Categories:** Lead generation, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 enriched companies

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 Enrichment by Domain | from $0.696/1k

Domain in, firmographics out. Send a list of company domains, get back one clean company record per domain: industry, employee count and size band, headquarters, founding year, funding signal, description, website, logo and LinkedIn page. No login, no cookies. If a domain is ambiguous, we skip it and tell you. We never guess.

**Domain to firmographics | No login | Collision-safe | 1 to 100 domains per run | 26 CRM-ready fields | JSON/CSV export**

> **Strict by design.** A row is written only when exactly one company is a confirmed match for the domain. Missing and ambiguous domains are counted in the run summary and are not billed. Not affiliated with LinkedIn.

[See all 10 actors by b2bdata](https://apify.com/b2bdata)

***

### 💳 Pricing and plans

Pay per result, see the Pricing tab. Free Apify plan: up to 100 domains per run, the same as paid plans, as many runs as your Apify credit covers. Normal Apify platform usage applies.

A result is one enriched company record in the dataset. Domains that come back missing or ambiguous never become rows, so they are not charged.

#### Success-only billing

You pay for delivered rows only. A failed lookup, an empty search or a notice row is free: failed lookups are free. Each delivered enriched company is one `company-record` event, charged right after the row is saved. Higher Apify plans pay less per result: Bronze 5% off, Silver 10% off, Gold and above 15% off. Exact numbers are on the Pricing tab.

#### Add-ons (charged extra)

Add-ons are opt-in inputs, off by default, each charged as its own event and only when it returns data for that row. The primary event is the only charge on a default run.

#### Lead score and `minLeadScore`

Every row gets a `leadScore` from 0 to 100, built only from signals that are really on the row: match method and match score, `dataCompleteness`, and whether industry, size and founding year are present. The formula is written out in AGENTS.md. Set `minLeadScore` (default 0) and rows below it are not pushed and not charged.

#### Compatible output

Set `outputFormat` to `compatible` to get common LinkedIn scraper field names instead of ours, so existing pipelines keep working. The default is `default`, unchanged. The mapping table is in AGENTS.md.

***

### ⚖️ This vs. the alternatives

| | **This actor** | Field-dump enrichment APIs | Manual research |
|---|---|---|---|
| Input | **Domains or website URLs** | Domains | One site at a time |
| Account or cookies needed | **No** | Often an account and key | n/a |
| Firmographics per domain | **Industry, headcount, size band, HQ, founded, funding signal** | Varies, often a flat field dump | Whatever you find |
| Look-alike companies | **Skipped, counted as ambiguous** | Often returned as the answer | You judge |
| Match evidence in every row | **Yes: method, score, candidate count** | Rarely | n/a |
| Output shape | **Stable CRM schema** | Varies by vendor | Free text |
| Completeness shown | **Yes, `dataCompleteness` percent** | Rarely | n/a |
| Bulk per run | **Up to 100 domains** | Varies | 1 |
| Pay for misses | **No** | Varies | Your time |
| Cost per result | **Pay per result, see Pricing tab** | Credit-based | Hourly |

We do not claim the widest data. We claim the safest match. The actor is deliberately strict: it prefers a miss over a wrong company in your CRM.

***

### ⚡ Why this actor?

- **Collision-safe.** A domain lookup can return several companies that all echo the domain. The actor writes a row only when exactly one candidate has an exact company-name or LinkedIn-company-slug match to the domain label.
- **Proof in every row.** `matchMethod`, `matchScore` and `candidateCount` show how the match was made.
- **A stable CRM schema.** The same field names every run, ready to map to HubSpot, Salesforce or Clay.
- **Honest completeness.** `dataCompleteness` is the share of the 18 company facts that are filled. It is not an accuracy score.
- **Misses are visible.** `OUTPUT` counts `found`, `notFound`, `ambiguous` and `failed`, so a bulk run can be audited without junk rows.

***

### 🎯 Use cases

- **CRM cleanup.** Turn a column of domains into names, size bands, locations and LinkedIn pages.
- **Lead routing and scoring.** Use `employeeSizeBand`, `industry` and `hasFunding` to route accounts.
- **Account list building.** After [linkedin-company-search](https://apify.com/b2bdata/linkedin-company-search), add the firmographics you need to filter.
- **Funding-signal filtering.** Keep only companies with a recorded funding round, using `hasFunding` and `lastFundingRoundType`.
- **Dedupe by canonical domain.** `companyDomain` gives one stable key per company.
- **Before outreach.** Confirm the company, then call [executive-email-finder-by-domain](https://apify.com/b2bdata/executive-email-finder-by-domain) or [ceo-founder-email-finder-by-domain](https://apify.com/b2bdata/ceo-founder-email-finder-by-domain) on the same domain.

***

### 🔗 Pipeline guide: from keyword to verified contact

This actor is step 2 (confirm the company, get firmographics). Chain four b2bdata actors and you go from a keyword to a contact:

```
  keyword: "fintech", countries: "uk, de"
        |
        v
 [1] linkedin-company-search        -> company page URL, name
        |
        v
 [2] company-firmographics-by-domain  <-- you are here
        |            -> confirmed company, domain, firmographics
        v
 [3] executive-email-finder-by-domain / ceo-founder-email-finder-by-domain
        |            -> decision-makers with domain-matched work emails
        v
 [4] email-phone-finder             -> phone for the chosen person
```

All of them are on the publisher page: [See all 10 actors by b2bdata](https://apify.com/b2bdata). Each step reads the previous step's dataset, so a Make or n8n scenario chains them without code. Unlike steps 3 and 4, this actor takes a whole list of domains in one run.

***

### 🚀 Quick start

Open the actor, paste domains, press Start. Or send JSON. Three examples:

#### 1. Two companies

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

#### 2. Paste website URLs, they still work

```json
{
  "domains": ["https://www.notion.so/", "https://linear.app/pricing"]
}
```

#### 3. A bulk run

```json
{
  "domains": ["stripe.com", "openai.com", "notion.so", "linear.app", "figma.com"]
}
```

Add up to 100 domains per run. Duplicates, blank and malformed values are removed before lookup, and their count is in the run summary.

***

### ⚙️ Inputs

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `domains` | array of strings | Yes | none (prefill `stripe.com`, `openai.com`) | 1 to 100 company domains or website URLs. Duplicates are removed. |

That is the whole form. One field, no modes.

***

#### Advanced inputs (API users)

These fields are hidden in the Console form and meant for API and automation use.

| Field | Type | Default | What it does |
|---|---|---|---|
| `maxChargeUsd` | number | `0` (off) | Stops the run when this run's charges reach the amount. The run ends SUCCEEDED with the rows already delivered and one free explanation row (`max_charge_reached`). The check runs after each charge, so a run can exceed the amount by one result. |
| `sourceTag` | string, up to 100 characters | empty | Copied onto every result row as `sourceTag` and into the `OUTPUT` record, so a CRM or Clay table can match results to the request that produced them. Explanation rows never carry it. |

#### Match fields

Every result row carries `matchMethod` (how the row was matched) and `confidence` (`high`, `medium` or `low`). The exact rule for this actor is written out in AGENTS.md. Confidence is derived only from evidence the actor really has; where it has none, the row says `medium` or `low` instead of guessing.

### 📤 Output

One dataset row per confirmed company match.

```json
{
  "inputDomain": "example.com",
  "status": "found",
  "matchMethod": "exact_name",
  "matchScore": 100,
  "candidateCount": 3,
  "dataCompleteness": 89,
  "companyId": 1234567,
  "companyName": "Example Co",
  "companyDomain": "example.com",
  "websiteUrl": "https://example.com",
  "linkedinUrl": "https://www.linkedin.com/company/example-co",
  "logoUrl": "https://example.com/logo.png",
  "companyDescription": "Illustrative text only.",
  "industry": "Software",
  "foundedYear": 2015,
  "employeeCount": 250,
  "employeeSizeBand": "201-500",
  "location": "Austin, Texas, United States",
  "hqLocality": "Austin",
  "hqRegion": "Texas",
  "hqPostalCode": "00000",
  "countryCode": "US",
  "hasFunding": true,
  "lastFundingRoundType": "Series A",
  "lastFundingRoundDate": "2020-01-01",
  "retrievedAt": "2026-10-11T08:30:00.000Z"
}
```

The sample values are illustrative. Only the field names and types are real.

Fields, grouped:

| 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` |

A blank field means the data source did not provide that fact, or its richer profile could not be uniquely joined to the already-confirmed company. `dataCompleteness` is a percentage of the 18 company facts that are filled. It is not an accuracy score.

Export as JSON, CSV, Excel, XML or HTML from the Output tab, or read the dataset over the API.

#### Run summary

Each run writes an `OUTPUT` record to the key-value store with counts for `found`, `notFound`, `ambiguous` and `failed`, and the count of duplicate or malformed inputs removed. Missing and ambiguous domains appear only here, never in the dataset.

#### Timestamp

Every row carries `retrievedAt` (ISO 8601). There is no `scrapedAt` field; `retrievedAt` is the same idea.

#### What is NOT returned

- ❌ Emails, phone numbers or contacts (use [executive-email-finder-by-domain](https://apify.com/b2bdata/executive-email-finder-by-domain) and [email-phone-finder](https://apify.com/b2bdata/email-phone-finder))
- ❌ Revenue or total funding raised
- ❌ Tech stack
- ❌ Hiring data or job openings
- ❌ Investor names
- ❌ A row for any ambiguous or missing domain

Domains that do not produce a confirmed match are left out of the dataset entirely rather than filled with placeholders.

***

### 🛡️ Reliable results

**Our data promise.** We work to keep every contact current, and we stand behind it. If a record is outdated, an email bounces or a person has moved on, open the Issues tab with your run link. We review every report and sort it out with you, case by case.

- **No guessing.** If two or more candidates could be the company, the domain is counted as ambiguous and skipped.
- **Billing follows delivery.** The charge is the standard per-dataset-item event. Only a row written to your dataset is charged.
- **Misses are reported.** `OUTPUT` tells you how many domains were not found, ambiguous or failed.
- **Free plan.** Free Apify accounts run exactly like paid ones: up to 100 domains per run, as many runs as their Apify credit covers. Results are charged as usual.
- **Retry advice.** If a domain comes back as `failed`, run it again once later. A domain that is `ambiguous` will not change on retry.

***

### 🤖 For AI agents

This section is written for an LLM agent that calls this actor as a tool, through the Apify MCP server or the API. Humans: it doubles as a one-screen contract.

#### When to use this actor, and when to use a sister actor

- **Use `b2bdata/company-firmographics-by-domain`** when you have one or more company DOMAINS and want a confirmed company record with firmographics.
- [linkedin-company-search](https://apify.com/b2bdata/linkedin-company-search): you have a company name or keyword, not a domain.
- [executive-email-finder-by-domain](https://apify.com/b2bdata/executive-email-finder-by-domain): you have a domain and need C-suite, VP or Director work emails.
- [ceo-founder-email-finder-by-domain](https://apify.com/b2bdata/ceo-founder-email-finder-by-domain): you have a domain and need the CEO or founder work email.
- [linkedin-employee-search](https://apify.com/b2bdata/linkedin-employee-search): you want employees of a company at any level.
- [linkedin-leads-verified-work-emails](https://apify.com/b2bdata/linkedin-leads-verified-work-emails): you want a lead list by title and seniority.
- [email-phone-finder](https://apify.com/b2bdata/email-phone-finder): you have a person and need a phone.

#### Input contract

| Field | Type | Default | Notes |
|-------|------|---------|-------|
| `domains` | array of strings, 1 to 100 items | required | Domains or website URLs. Not company names. Duplicates removed. |

Required: `domains` only.

#### Output contract

Each item has these fields (some may be absent when the data source has no value): `inputDomain`, `status`, `matchMethod`, `matchScore` (integer), `candidateCount` (integer), `dataCompleteness` (integer percent), `companyId` (integer), `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `logoUrl`, `industry`, `employeeCount` (integer), `employeeSizeBand`, `location`, `companyDescription`, `foundedYear` (integer), `hqLocality`, `hqRegion`, `hqPostalCode`, `countryCode`, `hasFunding` (boolean), `lastFundingRoundType`, `lastFundingRoundDate`, `retrievedAt`. Nothing else is returned. Every dataset item is a confirmed match. An empty dataset means no domain matched; the `OUTPUT` record in the key-value store holds the counts.

#### Cost per call

You pay per row written to the dataset, plus Apify platform usage. Missing and ambiguous domains cost no result charge. Free Apify plans get the same 100 domains per run as paid plans. Test with 2 or 3 domains first.

#### Idempotency and rate advice

Same input, similar run, but the underlying records can change, so two runs can differ. Deduplicate on `companyDomain`. Batch up to 100 domains in one run instead of one run per domain. Do not re-run a domain reported as ambiguous.

#### Chaining

Take `companyDomain` from each row and pass it to `executive-email-finder-by-domain` or `ceo-founder-email-finder-by-domain`, one domain per run. Use `employeeSizeBand`, `industry` and `hasFunding` to decide which accounts are worth the next step.

#### Error cases and what to do

| Situation | What you see | What to do |
|-----------|--------------|------------|
| Domain not found | No row, `notFound` count in `OUTPUT` | Check the spelling of the domain. Do not retry more than once. |
| Ambiguous domain | No row, `ambiguous` count in `OUTPUT` | Do not retry. Look the company up by hand or with `linkedin-company-search`. |
| Lookup failed | No row, `failed` count in `OUTPUT` | Retry that domain once after a minute. |
| More than 100 domains | Run rejected by the input schema | Split into batches of 100. |
| Company name instead of a domain | `notFound` | Pass the domain, or search by name first with `linkedin-company-search`. |

#### Minimal call

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

***

### 🔌 Integrations: send results anywhere

Every run writes to an Apify dataset. Dataset items from Company Domain Enrichment API carry `inputDomain`, `status`, `matchMethod`, `matchScore`, `candidateCount`, `dataCompleteness`, `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `industry`, `employeeCount`, `foundedYear`, `hasFunding`, `retrievedAt` and more. Actor id for all recipes: `b2bdata/company-firmographics-by-domain` (in API URLs, write it as `b2bdata~company-firmographics-by-domain`). Everything below uses the public Apify API and your own Apify token. Native means an Apify integration exists; CSV and automation routes are marked as such.

#### 1. Fetch results over the API (native)

Send the token in a header, never in the URL. Latest successful run, as JSON, CSV or Excel:

`curl -H "Authorization: Bearer $APIFY_TOKEN" "https://api.apify.com/v2/acts/b2bdata~company-firmographics-by-domain/runs/last/dataset/items?format=json&clean=true&status=SUCCEEDED"`

Swap `format=json` for `format=csv` or `format=xlsx` (`jsonl` also works). `clean=true` drops empty items and hidden fields. Pick fields with jq:

`curl -s -H "Authorization: Bearer $APIFY_TOKEN" "https://api.apify.com/v2/acts/b2bdata~company-firmographics-by-domain/runs/last/dataset/items?format=json&clean=true&status=SUCCEEDED" | jq '.[] | {name, url}'`

Replace `name` and `url` with any field names from the output list above. For a specific run, use `https://api.apify.com/v2/datasets/<datasetId>/items?format=json`.

One-shot call (start a run and wait for its items, limited to 300 seconds): `POST https://api.apify.com/v2/acts/b2bdata~company-firmographics-by-domain/run-sync-get-dataset-items?format=json&clean=true` with the Actor input as the JSON body and the same `Authorization` header. For longer runs, start the run normally and fetch the dataset afterwards.

#### 2. Webhook on run success (native)

In the Actor's Integrations tab (or via the API) add a webhook with event type `ACTOR.RUN.SUCCEEDED` and your own endpoint as the request URL. Apify sends a POST with the default payload, which contains the run under `resource`. Your endpoint reads `resource.defaultDatasetId` and calls the dataset items URL from recipe 1 with it. To send a smaller body, set a custom payload template: a JSON object whose values are Apify variables in double curly braces (`resource`, `eventType`, `userId`, `createdAt`, `eventData`), with nested values by dot, for example the run id as `resource.id` and the dataset id as `resource.defaultDatasetId`. Switch on "Interpolate variables in string fields" in Apify Console when you quote them.

#### 3. n8n (native node)

Apify node, operation "Run an Actor and get dataset" (or "Run an Actor", then "Get dataset items" from the Datasets resource). Select `b2bdata/company-firmographics-by-domain`, paste the Actor input as JSON, and connect your Apify token as a credential. Each dataset item becomes one n8n item, so map `inputDomain`, `status`, `matchMethod`, `matchScore`, `candidateCount`, `dataCompleteness`, `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `industry`, `employeeCount`, `foundedYear`, `hasFunding`, `retrievedAt` and more straight into the next node. The Apify node also has an "On new Apify event" trigger for run-finished events.

#### 4. Make (native app)

Apify app: module "Run an Actor" with `b2bdata/company-firmographics-by-domain` (or the trigger "Watch Actor Runs" for scheduled or manual runs), then the search module "Get Dataset Items" using the run's default dataset id. Each returned bundle is one row, so map `inputDomain`, `status`, `matchMethod`, `matchScore`, `candidateCount`, `dataCompleteness`, `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `industry`, `employeeCount`, `foundedYear`, `hasFunding`, `retrievedAt` and more into your destination module.

#### 5. Zapier (native app)

Apify app: trigger "Finished Actor run" (or action "Run Actor" with `b2bdata/company-firmographics-by-domain`), then the search "Fetch dataset items" with the run's default dataset id. Map `inputDomain`, `status`, `matchMethod`, `matchScore`, `candidateCount`, `dataCompleteness`, `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `industry`, `employeeCount`, `foundedYear`, `hasFunding`, `retrievedAt` and more into your destination step. Add a Looping or similar step if your Zap needs one action per item.

#### 6. Google Sheets

Apify's Store has a "Google Sheets Import & Export" Actor that you add on this Actor's Integrations tab, then choose append or replace mode and paste your spreadsheet URL. This needs a one-time Google login. Alternative with no extra Actor: Make or Zapier recipes above with their own Google Sheets module.

#### 7. Clay (HTTP API)

In Clay, create an HTTP API request with method GET, URL `https://api.apify.com/v2/acts/b2bdata~company-firmographics-by-domain/runs/last/dataset/items?format=json&clean=true&status=SUCCEEDED`, and a header `Authorization: Bearer <your Apify token>`. Treat each returned item as a row and chain your enrichment columns after it.

#### 8. Airtable, HubSpot, Salesforce

No native Apify connector is used here. Two routes:

- CSV: download with `format=csv` (recipe 1) or from the dataset's Export button, then use the tool's own import (Airtable CSV import, HubSpot Import, Salesforce Data Import Wizard or Data Loader). Use a unique field such as the URL as the dedupe key.
- Automation: use the n8n, Make or Zapier recipe above and the CRM's module there. Their setup and field limits are theirs to define.

#### 9. Map the fields

Company Domain Enrichment API returns `inputDomain`, `status`, `matchMethod`, `matchScore`, `candidateCount`, `dataCompleteness`, `companyName`, `companyDomain`, `websiteUrl`, `linkedinUrl`, `industry`, `employeeCount`, `foundedYear`, `hasFunding`, `retrievedAt` and more. Typical placement in a CRM (create custom properties where your CRM has no match):

| Output field type | Typical CRM placement |
|---|---|
| Person name | Contact name (first and last) |
| Job title or role | Contact job title |
| Company name | Company or account name |
| Website or domain | Company website or domain |
| Profile or page URL | Custom text field, also your dedupe key |
| Location (city, country) | Contact or company location fields |
| Email, phone (if returned) | Contact email, phone |
| Industry, size (if returned) | Company industry, employee count |
| Run date | Custom date field ("Sourced on") |

All recipes use the public Apify API; nothing is stored by the publisher.

***

### 🕐 Schedule examples

Use Apify Schedules (cron) on a saved task.

- **Weekly CRM refresh:** `0 6 * * 1`, your account domains in batches of 100. Compare `employeeSizeBand` and `hasFunding` against last week to catch growth and new funding.
- **Monthly list hygiene:** `0 6 1 * *`, the full domain column from your CRM, results sent back through a webhook.
- **Daily new-lead enrichment:** `0 8 * * *`, domains captured yesterday, so every new lead has firmographics before routing.

Keep scheduled runs small. A schedule you forget is still billed.

***

### 🔗 Related actors

More from the publisher: [See all 10 actors by b2bdata](https://apify.com/b2bdata)

- [linkedin-company-search](https://apify.com/b2bdata/linkedin-company-search): find company pages by name.
- [executive-email-finder-by-domain](https://apify.com/b2bdata/executive-email-finder-by-domain): C-suite, VP and Director contacts by domain.
- [ceo-founder-email-finder-by-domain](https://apify.com/b2bdata/ceo-founder-email-finder-by-domain): CEO and founder emails by domain.
- [linkedin-employee-search](https://apify.com/b2bdata/linkedin-employee-search): employees of a company.
- [linkedin-person-search](https://apify.com/b2bdata/linkedin-person-search): find a named person.
- [linkedin-people-search](https://apify.com/b2bdata/linkedin-people-search): people by role and keyword.
- [linkedin-leads-verified-work-emails](https://apify.com/b2bdata/linkedin-leads-verified-work-emails): lead lists.
- [email-phone-finder](https://apify.com/b2bdata/email-phone-finder): phone and details for a person.

***

### ❓ FAQ

#### Data & coverage

**Q: How do I get company details from a domain?**
A: Put the domain in `domains` and press Start. If exactly one company confirms as the match, you get one row with the profile, size, headquarters and funding signal.

**Q: Why did a domain return no row?**
A: Either no company was found (`notFound`) or several companies could have matched (`ambiguous`). Both are counted in the `OUTPUT` record and neither is charged.

**Q: Why not return the best guess for an ambiguous domain?**
A: Because a wrong company in a CRM is worse than a gap. The actor never picks a look-alike.

**Q: What does `dataCompleteness` mean?**
A: The percentage of the 18 company facts that are filled in the row. It says how full the record is. It does not say how accurate it is.

**Q: Does it return emails or phone numbers?**
A: No. Use [executive-email-finder-by-domain](https://apify.com/b2bdata/executive-email-finder-by-domain) for people and emails.

**Q: Is revenue, tech stack or hiring data included?**
A: No. The actor does not return revenue, total funding, tech stack, hiring, investors or job openings.

**Q: How fresh is the data?**
A: Each row has `retrievedAt`, the time the record was fetched. The underlying company facts can be older. Treat them as leads to verify.

**Q: Am I charged for failed lookups?**
A: No. Failed lookups are free. You pay one `company-record` event per delivered enriched company; empty results and notice rows cost nothing.

**Q: What are add-ons and are they on by default?**
A: Add-ons are opt-in inputs, off by default. Each is its own billed event, charged only when it returns data for that row.

**Q: What is the lead score and can I filter on it?**
A: `leadScore` is 0 to 100, built from signals really on the row. Set `minLeadScore` and lower-scoring rows are not pushed and not charged.

**Q: Can I keep my existing field names?**
A: Yes. Set `outputFormat` to `compatible` for common LinkedIn scraper field names. Default output is unchanged.

#### Legality & compliance

**Q: Is this legal?**
A: This is not legal advice. Domain lookups use publicly available business information only, with no login and no private data. Firmographics describe companies, but the rules for how you use them stay yours to check. Legal notices and claims go through Apify support at https://apify.com/contact.

**Q: Does it collect personal data?**
A: It returns company records, not people. A very small company can identify its owner, so if you hold personal data from results, you are the data controller.

**Q: Is it GDPR and CCPA compliant?**
A: The duties sit with you as controller: lawful basis, notices, opt-outs, deletion. The Master Terms below explain who does what.

**Q: Do you store my results?**
A: No. We keep no copy of your result data. It lives in your Apify account.

**Q: Does it break LinkedIn's terms of service?**
A: No LinkedIn account or login is used. The `linkedinUrl` field is only a link to a public company page. Following the laws and terms that apply to you when using the data is up to you.

**Q: Can I use the output in my product?**
A: Internal use in your own CRM and tools is fine. Reselling the raw output as a competing data product is not allowed (see the prohibited uses below).

**Q: Can my account be blocked?**
A: Your Apify account can be limited if you break the Terms below. Nothing of yours is used on any third-party site.

***

### 🛟 Support

Use the **Issues** tab on this actor's Apify page for bugs, questions and feature requests. We answer within 24 hours on working days. Please include the run ID and the domains you used.

***

### 📜 Legal

**Use for B2B prospecting only. Comply with all applicable laws including GDPR, CCPA, and CAN-SPAM.**

Not affiliated with LinkedIn. The LinkedIn name belongs to its respective owner. This actor returns company-level records for the domains you provide. It does not log in, use cookies, access private pages or bypass authentication. Published on Apify by b2bdata as proprietary software.

## 📜 Master Terms of Service

**Publisher:** `b2bdata` (the "Publisher"), an independent developer publishing on the Apify platform. **Applies to:** Company Domain Enrichment API (the "Actor"). **Version:** 1.0.

### Acceptance by use

By running the Actor, calling it through the Apify API, the Apify MCP server or any integration, or letting a schedule or an AI agent run it for you, you accept these Terms. This is acceptance by use. No signature is needed.

If you run the Actor on behalf of a company, you confirm you may bind that company. If you do not accept these Terms, do not run the Actor. Continued use after we update the Terms is acceptance of the update. Anonymous or automated use does not remove your responsibility: the Apify account that starts the run is the accountable party.

### Preamble: how the Actor is built

The Actor is a thin wrapper over an independent search index. It does not log in to anything, does not use cookies or accounts, and does not fetch pages from the source platform. We are a software vendor. We ship code that turns a query into a structured result. We do not own, host or curate the underlying data.

```
You / your agent
      |  input (query, filters)
      v
  The Actor (the Publisher's code, runs on Apify)
      |  search request
      v
  An independent search index of publicly indexed data
      |  public result rows
      v
  The Actor (normalises, deduplicates, saves to your dataset)
      |
      v
  Your Apify dataset (you control it)
```

Each party has one job. The index holds publicly indexed data. The Actor reshapes it. You decide what to search for, what to keep and what to do with it. We keep no copy of your queries or your results once the run ends, beyond what Apify itself stores in your account and what we need for billing and abuse prevention.

### 1. Nature of the service

#### 1.1 What the Actor is

A software tool that searches publicly indexed data and returns structured rows to your Apify dataset. It is a data-discovery utility, nothing more.

#### 1.2 What the Actor is not

It is not a scraper of the source platform, not an official integration, not a credit bureau, not a background-check service, not an employment or tenant screening tool, and not a source of legal, financial or compliance advice. Results are leads and pointers. They are not verified facts.

#### 1.3 The publisher's limited role

We write and maintain the code. We do not review individual runs, individual results or individual users. We do not guarantee that a result is accurate, current, complete or lawful to use for your purpose.

#### 1.4 Third-party infrastructure

The Actor depends on the Apify platform and on an independent search index. We do not control either. Their availability, rules and changes can affect the Actor at any time.

### 2. Who may use the Actor

#### 2.1 Eligibility

You must be at least 18, have the legal capacity to contract, and not be barred from using the Apify platform or from receiving services under applicable sanctions or export laws.

#### 2.2 Your representations

By running the Actor you represent that you have a lawful purpose, that you will follow the laws that apply to you and to the people whose data you handle, and that the information on your Apify account is accurate.

### 3. Permitted uses

Lawful business uses, including market research, account and lead discovery, competitive analysis, recruiting research done in line with local law, investment research, data enrichment of records you are entitled to hold, and building your own internal tools. Any use must comply with Section 4 and Section 6.

### 4. Prohibited uses

#### 4.1 Illegal activity

Any use that violates a law or regulation that applies to you, to us or to the people in the data.

#### 4.2 Harassment, stalking and personal targeting

Locating, monitoring, intimidating or pressuring a private individual.

#### 4.3 Discrimination

Using results to exclude or disadvantage people on a protected characteristic, including in hiring, lending, housing or insurance decisions.

#### 4.4 Spam and unsolicited commercial communication

Sending bulk messages in breach of anti-spam, e-privacy or telemarketing rules (for example CAN-SPAM, PECR, CASL, GDPR consent rules).

#### 4.5 Fraud and deception

Phishing, impersonation, social engineering, fake profiles or any scheme to mislead.

#### 4.6 Source platform abuse

Using the Actor to evade a block, rate limit or enforcement action by the source platform, or to build a service that competes with the source platform by copying its data wholesale.

#### 4.7 Reselling the Actor's service

Reselling or sub-licensing access to the Actor, or republishing raw output as a competing data product, without our written permission.

#### 4.8 AI training without authorization

Using raw output to train a model that identifies or profiles individuals, without a lawful basis and without checking the source platform's terms.

#### 4.9 Sensitive targeting

Building lists based on health, religion, ethnicity, political opinion, sexual orientation, union membership, immigration status, criminal history or any other special category of data.

#### 4.10 Privacy law violations

Any processing of personal data without a lawful basis, without required notices, or in breach of a data subject's rights.

### 5. Source platform terms: your responsibility

#### 5.1 Acknowledgment

The source platform named in the Addendum has its own terms. We have no contract with you about them and we do not interpret them for you.

#### 5.2 Your sole responsibility

You alone are responsible for checking whether your use of results is allowed under the source platform's terms and under the law of your jurisdiction. Running the Actor is not a statement by us that your use is allowed.

#### 5.3 Cease-and-desist compliance

If the source platform, a rights holder or a regulator sends us a valid cease-and-desist or takedown notice about specific use of the Actor, we will act on it. If we forward such a notice to you, you must stop the named use within 48 hours of receipt and confirm in writing. We may suspend your access immediately while we assess the notice.

### 6. Data protection

#### 6.1 Roles under privacy law

For the data you collect with the Actor, you are the data controller (or business, under CCPA). Apify and its infrastructure act for you as processor or service provider under their own terms. We, as the publisher of the code, do not decide the purposes or means of your processing and do not receive your result data.

#### 6.2 No data retention by the publisher

We do not retain your result data. We do not build a database from your runs. We keep only what is needed for billing, security and abuse prevention, such as run metadata and support correspondence.

#### 6.3 Your obligations as data controller

You must have a lawful basis (GDPR, UK GDPR), give required notices, honour access, deletion and objection requests, respect opt-outs and "do not sell or share" rights (CCPA/CPRA), keep records, protect the data, and delete it when you no longer need it.

#### 6.4 Sensitive data targeting

You must not use the Actor to target special-category data (see 4.9). If sensitive data appears in results, you must delete it or handle it under the stricter rules that apply.

#### 6.5 Data subject requests

If a person contacts us about data you collected, we will refer them to you and may ask you to confirm you have handled the request.

### 7. Intellectual property

#### 7.1 Actor code

The Actor, its code, schemas, documentation and branding belong to the Publisher. This is proprietary software. No licence is granted except the right to run the Actor under these Terms.

#### 7.2 Output data

We claim no ownership of the output. Rights in underlying data belong to their owners. You are responsible for how you use it.

#### 7.3 Restrictions

No reverse engineering, copying of the Actor, or removal of notices, except where the law gives you that right regardless.

#### 7.4 Feedback

If you send feedback or bug reports, we may use them freely to improve the Actor, without payment, and without crediting you.

### 8. Pricing and payment

#### 8.1 Apify platform billing

Charges are set on the Actor's Pricing tab and billed by Apify. Platform usage costs may also apply, as shown by Apify. We do not handle your payment details.

#### 8.2 Pricing changes

We may change prices. For any increase we give at least 14 days' notice through the Apify platform's change-notification process before it takes effect.

#### 8.3 No refunds for misuse

Results delivered as described are billable. Charges for runs you configured wrongly, repeated by a schedule you forgot, or started by an agent you control are your responsibility. Refund requests for platform or Actor faults go through Apify support or to us.

### 9. Service availability and changes

#### 9.1 No uptime guarantee

We give no uptime, latency, volume or coverage guarantee. Runs can return fewer results than you asked for, or none, because the underlying index changes.

#### 9.2 Service discontinuation

We may change, limit or stop the Actor at any time. We will try to give notice on the Actor page when practical.

### 10. Disclaimers

#### 10.1 "As is" service

The Actor is provided "as is" and "as available", without warranties of any kind, including merchantability, fitness for a particular purpose, accuracy and non-infringement.

#### 10.2 No representation of lawfulness

We do not represent that your intended use is lawful.

#### 10.3 No endorsement of source content

Results are not endorsed, verified or vouched for by us. Names can be wrong, profiles can be outdated and similarly named entities can be mixed up.

### 11. Limitation of liability

#### 11.1 Aggregate cap

To the maximum extent the law allows, our total liability for all claims relating to the Actor is limited to the greater of USD 100 or the fees you paid for the Actor in the 3 months before the event that gave rise to the claim.

#### 11.2 Excluded damages

We are not liable for indirect, incidental, special, consequential or punitive damages, or for lost profit, lost revenue, lost data or lost goodwill, even if advised of the possibility.

#### 11.3 Time limit

Any claim must be brought within 1 year after it arose.

### 12. Indemnification

#### 12.1 Your indemnification of the publisher

You will indemnify and hold harmless the Publisher, its owners and contractors from claims, losses and reasonable legal costs arising from your use of the Actor or its output, your breach of these Terms, or your violation of any law or third-party right.

#### 12.2 Defense

We will tell you promptly about a claim. You may control the defense, but you may not settle in a way that admits fault for us without our written consent.

#### 12.3 Scope

This applies whatever the legal theory, and survives termination.

### 13. Suspension and termination

#### 13.1 Termination by the publisher

We may suspend or end your access at any time, with or without notice, especially for a breach of Section 4 or a valid notice under 5.3.

#### 13.2 Effects of termination

Rights to run the Actor stop. Sections that by nature survive (IP, disclaimers, liability, indemnification, disputes) continue.

#### 13.3 Termination by you

Stop running the Actor and delete your schedules and integrations.

### 14. Dispute resolution

#### 14.1 Informal resolution first

Before any formal action, raise the dispute through Apify support or the Actor's issue tab on Apify, and allow 60 days for a good-faith resolution. The Issues tab is for product questions only and is not a channel for legal notices.

#### 14.2 Apify's process next

If the informal step fails, raise the matter through Apify's dispute and support channels. Your contractual relationship for payment, refunds and platform access is with Apify, under Apify's Terms of Service.

#### 14.3 No chosen court

These Terms do not select a governing law or a court. Any claim that survives 14.1 and 14.2 is subject to the law and forum that apply by default to a dispute between you and an individual software developer reached through Apify.

#### 14.4 No class actions

Claims may be brought only on an individual basis, not as a plaintiff or class member in a class, collective or representative action.

#### 14.5 Attorneys' fees

The prevailing party may recover reasonable attorneys' fees where the law allows.

### 15. Miscellaneous

#### 15.1 Entire agreement

These Terms, with the Addendum, are the whole agreement about the Actor. Apify's own terms continue to apply to the platform.

#### 15.2 Severability

If a provision is unenforceable, the rest stays in force.

#### 15.3 Assignment

You may not assign these Terms. We may assign them in a merger, sale or reorganisation.

#### 15.4 Force majeure

Neither party is liable for delay caused by events beyond reasonable control, including outages of the platform or of upstream infrastructure.

#### 15.5 Third-party beneficiaries

There are none, except that the Publisher's owners, contractors and affiliates may enforce the protections in Sections 10 to 12.

#### 15.6 Survival

Sections 5, 6, 7, 10, 11, 12 and 14 survive termination.

#### 15.7 Language

The English text controls.

#### 15.8 Publisher identification for legal process

All legal notices, takedown requests, cease-and-desist letters, regulator enquiries and data-subject requests must be directed to Apify (https://apify.com/contact), which forwards them to the Publisher. The Publisher operates on Apify under the username `b2bdata`. The Publisher's identity is held by Apify for billing and is provided to courts and authorities through valid legal process directed via Apify's official channels. We do not publish personal details on the Actor page.

### 16. Acknowledgment

By running the Actor you confirm you have read these Terms, that you understand you act as the data controller of what you collect, and that you are responsible for lawful use.

***

## 🛡️ Actor-Specific ToS Addendum: Company Domain Enrichment API

#### A. Architectural disclosure

The actor sends each domain to a licensed company-identity service, keeps a record only when one candidate is a confirmed exact match, then joins that match to an exact-domain company profile from a licensed company database. For this actor, the "independent index" described in the Master Terms is that service and database. It does not call LinkedIn, does not log in and does not use cookies.

#### B. Source platform

The `linkedinUrl` field points to a LinkedIn company page. LinkedIn is not affiliated with, and has not endorsed, this actor. Your use of LinkedIn data is governed by LinkedIn's terms and by the law that applies to you (Section 5 of the Master Terms).

#### C. Output and accuracy

Company facts can be missing or out of date. A confirmed match means the identity check passed; it does not mean every field is current. `dataCompleteness` is not an accuracy score. Treat output as leads to verify, not as verified facts.

#### D. No personal contact data

This actor returns no emails, phone numbers or named people. If you combine its output with data from other actors or tools, you take on the duties for that combined data.

#### E. Limits

Up to 100 domains per run. Free and paid Apify plans get the same limit.

#### F. Feedback

Anything broken or missing? Run b2bdata/supporter-feedback (free, no rewards) or leave a note in the Issues tab here.

#### G. Takedown

If a company asks that its record be removed, or a platform or regulator asks that specific use of this actor stop, send the request through Apify (https://apify.com/contact) or the actor's issue tab. Section 5.3 of the Master Terms (48 hours) applies.

# Changelog

This Actor's version history is a separate document: https://apify.com/b2bdata/company-firmographics-by-domain/changelog.md

# Actor input Schema

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

Company website domains or URLs, for example stripe.com or https://www.openai.com/about, which is reduced to its host. Duplicates are removed. A company name like 'Stripe' is skipped as invalid instead of looked up, and a run with no valid domain ends with an explanation row.

## `minLeadScore` (type: `integer`):

Rows scoring below this leadScore are not returned and not charged. 0 keeps every row. Example: 60 keeps only strong matches. A whole number from 0 to 100; values outside that range are rejected with a message.

## `outputFormat` (type: `string`):

default returns our field names. compatible keeps them and also adds the field names common LinkedIn scrapers use, so existing mappings keep working. Example: compatible adds email, jobTitle and firstName next to workEmail, title and fullName.

## `maxChargeUsd` (type: `number`):

Stop when this run's charges reach this amount. The run ends SUCCEEDED with the data so far and one free explanation row (status max_charge_reached). 0 means no extra cap.

## `sourceTag` (type: `string`):

Optional label copied to every result row as sourceTag and into OUTPUT, to tell runs apart in your pipeline.

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

How many domains are looked up in parallel. Each lane keeps the per-request delay, so higher values are faster but use more of the upstream rate allowance.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "openai.com"
  ],
  "minLeadScore": 0,
  "outputFormat": "default",
  "maxChargeUsd": 0,
  "sourceTag": "",
  "concurrency": 1
}
```

# 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("b2bdata/company-firmographics-by-domain").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("b2bdata/company-firmographics-by-domain").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 b2bdata/company-firmographics-by-domain --silent --output-dataset

```

## MCP server setup

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

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/2T7i2kQar8m2e0x0y/builds/FsJaz08eliwfMMtUI/openapi.json
