# LinkedIn People Search Scraper (`data_minds/linkedin-people-search-scraper`) Actor

Find public LinkedIn profiles by job title, keyword, location and company with no login or cookies. Get name, headline, current company, work history, education and followers. Bulk searches, auto proxy fallback. Export JSON, CSV or Excel for lead generation.

- **URL**: https://apify.com/data_minds/linkedin-people-search-scraper.md
- **Developed by:** [Data Minds](https://apify.com/data_minds) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### What is LinkedIn People Search Scraper?

**LinkedIn People Search Scraper** is a LinkedIn people search scraper that finds public [LinkedIn](https://www.linkedin.com) profiles by job title, skill, location and current company. Enter keywords or search links and get names, headlines, employers and locations, plus work history, education and career metrics with Full details, as spreadsheet-ready data with no login or cookies. Set a result limit for each search and export the list to CSV or Excel. Pay per profile, from $5.50 per 1,000 on the Gold plan. [🚀 Try it free](https://apify.com/data_minds/linkedin-people-search-scraper)

- **LinkedIn lead generation:** collect LinkedIn leads for a role, city or company.
- **LinkedIn talent sourcing:** run a LinkedIn candidate search by job title, location and seniority for recruiting.
- **Sales prospecting:** build a LinkedIn prospect list of the people at a target account.
- **CRM enrichment:** add seniority, function and company data to the people you already track.
- **Market research:** study who holds a job title in a region and how long they stay in a role.

The Apify platform adds an API, scheduling, webhooks, integrations and export to JSON, CSV, Excel, XML or HTML.

#### What can LinkedIn People Search Scraper do?

- 🔍 Use it as a LinkedIn people extractor for several searches in one run, each with its own result limit.
- 📍 Keep only people in the cities or countries you list.
- 🏢 Keep only people whose current employer matches the companies you list.
- 🧩 Choose Basic for quick profile data or Full for work history, education, followers, about text and career metrics.
- 🎯 Flag LinkedIn decision makers, people open to work and people who are hiring.
- ⏩ Save each profile to the dataset as soon as it is ready, so you can watch results arrive.

### What data can LinkedIn People Search Scraper extract?

Every row has the same fields. A field is `null` when the profile does not show it.

| Data | Fields |
|---|---|
| 👤 Identity | `publicIdentifier`, `linkedinUrl`, `firstName`, `lastName`, `fullName`, `credentials` |
| 💼 Current role | `headline`, `currentTitle`, `currentCompany`, `currentCompanyUrl`, `seniority`, `function`, `isDecisionMaker` |
| 📍 Place and reach | `location`, `connectionsCount`, `followerCount` |
| 📝 About and signals | `about`, `openToWork`, `hiring`, `badges`, `websites`, `profilePicture` |
| 📈 Career metrics | `yearsOfExperience`, `currentRoleTenureYears`, `averageTenureYears` |
| 📋 Work history | `experience`: one entry per job with `title`, `company`, `companyUrl`, `location`, `startDate`, `endDate`, `isCurrent`, `duration`, `description` |
| 🎓 Education | `education`: one entry per school with `school`, `schoolUrl`, `degree`, `startYear`, `endYear` |
| 📰 Articles | `articles`: up to 10 entries with `title`, `url`, `publishedAt`, `likes` |
| 🤝 Similar profiles | `similarProfiles`: up to 8 entries with `publicIdentifier`, `fullName`, `headline`, `linkedinUrl` |
| 🔖 Run details | `detailsStatus`, `foundVia` (the search entry that found the person) |

> **Note:** Work history, followers, about text, photo, articles, similar profiles and career metrics come from Full details and are filled only when LinkedIn shows them. With Basic details, expect the quick profile data and, at most, the school name under `education`.

#### What data can't LinkedIn People Search Scraper extract?

Email addresses, phone numbers, skills, certifications, recommendations, mutual connections and connection degree are not returned, because they are not part of a public profile.

### How to scrape LinkedIn people search results

1. Create a free [Apify account](https://console.apify.com/sign-up) and open the [Actor page](https://apify.com/data_minds/linkedin-people-search-scraper).
2. Add job titles, skills or keywords to `urls`, for example `Head of Marketing`. You can also paste LinkedIn people-search links.
3. Add cities or countries to `locations` and employers to `companies` if you want to narrow the list.
4. Choose `details`: `basic` for speed or `full` for work history and career metrics.
5. Set `maxItems` to the number of profiles you want for each search entry.
6. Click **Start** and watch the Output tab fill with profiles.
7. Export the dataset as JSON, CSV, Excel, XML or HTML.

### How much does it cost to scrape LinkedIn?

This Actor uses pay-per-event pricing: you pay for each profile saved, and platform usage is billed in addition. The price per profile depends on your Apify plan.

| Plan | Price per profile | Price per 1,000 profiles |
|---|---|---|
| Free | $0.00699 | $6.99 |
| Bronze | $0.0065 | $6.50 |
| Silver | $0.006 | $6.00 |
| Gold | $0.0055 | $5.50 |

Each run also pays a start event of $0.00005 per GB of memory, with a minimum of one. The Actor's default memory is 1024 MB, so a run is charged one start event of $0.00005.

**Worked example:** 2,000 profiles on the Gold plan cost 2,000 x $0.0055 = $11.00, plus the $0.00005 start event, with platform usage billed in addition.

**Free plan math:** the $5 monthly Apify credit covers about 715 profiles at the Free price of $0.00699, before platform usage.

Every profile row that is saved counts as one result, including rows whose `detailsStatus` is `search-only`. See the [pricing page](https://apify.com/data_minds/linkedin-people-search-scraper/pricing) for the live prices.

#### Is scraping LinkedIn people data free?

You can try this Actor on a free Apify account. The monthly credit pays for about 715 profiles at the Free price, before platform usage. Beyond the credit, you pay per profile at your plan's price, and higher plans pay less per profile.

### Input

The only required input is at least one entry in `urls`. `proxyConfiguration` is pre-filled and can stay as it is. The full list of fields is on the [input schema page](https://apify.com/data_minds/linkedin-people-search-scraper/input-schema). The pre-filled example looks like this:

```json
{
  "urls": ["Head of Marketing"],
  "locations": ["London"],
  "proxyConfiguration": { "useApifyProxy": true }
}
```

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `urls` | array of strings | Yes | `["Head of Marketing"]` (pre-filled) | Job titles, skills or keywords, or LinkedIn people-search URLs. Each entry runs as its own search. |
| `locations` | array of strings | No | `["London"]` (pre-filled) | Cities or countries. Only people located there are returned. Empty means anywhere. |
| `companies` | array of strings | No | empty | Current employers, as company names or LinkedIn company URLs. Empty means any company. |
| `details` | string | No | `basic` | `basic` returns quick profile data. `full` adds work history, education, followers, about text, photo and career metrics when available. |
| `maxItems` | integer | No | `25` | Maximum profiles returned for each entry in `urls`. `0` means as many as can be found. |
| `proxyConfiguration` | object | Yes | Apify Proxy on (pre-filled) | Proxy settings for the run. |

#### Tricky fields

- `urls`
  - ✅ Good: `Head of Marketing`, `Python developer`, or a link such as `https://www.linkedin.com/search/results/people/?keywords=head%20of%20marketing`.
  - ❌ Bad: adding the city to the keyword, such as `Head of Marketing London`. Use `locations` instead.

> **Warning:** For a search link, only the `keywords` part is used. Other filters in the link are ignored, so move them to `locations` and `companies`.

- `locations` and `companies`
  - ✅ Good: `Germany`, `London`, `Acme Ltd`, or a LinkedIn company page link.
  - ❌ Bad: long sentences or several places in one entry. Add one place per entry.

- `maxItems`
  - ✅ Good: `25` for a quick test, `0` when you want everything that can be found.
  - ❌ Bad: `0` on a very broad keyword with no filters if you have a small budget.

> **Warning:** The limit applies to each entry in `urls`, not to the whole run. Three entries with `maxItems` 25 can return up to 75 profiles.

### Output

Results appear in the run's Output tab and in the default dataset as the run progresses. The dataset has six views: overview, about and signals, experience, education, articles and similar profiles. You can download the data as JSON, CSV, Excel, XML or HTML, or read it through the API.

#### JSON example

```json
{
  "publicIdentifier": "jane-example",
  "linkedinUrl": "https://www.linkedin.com/in/jane-example",
  "firstName": "Jane",
  "lastName": "Example",
  "fullName": "Jane Example",
  "credentials": null,
  "headline": "Head of Marketing at Example Co",
  "about": "Marketing leader focused on growth.",
  "location": { "linkedinText": "London" },
  "profilePicture": "https://example.com/photo.jpg",
  "connectionsCount": 500,
  "followerCount": 683,
  "currentTitle": "Head of Marketing",
  "currentCompany": "Example Co",
  "currentCompanyUrl": "https://example.com/company/example-co",
  "seniority": "director",
  "function": "marketing",
  "isDecisionMaker": true,
  "openToWork": false,
  "hiring": false,
  "badges": null,
  "yearsOfExperience": 12.5,
  "currentRoleTenureYears": 3.2,
  "averageTenureYears": 4.1,
  "experience": [
    {
      "title": "Head of Marketing",
      "company": "Example Co",
      "companyUrl": "https://example.com/company/example-co",
      "location": "London",
      "startDate": "Jan 2023",
      "endDate": null,
      "isCurrent": true,
      "duration": "3 years",
      "description": "Leads the marketing team."
    }
  ],
  "education": [
    {
      "school": "Example University",
      "schoolUrl": "https://example.com/school/example-university",
      "degree": "BA Marketing",
      "startYear": 2008,
      "endYear": 2011
    }
  ],
  "websites": ["https://example.com"],
  "articles": [
    {
      "title": "Example article",
      "url": "https://example.com/article",
      "publishedAt": "2025-01-15",
      "likes": 12
    }
  ],
  "similarProfiles": [
    {
      "publicIdentifier": "john-example",
      "fullName": "John Example",
      "headline": "Marketing Director",
      "linkedinUrl": "https://www.linkedin.com/in/john-example"
    }
  ],
  "detailsStatus": "full",
  "foundVia": "Head of Marketing"
}
```

At the end of every run, a summary is saved in the key-value store under `RUN_SUMMARY`:

```json
{
  "totalProfiles": 25,
  "charged": 25,
  "failed": 0,
  "skipped": 2,
  "durationSecs": 94.3,
  "stopReason": "completed"
}
```

#### Notes and limitations

- `detailsStatus` shows how complete a row is: `full`, `search-only` (quick data only), `parse-failed`, `not-found` or `not-run`.
- With the `basic` detail level, rows normally carry `search-only`, because the extra details are not requested.
- With `full`, LinkedIn sometimes limits extra details for a while. The run then keeps the quick data for the remaining rows and marks them `search-only`.
- People whose location or company does not match your filters are skipped. `skipped` in the run summary counts them.
- `stopReason` is `completed`, or `spend` when the run stopped because the maximum cost per run was reached.
- Only public profile data is returned. Private details are not.

### Tips and advanced usage

- Test with `maxItems` 25 and `basic`, then switch to `full` for the profiles you care about.
- Use several entries in `urls` for related titles, such as `Head of Marketing` and `Marketing Director`, and compare rows through `foundVia`.
- Use `isDecisionMaker`, `seniority` and `function` to filter the dataset after export.
- For LinkedIn recruiter sourcing, put the skill in `urls` and your hiring city in `locations`.
- For a LinkedIn employee list of one company, put its name in `companies`.
- Use it as a LinkedIn profile finder when you know the job title but not the person.
- Download the results as a LinkedIn contact list for your outreach tool, or as a LinkedIn profile export in CSV or Excel.
- Set a maximum cost per run in Apify when you use `maxItems` 0, so a large search stops at a budget you chose.
- Schedule the Actor to refresh a prospect list on a regular basis, and use a webhook to send each finished run to your own tools.

### Integrations and API

#### Can I use LinkedIn People Search Scraper as an API?

Yes. Start runs and read results with the [Apify API](https://docs.apify.com/api/v2) or the apify-client packages for Node.js and Python. The [API tab](https://apify.com/data_minds/linkedin-people-search-scraper/api) shows ready-made calls for this Actor.

#### How to scrape LinkedIn people with Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("data_minds/linkedin-people-search-scraper").call(
    run_input={
        "urls": ["Head of Marketing"],
        "locations": ["London"],
        "proxyConfiguration": {"useApifyProxy": True},
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["fullName"], item["currentCompany"])
```

#### Can I integrate LinkedIn People Search Scraper with other apps?

Yes. Connect it to Make, Zapier, Google Sheets or Slack, call a [webhook](https://docs.apify.com/integrations/webhooks) when a run finishes, or schedule runs to keep a list fresh.

#### Can I use LinkedIn People Search Scraper with AI agents (MCP)?

Yes. Connect AI agents through the Apify MCP server using the [MCP tab](https://apify.com/data_minds/linkedin-people-search-scraper/api/mcp). Each profile is a JSON row with named fields, which is easy for an agent to read.

### Other LinkedIn scrapers

| Actor | What it does |
|---|---|
| 📢 [LinkedIn Ads Library Scraper](https://apify.com/data_minds/linkedin-ads-library-scraper) | Turns the public LinkedIn Ad Library into a dataset for competitor ad research. |
| 💼 [LinkedIn Job Scraper](https://apify.com/data_minds/lnkedin-job-scraper) | Turns public LinkedIn job listings into a clean dataset with salary, company and description. |
| 🎯 [LinkedIn Ads Scraper](https://apify.com/data_minds/linkedin-ads-scraper) | Scrapes the LinkedIn Ad Library by keyword, company, advertiser or payer, with ad text, media and targeting. |
| 📝 [LinkedIn Post Scraper](https://apify.com/data_minds/linkedin-post-scraper) | Scrapes public LinkedIn posts with text, author, media, engagement and comments as structured JSON. |
| 🔁 [Post Reshares & Reposts Scraper for LinkedIn (No Cookies)](https://apify.com/data_minds/post-reshares-reposts-scraper-for-linkedin-no-cookies) | Scrapes public LinkedIn posts from links or IDs, with reactions, comments, media and reposted originals. |

### FAQ

#### Is it legal to scrape LinkedIn people data?

Profile data can include personal data, so legality depends on your country, your purpose and how you store and use the data. Collect only what you need, respect GDPR, CCPA and anti-spam rules, and read the site's terms. This is not legal advice; see [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) for background.

#### How does LinkedIn People Search Scraper work?

You give it job titles, skills or search links, plus optional locations and companies. It returns one dataset row per public profile that matches, with the fields listed above. Basic returns quick profile data, and Full adds work history, education and career metrics when they are available.

#### Why scrape LinkedIn profiles?

Teams use public profile data for lead generation, recruiting, sales prospecting and CRM enrichment. A list of people by job title, seniority and company shows who to contact or hire. Market researchers also use it to see who holds a role in a region and how long they stay.

#### Why did I get fewer profiles than expected?

Fewer profiles usually mean fewer public matches for your keywords, or your location and company filters removed the rest. Try broader keywords, fewer filters or a higher `maxItems`. Remember that the limit applies to each entry in `urls`, and `0` asks for as many profiles as can be found.

#### Why are some rows marked search-only?

A `search-only` row holds the quick profile data without work history or education. It is the normal result for `basic`. With `full`, it means LinkedIn limited extra details for a while. Nothing is invented, so you can run the same search later to fill the gaps.

#### Can I get email addresses or phone numbers from LinkedIn profiles?

No. Email addresses and phone numbers are not part of a public profile, so the Actor does not return them. You get public fields such as the name, headline, current company, location, work history and education, which you can use to find the right person to contact elsewhere.

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

No. The Actor needs no LinkedIn login and no cookies, so there is no personal account to connect or put at risk. You only need an Apify account to start a run and download the results, and nothing you do here touches your own LinkedIn profile.

#### LinkedIn People Search Scraper not working?

Open the Issues tab on the Actor page and describe the search you ran, including the `urls`, filters and `details` setting. Check the `detailsStatus` and `stopReason` values first, since they often explain missing details. Add a link to the run so the team can reproduce the problem.

### Support and feedback

Found a bug or need a field added? Open a ticket in the [Issues tab](https://apify.com/data_minds/linkedin-people-search-scraper/issues/open). For custom solutions, write to hello.dataminds@gmail.com.

Built and maintained by the [data_minds](https://apify.com/data_minds) team on Apify.

This Actor is an independent tool, is not affiliated with or endorsed by LinkedIn, and collects only publicly available data. You are responsible for using the data in line with the law and the site's terms.

# Changelog

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

# Actor input Schema

## `urls` (type: `array`):

One or more job titles, skills or keywords (e.g. Head of Marketing), or LinkedIn people-search URLs. Each entry runs as its own search.

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

Optional cities or countries (e.g. London, Germany). Only people located there are returned. Leave empty for anywhere.

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

Optional current employers: company names or LinkedIn company URLs. Leave empty for any company.

## `details` (type: `string`):

Basic is fast and returns the quick profile data. Full adds work history, education, followers, about, photo and career metrics when they are available; otherwise the row keeps its quick data and detailsStatus says so.

## `maxItems` (type: `integer`):

Maximum profiles returned for each entry in the search list. 0 means as many as can be found.

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

Optional proxy settings for the run. Leave the default if you are unsure.

## Actor input object example

```json
{
  "urls": [
    "Head of Marketing"
  ],
  "locations": [
    "London"
  ],
  "details": "basic",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per person.

## `about_and_signals` (type: `string`):

About text, signals and career metrics.

## `experience` (type: `string`):

One row per job.

## `education` (type: `string`):

One row per school.

## `articles` (type: `string`):

One row per published article.

## `similar_profiles` (type: `string`):

People also viewed, one row per person.

# 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 = {
    "urls": [
        "Head of Marketing"
    ],
    "locations": [
        "London"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_minds/linkedin-people-search-scraper").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 = {
    "urls": ["Head of Marketing"],
    "locations": ["London"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("data_minds/linkedin-people-search-scraper").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 '{
  "urls": [
    "Head of Marketing"
  ],
  "locations": [
    "London"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call data_minds/linkedin-people-search-scraper --silent --output-dataset

```

## MCP server setup

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

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/jN7JewSuDvPEz5veO/builds/hTLfydVkwt8dJ0xiK/openapi.json
