# Company Enrichment - Domain to Emails, Tech Stack & Socials (`cancap/company-enrichment`) Actor

Turn company domains into full profiles: emails, phones, LinkedIn and socials, tech stack, email provider, ad pixels and sales signals. One row per company. A cheap Clearbit / Apollo alternative. Pay only for companies enriched.

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

## Pricing

from $5.00 / 1,000 enriched companies

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 Enrichment: Domain to Emails, Phones, Socials & Tech Stack

Paste a list of company domains and get a **complete company profile for each one**, in one clean row:

- **Contacts**: best email and all emails, best phone and all phones (international format), WhatsApp, contact page
- **Social profiles**: LinkedIn, Facebook, Instagram, X / Twitter, YouTube, TikTok, Pinterest, GitHub
- **Company details**: name, description, country, address and language, when the website states them
- **Tech stack**: CMS or website builder, ecommerce platform, analytics, ad pixels, marketing automation and CRM, live chat, payments, hosting and CDN. About 400 technologies.
- **From DNS records**: email provider (Google Workspace, Microsoft 365, Zoho...), DNS provider, email sending services (SendGrid, Mailgun...) and verified business tools (Slack, Zoom, Atlassian...)
- **Sales signals**: `sellsOnline`, `runsAds`, `hasLiveChat`, `usesMarketingAutomation`, ready to filter on

**You pay only for companies whose website could be read.** Unreachable, blocked and invalid domains are free.

No coding, no login and no API keys. Paste your domains and click Start.

### Who uses this

- **Sales and lead generation**: turn a list of domains into a contact list with LinkedIn pages and a reason to reach out ("runs Meta ads but has no live chat").
- **Agencies**: qualify prospects by platform. Find Shopify stores using Klaviyo, WordPress sites without analytics, companies on Microsoft 365.
- **CRM enrichment**: fill in emails, phones, socials and tech for company records you already have. A cheap alternative to Clearbit or Apollo company enrichment.
- **Market research**: see which tools a whole industry uses. The run summary counts the results.

### How to use

1. Paste company domains or websites, one per line. `stripe.com` and `https://www.stripe.com` both work.
2. Click **Start**.
3. Export to CSV, Excel or JSON, or send the results to Google Sheets, HubSpot, Salesforce, Make, Zapier or n8n.

It works well after a Google Maps, directory or Shopify scraper: take the `website` column and paste it here.

```json
{
    "domains": ["allbirds.com", "python.org", "https://www.eff.org"],
    "maxPagesPerWebsite": 5,
    "checkDns": true
}
```

### Output example

```json
{
    "inputUrl": "acme-candles.com",
    "domain": "acme-candles.com",
    "website": "https://www.acme-candles.com",
    "status": "ok",
    "companyName": "Acme Candles",
    "description": "Hand-poured soy candles made in Vermont.",
    "country": "US",
    "email": "hello@acme-candles.com",
    "emails": ["hello@acme-candles.com", "wholesale@acme-candles.com"],
    "phone": "+18025550142",
    "phones": ["+18025550142"],
    "linkedin": "https://www.linkedin.com/company/acme-candles",
    "instagram": "https://www.instagram.com/acmecandles",
    "facebook": "https://www.facebook.com/acmecandles",
    "contactPageUrl": "https://www.acme-candles.com/pages/contact",
    "contactsFound": true,
    "cms": null,
    "ecommerce": "Shopify",
    "analytics": ["Google Tag Manager"],
    "advertising": ["Meta Pixel", "TikTok Pixel"],
    "marketing": ["Klaviyo"],
    "chat": [],
    "payments": ["Shop Pay", "Klarna"],
    "hosting": ["Cloudflare"],
    "emailProvider": "Google Workspace",
    "dnsProvider": "Cloudflare DNS",
    "technologies": ["Shopify", "Google Tag Manager", "Meta Pixel", "TikTok Pixel", "Klaviyo", "..."],
    "technologyCount": 14,
    "sellsOnline": true,
    "runsAds": true,
    "hasLiveChat": false,
    "usesMarketingAutomation": true,
    "enrichedAt": "2026-10-17T10:00:00.000Z"
}
```

`technologyDetails` lists every technology with its category, version (when the website shows it) and how it was found. `emailDetails` and `phoneDetails` give the type and country of each email and phone.

### Status column

| Status | Meaning | Charged |
| --- | --- | --- |
| `ok` | The website was read. `contactsFound` tells you if an email or phone was found | Yes |
| `unreachable` | The website does not exist or did not answer | No |
| `blocked` | The website refuses automated visitors | No |
| `robots_disallowed` | robots.txt asks robots not to read the website | No |
| `invalid_url` | The input line is not a website address | No |

### Pricing: pay only for results

- **Enriched company**: charged once per company whose website was read.
- Unreachable, blocked, invalid and duplicate domains are **free**.

Set a **maximum cost per run** in the run options and the Actor stops cleanly at your limit.

### Good to know

- **Public data only**: the Actor reads the company's own public pages (first page, then contact, imprint, about and team pages), public response headers and public DNS records. No browser, no login, no blocking workarounds. It respects robots.txt by default.
- **Fast and cheap**: thousands of companies per run (roughly 1,000 in 5 to 10 minutes; give the run more memory to go faster). A restarted run continues where it stopped and nothing is charged twice.
- **What it does not do**: no employee counts, revenue or funding (that data is not on company websites), and emails are not mailbox-verified. A mail-server check removes addresses on domains that cannot receive mail.
- **Phones**: numbers are validated for their country. Numbers written without a country code are read using the website's country.

### Responsible use

Contact details can be personal data. Use them only where you have a lawful reason, for example business-to-business contact, and follow the privacy and anti-spam rules that apply to you (GDPR, CAN-SPAM and similar).

# Actor input Schema

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

One per line. Plain domains (stripe.com) and full addresses (https://www.stripe.com) both work. Use Bulk edit to paste a long list, e.g. the website column of a CRM or Google Maps export. Duplicates are skipped.

## `maxPagesPerWebsite` (type: `integer`):

The first page and then the pages most likely to show contacts (contact, imprint, about, team) are read. 5 is enough for most companies. Use 1 for the fastest run (tech stack and first-page contacts only).

## `checkDns` (type: `boolean`):

Reads the domain's MX, NS and TXT records to find the email provider (Google Workspace, Microsoft 365...), DNS provider, email sending services and verified business tools (Slack, Zoom, Atlassian...). Recommended.

## `saveOnlyEnriched` (type: `boolean`):

Leave off to get one row for every input, including unreachable websites (these rows are free and show the reason in the status column).

## `onlySameDomainEmails` (type: `boolean`):

Turn on to keep only addresses like info@example.com for example.com. Leave off if your targets are small businesses, which often use Gmail or similar.

## `checkEmailDomains` (type: `boolean`):

Looks up the mail server (MX record) of every email's domain and removes addresses on domains without one. This catches typos and dead domains. It does not test the individual mailbox.

## `respectRobotsTxt` (type: `boolean`):

Skip pages that the website's robots.txt asks robots not to read. Recommended.

## `proxyConfiguration` (type: `object`):

Websites are read directly first. The proxy is only used as a second try when a website does not answer.

## Actor input object example

```json
{
  "domains": [
    "https://www.python.org",
    "https://www.allbirds.com",
    "https://www.eff.org"
  ],
  "maxPagesPerWebsite": 5,
  "checkDns": true,
  "saveOnlyEnriched": false,
  "onlySameDomainEmails": false,
  "checkEmailDomains": true,
  "respectRobotsTxt": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per company: emails, phones, social links, tech stack, email provider and sales signals.

## `allFields` (type: `string`):

No description

## `summary` (type: `string`):

How many companies were enriched, with email, with phone, and how many could not be reached.

# 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": [
        "https://www.python.org",
        "https://www.allbirds.com",
        "https://www.eff.org"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cancap/company-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 = {
    "domains": [
        "https://www.python.org",
        "https://www.allbirds.com",
        "https://www.eff.org",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cancap/company-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 '{
  "domains": [
    "https://www.python.org",
    "https://www.allbirds.com",
    "https://www.eff.org"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cancap/company-enrichment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cancap/company-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/lvRlDSVSxbMuZIfZ3/builds/d9lYwUJpzZDwpQoLG/openapi.json
