# Company Enrichment - Domain to Company Data (`plainsight/company-enrichment`) Actor

Turn a list of domains or work emails into rich company profiles: name, description, logo, address, emails, phones, social links, tech stack, internal SaaS tools, email provider, DMARC status, domain age, registrar, hosting provider and TLS. One row per company, $10 per 1,000.

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

## Pricing

from $10.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 Enrichment: turn domains or work emails into company profiles

Upload a list of **domains, website URLs or work email addresses** and get one clean row per company with **40+ fields**: name, description, logo, address, emails, phones, LinkedIn and other socials, **tech stack**, **internal SaaS tools**, **email provider**, **email security grade**, **domain age**, registrar, **hosting provider**, server country and TLS certificate.

A pay-as-you-go alternative to enrichment subscriptions: **$10 per 1,000 companies**, no contract, no seats, and you're never charged for domains that are dead.

### What can you use it for?

- **Enrich inbound signups**: turn `jane@acme.com` into "Acme, 12-year-old domain, Shopify + Klaviyo, Google Workspace, LinkedIn page, phone number" before your SDR calls.
- **Score and route leads**: prioritise accounts by tech stack (uses HubSpot? on Salesforce?), domain age, hosting or email provider.
- **Clean and complete your CRM**: fill missing descriptions, logos, socials and phone numbers in bulk.
- **Build targeted lists**: enrich a raw domain list, then filter by CMS, ecommerce platform, CRM or email provider.
- **Due diligence and research**: quick, consistent profiles of hundreds of companies at once.
- **AI agents**: a single "tell me about this company" tool call via API or MCP.

### What data do you get?

| Group | Fields |
|---|---|
| **Profile** | `companyName`, `description`, `logoUrl`, `faviconUrl`, `language`, `address`, `foundingDate`, `copyrightYear` |
| **Contacts** | `primaryEmail`, `emails`, `primaryPhone`, `phones` |
| **Socials** | `linkedin`, `twitter`, `facebook`, `instagram`, `youtube`, `github`, plus `socialProfiles` for all networks |
| **Tech stack** | `cms`, `ecommercePlatform`, `analytics`, `advertising`, `marketingAutomation`, `crm`, `liveChat`, `paymentProcessors`, `jsFrameworks`, `cdn`, `techNames`, `technologies` and more |
| **Internal tools (from DNS)** | `companyToolNames`: e.g. Atlassian, Microsoft 365, HubSpot, Salesforce, Zoom, Figma, OpenAI, DocuSign |
| **Email** | `emailProvider` (Google Workspace, Microsoft 365...), `emailSecurityGateway`, `emailSendingServices`, `emailSecurityGrade`, `dmarcPolicy`, `spoofable` |
| **Domain** | `domainCreatedAt`, `domainAgeYears`, `registrar`, `domainExpiresAt` (official RDAP registry data) |
| **Infrastructure** | `hostingProvider`, `hostingAsnOrg`, `serverIp`, `serverCountry`, `tlsIssuer`, `tlsValid`, `tlsExpiresAt` |

#### Sample output (trimmed)

Real output for `basecamp.com` (trimmed):

```json
{
  "domain": "basecamp.com",
  "companyName": "Basecamp",
  "description": "Trusted by millions, Basecamp puts everything you need to get work done in one place...",
  "faviconUrl": "https://basecamp.com/assets/images/general/apple-touch-icon.png",
  "language": "en",
  "cdn": "Cloudflare",
  "jsFrameworks": ["Stimulus"],
  "marketingAutomation": ["MailChimp"],
  "techNames": "Bootstrap, Stimulus, Cloudflare, MailChimp, Priority Hints, Open Graph",
  "companyToolNames": "Atlassian Cloud, Microsoft 365, Cloudflare DNS, Zoom",
  "emailProvider": "Google Workspace",
  "emailSendingServices": ["Google Workspace", "Mailchimp"],
  "emailSecurityGrade": "B",
  "dmarcPolicy": "quarantine",
  "spoofable": false,
  "domainCreatedAt": "1994-07-30T04:00:00Z",
  "domainAgeYears": 32.2,
  "registrar": "Cloudflare, Inc.",
  "hostingProvider": "Cloudflare",
  "serverCountry": "US",
  "tlsIssuer": "Google Trust Services",
  "tlsValid": true
}
```

### How to use it

1. Paste domains, URLs or work emails, one per line. Free-mail addresses (gmail.com, outlook.com...) are skipped automatically and never charged.
2. Click **Start**.
3. Use the **Company profiles**, **Tech & tools** and **Domain & security** tables, export to CSV/Excel/JSON, or send results to HubSpot, Salesforce, Google Sheets, Clay, Make, Zapier or n8n.

```bash
curl -X POST "https://api.apify.com/v2/acts/plainsight~company-enrichment/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["basecamp.com", "jane@allbirds.com"]}'
```

### Pricing

**$0.01 per company enriched** ($10 per 1,000). You're not charged for free-mail domains, or for domains that have neither a working website nor email (MX) records. If a website is down but the domain still has email, you get DNS-based data (email provider, internal tools, domain age...) and are charged normally.

**Try it free:** start a run with an empty input and it analyses 3 sample websites at no charge, so you can see the exact output format first.

### Where does the data come from?

Only public sources, queried live for each company, with no stale database:

- the company's own **website** (homepage + up to 3 contact/about pages, structured data, metadata),
- public **DNS** records (MX, SPF, DMARC, DKIM, verification records),
- the official **RDAP** domain registries (the modern replacement for WHOIS),
- **IP-to-ASN** routing data for hosting, and the site's **TLS certificate**,
- the open-source [webappanalyzer](https://github.com/enthec/webappanalyzer) fingerprint database (7,600+ technologies) for tech detection.

Because every row is fetched live, the data is current as of the moment you run it.

### FAQ

**Does it return employee names or personal data?**
No. It returns company-level data and the contact details a company publishes on its own website. It does not look up individuals, generate email addresses, or scrape LinkedIn.

**Why is `companyName` sometimes missing?**
The name comes from the site's structured data, metadata or page title. A few sites expose none of these clearly; the domain is always included.

**What about company size and revenue?**
Those aren't publicly verifiable from the web, and we'd rather give you accurate fields than guessed ones. Pair this with your preferred firmographics source if you need them.

### Related tools by the same developer

- [Tech Stack Detector](https://apify.com/plainsight/tech-stack-detector): deep tech-stack detail only, $4 per 1,000.
- [Website Contact Extractor](https://apify.com/plainsight/website-contact-extractor): contacts only, pay only when found.
- [Email Provider & DMARC Checker](https://apify.com/plainsight/email-security-audit): full SPF/DKIM/DMARC audit, $2 per 1,000.
- [Company Hiring Signals](https://apify.com/plainsight/company-hiring-signals): is the company hiring, how many open roles, in which departments.
- [Impressum Scraper](https://apify.com/plainsight/impressum-extractor): legal name, directors, register number and verified VAT ID for German/EU companies.

# Actor input Schema

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

One per line: acme.com, https://www.acme.com or jane@acme.com. Work emails are converted to their company domain; duplicates are removed automatically.

## `skipFreeEmailDomains` (type: `boolean`):

Skip gmail.com, outlook.com, yahoo.com and ~80 other consumer mail domains (they are not companies, so you are not charged for them).

## `maxPagesPerDomain` (type: `integer`):

How many contact-like pages (Contact, About, Imprint, Team) to check per website in addition to the homepage.

## `includeDomainRegistration` (type: `boolean`):

Look up domain creation date, age, expiry and registrar from the official RDAP registry.

## `minConfidence` (type: `integer`):

Hide technology detections below this confidence (0-100).

## `maxDomains` (type: `integer`):

Only process the first N domains (useful for a quick test).

## `maxConcurrency` (type: `integer`):

How many companies to enrich in parallel.

## Actor input object example

```json
{
  "domains": [
    "basecamp.com",
    "mozilla.org",
    "wordpress.org"
  ],
  "skipFreeEmailDomains": true,
  "maxPagesPerDomain": 3,
  "includeDomainRegistration": true,
  "minConfidence": 50,
  "maxConcurrency": 15
}
```

# Actor output Schema

## `results` (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": [
        "basecamp.com",
        "mozilla.org",
        "wordpress.org"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainsight/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": [
        "basecamp.com",
        "mozilla.org",
        "wordpress.org",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("plainsight/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": [
    "basecamp.com",
    "mozilla.org",
    "wordpress.org"
  ]
}' |
apify call plainsight/company-enrichment --silent --output-dataset

```

## MCP server setup

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