# Company Employees Finder + Emails (by Domain, No Login) (`peoplesearch/company-employees-finder`) Actor

List the people who work at any company: give websites, LinkedIn company pages or names, filter by job title and location, and get name, title, location and LinkedIn URL, plus verified work emails on request. No LinkedIn login or cookies. Pay per employee.

- **URL**: https://apify.com/peoplesearch/company-employees-finder.md
- **Developed by:** [PeopleSearch.im](https://apify.com/peoplesearch) (community)
- **Categories:** Lead generation, AI, Developer tools
- **Stats:** 7 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 employee profiles

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?

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

## Company Employees Finder + Emails (by Domain, No Login)

List the companies you care about and get the people who work there as clean rows: name, job title, location and LinkedIn profile URL, with a verified work email when you ask for one. Narrow it to the roles you sell to or hire from, and to the places that matter.

There is no LinkedIn login, no cookie and no browser session involved. The people come from a licensed B2B people database, so nothing can get an account restricted and a company takes seconds.

### What it does

- **Takes companies the way you have them**: a LinkedIn company page (`linkedin.com/company/stripe`), a website (`stripe.com`) or a name (`Stripe`). Up to 25 companies per run.
- **Matches the company exactly.** A LinkedIn company page is the most exact: you get the people who work at that company and nobody else. A website matches the people whose employer lists that website on LinkedIn, which is exact for most companies; a few large ones list another site (Amazon's page lists aboutamazon.com, so `amazon.com` finds AWS staff), so each company in `OUTPUT` names the company pages its people were found at (`matchedCompanies`). A name matches every company whose name contains it, so use the page or the website when the name is common. Names are read the way a company's own page carries them: a legal form (Inc., Pvt Ltd, GmbH) and a listing's tagline after a dash or a pipe, as Google Maps titles have, are left out, so "Tafsol Technologies (Private) Limited" finds Tafsol Technologies.
- **Filters by job title and place**: "Head of Sales", "VP Engineering", "Account Executive"; "United States", "London", "DACH". Titles match anywhere in the person's current title, so "Sales" also finds "Head of Sales", and each title is also searched in its other spellings ("VP Sales", "VP of Sales", "Vice President of Sales"; "CEO", "Chief Executive Officer"). A bare "President" means the company's president: its vice presidents are left out unless you list a Vice President title yourself.
- **Finds the job, not just the word.** A small company is run by its President, Owner or Founder far more often than by a "CEO", and its sales are led by a Sales Director as often as a "VP Sales". When nobody at a company holds a title you listed, you get the people doing that job under the title the company uses, marked `titleMatch: "equivalent"`. Switch **Include the same job under other titles** off for exact titles only.
- **Never pads the list.** When nobody at a company does the job you asked for in the places you asked for, that company delivers nobody and the run says so, instead of handing you people with other jobs.
- **Finds verified work emails** on request. Each address is looked up live, not guessed from a pattern, and you pay only for an email that is found.

### How to use it

1. Put one company per line in **Companies**.
2. Optionally add **Job titles**, **Leave out these titles** and **Locations**.
3. Set **Employees per company** (up to 100).
4. Switch on **Find verified work emails** if you want them.
5. Run it, then download the dataset as CSV, Excel or JSON, or read it through the Apify API.

### Input

| Field | What it is |
|---|---|
| `companies` | LinkedIn company pages, websites or names, up to 25. Required. |
| `jobTitles` | Only people whose current title contains one of these. Optional. |
| `excludeJobTitles` | Titles to leave out, such as Intern or Recruiter. Optional. |
| `equivalentTitles` | When nobody holds a listed title, deliver the same job under the company's own title. Default on. |
| `locations` | Countries, states, regions or cities. Optional. |
| `maxPerCompany` | People per company, 1 to 100. Default 25. |
| `includeEmails` | Also look up each person's verified work email. Default off. |

```json
{
    "companies": ["stripe.com", "https://www.linkedin.com/company/hubspot", "datadoghq.com"],
    "jobTitles": ["Head of Sales", "VP Sales", "Sales Director"],
    "locations": ["United States"],
    "maxPerCompany": 25,
    "includeEmails": true
}
```

### Output

One row per person. The values below are placeholders that show the shape.

```json
{
    "name": "Jane Doe",
    "firstName": "Jane",
    "lastName": "Doe",
    "title": "Head of Sales, North America",
    "headline": "Enterprise sales leader",
    "company": "Example Payments",
    "companyWebsite": "https://example.com",
    "companyIndustry": "Financial Services",
    "companySize": 8200,
    "location": "New York, New York, United States",
    "linkedinUrl": "https://www.linkedin.com/in/jane-doe-example",
    "email": "jane.doe@example.com",
    "emailStatus": "found",
    "emailCertainty": "ultra_sure",
    "inputCompany": "example.com",
    "matchedBy": "website",
    "titleMatch": "exact"
}
```

`inputCompany` is the line you gave and `matchedBy` says how it was matched (`website`, `linkedin` or `name`). `titleMatch` is `exact` when the person holds a title you listed, `equivalent` when nobody at that company does and the person does the same job under another title, and empty when you listed no titles. `emailStatus` is `found`, `not_found` (no verified address exists; not charged), or empty when emails were not requested. The run's `OUTPUT` record lists every company with how it was matched, how many people there match your filters and how many were delivered, and why a company delivered nobody; `searchedAs` is the name searched when it differs from the line you gave.

### What it costs

You pay per result, nothing per month:

| What | Price |
|---|---|
| One employee delivered as a full profile | $0.004 |
| One verified work email found | $0.02 |
| An email lookup that finds nothing | Free |
| A company where nobody matches | Free |
| The run start | $0.00005 |

So 100 employees cost $0.40, and 100 employees with their verified emails cost at most $2.40. Set a maximum cost per run in the run options and the Actor stops delivering at that amount.

**On Apify's free plan** a run delivers up to 10 people in total and does not look up emails. Paid plans get up to 100 people per company and verified emails.

### Use it from an AI agent

Every Apify Actor can be called as a tool through Apify's MCP server, so an AI agent can pass a list of companies to this Actor and read the people back.

### Questions

**Does this scrape LinkedIn?**
No. It never opens LinkedIn and never needs your LinkedIn account. The profiles come from a licensed B2B people database (Icypeas), and a person's public LinkedIn URL is part of the profile you receive.

**Can I get every employee of a large company?**
A company delivers up to 100 people per run. For a large company, split the run by job titles or locations (for example one run per department or country) to reach the people you need.

**I asked for CEOs and got a President. Why?**
Nobody at that company is titled CEO, and its President is the person who runs it. Those rows say `titleMatch: "equivalent"`. Switch off **Include the same job under other titles** to get exact titles only.

**Why did a company deliver nobody?**
Nobody there does the job you asked for in the places you asked for, or the website is not one the database knows (give the company's LinkedIn company page instead). The status message and the `OUTPUT` record say which.

**I gave a big company's website and got fewer people, or another company's. Why?**
A website finds the people whose employer lists it on its LinkedIn page, and some large companies list another site there (Amazon lists aboutamazon.com; Google lists a short link). `matchedCompanies` in `OUTPUT` shows which company pages the website matched. Give the company's LinkedIn company page (`linkedin.com/company/google`) to get exactly its people.

**Why did I get fewer people than I asked for?**
Fewer people may match, your maximum cost per run may cover fewer, or you are on the free plan (10 per run). The status message and the `OUTPUT` record say which.

**Can a person be removed from results?**
Yes. Anyone can ask to be left out at peoplesearch.im/opt-out, and the request applies to every search and lookup.

### Using the data

The results are business contact data about real people. You are responsible for having a lawful basis for how you use them, including the rules on unsolicited email where your recipients live (for example GDPR and the ePrivacy rules in Europe, CAN-SPAM in the United States and CASL in Canada).

# Actor input Schema

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

One company per line, up to 25 per run: its LinkedIn company page (linkedin.com/company/stripe, the most exact, best for large companies), its website (stripe.com), or its name (matches every company whose name contains it).

## `jobTitles` (type: `array`):

Only people whose current title contains one of these, for example Head of Sales, VP Sales, Account Executive. Each is also searched in its other spellings (VP Sales, VP of Sales, Vice President of Sales). A bare President means the company's president, not its vice presidents. Leave empty for everyone.

## `excludeJobTitles` (type: `array`):

Titles to leave out, for example Intern or Recruiter.

## `equivalentTitles` (type: `boolean`):

When nobody at a company holds a job title you listed, deliver the people doing that job under the title the company uses instead: its President, Owner or Founder for CEO, its Sales Director or Head of Sales for VP Sales. Those rows say titleMatch "equivalent" and show each person's own title. Switch off to get exact titles only.

## `locations` (type: `array`):

Only people in these places: countries, states, regions or cities, for example United States, London, DACH.

## `maxPerCompany` (type: `integer`):

At most this many people from each company, up to 100 (10 per run in total on Apify's free plan). You pay per person delivered.

## `includeEmails` (type: `boolean`):

Also look up each person's verified work email. Charged only for emails that are found. Available on Apify paid plans.

## Actor input object example

```json
{
  "companies": [
    "stripe.com"
  ],
  "equivalentTitles": true,
  "maxPerCompany": 25,
  "includeEmails": false
}
```

# Actor output Schema

## `employees` (type: `string`):

One row per person delivered: name, job title, company, location, LinkedIn URL, the company you listed and, when asked for, the verified work email.

## `summary` (type: `string`):

For each company: how it was matched (website, LinkedIn page or name), how many people match and how many were delivered.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("peoplesearch/company-employees-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"] }

# Run the Actor and wait for it to finish
run = client.actor("peoplesearch/company-employees-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"
  ]
}' |
apify call peoplesearch/company-employees-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,peoplesearch/company-employees-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/fQ6Bcl7cwd7Jnimsb/builds/cunGy30skXlMbwEmZ/openapi.json
