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

Find LinkedIn profiles by job title, company, location, school, name or keywords without login or cookies: name, headline, company, location, education and connections, plus optional profile details.

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

## Pricing

from $1.50 / 1,000 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

## LinkedIn People Search Scraper (No Login)

### What is LinkedIn People Search Scraper?

**LinkedIn People Search Scraper** is a tool that lets you **find LinkedIn profiles by job title, company, location, school, name or keywords** and scrape each person's name, headline, company, location, school and number of connections. Type who you are looking for, click **Start**, and download the profiles as Excel, CSV or JSON.

- ⚡ **Speed:** about 1,500 profiles per minute over several searches (300 profiles in 12 seconds in our test), about 500 per minute for a single search
- 🔎 **Search like LinkedIn:** job titles, companies, locations, schools, names and keywords, in any combination
- 🌍 **Worldwide:** profiles in any language, with company, school and location read from German, French, Spanish, Japanese and other profile pages
- 🔓 **No login:** no LinkedIn account, cookies or Sales Navigator needed, so no account can get restricted

### What can LinkedIn People Search Scraper do?

- **Search LinkedIn people** by job title, company, location and school without an account
- **Find people at a company**: all the product managers at Stripe, the data scientists at Shopify in Toronto
- **Find a person on LinkedIn by name**, narrowed by company or city
- **Search several titles, companies and cities in one run**: every combination is searched and each person is saved once
- Add **profile details**: photo, followers, About, current company, education and recent posts, plus the full work history of public figures and creators
- Build **lead lists and talent pools** of up to thousands of profiles
- Export to Excel, CSV, JSON, HTML or XML, or send the results to Google Sheets, Make, Zapier and more

### What data can you extract from LinkedIn profiles?

| | | |
|---|---|---|
| 👤 Full name | 💼 Headline | 🏢 Company |
| 📍 Location | 🎓 School | 🤝 Connections |
| 🔗 Profile link | 🆔 Public profile ID | 🔎 The search that found them |
| 🖼️ Profile photo\* | 👥 Followers\* | 📝 About\* |
| 🏷️ Current company and position\* | 📚 Education\* | 🗂️ Work history\* |
| 📰 Recent posts\* | 🏅 Badges (Top Voice, Creator)\* | 👁️ Profile visibility\* |

\* with **Add profile details** turned on.

### How to scrape LinkedIn people search results

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **LinkedIn People Search Scraper**.
3. Type the job titles, companies, locations, schools or a name you are looking for.
4. Click **Start** and watch the profiles arrive.
5. Download them as Excel, CSV, JSON or HTML, or connect them to your CRM.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Job titles** | Titles to look for, one per line, e.g. `Product Manager`, `Head of Sales` |
| **Companies** | Company names or LinkedIn company links, one per line |
| **Locations** | Cities, regions or countries, one per line. Only people whose profile shows one of these places are kept; add the country (`Berlin, Germany`) to also keep people who show only their country |
| **Schools** | Universities or schools, one per line |
| **Keywords** | Any other words the profile should mention, e.g. `fintech` |
| **First name / Last name** | Find people by name; only profiles with that name are saved |
| **Maximum profiles** | Stop after this many profiles in the whole run (default 100) |
| **Maximum profiles per search** | Stop each combination of filters after this many profiles, e.g. 50 per city |
| **Add profile details** | Also open each profile for photo, followers, About, education, posts and, on public profiles, the work history |

Each combination of one job title, one company, one location and one school is one search. Two job titles and three cities make six searches, and a person found by several of them is saved once.

Product managers at Stripe in San Francisco:

```json
{
  "jobTitles": ["Product Manager"],
  "companies": ["Stripe"],
  "locations": ["San Francisco"],
  "maxResults": 50
}
```

Data scientists and product managers at two companies in two cities, with profile details:

```json
{
  "jobTitles": ["Data Scientist", "Product Manager"],
  "companies": ["Stripe", "Shopify"],
  "locations": ["San Francisco", "Toronto"],
  "maxResults": 300,
  "fullProfiles": true
}
```

A person by name:

```json
{
  "firstName": "Satya",
  "lastName": "Nadella",
  "companies": ["Microsoft"]
}
```

### ⬆️ Output

Every profile is one row. Without profile details:

```json
{
  "linkedinUrl": "https://www.linkedin.com/in/satyanadella",
  "publicIdentifier": "satyanadella",
  "name": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "company": null,
  "school": null,
  "location": "Redmond",
  "connections": "500+",
  "query": "\"Satya Nadella\""
}
```

With **Add profile details** (shortened):

```json
{
  "linkedinUrl": "https://www.linkedin.com/in/satyanadella",
  "name": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "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.",
  "location": "Redmond, Washington, United States",
  "countryCode": "US",
  "followers": 12189477,
  "connections": "500+",
  "badges": ["Creator", "Top Voice"],
  "currentCompany": "Microsoft",
  "jobTitles": ["Chairman and CEO", "Member Board Of Trustees"],
  "education": [{ "name": "The University of Chicago Booth School of Business", "startDate": 1994, "endDate": 1996 }],
  "experience": [{
    "title": "Chairman and CEO",
    "companyName": "Microsoft",
    "companyUrl": "https://www.linkedin.com/company/microsoft",
    "startDate": "Feb 2014",
    "endDate": "Present",
    "duration": "12 years 8 months",
    "location": "Greater Seattle Area"
  }],
  "query": "\"Satya Nadella\" \"Microsoft\"",
  "profileVisibility": "full"
}
```

The **Profiles** tab shows the search results as a table and the **Profile details** tab the photo, followers, education and work history. The run report lists how many profiles each search found.

#### Why do some profiles have fewer fields?

LinkedIn decides how much of a profile visitors who are not logged in can see:

- **full**: creators, founders, executives and other public figures. Everything, including job titles and work history.
- **limited**: most members. Name, headline, location, current company, followers, connections, photo, a short About, recent posts and often education, but no work history.
- **hidden**: the owner shows the profile to logged-in members only. You still get the name, headline and, when listed, the company, location, school and connections from the search.

In our tests with profile details, about a third of the people a search found had hidden profiles (up to half in some searches) and nearly all the rest were limited.

### How can I use LinkedIn people data?

- **Lead generation:** build lists of decision makers by title, company and region for outreach
- **Recruiting and sourcing:** find candidates with a given title, employer or school in a city
- **Account-based marketing:** map who works at your target accounts and in which roles
- **Market research:** see how many people in a role work at each company or city
- **CRM enrichment:** add headlines, companies and locations to the contacts you already have

### Tips for large searches

- One search returns **up to about 1,000 profiles**. For more, add more locations or job titles: each combination is its own search, and people found twice are saved once.
- Use **Maximum profiles per search** to get an even spread, e.g. 100 per city.
- The run report shows how many profiles each search found; a search close to 1,000 has more to give if you split it.

### Use it from your own code

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("automly/linkedin-people-search-scraper").call(run_input={
    "jobTitles": ["Product Manager"],
    "companies": ["Stripe"],
    "locations": ["San Francisco"],
    "maxResults": 50,
})
for person in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(person["name"], "|", person["headline"], "|", person["linkedinUrl"])
```

You can also run it on a schedule, for example every week for the same search, and send the profiles to Google Sheets or your CRM.

### ❓FAQ

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

You pay only for the profiles you get. A profile from the search costs less than a profile with full details (headline, job titles and work history); limited and hidden profiles are charged at the lower price even with **Add profile details** on. See the **Pricing** tab for the current prices. Every Apify account gets $5 of free usage each month, so you can try it at no cost.

#### Do I need a LinkedIn account, cookies or Sales Navigator?

No. The scraper uses only what LinkedIn shows to visitors who are not logged in, so it never touches your LinkedIn account and nothing can get restricted.

#### Do the filters match exactly like LinkedIn's own filters?

The filters are matched as words on the profile, and the profiles that match best come first. Most rows match every filter, but some people mention a company elsewhere on their profile (a past job, a school, a client). In our tests 94% of rows showed the searched company in their headline or company. If you need exact matches, filter the **company** column after the run. Locations are checked on every row: people who show another place, or no location at all, are left out, so a search for Berlin does not return people named Berlin in New York. LinkedIn's seniority, function and company-size filters are not available without an account; add words like `Senior` or `Director` to the job title instead.

#### How many profiles can I get?

Up to about 1,000 per search, and as many searches as you like in one run. Split big searches by city, title or school (see Tips above).

#### Does it find email addresses?

No. For work emails, use **LinkedIn Profile Scraper + Email Finder**: give it the profile links from this scraper and it adds emails published on the web or a guess from the company's email format.

#### Can it scrape private profiles?

No. It only reads what is public. Profiles whose owners hide them from visitors keep only the details from the search.

#### Is it legal to scrape LinkedIn profiles?

This scraper collects only public data that LinkedIn shows to anyone without logging in. Profiles are still personal data, which is protected by laws such as the GDPR in Europe, and messages you send to the people you find are covered by rules such as CAN-SPAM. You are responsible for having a legitimate reason to collect and use the data and for contacting people lawfully. If you are unsure, check with a lawyer. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

This scraper is not affiliated with, endorsed by or connected to LinkedIn or Microsoft.

#### What happens if a search fails?

The other searches carry on and their profiles are saved. The run report lists every search that could not be completed and why, and how many profiles each search found.

#### Something isn't working. What should I do?

Open the **Issues** tab and tell us the input you used.

### Scrape more LinkedIn data

| Scraper | What it gets |
|---|---|
| LinkedIn Profile Scraper + Email Finder | Profiles from links or names, with work emails |
| LinkedIn Company Employees Scraper + Emails | People who work at a company |
| LinkedIn Posts Scraper | Posts of people and companies |
| LinkedIn Post Search Scraper | Posts about any topic |

# Actor input Schema

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

Job titles to look for, one per line, e.g. Product Manager, Head of Sales.

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

Company names or LinkedIn company links (https://www.linkedin.com/company/stripe/), one per line.

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

Cities, regions or countries, one per line, e.g. San Francisco, Germany. Only people whose profile shows one of these places are kept; people who show no location are left out, as most of them turn out to live elsewhere. Add the country (Berlin, Germany) to also keep people who show only their country and to leave out a city of the same name elsewhere.

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

Universities or schools, one per line, e.g. Stanford University.

## `searchQuery` (type: `string`):

Any other words the profile should mention, e.g. fintech or Kubernetes.

## `firstName` (type: `string`):

The person's first name, e.g. Satya.

## `lastName` (type: `string`):

The person's last name, e.g. Nadella.

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

Stop after this many profiles in the whole run.

## `maxResultsPerSearch` (type: `integer`):

Stop each search (one combination of the filters) after this many profiles, e.g. 50 per city. Leave it empty for no limit; one search finds up to about 1,000 profiles.

## `fullProfiles` (type: `boolean`):

Also open each profile and add what LinkedIn shows without login: photo, followers, about, current company, education, recent posts, and for public figures and creators the full headline, job titles and work history. Profiles whose owners hide them from visitors keep the search details.

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

The default works for most runs.

## Actor input object example

```json
{
  "jobTitles": [
    "Product Manager"
  ],
  "companies": [
    "Stripe"
  ],
  "locations": [
    "San Francisco"
  ],
  "maxResults": 50,
  "fullProfiles": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

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

No description

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

No description

## `report` (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 = {
    "jobTitles": [
        "Product Manager"
    ],
    "companies": [
        "Stripe"
    ],
    "locations": [
        "San Francisco"
    ],
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = {
    "jobTitles": ["Product Manager"],
    "companies": ["Stripe"],
    "locations": ["San Francisco"],
    "maxResults": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/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 '{
  "jobTitles": [
    "Product Manager"
  ],
  "companies": [
    "Stripe"
  ],
  "locations": [
    "San Francisco"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/linkedin-people-search-scraper --silent --output-dataset

```

## MCP server setup

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