# LinkedIn Email Finder (`lergassy/linkedin-email-finder`) Actor

\[$0.01/e-mail] LinkedIn profile URL in — name, title, current company, location and the person's work e-mail out, with layout evidence and a confidence level. Reads the public profile, finds the company site, learns its address layout, checks the mail domain. Only found e-mails are charged.

- **URL**: https://apify.com/lergassy/linkedin-email-finder.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Lead generation, Social media, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $7.00 / 1,000 e-mail founds

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

**LinkedIn Email Finder** takes a LinkedIn profile URL and gives back the person's **name, current title, company, location — and their work e-mail address**, with the evidence behind it and a confidence level. Paste one URL or a thousand; one row per profile.

**$0.01 per e-mail found.** A profile that cannot be read, a person whose company has no findable website, an address on a domain that takes no mail — all **free**. No LinkedIn login, no cookies, no browser, no API key.

### What is LinkedIn Email Finder?

It is the step between "I found them on LinkedIn" and "I wrote to them". The Actor reads the public profile page — the same page a search engine sees, no login — for the name and the current position. It then turns the company into its website, reads how that company writes its addresses (a team page that says `jane.doe@` tells you how everyone else is addressed), builds the person's address in that layout and checks that the mail domain accepts mail.

The answer is never a bare guess dressed up as a fact: every row says whether the address was **published on the company site**, whether the **layout was confirmed** there, or whether it is the common-layout fallback — and prices only the rows that carry an address.

### What is in every row

| Field | Meaning |
|---|---|
| `fullName`, `title`, `company`, `headline`, `location` | From the public profile |
| `positions`, `education`, `companyLinkedinUrl`, `imageUrl` | Current positions with start dates, schools, the company page |
| `email`, `emailPattern`, `confidence` | The address, the layout it follows (`first.last`, `flast`, `first`…) and `confirmed` / `high` / `medium` / `low` |
| `foundOnSite`, `patternEvidence`, `patternEvidenceCount` | Whether the address itself is on the company site, and which published addresses show the layout |
| `alternatives` | Runner-up addresses in the other plausible layouts |
| `emailStatus`, `emailProvider`, `emailMxHost`, `emailIsRole`, `emailIsFree` | Mail-domain checks: accepts mail, which provider (Google Workspace, Microsoft 365…) |
| `domain`, `domainSource`, `summary` | The company website, how it was found, and a one-line explanation |

### How much does it cost?

**$0.01 per e-mail found** — one row with an address, one charge, no start fee.

- Profiles that cannot be read or do not exist: **$0**.
- People whose company has no website we can find: **$0** (the profile data is still delivered).
- Addresses on a domain that does not accept mail: **$0** (reported as unusable).
- Profile data, alternatives, evidence and domain checks: included.

#### Bulk export: what 50,000 rows actually cost

This Actor is built for bulk jobs — put a whole search export into one run, or call it from the API for
every new lead. There is **no fee per run, no fee per profile and no proxy charge**: you pay for the
e-mails you get. That is what decides the bill once you enrich a whole list rather than a handful.

| Job | This Actor | Most-used Actor in this category |
|---|---|---|
| 50,000 e-mails across 100 runs | **$500** | $1,450 + start fees |

Checked on the Apify Store on 23 September 2026 against the Actor with the most monthly users in
this category ($0.029 per e-mail plus a fee per run). Some Actors here ask less per row — this table
compares against the one buyers actually use most.

### How to use it in three steps

1. Paste profile URLs into **🔗 LinkedIn profile URLs**, one per line — or link a sheet under **📄 Profile URLs from a file or sheet**.
2. If every profile is from one company, or a company name will not resolve to a website, type the domain into **🏢 Company override**.
3. Press **Start**, then download JSON, CSV or Excel — or call the run from the API, n8n, Make, Zapier or an AI agent.

### ⬇️ Input

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/patrickcollison",
    "https://www.linkedin.com/in/satyanadella"
  ],
  "candidatesPerPerson": 3,
  "checkMx": true
}
```

### ⬆️ Output

```json
{
  "type": "person",
  "linkedinUrl": "https://www.linkedin.com/in/patrickcollison",
  "fullName": "Patrick Collison",
  "title": "CEO",
  "company": "Stripe",
  "location": "San Francisco Bay Area",
  "domain": "stripe.com",
  "email": "patrick.collison@stripe.com",
  "emailPattern": "first.last",
  "emailPatternSource": "site",
  "confidence": "high",
  "foundOnSite": false,
  "alternatives": [{ "email": "patrick@stripe.com", "pattern": "first" }, { "email": "pcollison@stripe.com", "pattern": "flast" }],
  "patternEvidenceCount": 3,
  "emailStatus": "deliverable",
  "emailProvider": "Google Workspace",
  "summary": "patrick.collison@stripe.com follows the first.last layout confirmed on stripe.com; the domain accepts mail.",
  "scrapedAt": "2026-09-23T12:04:11.004Z"
}
```

### Use cases

#### Outbound from a LinkedIn search

Export the profile URLs from a search or a Sales Navigator list, run them through, and load the `confirmed` and `high` rows into your sequencer.

#### Enriching a CRM

A webhook per new lead: LinkedIn URL in, name, title, company and e-mail out, straight into the contact record.

#### Recruiting

Candidates' current company and a work address for the first touch, without buying a seat in a data tool.

#### AI agents

Connect through the Apify MCP server and ask *"find a work e-mail for linkedin.com/in/…"* — the agent gets a row with the address, the layout and the evidence.

### Integrations

Every run is available through the Apify API, and the Actor works out of the box with n8n, Make, Zapier, Google Sheets, LangChain and the Apify MCP server. Schedule it, webhook it, or export straight to CSV.

### FAQ

**Does it log in to LinkedIn?** No. It reads the public profile page, which needs no account. Some profiles hide details from anonymous readers; those still return the name and, usually, the company from the page title.

**Is the address verified with the mail server?** The mail domain is checked (MX records, provider, role and disposable flags). Mailbox-level verification is deliberately not done — it is unreliable for Google and Microsoft domains and gets senders blocked. Use `confidence` to decide: `confirmed` means the address is published on the company site; `high` means the layout is confirmed there by two or more addresses.

**What if the company name does not resolve to a website?** The row comes back free with the profile data and a note; pass the domain in **Company override** and run again.

**Is this legal?** The Actor reads public pages and public company websites and constructs a business address in the company's own layout. Use it for business contact in line with GDPR, CCPA and the sites' terms; respect opt-outs.

# Actor input Schema

## `profileUrls` (type: `array`):

One per line — <b>https://www.linkedin.com/in/patrickcollison</b>. One row per profile; $0.01 only when an e-mail is found.

## `startUrls` (type: `array`):

The same thing for long lists — upload a file or link a Google Sheet.

## `companyOverride` (type: `string`):

Use this company or domain for everyone instead of what the profiles say — handy when all profiles come from one company, or when a company name cannot be turned into a website.

## `candidatesPerPerson` (type: `integer`):

The best address goes into 'email'; this many runners-up go into 'alternatives'.

## `maxPagesPerCompany` (type: `integer`):

Home page plus contact / team / about pages, to learn how the company writes its addresses.

## `checkMx` (type: `boolean`):

DNS MX check on the mail domain. An address on a domain that takes no mail is reported as unusable and not charged.

## `maxPeople` (type: `integer`):

A hard ceiling on one run.

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

How many profiles to read at the same time. Keep it low; LinkedIn dislikes bursts.

## `pageTimeoutSecs` (type: `integer`):

How long to wait for one company page before giving up on it.

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

Off by default — public profiles answer a direct request. A challenged request is retried through a proxy automatically.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/patrickcollison",
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/williamhgates"
  ],
  "startUrls": [],
  "companyOverride": "",
  "candidatesPerPerson": 3,
  "maxPagesPerCompany": 4,
  "checkMx": true,
  "maxPeople": 1000,
  "concurrency": 3,
  "pageTimeoutSecs": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `people` (type: `string`):

One row per LinkedIn profile: name, title, company, location, work e-mail with confidence and evidence.

# 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 = {
    "profileUrls": [
        "https://www.linkedin.com/in/patrickcollison",
        "https://www.linkedin.com/in/satyanadella",
        "https://www.linkedin.com/in/williamhgates"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/linkedin-email-finder").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 = {
    "profileUrls": [
        "https://www.linkedin.com/in/patrickcollison",
        "https://www.linkedin.com/in/satyanadella",
        "https://www.linkedin.com/in/williamhgates",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("lergassy/linkedin-email-finder").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 '{
  "profileUrls": [
    "https://www.linkedin.com/in/patrickcollison",
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/williamhgates"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call lergassy/linkedin-email-finder --silent --output-dataset

```

## MCP server setup

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

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/I5dwZa0smIgjUcM7u/builds/FKCagN7W3zDEjbUTF/openapi.json
