# LinkedIn People Search Scraper - Employees, No Login (`eiv/linkedin-people-search-scraper`) Actor

Find LinkedIn profiles by company, job title, location, country, keywords or name, with no login or cookies: name, headline, job title, current company, location, country and profile URL. Company employee lists with a current-employee filter. Add-on: schools, followers, photo.

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

## Pricing

from $1.10 / 1,000 profile 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 People Search Scraper** finds **LinkedIn profiles** by company, job title, location, country, keywords, name or school, without a LinkedIn account or cookies. Get each person's name, headline, job title, current company, location, country and profile URL, ready for your CRM or outreach list. No login, no cookies, no browser, from **$1.10 per 1,000 profiles**.

| fullName | jobTitle | currentCompany | location | countryCode | linkedinUrl |
|---|---|---|---|---|---|
| Satya Nadella | Chairman and CEO | Microsoft | Redmond, Washington, United States | US | linkedin.com/in/satyanadella |

**Benchmark (2026-11-03): 90 product managers at Stripe, Revolut and Plaid in 20 seconds, 13 Google pages, about $0.003 of platform cost.**

### What does LinkedIn People Search Scraper do?

It runs Google searches restricted to LinkedIn profiles (`site:linkedin.com/in`), reads every result into a clean person record, filters out the people who do not match, and returns the rest. Give it a list of companies to get their employees, add job titles to get only the roles you sell to, add locations or countries to target a market. Your LinkedIn account is never involved, so it cannot be restricted or banned.

- **Company employee lists without cookies.** Enter company names or LinkedIn company links; "Only current employees" keeps the people who work there now, not alumni or namesakes ("Stripe Partners" is not Stripe).
- **Every filter LinkedIn search has that works without login:** job titles, locations, countries (by LinkedIn's country sites), keywords with Google operators, names, schools and excluded words.
- **Optional profile details:** full location and country, company page, schools with years, exact followers, photo, languages and websites, plus About and every job for members who show them.
- **Only pay for results.** People left out by your filters, people found twice, empty or failed searches: never charged.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets, HubSpot or an AI agent through Apify's MCP server.

### Why it is fast and cheap

LinkedIn hides its own people search behind a login, but Google indexes every public profile, and LinkedIn titles each one "Name - Current employer | LinkedIn". The Actor asks Google's lightweight results page (about 20 KB) for profiles whose title names your company and job title, so most results are exactly the people you want: one request returns up to 10 of them. There is no browser and no LinkedIn account, which keeps runs fast and the price far below scrapers that log in.

### What data can you extract from LinkedIn?

| Field | Example | What it is |
|---|---|---|
| `fullName`, `firstName`, `lastName` | Satya Nadella | The member's name, credentials removed |
| `headline` | Chairman and CEO at Microsoft | LinkedIn headline |
| `jobTitle` | Chairman and CEO | Current job title |
| `currentCompany` | Microsoft | Current employer |
| `currentCompanyUrl` | linkedin.com/company/microsoft | Employer's LinkedIn page (profile details) |
| `location` | Redmond, Washington, United States | Where the member is |
| `countryCode` | US | Country of the member's LinkedIn site, or of the profile with details |
| `education` | The University of Chicago Booth School of Business | First school listed |
| `linkedinUrl`, `publicIdentifier` | linkedin.com/in/satyanadella | Profile URL and its id |
| `connections`, `connectionsText` | 500+ | Connections, exact when LinkedIn shows a number |
| `followers` | 12281044 | Followers (exact with profile details) |
| `snippet` | Chairman and CEO at Microsoft... | What Google showed with the result |
| `photoUrl`, `about` | | Photo and About text (profile details) |
| `experience`, `schools`, `languages`, `websites` | | Jobs, schools with years and degrees, languages, websites (profile details) |
| `input`, `searchQuery`, `searchPage`, `searchPosition` | Stripe | London | Which of your searches found the person, and where |

### How to scrape LinkedIn profiles

1. Click **Try for free**. Fill in **Companies**, **Job titles**, **Locations** or any other list, one value per line.
2. Set **Max profiles**. You pay per profile, so this is also your cost cap.
3. Click **Start**. Typical runs return 100 profiles in about 20-40 seconds.
4. Open the **Output** tab (views: Overview, Leads, Profile details, Search and errors), or download as JSON, CSV, Excel or HTML.

Every search takes one value from each list you fill in: 3 companies x 2 locations = 6 searches. Job titles, schools and excluded words apply to all of them.

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

You pay per profile returned, and the price drops on higher Apify plans:

| Apify plan | Per 1,000 profiles | Profile details add-on, per 1,000 |
|---|---|---|
| Free | $2.00 | $1.00 |
| Starter | $1.50 | $0.80 |
| Scale | $1.30 | $0.70 |
| Business and up | $1.10 | $0.60 |

- 500 software engineers at 5 companies on Starter: 500 x $0.0015 = **$0.75**.
- 1,000 sales leaders with profile details on Starter: $1.50 + up to $0.80 for the profiles LinkedIn shows (about half to three quarters of members) = **about $2.00**.
- A run also costs **$0.00005** to start. People your filters leave out, duplicates, hidden profiles' details and failed searches cost nothing.
- The Free plan's $5 monthly credit covers about **2,500 profiles**.

### Input

```json
{
    "currentCompanies": ["Stripe", "https://www.linkedin.com/company/revolut/"],
    "currentJobTitles": ["Product Manager", "Head of Product"],
    "locations": ["London", "New York"],
    "excludeKeywords": ["intern"],
    "onlyCurrentEmployees": true,
    "onlyMatchingJobTitles": true,
    "enrichProfiles": false,
    "maxItems": 200,
    "maxItemsPerSearch": 50
}
```

| Field | Default | Notes |
|---|---|---|
| Companies | Stripe (example) | Names or LinkedIn company links; each is its own search |
| Job titles | Software Engineer (example) | Alternatives within each search: CEO, CTO, Head of Sales |
| Locations | none | City, region or country as people write it; each is its own search |
| Countries | none | LinkedIn country sites (uk.linkedin.com = United Kingdom, www = United States) |
| Keywords | none | Free text; Google operators work ("exact phrase", OR, -word) |
| Names | none | Full names; only people with every word of the name are kept |
| Schools | none | Alternatives within each search |
| Exclude words | none | Leave out profiles mentioning these |
| Only current employees | on | Company must be the current employer |
| Only matching job titles | on | Headline or job title must contain one of the titles |
| Max profiles | 100 | Total for the run: your cost cap |
| Max profiles per search | 100 | Up to 500; Google shows about 300 results per search |
| Add profile details | off | One more request per person; charged per profile read |

### Output

Each person is one row. A sample with profile details on:

```json
{
    "recordType": "profile",
    "fullName": "Satya Nadella",
    "firstName": "Satya",
    "lastName": "Nadella",
    "headline": "Chairman and CEO at Microsoft",
    "jobTitle": "Chairman and CEO",
    "currentCompany": "Microsoft",
    "currentCompanyUrl": "https://www.linkedin.com/company/microsoft",
    "location": "Redmond, Washington, United States",
    "countryCode": "US",
    "education": "The University of Chicago Booth School of Business",
    "linkedinUrl": "https://www.linkedin.com/in/satyanadella",
    "publicIdentifier": "satyanadella",
    "connections": null,
    "connectionsText": "500+",
    "followers": 12281044,
    "enrichmentStatus": "enriched",
    "about": "As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.",
    "experience": [
        { "title": "Chairman and CEO", "company": "Microsoft", "companyUrl": "https://www.linkedin.com/company/microsoft", "dateRange": "Feb 2014 - Present", "isCurrent": true, "location": "Greater Seattle Area" }
    ],
    "schools": [
        { "name": "The University of Chicago Booth School of Business", "url": "https://www.linkedin.com/school/universityofchicagoboothschoolofbusiness", "degree": null, "startYear": 1994, "endYear": 1996 }
    ],
    "websites": ["https://snscratchpad.com/"],
    "input": "Microsoft | Satya Nadella",
    "searchQuery": "site:linkedin.com/in intitle:\"Microsoft\" \"Satya Nadella\"",
    "searchPage": 1,
    "searchPosition": 1
}
```

A search or company link that cannot be read becomes a row with `"recordType": "error"` and an `errorCode`, never charged:

| `errorCode` | Meaning |
|---|---|
| `RATE_LIMITED` | Google or LinkedIn refused the requests; run that search again later |
| `BAD_INPUT` | A numbered company link (linkedin.com/company/1441): use the name instead |

### Tips and limits

- **Get past ~300 results per search.** Google shows about 300 results for one search. To list a large company, split it by location or job title: each value is its own search.
- **Namesakes.** "Only current employees" compares the employer LinkedIn shows, so "Stripe Partners" is not Stripe, but a headline that only says "Stripe" counts. Use **Exclude words** for the rest.
- **What logged-out LinkedIn hides.** For most members LinkedIn masks job history and past employers to logged-out visitors, and about a third to a half of members hide their profile page entirely. Profile details therefore return the current employer, location, schools, followers and photo for most people, and full job history only for members who show it. No email addresses or phone numbers.
- **Search results move.** Google's index changes daily; two runs of the same search return mostly, not exactly, the same people.
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

#### Is it legal to scrape LinkedIn?

This Actor reads only public Google results and public LinkedIn profiles, without logging in. Results contain personal data, which laws such as the GDPR protect: collect it only for a legitimate purpose, keep it secure, and honour opt-outs. Ask a lawyer if you are unsure. LinkedIn is a trademark of LinkedIn Corporation; this Actor is not affiliated with or endorsed by LinkedIn or Google.

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

No. Nothing is done with your account, so there is no risk of restriction.

#### Can I use it through the API or with Make, Zapier and n8n?

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool, with the same per-profile pricing.

#### Why did I get fewer profiles than I asked for?

Google ran out of matching profiles for your searches (the log lists searches that found nobody and how many people each filter left out), or the run reached your maximum cost per run. Turn off "Only current employees" or "Only matching job titles" for broader results, or add locations to split big searches.

### Related scrapers

- [LinkedIn Company Scraper](https://apify.com/eiv/linkedin-company-scraper): firmographics for the companies your leads work at: size, industry, HQ, followers.
- [LinkedIn Posts Scraper](https://apify.com/eiv/linkedin-posts-scraper): what these people post, without login.
- [LinkedIn Jobs Scraper](https://apify.com/eiv/linkedin-jobs-scraper): which companies are hiring for the roles you sell to.

### Support

Missing a field, or a search that does not work? Open an issue on the **Issues** tab with the input you used, and it will be looked at quickly.

# Actor input Schema

## `currentCompanies` (type: `array`):

Find people who work at these companies, one per line: a name (Stripe) or a LinkedIn company link (linkedin.com/company/stripe). Each company is its own search. Leave empty to search across all companies.

## `currentJobTitles` (type: `array`):

Job titles to look for, one per line, e.g. Software Engineer, Head of Marketing, CEO. A person matches any of them (they are alternatives within each search, not extra searches). Up to 12 are used.

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

Cities, regions or countries as people write them on LinkedIn, one per line: London, San Francisco Bay Area, Germany. Each location is its own search, which also helps you get past Google's ~300 results per search.

## `countries` (type: `array`):

Only members of these countries' LinkedIn sites (uk.linkedin.com, de.linkedin.com; the United States is www.linkedin.com). Stricter than a location: the country is the one the member's profile is filed under. Each country is its own search.

## `searchQueries` (type: `array`):

Free-text searches, one per line: skills, industries, anything a profile mentions, e.g. growth marketing fintech. Each line is its own search. Google operators work: "exact phrase", OR, -word.

## `names` (type: `array`):

Full names to find, one per line, e.g. Jane Smith. Each name is its own search; only people whose name has every word you typed are returned. Add a company or location to tell namesakes apart.

## `schools` (type: `array`):

Schools or universities, one per line, e.g. Stanford University. A person matches any of them (alternatives within each search).

## `excludeKeywords` (type: `array`):

Leave out profiles that mention any of these words, one per line, e.g. intern, recruiter.

## `onlyCurrentEmployees` (type: `boolean`):

With companies: search only profiles whose title names the company (LinkedIn titles every profile with the current employer), and keep people whose current employer is that company. Off: also people who only mention it (former employees, partners). People left out are not charged.

## `onlyMatchingJobTitles` (type: `boolean`):

With job titles: search only profiles whose title (headline) has one of them, and keep people whose headline or job title contains it. Off: also people who mention the title anywhere on their profile. People left out are not charged.

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

Stop after this many profiles in total. You pay per profile, so this is also your cost cap for the run.

## `maxItemsPerSearch` (type: `integer`):

Stop each search after this many profiles. Google shows about 300 results for one search; split by location or job title to get more people.

## `enrichProfiles` (type: `boolean`):

Also open each person's public LinkedIn profile for the full location and country, current company page, schools with years, exact followers, photo, languages and websites (About and every job for members who show them). $0.80 per 1,000 profiles read on Starter; hidden profiles are not charged. Slower: one more request per person.

## `maxConcurrency` (type: `integer`):

How many searches run at the same time. Google limits each address, so more is not always faster.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before trying another address.

## Actor input object example

```json
{
  "currentCompanies": [
    "Stripe"
  ],
  "currentJobTitles": [
    "Software Engineer"
  ],
  "onlyCurrentEmployees": true,
  "onlyMatchingJobTitles": true,
  "maxItems": 100,
  "maxItemsPerSearch": 100,
  "enrichProfiles": false,
  "maxConcurrency": 4,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

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

One row per person (recordType "profile"), plus one uncharged row per search or company link that could not be read (recordType "error").

## `leads` (type: `string`):

The same people as CRM-ready columns: first and last name, job title, company, location, country, profile URL.

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

Totals for the run: searches, profiles, people left out by the filters, Google pages and addresses used, and why the run stopped.

# 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 = {
    "currentCompanies": [
        "Stripe"
    ],
    "currentJobTitles": [
        "Software Engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eiv/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 = {
    "currentCompanies": ["Stripe"],
    "currentJobTitles": ["Software Engineer"],
}

# Run the Actor and wait for it to finish
run = client.actor("eiv/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 '{
  "currentCompanies": [
    "Stripe"
  ],
  "currentJobTitles": [
    "Software Engineer"
  ]
}' |
apify call eiv/linkedin-people-search-scraper --silent --output-dataset

```

## MCP server setup

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