# LinkedIn People Search — Find Employees by Company & Job Title (`afanasenko/linkedin-people-search`) Actor

LinkedIn people search without login: find employees and decision makers by job title, company, location and function. Up to 2,500 people per search with name, title, company, location and profile URL. Export to CSV, JSON or Excel.

- **URL**: https://apify.com/afanasenko/linkedin-people-search.md
- **Developed by:** [Andrey Afanasenko](https://apify.com/afanasenko) (community)
- **Categories:** Lead generation, Social media, Jobs
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 people

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 People Search — Find Employees by Company & Job Title

[![Apify Actor](https://apify.com/actor-badge?actor=afanasenko/linkedin-people-search)](https://apify.com/afanasenko/linkedin-people-search)

> **Search LinkedIn for people by job title, company, country and job function — and get a clean list of names, titles, companies and profile links.**
> Built for sales prospecting, recruiting and market research. No LinkedIn login, no cookies, up to 2,500 people per search.

> **🆓 Free to start:** 5 searches a month on the free plan · up to 10 people per search · a search that finds nobody costs nothing.

### 🎯 What it does

**You give** what you are looking for: job titles (CTO, VP Sales), companies (a name, a LinkedIn URL or a website domain), countries, job functions, or keywords. Any one of them is enough.

**You get** one row per person: their name, current title, company, location, the About section of their profile, and a link to their LinkedIn profile. Each row also says how many people on LinkedIn match your search in total.

**What you won't get** emails or phone numbers — this actor finds the people, not their contact details. Titles are what people wrote on their own profiles, so a search for "CEO" also returns people who call themselves CEO of a side project.

**Narrowing the search**: exclude titles (Intern, Assistant), exclude countries, add a past employer, or pick a job function. Every criterion narrows the search itself — you are never charged for people it filters out.

### 📦 Output sample

Every person is one row. Here is what a row holds:

- **The person** — `fullName`, `firstName`, `lastName`, `jobTitle`, `location`, `about`.
- **Where they work** — `company`, `companyId`.
- **How to find them again** — `linkedinUrl`, `profileId`.
- **About the search** — `searchQuery`, `position` (their rank in the results), `totalMatches`, `scrapedAt`.

A real row from a recent run — the person's name, company and IDs are changed; the shape and the other values are as delivered:

```json
{
  "fullName": "Jana Weber",
  "firstName": "Jana",
  "lastName": "Weber",
  "jobTitle": "Chief Technology Officer (CTO) & Prokurist",
  "company": "Nordlicht Software GmbH",
  "companyId": "18233456",
  "location": "Zeven, Lower Saxony, Germany",
  "about": "Senior IT executive with over 14 years in IT operations and infrastructure...",
  "linkedinUrl": "https://www.linkedin.com/in/ACwAADcNXDMByxd...",
  "profileId": "923622451",
  "searchQuery": "CTO in Germany",
  "position": 1,
  "totalMatches": 10752,
  "scrapedAt": "2026-09-24T14:56:11.134Z"
}
```

A value LinkedIn does not show is `null`, never an empty string or "N/A" — every key is always present. The full field list with types is in [`.actor/dataset_schema.json`](.actor/dataset_schema.json), which is also what AI agents read through Apify's MCP server.

### ⚡ Quick start

A minimal input that works on the **free plan**:

```json
{
  "jobTitles": ["CTO"],
  "locations": ["101282230"]
}
```

`101282230` is Germany — in the input form you just pick countries from a list. Run it, open the **Output** tab, and you will see the first people. Add a company or a job function to narrow the list.

Run it with an empty input and the actor runs a small built-in sample (product managers at Microsoft, 10 people) and tells you so.

### 🧭 When to use it

- **Sales prospecting** — find the heads of marketing or the CTOs at the companies on your target list, in the countries you sell to.
- **Recruiting and sourcing** — list the data scientists at a competitor, or engineers who used to work at a company you admire.
- **Account mapping** — see who works in sales, engineering or product at one account before an outreach campaign.
- **Market research** — count how many people hold a role in a country (`totalMatches`) before you size a campaign.
- **AI agents** — an agent asked "find the VPs of Sales at Stripe and Adyen" can run this actor directly and get structured rows back.

### 🎯 Example tasks

Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):

- **[Find employees of a company on LinkedIn](https://apify.com/afanasenko/linkedin-people-search/examples/find-employees-of-a-company-on-linkedin)** — List the people who work at any company on LinkedIn: name, job title, location and profile link. Narrow by role or country and export to CSV or Excel.
- **[Find decision makers at a company on LinkedIn](https://apify.com/afanasenko/linkedin-people-search/examples/find-decision-makers-at-a-company-on-linkedin)** — Find the executives, VPs, directors and heads of department at any company on LinkedIn, with name, job title, location and profile link for outreach.
- **[Find former employees of a company on LinkedIn](https://apify.com/afanasenko/linkedin-people-search/examples/find-former-employees-of-a-company-on-linkedin)** — Find people who list a company among their past jobs and see where they work now: name, current title, company, location and profile link.
- **[Find recruiters at a company on LinkedIn](https://apify.com/afanasenko/linkedin-people-search/examples/find-recruiters-at-a-company-on-linkedin)** — Find the recruiters and talent acquisition team at any company on LinkedIn, with name, job title, location and profile link, so you know whom to contact.
- **[Find LinkedIn profiles by job title and location](https://apify.com/afanasenko/linkedin-people-search/examples/find-linkedin-profiles-by-job-title-and-location)** — Search LinkedIn people by job title and country, e.g. every Head of Marketing in the United States, with name, company, location and profile link.

### 🛠 Input

The form has two sections:

| Section | Purpose |
|---|---|
| 🎯 **Who to find** | Job titles, companies, countries, and how many people you want (`maxResults`). |
| 🔬 **Narrow the search** | Job functions, past companies, titles and countries to exclude, keywords. |

The most useful fields:

- **`jobTitles`** — titles to look for. A person matches if their title contains any of them. Short titles ("VP Sales") find more people than long exact ones.
- **`companies`** — where they work now. A company name, its LinkedIn page URL, its website domain (stripe.com) or its LinkedIn company ID all work, up to 25 per search.
- **`locations`** — countries, picked from a list. Empty means worldwide.
- **`maxResults`** — the most people this run returns, and the most it charges for. Default 25, up to 2,500.
- **`functions`** — LinkedIn job functions (department), for example Marketing, Engineering or Sales.
- **`pastCompanies`** — only people who used to work at one of these companies.
- **`excludeJobTitles`** / **`excludeLocations`** — leave out titles or countries.
- **`keywords`** — words that must appear anywhere on the profile, such as a skill.

### 💰 How much will scraping LinkedIn people cost?

You pay per person the search returns. There is one event, **Person**, and its price depends on your Apify plan:

| Plan | Per person | 25 people | 100 people |
|---|---|---|---|
| Free | $0.03 | — (10 per run) | — |
| Bronze | $0.025 | $0.63 | $2.50 |
| Silver | $0.02 | $0.50 | $2.00 |
| Gold and above | $0.015 | $0.38 | $1.50 |

- **A search that finds nobody costs nothing.** Neither does a company name that cannot be found.
- **`maxResults` is your ceiling.** The run never charges for more people than it asks for.
- **The run's "Maximum cost per run" is respected.** If it covers fewer people than you asked for, the run returns exactly as many as it can charge for, and says so.

### 🆓 Free vs paid plan

| | Free plan | Paid plan |
|---|---|---|
| People per search | 10 | up to 2,500 (`maxResults`) |
| Searches per month | 5 | unlimited |
| All filters | ✓ | ✓ |
| Total matches count | ✓ | ✓ |

When a free search matches more than 10 people, you get the first 10 and a message with the real total. Upgrade to get the whole list in one run.

### 🧪 Recipes

Copy-paste inputs for the most common jobs:

**Decision makers at a list of companies**

```json
{ "jobTitles": ["CEO", "Founder", "VP Sales", "Head of Sales"], "companies": ["stripe.com", "Adyen", "https://www.linkedin.com/company/mollie/"], "maxResults": 100 }
```

Several short titles cast a wide net; companies can be names, domains or URLs in one list.

**Engineers in two countries who used to work at a big company**

```json
{ "functions": ["Engineering"], "locations": ["101282230", "106693272"], "pastCompanies": ["Google"], "maxResults": 250 }
```

A function instead of titles catches every engineering title; the past employer narrows it to a profile.

**Marketing leaders, no agencies**

```json
{ "jobTitles": ["Head of Marketing", "CMO", "VP Marketing"], "excludeJobTitles": ["Agency", "Freelance"], "locations": ["103644278"] }
```

Excluding words is often the fastest way to clean a list.

### 📡 Live status & storage records

| Storage key | Type | What it holds |
|---|---|---|
| `status.html` | HTML page | Live progress while the run is going; the result and the reason afterwards. |
| `USER_MESSAGE` | JSON | What happened and what to change — written on every run that returned nobody, and on free-plan runs that reached the limit. |
| `RUN_SUMMARY` | JSON | People delivered, total matches, price per person, the stop reason. |
| `FREE_LIMITS_APPLIED` | JSON | Which free-plan limits applied to this run. |

The people search runs in the background: the actor waits until it finishes, then fetches the results once. You can pull all of these records through the Apify API.

### 🤖 Programmatic / API use

Start a run from your own code:

```bash
curl -X POST "https://api.apify.com/v2/acts/afanasenko~linkedin-people-search/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jobTitles":["VP Sales"],"companies":["stripe.com"],"maxResults":25}'
```

**MCP / agentic clients (Claude, ChatGPT, Cursor, LangGraph, OpenAI Agents SDK, …):** the actor is exposed as a tool through Apify's [MCP server](https://docs.apify.com/platform/integrations/mcp) at `mcp.apify.com`. An agent can run it from an instruction like *"find the heads of marketing at HubSpot and Salesforce in the United States"*.

### 💡 Tips & Best Practices

#### Getting maximum results

- Start broad — one short title and a country — then narrow. A long exact title often matches nobody.
- Use several titles at once (`CTO`, `VP Engineering`, `Head of Engineering`): a person matches if any of them fits.
- If a company returns fewer people than expected, try its LinkedIn URL instead of its name.

#### Cost optimization

- Set `maxResults` to what you will actually use; it is the ceiling of what you pay.
- Narrow with exclusions and functions rather than fetching more and filtering later — people outside your criteria are never fetched or charged.
- Use `totalMatches` from a small run to size a search before running the big one.

#### Performance

- Small searches (10–25 people) usually finish in about 30 seconds.
- Big searches take longer: a few hundred people can take several minutes while the search collects them.
- Run several different searches one after another rather than all at the same moment.

#### Data quality

- Spot-check the first 5–10 rows before scaling up a search.
- `jobTitle` is what people wrote on their profile; filter or exclude words to remove the self-titled.
- Use `profileId` to deduplicate people across several searches.

### ❓ FAQ

**Q: How do I find all employees of a company on LinkedIn?**
A: Put the company in `companies`, leave `jobTitles` empty and set `maxResults` to how many you want (up to 2,500). Add a function or a country to narrow the list.

**Q: Is there a free LinkedIn people search?**
A: Yes — the free plan gives you 5 searches a month with up to 10 people each. See [Free vs paid plan](#-free-vs-paid-plan).

**Q: Can I use the LinkedIn API instead?**
A: LinkedIn's own people search API is available only to approved partners. This actor searches public profiles without a login and returns them as data.

**Q: What are the alternatives to Sales Navigator?**
A: Sales Navigator is a paid LinkedIn subscription built for browsing. This actor gives you the search results as rows you can export to CSV, Excel or a CRM, and pay per person instead of per month.

**Q: Does it need my LinkedIn account or cookies?**
A: No. It never logs in to LinkedIn and never uses your account.

**Q: Does it return emails?**
A: No. It returns the person, their title, company, location and profile link. Use a separate enrichment step for contact details.

**Q: Why does `linkedinUrl` look like `/in/ACwAA…` instead of a name?**
A: That is LinkedIn's member-ID form of the profile link. It opens the same profile as the named link.

**Q: Why did my search return nobody?**
A: Usually one criterion is too narrow — a long exact title, a keyword, or a function that the company does not have. The run's User Message names the fields you set and what to loosen. Nothing is charged.

**Q: What happens if a company cannot be found?**
A: It is left out of the search and named in the User Message. If none of your companies can be found, nothing is searched and nothing is charged.

**Q: How fast is it?**
A: About 30 seconds for 10–25 people. Searches of hundreds of people take a few minutes while the search collects them.

**Q: How many people can one search return?**
A: Up to 2,500 on a paid plan, and 10 on the free plan. `totalMatches` tells you how many exist in total.

### 🔗 Other related actors (same author)

| You start with… | You want… | Use this actor |
|---|---|---|
| A job title, company or country | A list of people | **This actor** |
| Profile or company links | Full profiles: experience, education, followers | [LinkedIn Profile Scraper](https://apify.com/afanasenko/linkedin-profile-api-scraper) |
| A role, a company or a job link | Job postings with salary and hiring contacts | [LinkedIn Jobs Scraper](https://apify.com/afanasenko/linkedin-jobs-scraper) |

Find people here, then send their `linkedinUrl` to the profile scraper when you need their full career history.

### 🛟 Support & feedback

- **Open an issue** in the actor's Issues tab — the fastest way to get a fix shipped.
- **Feature requests** in the same tab; we read every one.
- **Ratings & reviews** on the [Apify Store page](https://apify.com/afanasenko/linkedin-people-search) help other people find the actor.

### ⚖️ Is it legal to scrape LinkedIn?

The actor reads **publicly available** profile information and does not log in, bypass authentication, or act on LinkedIn on your behalf. Use the data in line with LinkedIn's terms and privacy laws such as GDPR and CCPA — for outreach, have a legitimate interest and give people an easy way to opt out.

### 📋 Changelog

See the [Changelog](CHANGELOG.md) for every release.

# Changelog

This Actor's version history is a separate document: https://apify.com/afanasenko/linkedin-people-search/changelog.md

# Actor input Schema

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

Job titles to look for, one per line — for example CTO, VP Sales or Head of Marketing. A person matches if their title contains any of these. Short titles find more people than long exact ones.

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

Where they work now, one per line. A company name (Microsoft), its LinkedIn page URL (https://www.linkedin.com/company/microsoft/), its website domain (stripe.com) or its LinkedIn company ID all work. Up to 25 companies per search. Leave empty to search every company.

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

Countries the people live in. Leave empty to search worldwide.

## `maxResults` (type: `integer`):

The most people this run returns — and the most it charges for. Up to 2,500 per search. On the free plan a run returns up to 10.

## `functions` (type: `array`):

LinkedIn job functions (department), for example Marketing or Engineering. Leave empty to include every function.

## `pastCompanies` (type: `array`):

Only people who used to work at one of these companies, one per line — names, LinkedIn URLs, domains or IDs, as above.

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

Leave out people whose title contains any of these words, for example Intern or Assistant.

## `excludeLocations` (type: `array`):

Leave out people in these countries.

## `keywords` (type: `string`):

Words that must appear anywhere on the profile — a skill or a tool, for example Kubernetes. Every keyword narrows the search, so start with none.

## Actor input object example

```json
{
  "locations": [],
  "maxResults": 25,
  "functions": [],
  "excludeLocations": []
}
```

# Actor output Schema

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

No description

## `liveStatus` (type: `string`):

No description

## `userMessage` (type: `string`):

What happened this run and what to change — written on every run that returned nobody, and on free-plan and first-paid runs.

## `runSummary` (type: `string`):

Counts, total matches, price per person and the stop reason.

## `freeLimitsApplied` (type: `string`):

Free-plan limits that affected this run. Empty on paid plans.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("afanasenko/linkedin-people-search").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("afanasenko/linkedin-people-search").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 '{}' |
apify call afanasenko/linkedin-people-search --silent --output-dataset

```

## MCP server setup

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

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/TzaLgcTia0RLdBcf8/builds/MfibiqsJqMCfv5dSO/openapi.json
