# Company Enrichment by Domain - Clearbit Alternative, No API Key (`that_red_bird/company-enrichment-by-domain`) Actor

Turn a list of company websites into clean company profiles: name, description, logo, socials, public emails and phones, address, tech stack, email provider, industry and founding year. No API key, no LinkedIn. $3 per 1,000 companies.

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

## Pricing

$3.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 by Domain - Clearbit Alternative, No API Key

Turn a list of company websites into ready-to-use company profiles.
Paste domains (or company names) -> get one row per company with name, description, logo, socials, public emails and phones, tech stack, email provider, industry and founding facts. About 3 seconds per company without the Wikidata step; the Wikidata step adds time on large lists, so switch it off for speed.

No API key, no login, no LinkedIn scraping. Everything comes from the company's own website, its public mail records (MX) and Wikidata.

### What you get

| Field | Meaning |
|---|---|
| domain, url | The company's domain and the final website address after redirects |
| name, legalName | Company name from structured data (JSON-LD), the site name tag or the page title |
| description, tagline | What the company says about itself |
| logo, favicon | Logo image (from the site's structured data or Wikidata) and site icon |
| industry, industryConfidence, industryKeywords | Plain-language industry guess, how sure it is (0 to 100) and the words that led to it |
| naicsCode, naicsTitle, sicCodes | NAICS and SIC codes, only when the match is strong |
| country, address, headquarters | From the site's structured data, Wikidata, or the country domain suffix (.de, .fr) |
| foundedYear, employeeCount, sizeHint | From the website or Wikidata. Only filled for companies that publish it. |
| linkedin, twitter, facebook, instagram, youtube, tiktok, github | Social links the company itself shows on its site |
| emails, thirdPartyEmails, phones | Public contacts. `emails` are on the company's own domain; `thirdPartyEmails` (for example gmail) are kept apart |
| emailProvider, mxHosts, receivesEmail | Which email system the domain uses (Google Workspace, Microsoft 365 ...) and whether it can receive mail |
| tech, techByCategory | Website platform, ecommerce, analytics, CRM, chat, payments, CDN (500+ signatures) |
| wikidataId, wikipediaUrl | Link to the Wikidata item, only when it lists the same website |
| confidence, fieldSources, sources | How much of the profile was filled (0 to 100) and which source supplied each field |
| status, error | `ok`, `partial` (site unreachable but other sources worked) or an error row |

Honest note on `confidence`: it measures how complete the profile is, not whether each field is correct. `fieldSources` tells you where every value came from so you can judge it yourself.

### 3 ways to use it

1. **Clean a CRM list: domains in, profiles out**
   `{"domains": ["stripe.com", "notion.so", "hubspot.com"]}`
2. **I only have company names**
   `{"domains": [], "companyNames": ["Shopify", "Allbirds", "Duolingo"]}`
3. **Fast and lean: only the basics for 10,000 domains**
   `{"domains": ["acme.com", "..."], "includeWikidata": false, "includeTech": false, "contactPagesToRead": 0, "concurrency": 10}`

### Input

| Field | What to enter | Default |
|---|---|---|
| domains | Domains, website addresses or email addresses (the part after @ is used) | stripe.com, notion.so, hubspot.com |
| companyNames | Names whose website you do not know. Resolved through Wikidata, then a public autocomplete service | empty |
| includeEmails | Read the homepage and contact/about pages for public emails and phones | true |
| contactPagesToRead | Extra pages to read per company (0 to 4) | 2 |
| includeTech | Detect the tech stack | true |
| checkEmailProvider | Look up the email provider from MX records | true |
| includeIndustry | Guess the industry | true |
| includeWikidata | Add founding year, employees, headquarters (needs a matching Wikidata item, adds a few seconds) | true |
| maxCompanies | Safety cap, also your spending cap | 1000 |
| concurrency | Companies processed in parallel | 5 |

If you pass only `companyNames`, the sample domains are ignored, so you are never charged for them.

### Output example

```json
{
  "type": "company",
  "domain": "allbirds.com",
  "url": "https://www.allbirds.com/",
  "status": "ok",
  "name": "Allbirds",
  "description": "Allbirds: The world's most comfortable shoes, flats, and clothing made with natural materials like merino wool...",
  "logo": "https://commons.wikimedia.org/wiki/Special:FilePath/Allbirds_logo.svg?width=256",
  "industry": "E-commerce / Retail",
  "industryConfidence": 93,
  "industryKeywords": ["free shipping", "shoes", "clothing", "apparel"],
  "foundedYear": 2014,
  "twitter": "https://twitter.com/allbirds",
  "instagram": "https://www.instagram.com/allbirds",
  "emails": ["help@allbirds.com"],
  "phones": ["+1 (424) 363-8064"],
  "emailProvider": "Microsoft 365",
  "receivesEmail": true,
  "tech": ["Shopify", "Cloudflare", "Google Tag Manager"],
  "wikidataId": "Q30591057",
  "confidence": 90
}
```

Download the dataset as JSON, CSV or Excel from the Storage tab.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Company enriched | $0.003 |

You pay only for companies that were delivered. A domain that does not exist, a name that cannot be placed, or an empty row is returned as an error row and is not charged.

- 100 companies = **$0.30**
- 1,000 companies = **$3.00**
- 10,000 companies = **$30.00**

Pricing is pay per event, so the Apify platform usage is included.

### Use it with

- **Before:** a Google Maps scraper (use its `website` column as `domains`), a lead export from any tool, or your CRM's company list.
- **After:** `that_red_bird/email-verifier` to verify the emails found, `that_red_bird/lead-list-deduplicator` to merge duplicates, `that_red_bird/tech-stack-detector` for a deeper technology report on a few sites.
- **Make, Zapier, n8n:** trigger on "run succeeded", then send the rows to Google Sheets, HubSpot or your CRM.
- **AI agents / MCP:** call `that_red_bird/company-enrichment-by-domain` with `{"domains": ["example.com"]}`. The agent receives a JSON profile with a `confidence` and the source of every field.

### FAQ

**Is this a replacement for Clearbit?** For public, website-based facts, yes. It does not hold a private database, so it will not know a company's revenue or its employees' names. Where a field is not public, it stays empty rather than guessed.

**Is it legal?** It reads public web pages and public records only, the same pages you can open in a browser. You are responsible for how you use contact data (GDPR, CAN-SPAM and local rules).

**Why is an email missing?** Many companies show only a contact form. We never guess addresses (no info@ patterns); we return only what is printed on the site.

**Why is the industry empty or low-confidence?** The label comes from the words on the homepage. If the page is a login screen or has no description, the Actor returns a low confidence or nothing instead of a wrong label.

**Why is the founding year or employee count missing?** Those come from the website's structured data or Wikidata. Smaller companies are usually not on Wikidata. A Wikidata match is accepted only when it lists the same website.

**Sites that block bots?** A blocked site is retried through the Apify proxy automatically. If it still fails, the row is returned with `status: partial` when other sources worked (MX, Wikidata), or as an uncharged error row.

**How fresh is the data?** It is read live on every run. Only Wikidata facts can be older.

**Can I schedule it?** Yes. Schedule it after the Actor that produces your domains.

### Limits

- LinkedIn is not scraped. LinkedIn links are shown only when the company's own site or Wikidata lists them.
- No private data, no personal emails, no guessed emails, no revenue or funding.
- Employee counts and founding years exist only for companies on Wikidata or with structured data on their site.
- Industry is a keyword-based guess with a stated confidence, not an official classification.
- Sites behind strict bot protection may return partial data.

### Support

Open an issue on the Issues tab; we answer quickly. If this saved you time, a short review helps other people find it.

# Actor input Schema

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

One entry per company: a bare domain (stripe.com), a website address (https://www.stripe.com/pricing) or an email address (jane@stripe.com, the part after @ is used). Duplicates are removed. Clear this field if you only want to use company names.

## `companyNames` (type: `array`):

Company names whose website you do not know, for example Shopify or Allbirds. The Actor looks up each official website on Wikidata first and on a public autocomplete service second. Names it cannot place come back as error rows and are not charged. A domain is always more reliable than a name.

## `includeEmails` (type: `boolean`):

Read the homepage and its contact and about pages for email addresses and phone numbers the company prints publicly. Emails on the company's own domain are listed first; addresses on other domains (for example gmail) are kept separate.

## `contactPagesToRead` (type: `integer`):

How many extra pages (contact, about, impressum) to read per company when looking for emails and phones. 0 reads only the homepage. More pages find more contacts and make runs slower.

## `includeTech` (type: `boolean`):

Identify the website platform, ecommerce system, analytics, CRM, chat, payment and hosting tools from the homepage, using the same 500+ signature library as the Tech Stack Detector Actor.

## `checkEmailProvider` (type: `boolean`):

Read the domain's public mail records to show which email system the company uses (Google Workspace, Microsoft 365 and others) and whether the domain can receive email at all. No email is sent.

## `includeIndustry` (type: `boolean`):

Label the industry (for example Software / SaaS, Healthcare) from the words the company uses about itself, with a confidence and the words that led to it, plus a NAICS code when the match is strong. A vague homepage gets a low confidence or no label instead of a wrong one.

## `includeWikidata` (type: `boolean`):

Look the company up on Wikidata and add founding year, employee count, headquarters and Wikipedia link. A match is accepted only when Wikidata lists the same website, so another company with a similar name is never mixed in. Only well-known companies are on Wikidata. Adds a few seconds per company.

## `maxCompanies` (type: `integer`):

Safety cap on how many companies are enriched in one run. You are charged per company delivered, so this is also a spending cap.

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

How many companies are processed in parallel. The default is polite to the websites and fast enough for most runs.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "notion.so",
    "hubspot.com"
  ],
  "companyNames": [],
  "includeEmails": true,
  "contactPagesToRead": 2,
  "includeTech": true,
  "checkEmailProvider": true,
  "includeIndustry": true,
  "includeWikidata": true,
  "maxCompanies": 1000,
  "concurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `downloadCsv` (type: `string`):

No description

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

No description

## `count` (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": [
        "stripe.com",
        "notion.so",
        "hubspot.com"
    ],
    "companyNames": [],
    "includeEmails": true,
    "contactPagesToRead": 2,
    "includeTech": true,
    "checkEmailProvider": true,
    "includeIndustry": true,
    "includeWikidata": true,
    "maxCompanies": 1000,
    "concurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/company-enrichment-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",
        "notion.so",
        "hubspot.com",
    ],
    "companyNames": [],
    "includeEmails": True,
    "contactPagesToRead": 2,
    "includeTech": True,
    "checkEmailProvider": True,
    "includeIndustry": True,
    "includeWikidata": True,
    "maxCompanies": 1000,
    "concurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/company-enrichment-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",
    "notion.so",
    "hubspot.com"
  ],
  "companyNames": [],
  "includeEmails": true,
  "contactPagesToRead": 2,
  "includeTech": true,
  "checkEmailProvider": true,
  "includeIndustry": true,
  "includeWikidata": true,
  "maxCompanies": 1000,
  "concurrency": 5
}' |
apify call that_red_bird/company-enrichment-by-domain --silent --output-dataset

```

## MCP server setup

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