# Lead Enrichment Pipeline (`arched_friend/lead-enrichment-pipeline`) Actor

Turn a list of company domains into CRM ready rows. One pass returns contact details, the technology each company runs, and whether they are hiring, so a raw domain list becomes a qualified account list.

- **URL**: https://apify.com/arched\_friend/lead-enrichment-pipeline.md
- **Developed by:** [Peach O](https://apify.com/arched_friend) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.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?

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

## Lead Enrichment Pipeline: Domains to CRM Ready Leads

**Start with a list of company websites. Finish with a qualified account list.**

One pass returns the contact details, the technology each company runs, and whether they are hiring. Three enrichments, one crawl, one row per company.

Built for sales teams building target lists, agencies qualifying prospects by platform, and anyone tired of paying three vendors for one answer.

### How it works

```mermaid
flowchart LR
    A[Your domain list] --> B[One crawl per company]
    B --> C[Emails, phones, socials]
    B --> D[Technology stack]
    A --> E[Job board lookup]
    E --> F[Hiring signals]
    C & D & F --> G[(One CRM ready row)]
```

The point is the shared crawl. Running a contact tool and a technology tool separately loads every page twice and bills you twice. This reads each page once and answers both questions from it.

### Why these three signals together

```mermaid
flowchart TD
    A[Company] --> B[Contact details]
    A --> C[Technology stack]
    A --> D[Hiring signals]
    B --> B1[Who to reach]
    C --> C1[Whether they fit]
    D --> D1[Whether now is the moment]
    B1 & C1 & D1 --> E[A reason to send the email]
```

A company on Shopify running Klaviyo, hiring three growth roles, with a reachable address is a different prospect from a name on a list.

### Input

```json
{
  "websites": ["gymshark.com", "allbirds.com", "monzo.com"],
  "maxPagesPerSite": 3
}
```

| Option | Does |
| --- | --- |
| `websites` | Required. Bare domains or full URLs both work. |
| `enrichContacts` | Emails, phones and social profiles. On by default. |
| `enrichTechnologies` | The technology stack. On by default. |
| `enrichHiring` | Finds the company job board and counts open roles. On by default. |
| `renderJavaScript` | Runs pages like a browser. On by default, and worth it. |
| `requireEmail` | Keep only companies where an email was found. |
| `includeTechnologies` | Keep only companies running these, for example Shopify. |
| `excludeTechnologies` | Drop companies already using a competitor. |
| `maxPagesPerSite` | Split between contact pages and product pages. |

### Output

One row per company. Flat fields for spreadsheets, full detail underneath.

```json
{
  "domain": "monzo.com",
  "companyName": "Monzo | Open a Free Account",
  "primaryEmail": "help@monzo.com",
  "linkedin": "https://www.linkedin.com/company/monzo-bank",
  "instagram": "https://www.instagram.com/monzo",
  "cms": "Contentful",
  "analytics": ["Google Analytics 4"],
  "reviews": ["Trustpilot"],
  "webFramework": ["Next.js"],
  "cdn": ["Amazon CloudFront"],
  "technologyCount": 5,
  "isHiring": true,
  "openRoles": 65,
  "jobBoard": "greenhouse",
  "jobBoardUrl": "https://boards.greenhouse.io/monzo",
  "sampleRoles": ["Anaplan Support Analyst", "Android Engineer"],
  "matchesFilter": true,
  "enrichedAt": "2026-09-02T11:42:08.551Z"
}
```

Export to JSON, CSV or Excel, or send it straight into your CRM.

### Qualify a list in one run

Say you sell a subscription tool to Shopify brands, and you would rather not pitch anyone already running Recharge.

```json
{
  "websites": ["allbirds.com", "huel.com", "monzo.com", "gymshark.com"],
  "includeTechnologies": ["Shopify"],
  "excludeTechnologies": ["Recharge"],
  "requireEmail": true,
  "onlyMatching": true
}
```

What comes back is the companies on Shopify, without your competitor installed, that you can actually email. Everything else is dropped before it reaches your CRM.

### Run it as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/arched_friend~lead-enrichment-pipeline/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"websites": ["gymshark.com"], "requireEmail": true}'
```

Schedule it against your account list and diff the runs. A company that just added Klaviyo, or opened five sales roles, is a company worth an email this week.

### What it detects

162 technologies across 24 categories, including ecommerce platforms, CMS, analytics, email and SMS, payments, live chat, reviews, ad pixels, CDN and hosting. Hiring lookups cover Greenhouse, Lever, Ashby and Workable, discovered automatically from the domain.

Every technology carries the evidence that proved it, so you can check any row rather than trust it.

### Pricing

You pay per company enriched, whichever enrichments you switch on.

| Option | Cost |
| --- | --- |
| Lead Enrichment Pipeline | $30 per 1,000 companies |
| Buying the three signals separately | Three tools, three bills, three crawls |
| Clearbit and similar | From about $99 a month, seats extra |
| Doing it by hand | Roughly 10 minutes a company |

A thousand companies qualified for $30. New Apify accounts get free monthly credits, so the first runs cost nothing.

### Common questions

**Why is this more than the single purpose Actors?**
It does three jobs and returns them joined on the company. Running Website Lead Extractor and Tech Stack Checker separately means crawling every site twice, and you still would not have hiring data or one merged row.

**What if no email is found?**
Plenty of companies publish a form instead of an address. The row still carries phones, socials, technology and hiring. Set `requireEmail` if you only want rows you can email.

**How does it find a job board without being told?**
It derives likely slugs from the domain and asks Greenhouse, Lever, Ashby and Workable whether they know that company. A board that answers with open roles is proof. No board found is reported honestly rather than guessed at.

**Is the technology detection the same as Tech Stack Checker?**
The same catalogue and the same evidence rules, running on the shared crawl.

**Is this legal?**
It reads publicly served pages and public job boards, the same way any browser does. No logins, no personal data, no private information.

### Related products

- **Website Lead Extractor** when you only need contact details
- **Tech Stack Checker** when you only need the technology profile
- **Hiring Signals Tracker** when you need the full role feed rather than a count

# Actor input Schema

## `websites` (type: `array`):

One entry per company. Bare domains such as gymshark.com or full URLs both work.

## `enrichContacts` (type: `boolean`):

Emails, phone numbers and social profiles, read from the homepage and contact pages.

## `enrichTechnologies` (type: `boolean`):

Ecommerce platform, CMS, analytics, payments, marketing and support tools.

## `enrichHiring` (type: `boolean`):

Looks for the company's public job board and reports how many roles are open. Hiring is the earliest public sign that budget is moving.

## `renderJavaScript` (type: `boolean`):

On, each page is rendered and every network request it makes is inspected, which catches the tools a tag manager injects at runtime. Off is faster but only sees the raw HTML.

## `requireEmail` (type: `boolean`):

Drops companies where no email address could be found.

## `includeTechnologies` (type: `array`):

Keep a company only when it runs these, for example Shopify or Klaviyo. Leave empty to keep every company.

## `matchMode` (type: `string`):

Whether the list above means any of them or all of them.

## `excludeTechnologies` (type: `array`):

Drop companies already running a tool you compete with.

## `onlyMatching` (type: `boolean`):

Off, every company is returned with a matchesFilter flag so you can see what was rejected and why.

## `categories` (type: `array`):

Limit the technology report. Leave empty to report everything found.

## `minConfidence` (type: `string`):

High keeps only matches proven by a vendor script, a response header, a cookie or a generator tag.

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

The homepage is always read. The rest is split between contact pages, which carry the emails, and product or pricing pages, which reveal more of the stack.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on requests across the run, for cost control. Leave empty for no cap.

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

Optional proxy for larger runs or sites that rate limit by IP.

## Actor input object example

```json
{
  "websites": [
    "gymshark.com"
  ],
  "enrichContacts": true,
  "enrichTechnologies": true,
  "enrichHiring": true,
  "renderJavaScript": true,
  "requireEmail": false,
  "includeTechnologies": [
    "Shopify"
  ],
  "matchMode": "any",
  "excludeTechnologies": [
    "Klaviyo"
  ],
  "onlyMatching": false,
  "minConfidence": "medium",
  "maxPagesPerSite": 3
}
```

# Actor output Schema

## `enrichedCompanies` (type: `string`):

One row per company, with contact details, technology stack and hiring signals together.

## `runSummary` (type: `string`):

How many companies were enriched, how many carried an email, technology or hiring signal, and anything that 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 = {
    "websites": [
        "monzo.com",
        "gymshark.com",
        "huel.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("arched_friend/lead-enrichment-pipeline").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 = { "websites": [
        "monzo.com",
        "gymshark.com",
        "huel.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("arched_friend/lead-enrichment-pipeline").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 '{
  "websites": [
    "monzo.com",
    "gymshark.com",
    "huel.com"
  ]
}' |
apify call arched_friend/lead-enrichment-pipeline --silent --output-dataset

```

## MCP server setup

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

```

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/fSBJK2w0vbR8KXb5b/builds/lfLEuhBf8B4cv0kwN/openapi.json
