# Employee Email Finder ✅ Company Employees & Emails by Domain (`b2bsearch/employee-email-finder`) Actor

✅ Paste company domains, get the employees with a live email: on record at the current company or personal, plus title, seniority, career profile and LinkedIn URL. ✅ Whole roster or the decision makers, by seniority and title. ✅ No email = no charge, no cookies, no login. From $6 per 1,000.

- **URL**: https://apify.com/b2bsearch/employee-email-finder.md
- **Developed by:** [B2B Search Enriched](https://apify.com/b2bsearch) (community)
- **Categories:** Lead generation, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 employee delivered with an emails

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

## Employee Email Finder ✅ Company Employees & Emails by Domain

**Paste company domains, get the company's employees with a live email on
record, at the current company or personal, plus title, seniority, the
career profile and the LinkedIn URL.** An employee email finder on our own
database of 800M+ professional profiles, no cookies, no login. From $6 per
1,000 employees; people without a live email are skipped and cost nothing.

- ✅ **$9 per 1,000 employees on the Free plan, $6 on Business and up.**
  Employee-plus-email listings on this shelf charge $12–$15 per 1,000.
- ✅ **An email on every row, by rule.** A work address on the company's own
  domain, or a personal mailbox. Addresses that only match an old employer
  never ship. Those are the ones that bounce.
- ✅ **Any company, by its website.** `stripe.com`, `figma.com`: the domain
  resolves to the company record, brand domains included. Up to 20
  companies per request, hundreds per run.
- ✅ **The whole roster or the decision makers.** Filter by seniority bucket
  and title words; `cxo` + `vp` gives the leadership with their emails.
- ✅ **No minimum order, no charge for misses.** Each employee is delivered
  once; repeats, people without an email and note rows are free.
- ✅ **The full career card rides along**: positions with dates, education,
  skills, the same record [Profile Lookup](https://apify.com/b2bsearch/profile-lookup) sells.

### Why this employee email finder

| | This Actor | A typical "company employees" listing on this shelf |
|---|---|---|
| Email on the row | Required: current-company or personal, or the person is skipped free | "Optional email finder", charged whether or not it reaches anyone |
| Price per 1,000 employees with an email | $9 on the Free plan, $6 on Business and up | $12–$15 |
| Where the data comes from | Our own database, 800M+ profiles | A live crawl of the network, or a source not stated |
| Rosters | In seconds, no 2,500-row cap, no cookies | Page by page |
| Duplicates | One employee, one row, one charge | Often charged per snapshot |
| What else is on the row | Career card, seniority, title, location, record dates | Name, title, URL |

### What you get per employee

- ✅ Full name, headline, current title, seniority bucket, in-role-since year
- ✅ `email` and `emailType` (`work` or `personal`); `workEmails` and `personalEmails` with every address on record; `emailCount`
- ✅ Phone numbers when on record (`phone`, `phones`)
- ✅ City and country code
- ✅ LinkedIn profile URL and the career card (positions, education, skills)
- ✅ Record dates: when the profile and the position were last updated

### Quick start

1. Paste the company domains, one per line.
2. Pick the seniority buckets (leave empty for everyone) and set **Maximum
   employees**. Press **Start**.
3. Export the dataset as CSV, Excel or JSON. One `skipped_must_have` row at
   the end says how many employees had no live email and were skipped free.

### Run Employee Email Finder from Python, Node.js or the API

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("b2bsearch/employee-email-finder").call(run_input={
    "companies": ["stripe.com", "figma.com"],
    "roles": ["cxo", "vp"],
    "maxRows": 100,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["fullName"], row["title"], row["email"])
```

The same call in Node.js is `new ApifyClient({ token }).actor('b2bsearch/employee-email-finder').call(input)`
from the `apify-client` package. Over plain REST, `POST
https://api.apify.com/v2/acts/b2bsearch~employee-email-finder/run-sync-get-dataset-items`
with the input as the JSON body returns the rows in one response. The price
is the same from code and from the form.

### Measured

How often an employee carries an email on record at the current company or
a personal one, measured on 30 September 2026 over 200 employed
professionals per country: about half in the US, fewer in Europe and
India. Only those employees are delivered and charged here. Senior titles
and larger employers usually score higher.

### Input

| Field | What it does |
|---|---|
| `companies` | Site domains (`acme.com`) or numeric company ids from an earlier run. Domains that match no company come back as free `unresolved_domain` rows. |
| `roles` | Seniority buckets: `cxo`, `founder`, `vp`, `director`, `manager`, `other`. Empty means the whole roster. |
| `titleContains`, `titleExcludes` | Words the job title must or must not contain, applied before anything is counted or charged. `assistant`, `office of` keeps executive assistants out of a C-level list. |
| `mustHave` | Every row already has a live email. Add what else a person must have: `phone`, `currentWorkEmail`, `github`, `twitter`, `facebook`. The rest are skipped free. |
| `excludeLowSignal` | Drop self-declared profiles (under 10 connections, no start date). |
| `compact` | A 2 KB row instead of the full card — for AI agents with a context limit. Same price. |
| `maxRows` | Employees to deliver across all companies (default 1,000, up to 10,000). You pay only for these. |

```json
{
  "companies": ["stripe.com", "figma.com"],
  "roles": ["cxo", "vp"],
  "maxRows": 100
}
```

### Output

A delivered row (values made up):

```json
{
  "_status": "found",
  "_input": { "company": 456123 },
  "_detail": "contacts",
  "fullName": "Jane Doe",
  "title": "VP Engineering",
  "seniority": "vp",
  "headline": "VP Engineering at Acme",
  "locality": "Amsterdam",
  "countryCode": "nl",
  "email": "jane.doe@acme.example",
  "emailType": "work",
  "employerMatch": true,
  "workEmails": ["jane.doe@acme.example"],
  "personalEmails": ["jane.doe@example.com"],
  "emailCount": 2,
  "profileUrl": "https://www.linkedin.com/in/jane-doe-example",
  "positionStartYear": 2021,
  "personUpdatedAt": "2026-08-14T09:12:44Z"
}
```

The career card (positions, education, skills, certifications) is on the
same row. Free status rows say what happened: `unresolved_domain`,
`skipped_must_have`, `skipped_row_budget`, `skipped_scan_limit`,
`detail_unavailable`.

### Pricing

| Apify plan | Per 1,000 employees with an email | Per employee |
|---|---|---|
| Free and Starter | $9 | $0.009 |
| Scale | $7.50 | $0.0075 |
| Business and up | $6 | $0.006 |

One employee delivered with a live email is one charge, however many
addresses or numbers the row carries. Not charged: employees without one,
repeats, unresolved domains, every note row. A small per-run start fee
applies (Pricing tab).

### Ready-made examples

Each one opens with the input filled in; press Try for free and change it to your own.

- [Leadership of Stripe and Figma with Emails](https://apify.com/b2bsearch/employee-email-finder/examples/stripe-figma-leadership-emails): C-level and VP employees of any company by its website domain, each with a live email, title, career card and LinkedIn URL. Misses are free.
- [Sales Team of Any Company with Emails, by Domain](https://apify.com/b2bsearch/employee-email-finder/examples/sales-team-emails-by-domain): The sales team of any company by its website domain: account executives and sales managers with a live email, title and LinkedIn URL. Misses are free.

### FAQ

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

No. No login, cookies or API key besides Apify. Nothing is collected from
any network while your run is in progress.

#### I only want the staff list, without emails.

[Company Employees](https://apify.com/b2bsearch/company-employees) delivers
the roster rows at $2.25 per 1,000, with email flags on every row, and the
full profile or the contacts on request.

#### Why did a company come back with few people?

Only employees with a live email are delivered; the `skipped_must_have` row
says how many were left out. The walk reads ahead of what it delivers up to
a ceiling; if it stops there, a `skipped_scan_limit` row says so. Narrow
the roles or titles to reach further.

#### Can I run it from n8n, Make or an AI agent?

Yes. The Actor is a tool on the Apify MCP server
(`https://mcp.apify.com?tools=b2bsearch/employee-email-finder`) and a step in
n8n, Make and Zapier. Cap what one call may spend with `maxTotalChargeUsd`.

### Related Actors

| Need | Actor |
|---|---|
| The staff list without emails, or full profiles | [Company Employees](https://apify.com/b2bsearch/company-employees) |
| Only the leadership of a company, ranked | [Decision Maker Finder by Domain](https://apify.com/b2bsearch/domain-to-decision-makers) |
| One profile URL → its email addresses | [LinkedIn Email Finder](https://apify.com/b2bsearch/linkedin-email-finder) |
| A name and a company domain → work email | [Work Email Finder](https://apify.com/b2bsearch/work-email-finder) |
| People by title and country, not by company | [B2B Leads Finder](https://apify.com/b2bsearch/b2b-leads-finder) |

### Free Apify plan

Free accounts get the same rows as paid ones, with three limits. A run delivers
at most 100 results; an account gets 500 dataset rows per calendar
month on this Actor, found rows and misses alike; and a row that finds nothing
carries only its status. Previews and counts, where this Actor offers them, stay
free and outside the monthly allowance. When a limit stops a run, the status
line and the last dataset row say which limit it was, what is left and when it
resets. Any paid Apify plan removes all of this: Starter is $19/month and
includes $19 of usage.

### Feedback and reviews

How did it go? A rating on this Actor's [Reviews page](https://console.apify.com/actors/l1aCAaqkx56gWLlcZ/info/reviews)
tells the next buyer what to expect; we read every word, good or bad. Got a wrong or stale
row? Open the **Issues** tab with the run ID. Issues are public, so leave out
emails, phones and names; the run ID is enough for us to find the row. We
check every report, fix what is ours to fix and answer in the thread.

### Disclaimer and permitted use

**Independent product.** This Actor is an independent tool. It is not
affiliated with, endorsed by, or sponsored by LinkedIn Corporation; the name
appears only to describe the kind of profile data it covers.

**No platform access.** This Actor does not log in to any network and does
not collect anything from one. Every answer comes from our own database of
publicly available professional data.

**Permitted use.** Business-to-business purposes only: sales prospecting,
recruiting outreach and CRM enrichment. You may not use this Actor or its
output to stalk, harass or dox anyone; to decide on anyone's eligibility for
credit, employment, housing or insurance (this is not a consumer report under
the U.S. Fair Credit Reporting Act); to send unsolicited bulk messages or
place autodialed or prerecorded calls or texts without the consent the law
requires; or to build or resell a contact database.

**Your responsibilities.** You are responsible for having a lawful basis for
your use and for complying with the laws that apply to you, including GDPR
and UK GDPR, ePrivacy and PECR, CCPA/CPRA, CAN-SPAM and, for any number you
call or text, the TCPA and Do Not Call rules. Honor every opt-out you receive.

**Removal requests.** To have a person's data removed, open an issue on this
Actor with only the profile link; the record is removed from every listing.

**Accuracy.** Records can be incomplete or out of date. Output is provided as
is. Check before you rely on it.

# Actor input Schema

## `companies` (type: `array`):

One company per line: a site domain (acme.com) or a numeric company id from a previous run. Every delivered employee carries an email that reaches them today; domains that match no company come back as free "unresolved_domain" rows.

## `roles` (type: `array`):

Keep only these seniority buckets, for example C-level and VP for a decision-maker list. Leave empty for everyone at the company with an email.

## `mustHave` (type: `array`):

Every row already has a live email. Add what else a person must have to be delivered — a direct phone, a work address at the current employer, a GitHub profile; the rest are skipped for free and counted in one note row.

## `compact` (type: `boolean`):

Returns a short row instead of the full record: identity, current role, location, the 5 latest positions, education, top skills and any contacts — about 2 KB per person instead of 10+ KB. Made for AI agents and LLM pipelines with a context limit. Same price. Off by default: a run returns the complete record.

## `titleContains` (type: `array`):

Keep only employees whose job title contains any of these words (case-insensitive, 3–64 characters each, up to 10; an entry outside these rules stops the run before anything is charged). Reaches titles the seniority buckets misfile: "President" is filed under Other.

## `titleExcludes` (type: `array`):

Drop employees whose job title contains any of these words. The C-level bucket also holds "Executive Operations, Office of the CEO" and "Executive Assistant to CRO"; assistant, office of, executive operations, chief of staff removes them before they are counted or charged.

## `excludeLowSignal` (type: `boolean`):

Drop rows the data flags as low-signal: under 10 connections and no start date on the position — the self-declared "CEO at <famous brand>" pattern. Off by default because among rank-and-file staff many such rows are real people with a hidden network; they only sort last. Every row carries the lowSignal column either way.

## `maxRows` (type: `integer`):

Stop after this many employees with an email across all companies (default 1000, maximum 10000). $9 per 1,000 employees delivered on the Free plan, $6 on Business and up; people without a live email are skipped free. Free Apify plan: up to 100 per run and 500 rows per month per account.

## Actor input object example

```json
{
  "companies": [
    "stripe.com"
  ],
  "roles": [
    "cxo"
  ],
  "compact": false,
  "titleContains": [],
  "titleExcludes": [],
  "excludeLowSignal": false,
  "maxRows": 25
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "companies": [
        "stripe.com"
    ],
    "roles": [
        "cxo"
    ],
    "titleContains": [],
    "titleExcludes": [],
    "excludeLowSignal": false,
    "maxRows": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2bsearch/employee-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 = {
    "companies": ["stripe.com"],
    "roles": ["cxo"],
    "titleContains": [],
    "titleExcludes": [],
    "excludeLowSignal": False,
    "maxRows": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("b2bsearch/employee-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 '{
  "companies": [
    "stripe.com"
  ],
  "roles": [
    "cxo"
  ],
  "titleContains": [],
  "titleExcludes": [],
  "excludeLowSignal": false,
  "maxRows": 25
}' |
apify call b2bsearch/employee-email-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2bsearch/employee-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/l1aCAaqkx56gWLlcZ/builds/x4QmDbtTio8znVb8w/openapi.json
