# Company Enrichment — Emails, Phones, Socials & Tech Stack (`maged120/company-enrichment`) Actor

Turns a list of company websites into structured company profiles: contact emails, phone numbers, social profiles, address and the technologies each site runs on.

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

## Pricing

from $9.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

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

**Turn a plain list of company websites into a full contact database.** Paste the domains you already have and get back emails, phone numbers, social profiles, company details and the technology each business runs on — one clean row per fact, ready for your CRM.

### What does Company Enrichment do?

Sales and research teams always have the same starting point: a list of company domains, and nothing else. This Actor fills in the rest. For every website it returns:

- **Email addresses**, classified by type (role inbox, personal, and more)
- **Phone numbers**, validated and normalized to international format with their country
- **Social profiles** — LinkedIn, Facebook, Instagram, X, YouTube, TikTok, GitHub, Crunchbase and more
- **Company details** — name, description, postal address and logo
- **Technology stack** — the ecommerce platform, analytics, chat, payment and marketing tools the site uses

It is built for speed and reliability, handling modern JavaScript-heavy and bot-protected sites automatically. No API keys, no per-record subscription. A dozen companies are enriched in well under a minute, and thousands run comfortably in one job.

Running on the Apify platform gives you the REST API, scheduling, webhooks and integrations with Google Sheets, Slack, Zapier and Make, so enrichment can sit directly inside your sales workflow.

### Why use Company Enrichment?

- **Fill in a cold list** — you exported 2,000 domains and need somebody to contact at each one.
- **Enrich your CRM** — refresh contact details on accounts that have gone stale.
- **Qualify leads before outreach** — the tech stack tells you whether a prospect is even a fit. Selling a Shopify app? Filter for the ones running Shopify.
- **Build partner and supplier lists** — collect contact routes for hundreds of firms at once.
- **Competitive research** — see which analytics, chat and marketing tools a market segment has standardized on.
- **Recruiting and outreach** — find the careers inbox and the company's social presence in one pass.

Commercial enrichment services charge a monthly subscription and meter every record. Here you pay per result, with no floor.

### How to use Company Enrichment

1. Open the Actor in Apify Console and click **Try for free**.
2. Paste your domains into **Company Websites** — `acme.com`, `www.acme.com` or a full URL all work.
3. Optionally list result types in **Exclude Result Types** to drop what you don't need — those are skipped entirely, saving time and cost.
4. Click **Start**.
5. Read the results in the **Output** tab.
6. Export to JSON, CSV, Excel, or pull the results straight from the API.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `domains` | array | — | Company websites to enrich. Bare domains, www addresses and full URLs are all normalized. |
| `maxPagesPerSite` | integer | 4 | How many pages to read per company. Higher finds more contacts and takes longer. |
| `excludeTypes` | array | `[]` | Result types to leave out: `company`, `description`, `address`, `logo`, `email`, `phone`, `social`, `technology`. Excluded types are never looked for, so the run is faster and you are not billed for them. Excluding all of them keeps the `company` row so the output is never empty. |
| `companyEmailsOnly` | boolean | `true` | Return only addresses on the company's own domain. Off = also collect other addresses found on the site (may include unrelated ones). |
| `maxResultsPerType` | integer | 25 | Cap on emails, phones, socials and technologies per company. `0` = unlimited. |
| `allowBrowser` | boolean | `true` | Automatically re-read difficult (JavaScript-only or protected) sites for best coverage. Leave on unless you want the cheapest possible run. |
| `proxyConfiguration` | object | disabled | Optional; only needed for unusually large lists. |

```json
{
    "domains": ["acme.com", "example.com", "www.example.org"],
    "maxPagesPerSite": 4,
    "excludeTypes": ["technology"],
    "companyEmailsOnly": true
}
```

### Output

Every result — a company, an email, a phone, a social profile, a technology, or an error — is the **same seven-column row**, so the dataset drops straight into a spreadsheet, a database table, or a CRM import with no reshaping. Group by `domain` to reassemble a company. You can download the dataset in JSON, CSV, Excel or HTML.

| Column | What it holds |
|---|---|
| `domain` | The company the row belongs to. Group by this. |
| `entityType` | `company`, `description`, `address`, `logo`, `email`, `phone`, `social`, `technology`, or `error`. |
| `value` | The datum itself — the email address, the phone number, the company name, the technology, the social handle. |
| `label` | A qualifier for the row's type: email category, phone line type, or the address country. |
| `channel` | How to reach a phone (`call`, `whatsapp`, `telegram`, `viber`, `fax`, `hotline`, …) or which network a social profile is on (`linkedin`, `instagram`, …). |
| `url` | The canonical link for the row — the profile URL, the source page, or the website. |
| `error` | Set only on `error` rows; `null` everywhere else. |

```json
[
  { "domain": "acme.com", "entityType": "company", "value": "Acme Widgets Ltd",
    "label": "4 pages", "channel": null, "url": "https://acme.com/", "error": null },

  { "domain": "acme.com", "entityType": "address",
    "value": "12 Example Street, Springfield, United States",
    "label": "United States", "channel": null, "url": "https://acme.com/", "error": null },

  { "domain": "acme.com", "entityType": "email", "value": "hello@acme.com",
    "label": "role", "channel": null, "url": "https://acme.com/contact", "error": null },

  { "domain": "acme.com", "entityType": "phone", "value": "+15551234567",
    "label": "mobile", "channel": "whatsapp", "url": "https://acme.com/contact", "error": null },

  { "domain": "acme.com", "entityType": "social", "value": "acme",
    "label": null, "channel": "linkedin", "url": "https://linkedin.com/company/acme",
    "error": null },

  { "domain": "acme.com", "entityType": "technology", "value": "Shopify",
    "label": null, "channel": null, "url": "https://acme.com/", "error": null }
]
```

#### What `label` and `channel` carry per row type

| `entityType` | `value` | `label` | `channel` |
|---|---|---|---|
| `company` | company name | pages read | — |
| `description` | the description | — | — |
| `address` | full postal address | country | — |
| `logo` | logo image URL | — | — |
| `email` | the address | `role`, `person`, `personal_freemail`, `third_party`, `other` | — |
| `phone` | international number | line type: `mobile`, `landline`, `toll_free`, `voip`, `fax`, … | `call`, `whatsapp`, `telegram`, `viber`, `fax`, `hotline` (comma-separated if several) |
| `social` | handle | — | network: `linkedin`, `facebook`, `x`, … |
| `technology` | the technology | — | — |
| `error` | the input, if any | — | — (reason is in `error`) |

WhatsApp numbers surface as a `phone` row with `whatsapp` in `channel`. The same number found more than once is returned as a single row with all its channels merged.

#### Dataset view

- **Results** — the single seven-column table. Filter or pivot on `entityType` in your own tool after export.

### How much does it cost to enrich a company list?

You are charged per result. The `company` row plus every email, phone, social profile and technology is one result.

Typical yield is **8–12 results per company**, so:

| Job | Approximate results |
|---|---|
| 100 companies, everything on | ~1,000 |
| 1,000 companies, everything on | ~10,000 |
| 1,000 companies, contacts only (socials and tech excluded) | ~3,000 |

Levers to control the bill:

- **`excludeTypes`** — drop whole result types you don't need (e.g. `["technology","social"]`, usually the highest-volume rows). Excluded types aren't fetched, so they cost neither time nor money.
- **`maxResultsPerType`** — cap the long tail of emails, phones, socials and technologies per company.
- **`maxPagesPerSite: 1`** — the quickest, cheapest pass, though it finds fewer contacts.

### Tips

- **The default page depth is the sweet spot.** A single page misses most contact details; a few pages per site is where the emails and phones actually turn up.
- **Filter the tech rows to qualify leads** — "runs Shopify", "runs HubSpot" is often a better buying signal than company size.
- **Small and mid-sized businesses publish the most.** Large enterprises route everything through contact forms; smaller firms print their details openly, and they are usually the ones worth emailing.
- **Leave `allowBrowser` on** for best coverage; switch it off only if you want the absolute cheapest run and don't mind that some difficult sites return less.
- Turn the proxy on only if a batch of sites returns errors; it isn't needed for typical lists.

### FAQ

**How many pages per company are read?**
As many as you set in **Pages to Crawl per Company**, always on the company's own domain. More pages means more contacts and a longer run.

**Why does one company return fewer results than another?**
Every website publishes a different amount. Some list a full address, phones and every social network; others expose only a contact form. The Actor returns whatever a company actually makes public.

**Are the phone numbers real?**
Every number is validated before it is returned, so order references, IDs and postcodes never leak in as phone results.

**Is the technology detection accurate?**
Technologies are detected from a site's technical fingerprints, not from its marketing copy — a site that merely mentions a tool in text is not reported as running it.

**Is scraping company websites legal?**
It collects only publicly published business information — the same details a visitor sees on a contact page. Business contact data is still personal data in some jurisdictions: follow GDPR, CAN-SPAM and local marketing rules, honour opt-outs, and do not use the output for spam.

### Support

Need another field, another network, or a technology added? Open an issue on the Actor's **Issues** tab. Custom enrichment pipelines are available on request.

# Actor input Schema

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

The companies to enrich. Paste a bare domain (acme.com), a full URL, or a www address — all are accepted. Duplicates are removed automatically.

## `maxPagesPerSite` (type: `integer`):

How many pages to read per company. Higher values find more contacts and take longer.

## `excludeTypes` (type: `array`):

Result types to leave out of the output. Anything you exclude is not even looked for, so the run is faster and you are never billed for it. You cannot exclude everything — if you select them all, the company row is kept so the output is never empty.

## `companyEmailsOnly` (type: `boolean`):

On by default: return only email addresses on the company's own domain (e.g. name@thecompany.com). Turn this off to also collect other addresses found on the site — note this can include unrelated third-party or personal emails quoted in page content.

## `allowBrowser` (type: `boolean`):

On by default. Automatically re-reads difficult sites (JavaScript-only or protected) for the best coverage, while keeping easy sites fast. Switch off only for the cheapest possible run.

## `maxResultsPerType` (type: `integer`):

Caps how many emails, phones, social profiles and technologies each company can return. Set to 0 for unlimited.

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

Optional proxy settings. Not required for most websites — enable it if some sites block the request or you process very large lists.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "stripe.com"
  ],
  "maxPagesPerSite": 4,
  "excludeTypes": [],
  "companyEmailsOnly": true,
  "allowBrowser": true,
  "maxResultsPerType": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "domains": [
        "apify.com",
        "stripe.com"
    ],
    "maxPagesPerSite": 4,
    "maxResultsPerType": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/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": [
        "apify.com",
        "stripe.com",
    ],
    "maxPagesPerSite": 4,
    "maxResultsPerType": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("maged120/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": [
    "apify.com",
    "stripe.com"
  ],
  "maxPagesPerSite": 4,
  "maxResultsPerType": 25
}' |
apify call maged120/company-enrichment --silent --output-dataset

```

## MCP server setup

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