# Lead Enrichment Pipeline, Company URL to Verified Contacts (`george.the.developer/lead-enrichment-pipeline`) Actor

One API call: provide a LinkedIn company URL, get back enriched employee profiles with validated emails. Combines LinkedIn scraping, company intelligence, and email discovery into a single pipeline.

- **URL**: https://apify.com/george.the.developer/lead-enrichment-pipeline.md
- **Developed by:** [George Kioko](https://apify.com/george.the.developer) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 1.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

One API call to turn a LinkedIn company URL into verified employee contacts with emails. No manual research, no tab switching, no copy pasting.

### What It Does

You provide a LinkedIn company URL. The pipeline does the rest:

1. **Scrapes employees** from the company LinkedIn page (names, titles, profile URLs)
2. **Enriches the company** (industry, tech stack, domain, social profiles)
3. **Generates candidate emails** using 7 common corporate email patterns per person
4. **Validates every email** to confirm deliverability before you send

You get back a clean JSON array of enriched leads ready for outreach.

### How It Works

```mermaid
flowchart TD
    A[User Input: LinkedIn Company URL] --> B[Step 1: LinkedIn Employee Scraper]
    B --> C{Title Filter Applied?}
    C -->|Yes| D[Filter by CEO, CTO, VP, etc.]
    C -->|No| E[Keep All Employees]
    D --> F[Step 2: Company Enrichment API]
    E --> F
    F --> G[Extract Domain + Company Intel]
    G --> H[Step 3: Email Pattern Generator]
    H --> I["Generate 7 patterns per person<br/>first.last@ / first@ / flast@ / etc."]
    I --> J[Step 4: Email Validator API]
    J --> K[Validate Each Candidate Email]
    K --> L[Step 5: Merge + Output]
    L --> M[Enriched Leads Dataset]

    style A fill:#e1f5fe
    style M fill:#c8e6c9
    style H fill:#fff3e0
    style I fill:#fff3e0
````

### Quick Start

#### On Apify Console

1. Open the actor on Apify Store
2. Set the **Company LinkedIn URL** (e.g., `https://www.linkedin.com/company/stripe`)
3. Optionally set the **Company Website** for better enrichment
4. Optionally filter by **Title Keywords** like `CEO, CTO, VP, Director`
5. Click **Start** and wait for results

#### Via API

```bash
curl -X POST "https://api.apify.com/v2/acts/george.the.developer~lead-enrichment-pipeline/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "companyUrl": "https://www.linkedin.com/company/stripe",
    "companyWebsite": "https://stripe.com",
    "maxEmployees": 10,
    "filterTitles": ["CEO", "CTO", "VP", "Director"],
    "validateEmails": true
  }'
```

#### Via Apify Client (Node.js)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('george.the.developer/lead-enrichment-pipeline').call({
    companyUrl: 'https://www.linkedin.com/company/stripe',
    companyWebsite: 'https://stripe.com',
    maxEmployees: 10,
    filterTitles: ['CEO', 'CTO', 'VP'],
    validateEmails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Output Format

Each lead in the dataset looks like this:

```json
{
    "fullName": "Patrick Collison",
    "firstName": "Patrick",
    "lastName": "Collison",
    "title": "CEO and Co-founder at Stripe",
    "linkedinUrl": "https://www.linkedin.com/in/patrickcollison/",
    "company": {
        "name": "Stripe",
        "domain": "stripe.com",
        "industry": "Financial Services",
        "description": "Financial infrastructure for the internet",
        "technologies": ["React", "Node.js", "Ruby"],
        "socialProfiles": {
            "linkedin": "https://www.linkedin.com/company/stripe",
            "twitter": "https://twitter.com/stripe"
        }
    },
    "emails": [
        {
            "email": "patrick@stripe.com",
            "valid": true,
            "score": 0.9
        },
        {
            "email": "patrick.collison@stripe.com",
            "valid": true,
            "score": 0.85
        },
        {
            "email": "pcollison@stripe.com",
            "valid": false,
            "score": 0.2
        }
    ],
    "enrichedAt": "2026-04-08T12:00:00.000Z"
}
```

### Email Pattern Generation

The pipeline generates 7 common corporate email patterns for each employee:

| Pattern | Example |
|---------|---------|
| first.last@domain | patrick.collison@stripe.com |
| first@domain | patrick@stripe.com |
| flast@domain | pcollison@stripe.com |
| firstl@domain | patrickc@stripe.com |
| last.first@domain | collison.patrick@stripe.com |
| first\_last@domain | patrick\_collison@stripe.com |
| last@domain | collison@stripe.com |

Each pattern is then validated against the mail server to confirm deliverability.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| companyUrl | string | Yes | | LinkedIn company page URL |
| companyWebsite | string | No | | Company website for enrichment |
| maxEmployees | integer | No | 10 | Max employees to extract (1 to 50) |
| filterTitles | string\[] | No | \[] | Only include matching title keywords |
| validateEmails | boolean | No | true | Validate discovered emails |
| apifyToken | string | No | | Your Apify token for sub actor calls |

### Pricing

**$0.03 per enriched lead** via Pay Per Event.

This includes LinkedIn scraping, company enrichment, email generation, and email validation all in one call.

#### Comparison with alternatives

| Service | Cost per lead | What you get |
|---------|--------------|--------------|
| **This pipeline** | **$0.03** | LinkedIn profile + company intel + validated emails |
| Apollo.io | $0.10 to $0.50 | Similar data, monthly subscription required |
| Hunter.io | $0.05 to $0.15 | Email only, no LinkedIn scraping |
| Clearbit | $0.20 to $1.00 | Company enrichment only |
| Manual research | $2 to $5/hr | Time intensive, error prone |

### Architecture

The pipeline orchestrates three existing Apify actors:

```mermaid
flowchart LR
    P[Lead Enrichment Pipeline] --> L[LinkedIn Employee Scraper]
    P --> E[Company Enrichment API]
    P --> V[Email Validator API]

    L -->|Employees| P
    E -->|Company Data + Domain| P
    V -->|Validation Results| P

    P --> G[Email Pattern Generator]
    G -->|Candidate Emails| V

    style P fill:#1565c0,color:#fff
    style G fill:#ff8f00,color:#fff
```

The email pattern generator is the core value. LinkedIn gives names but not emails. Company enrichment gives generic contact emails. The pattern generator bridges the gap by creating personalized candidate emails from names and the company domain, then validates each one.

### Use Cases

- **Sales prospecting**: Find decision makers at target companies with verified emails
- **Recruiting**: Build candidate lists with contact information
- **Market research**: Map out team structures at competitor companies
- **Partnership outreach**: Find the right people to contact at potential partner companies
- **Investor research**: Identify key executives at portfolio companies

### Tips for Best Results

- Always provide the **company website** when you know it. This improves enrichment accuracy.
- Use **title filters** to focus on decision makers and reduce costs.
- Set **maxEmployees** to a reasonable number. Start with 10 and increase if needed.
- The pipeline works best for companies with active LinkedIn presence.

### Limitations

- LinkedIn scraping depends on publicly available profile data
- Email validation accuracy depends on the target mail server configuration
- Some mail servers block SMTP checks, resulting in lower confidence scores
- Rate limits apply to sub actor calls

# Actor input Schema

## `companyUrl` (type: `string`):

The LinkedIn company page URL to scrape employees from.

## `companyWebsite` (type: `string`):

The company website domain for enrichment and email discovery. If not provided, the pipeline will attempt to find it from LinkedIn data.

## `maxEmployees` (type: `integer`):

Maximum number of employees to extract from LinkedIn.

## `filterTitles` (type: `array`):

Only include employees whose title contains one of these keywords. Leave empty to include all employees.

## `validateEmails` (type: `boolean`):

Whether to validate discovered and guessed emails using the Email Validator API. Disabling this saves time but emails will be unverified.

## `apifyToken` (type: `string`):

Your Apify API token for calling sub-actors. Required to run the LinkedIn scraper, Company Enrichment, and Email Validator actors.

## Actor input object example

```json
{
  "companyUrl": "https://www.linkedin.com/company/stripe",
  "companyWebsite": "https://stripe.com",
  "maxEmployees": 10,
  "filterTitles": [
    "CEO",
    "CTO",
    "VP",
    "Director",
    "Head"
  ],
  "validateEmails": true
}
```

# 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 = {
    "companyUrl": "https://www.linkedin.com/company/stripe"
};

// Run the Actor and wait for it to finish
const run = await client.actor("george.the.developer/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 = { "companyUrl": "https://www.linkedin.com/company/stripe" }

# Run the Actor and wait for it to finish
run = client.actor("george.the.developer/lead-enrichment-pipeline").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyUrl": "https://www.linkedin.com/company/stripe"
}' |
apify call george.the.developer/lead-enrichment-pipeline --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=george.the.developer/lead-enrichment-pipeline",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Lead Enrichment Pipeline, Company URL to Verified Contacts",
        "description": "One API call: provide a LinkedIn company URL, get back enriched employee profiles with validated emails. Combines LinkedIn scraping, company intelligence, and email discovery into a single pipeline.",
        "version": "1.0",
        "x-build-id": "lgurz9XN1eLyvI3nr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/george.the.developer~lead-enrichment-pipeline/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-george.the.developer-lead-enrichment-pipeline",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/george.the.developer~lead-enrichment-pipeline/runs": {
            "post": {
                "operationId": "runs-sync-george.the.developer-lead-enrichment-pipeline",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/george.the.developer~lead-enrichment-pipeline/run-sync": {
            "post": {
                "operationId": "run-sync-george.the.developer-lead-enrichment-pipeline",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "companyUrl"
                ],
                "properties": {
                    "companyUrl": {
                        "title": "Company LinkedIn URL",
                        "type": "string",
                        "description": "The LinkedIn company page URL to scrape employees from."
                    },
                    "companyWebsite": {
                        "title": "Company Website",
                        "type": "string",
                        "description": "The company website domain for enrichment and email discovery. If not provided, the pipeline will attempt to find it from LinkedIn data."
                    },
                    "maxEmployees": {
                        "title": "Max Employees",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of employees to extract from LinkedIn.",
                        "default": 10
                    },
                    "filterTitles": {
                        "title": "Filter by Title Keywords",
                        "type": "array",
                        "description": "Only include employees whose title contains one of these keywords. Leave empty to include all employees.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "validateEmails": {
                        "title": "Validate Emails",
                        "type": "boolean",
                        "description": "Whether to validate discovered and guessed emails using the Email Validator API. Disabling this saves time but emails will be unverified.",
                        "default": true
                    },
                    "apifyToken": {
                        "title": "Apify API Token",
                        "type": "string",
                        "description": "Your Apify API token for calling sub-actors. Required to run the LinkedIn scraper, Company Enrichment, and Email Validator actors."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
