# LinkedIn Email Finder & Verifier | Find B2B Emails (`blessiticus/linkedin-email-finder-pro`) Actor

Find verified emails from LinkedIn profiles or Names & Domains. We generate permutations and perform live SMTP handshakes to guarantee deliverability. No external API keys required! At just $0.020 per valid email

- **URL**: https://apify.com/blessiticus/linkedin-email-finder-pro.md
- **Developed by:** [Mohammad Palekar](https://apify.com/blessiticus) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $15.00 / 1,000 email found & verifieds

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?

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

## LinkedIn Email Finder — Find Verified Emails from LinkedIn Profiles

Turn any LinkedIn profile URL into a **verified professional email address**. Upload a CSV or Google Sheet of LinkedIn URLs, and get back real, SMTP-verified work emails — not guesses from stale databases.

**How it works:** We scrape each LinkedIn profile to extract their name and current company, generate 14+ email permutations (`first.last@company.com`, `flast@company.com`, etc.), then perform live SMTP handshakes against the company's mail server to confirm which one actually exists.

### Why This Actor?

| Feature | LinkedIn Email Finder | Hunter.io / Apollo |
|:---|:---:|:---:|
| **Price per verified email** | **$0.02** | $0.01 – $0.05 |
| LinkedIn profile scraping (no cookies) | ✅ | ❌ Requires browser extension |
| Live SMTP verification | ✅ | ❌ Database lookups |
| Works on brand-new hires | ✅ | ❌ Stale data |
| Catch-all domain detection | ✅ | Some |
| CSV / Google Sheets upload | ✅ | ❌ |
| Bulk processing (thousands) | ✅ | Rate limited |
| No API key required | ✅ | ❌ |

### Use Cases

- **Sales prospecting** — Upload your lead list of LinkedIn URLs, get back verified emails ready for outreach
- **Recruiting** — Find direct email addresses for candidates instead of relying on InMail
- **Link building & PR** — Reach journalists, bloggers, and editors at their work email
- **Account-based marketing** — Build verified contact lists for target accounts at scale
- **CRM enrichment** — Enrich your existing LinkedIn-based CRM with verified email addresses

### Input Options

#### Option 1: CSV / Google Sheets Upload (Recommended)

Paste a URL to your CSV file or Google Sheet containing LinkedIn profile URLs. The actor automatically:

- **Detects your column headers** — supports `LinkedIn Profile`, `linkedin_url`, `URL`, `Profile`, and 10+ variations
- **Converts Google Sheets links** — paste a regular `docs.google.com/spreadsheets/...` link and it auto-converts to CSV
- **Handles any delimiter** — commas, semicolons, tabs — all auto-detected

#### Option 2: Direct LinkedIn URLs

Paste LinkedIn profile URLs directly into the **LinkedIn URLs** field, one per line.

#### Option 3: Manual Name + Domain

If you already know the person's name and company domain, enter them directly as `FirstName, LastName, domain.com` — skips the LinkedIn scraping step entirely.

### How the Pipeline Works

```
LinkedIn URL → Scrape Profile → Extract Name + Company
    → Generate 14 Email Permutations
    → SMTP Verify Each One in Parallel
    → Return the Winning Email ✅
```

#### Email Patterns We Test

For a person named **John Doe** at **company.com**, we test:

| Pattern | Example |
|:---|:---|
| `first@domain` | john@company.com |
| `first.last@domain` | john.doe@company.com |
| `firstlast@domain` | johndoe@company.com |
| `flast@domain` | jdoe@company.com |
| `firstl@domain` | johnd@company.com |
| `first_last@domain` | john\_doe@company.com |
| `f.last@domain` | j.doe@company.com |
| `last@domain` | doe@company.com |
| `lastfirst@domain` | doejohn@company.com |
| `last.first@domain` | doe.john@company.com |
| `lastf@domain` | doej@company.com |
| `fl@domain` | jd@company.com |
| `first-last@domain` | john-doe@company.com |
| `first.l@domain` | john.d@company.com |

### Output

Each LinkedIn profile produces a result row with the verified email and metadata:

```json
{
    "firstName": "John",
    "lastName": "Doe",
    "domain": "company.com",
    "linkedinUrl": "https://www.linkedin.com/in/johndoe",
    "email": "john.doe@company.com",
    "status": "found",
    "confidence": "high",
    "is_catch_all": false,
    "smtp_response": "250 OK — Mailbox exists"
}
```

#### Result Statuses

| Status | Meaning | Action |
|:---|:---|:---|
| `found` | ✅ Verified email address discovered | **Use for outreach** |
| `not_found` | ❌ None of the 14 patterns matched | Person may use a non-standard email |
| `error` | ⚠️ LinkedIn profile couldn't be scraped | Check the URL is valid and public |

#### Confidence Levels

| Confidence | Meaning |
|:---|:---|
| `high` | SMTP server explicitly confirmed the mailbox exists |
| `medium` | Domain is catch-all (accepts all emails) — likely valid but unconfirmed |

### Pricing

**$0.02 per email found** — you only pay when we successfully find and verify an email.

- ❌ No charge for profiles where no email was found
- ❌ No charge for LinkedIn scraping
- ❌ No monthly subscription
- ✅ Pay only for results

#### Cost Examples

| Leads | Emails Found (est. 60%) | Cost |
|:---|:---|:---|
| 100 LinkedIn profiles | ~60 verified emails | **$1.20** |
| 1,000 LinkedIn profiles | ~600 verified emails | **$12.00** |
| 10,000 LinkedIn profiles | ~6,000 verified emails | **$120.00** |

### Plan-Based Limits

| Apify Plan | Max Profiles Per Run | Processing Speed |
|:---|:---|:---|
| Free ($5/mo) | 50 profiles | Batched (slower) |
| Starter+ ($49/mo+) | Unlimited | Full speed |

Free plan users are automatically limited to 50 LinkedIn profiles per run and processed in smaller batches. Upgrade your Apify plan to remove this limitation.

### Frequently Asked Questions

#### How accurate is the email finding?

We typically find verified emails for **50–70%** of LinkedIn profiles, depending on the industry. Tech companies with standard email patterns (first.last@company.com) have the highest hit rates. The emails we do find are verified via live SMTP — not pulled from a database.

#### Do I need LinkedIn cookies or a LinkedIn account?

**No.** We use a third-party LinkedIn scraper that works without any cookies or login credentials. Your LinkedIn account is never touched.

#### Can I upload a Google Sheet directly?

**Yes!** Just paste the regular Google Sheets URL (e.g., `https://docs.google.com/spreadsheets/d/...`). Make sure the sheet's sharing is set to "Anyone with the link can view" and we'll auto-convert it to a CSV download.

#### What if a LinkedIn profile is private or doesn't exist?

We'll mark it as `error` with the message "LinkedIn scraper failed to extract profile data for this URL." You won't be charged for these profiles.

#### How fast is it?

Each batch of 10 LinkedIn profiles takes about 10–15 seconds to scrape. Email verification runs in parallel and typically completes within seconds. A full run of 50 profiles takes roughly 2–3 minutes.

#### Can I chain this with other Apify actors?

Yes! Scrape LinkedIn URLs with any actor (LinkedIn Search Scraper, Sales Navigator Scraper, etc.), then pass the results directly to this actor via CSV URL or Dataset ID.

### Integrations

Connect LinkedIn Email Finder with your existing tools:

- **Make.com** & **Zapier** — Auto-find emails when new leads enter your CRM
- **Google Sheets** — Upload directly, download results as CSV
- **Clay** & **Apollo** — Enrich outbound prospect lists
- **n8n** — Build self-hosted lead enrichment pipelines
- **HubSpot** & **Salesforce** — Enrich CRM contacts via API

### API Usage

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("YOUR_USERNAME/linkedin-email-finder-pro").call(run_input={
    "csvUrl": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/export?format=csv"
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item.get("status") == "found":
        print(f"{item['firstName']} {item['lastName']}: {item['email']}")
```

#### JavaScript

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

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

const run = await client.actor("YOUR_USERNAME/linkedin-email-finder-pro").call({
    csvUrl: "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/export?format=csv"
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.filter(i => i.status === 'found').forEach(i => {
    console.log(`${i.firstName} ${i.lastName}: ${i.email}`);
});
```

### Changelog

- **v1.0.16** — Complete rewrite of LinkedIn enrichment layer. Fixed HarvestAPI schema mapping, added batch chunking for free plan users, auto-detection of Google Sheets URLs, and comprehensive error logging.
- **v1.0.0** — Initial release with LinkedIn scraping, 14-pattern email permutation, and live SMTP verification.

### Support

This Actor is actively maintained. Found a bug or need a feature? Open an issue — we respond within 24 hours.

# Actor input Schema

## `linkedinUrls` (type: `array`):

Paste LinkedIn profile URLs. We will automatically scrape their First Name, Last Name, and current Company Domain to find their email.

## `manualInputs` (type: `array`):

If you don't have LinkedIn URLs, provide the data manually in this format: First,Last,company.com (e.g., Bill,Gates,microsoft.com)

## `csvUrl` (type: `string`):

URL to a CSV file. Must contain either a 'linkedin\_url' column OR 'first\_name', 'last\_name', and 'domain' columns.

## `datasetId` (type: `string`):

ID of an existing Apify dataset (e.g., from a Google Maps or LinkedIn scraper).

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

Provide your Apify API token if you are linking a Dataset ID from a different run/account.

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

Number of email permutations to test simultaneously.

## Actor input object example

```json
{
  "linkedinUrls": [
    "https://www.linkedin.com/in/williamhgates/"
  ],
  "manualInputs": [
    "Bill,Gates,microsoft.com"
  ],
  "csvUrl": "",
  "datasetId": "",
  "concurrency": 10
}
```

# Actor output Schema

## `defaultDatasetUrl` (type: `string`):

URL to the dataset containing the verification results

# 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 = {
    "linkedinUrls": [
        "https://www.linkedin.com/in/williamhgates/"
    ],
    "manualInputs": [
        "Bill,Gates,microsoft.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("blessiticus/linkedin-email-finder-pro").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 = {
    "linkedinUrls": ["https://www.linkedin.com/in/williamhgates/"],
    "manualInputs": ["Bill,Gates,microsoft.com"],
}

# Run the Actor and wait for it to finish
run = client.actor("blessiticus/linkedin-email-finder-pro").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 '{
  "linkedinUrls": [
    "https://www.linkedin.com/in/williamhgates/"
  ],
  "manualInputs": [
    "Bill,Gates,microsoft.com"
  ]
}' |
apify call blessiticus/linkedin-email-finder-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,blessiticus/linkedin-email-finder-pro"
        }
    }
}
```

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/ouLrj1LhX7jbZGkII/builds/a8wmpgIwpLp5KpsmK/openapi.json
