# Company Enrichment — Domain to Profile, Tech, Hiring, Contacts (`chorelet/company-enrichment-scraper`) Actor

Turn a list of domains into company profiles: name, description, logo, industry hint, emails, phones and social profiles, the technologies the site runs on, which ATS it hires through and how many jobs are open, plus domain age, registrar and email setup. No API key.

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

## Pricing

from $3.50 / 1,000 companies

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?

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 Profile, Tech, Hiring, Contacts

Give it a list of domains and get a company profile for each: name, what the company does, logo, site language and an industry hint; emails, phones and social profiles; the technologies the site runs on; **which applicant tracking system it hires through and how many jobs are open right now**; and the domain's age, registrar, registrant country, mail provider, SPF and DMARC.

No API key, no account, no third-party data licence — every field comes from the company's own website, its job board's public endpoint, the domain registry and public DNS.

### Why this Actor

- **Hiring signals most enrichment tools do not have.** The Actor finds the company's job board even when the website never links to it, and returns how many roles are open — 712 for Stripe, 156 for Ramp, 132 for Notion in a test run. Open roles are the cleanest public signal that a company is growing and spending.
- **One row, four sources.** The website, the ATS's public endpoint, the domain registry and public DNS, merged into a single flat row — no stitching three Actors together.
- **No data licence, no API key.** Everything is read from public sources at run time, so there is no stale vendor database between you and the company.
- **Says when it cannot see.** A JavaScript-only homepage is flagged rather than returned as an empty row, so a list of 500 domains tells you which ones need a different approach.

### Sample output

One item of the dataset (long values shortened):

```json
{
  "domain": "stripe.com",
  "name": "Stripe",
  "description": "Stripe is a financial services platform that helps all types of businesses accept payments, build flexible billing models, and manage mon…",
  "industry": "SaaS / software",
  "atsProvider": "greenhouse",
  "openJobs": 712,
  "technologyCount": 2,
  "emails": [],
  "linkedin": null
}
```

### What you get

- **Open jobs as a growth signal.** The run finds the company's board even when the site never links to it — Stripe came back with 712 open roles on Greenhouse, Ramp with 156 on Ashby, Notion with 132 — with a few role titles and a direct board link
- **Contacts** from the homepage and the site's own contact pages: emails, phones, LinkedIn, X, Facebook, Instagram, YouTube and GitHub, each as a separate column
- **Technology stack**: CMS, shop platform, frameworks, hosting, analytics and payment providers
- **Domain facts**: registration date and age in years, registrar, registrant country, nameservers, mail provider, SPF and DMARC — the quick read on how established and how well-run a company is
- **Eight page signals** taken from the site's own navigation — pricing, blog, careers, docs, shop, support, login, demo — which separate a SaaS from a shop from an agency without reading a word
- **An honest flag when there is nothing to read.** A homepage that renders entirely in JavaScript is marked `javascriptOnly` instead of coming back as a mysteriously empty row

Every part is a toggle, so a run that only needs hiring signals makes one request per company instead of eight.

### Input example

```json
{
  "domains": [
    "stripe.com",
    "notion.so"
  ],
  "includeContacts": true,
  "includeTech": true,
  "includeHiring": true,
  "includeDomainFacts": true,
  "concurrency": 5,
  "requestTimeoutSecs": 20
}
```

### How much does it cost?

Pay per company — no subscription, no minimum, no charge for platform usage.

| Volume | Price |
|---|---|
| 1,000 companies | $5.00 |
| 10,000 companies | $50.00 |
| 100,000 companies | $500.00 |

The Apify **free plan includes $5 of usage every month** — about 1,000 companies with this Actor, no card needed. Nothing else is charged: platform usage is included in the price, and Apify Bronze, Silver and Gold subscribers get 10%, 20% and 30% off these prices.

### Use it from code, n8n, Make, Zapier or an AI agent

Run the Actor and download the dataset in one call (JSON by default; add `&format=csv` or `xlsx`):

```bash
curl -X POST "https://api.apify.com/v2/acts/chorelet~company-enrichment-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["stripe.com", "notion.so"], "includeContacts": true, "includeTech": true, "includeHiring": true, "includeDomainFacts": true, "concurrency": 5, "requestTimeoutSecs": 20}'
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("chorelet/company-enrichment-scraper").call(run_input={"domains": ["stripe.com", "notion.so"], "includeContacts": true, "includeTech": true, "includeHiring": true, "includeDomainFacts": true, "concurrency": 5, "requestTimeoutSecs": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

- **n8n, Make, Zapier** — use the Apify node/module: run the Actor, then "get dataset items".
- **Google Sheets, Slack, webhooks** — add an integration on the run's *Integrations* tab.
- **AI agents** — the Actor is available as a tool through the Apify MCP server; the dataset schema describes every field for the model.
- **Schedules** — run it hourly, daily or weekly from the *Schedules* tab.

### FAQ

**Where does the data come from?**

The company's own homepage and contact pages, the public endpoint of its applicant tracking system, the domain registry over RDAP, and public DNS. Nothing is bought from a data vendor and nothing needs a key.

**How does it find the job board?**

First from the links on the site. If nothing is linked, it tries the company's own name as a board slug on Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee — which is how most companies name theirs.

**Can it find employee counts or revenue?**

No. Those come from paid databases or from LinkedIn, which does not allow this kind of access. Open jobs, domain age, tech stack and page signals are the public proxies this Actor gives you instead.

**Why are some rows nearly empty?**

The homepage renders in JavaScript, so a plain fetch sees a shell. Those rows carry `javascriptOnly: true` — hiring and domain facts still come back for them, because those do not depend on the HTML.

**Can I turn parts off?**

Yes. Contacts, technology, hiring and domain facts are separate switches; with only hiring on, a company costs about one request instead of eight.

**Is it legal to collect this?**

It reads public web pages, public job-board endpoints, the domain registry and DNS. Business contact details in Europe are still personal data under the GDPR — have a lawful basis before you use them for outreach.

### Support

Questions, missing fields or a source that changed? Open an issue on the *Issues* tab or write to support@chorelet.app — problems are usually fixed within a day, and the Actor is checked every morning by an automated test run. If the Actor saved you time, a short review on its Store page helps other people find it.

# Actor input Schema

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

`stripe.com`, `https://www.notion.so/`, or an email address — anything with a domain in it.

## `includeContacts` (type: `boolean`):

Reads the homepage and up to two of the site's own contact pages.

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

CMS, shop platform, frameworks, hosting, analytics and payment providers, detected from the homepage.

## `includeHiring` (type: `boolean`):

Which applicant tracking system the company uses and how many jobs are open on that board right now — the clearest public growth signal there is.

## `includeDomainFacts` (type: `boolean`):

Registration date and age, registrar, registrant country, nameservers, mail provider, SPF and DMARC.

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

How many domains to enrich in parallel.

## `requestTimeoutSecs` (type: `integer`):

Per request.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "notion.so"
  ],
  "includeContacts": true,
  "includeTech": true,
  "includeHiring": true,
  "includeDomainFacts": true,
  "concurrency": 5,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

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

Everything enriched — items of the default dataset. Use ?format=csv or xlsx on this URL for spreadsheets.

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

How many companies were enriched and how many were unreachable.

# 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"
    ],
    "includeContacts": true,
    "includeTech": true,
    "includeHiring": true,
    "includeDomainFacts": true,
    "concurrency": 5,
    "requestTimeoutSecs": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("chorelet/company-enrichment-scraper").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",
    ],
    "includeContacts": True,
    "includeTech": True,
    "includeHiring": True,
    "includeDomainFacts": True,
    "concurrency": 5,
    "requestTimeoutSecs": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("chorelet/company-enrichment-scraper").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"
  ],
  "includeContacts": true,
  "includeTech": true,
  "includeHiring": true,
  "includeDomainFacts": true,
  "concurrency": 5,
  "requestTimeoutSecs": 20
}' |
apify call chorelet/company-enrichment-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chorelet/company-enrichment-scraper"
        }
    }
}
```

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/e0PSE4hWcAhUesupn/builds/ixGFcLOQ4seh4NyyF/openapi.json
