# LinkedIn Profile Scraper + Email Finder (No Login) (`automly/linkedin-profile-scraper`) Actor

Scrape LinkedIn profiles without login or cookies: name, headline, location, company, job titles, experience, education, followers and recent posts. Search people by name and add available work emails and clearly labeled email guesses.

- **URL**: https://apify.com/automly/linkedin-profile-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 $2.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 Profile Scraper + Email Finder (No Login)

### What is LinkedIn Profile Scraper + Email Finder?

**LinkedIn Profile Scraper + Email Finder** lets you **scrape public LinkedIn profiles without logging in**: name, headline, location, current company, job titles, work history, education, followers, connections and recent posts. Paste profile links or search people by name, and optionally **find each person's work email**. Click **Start** and download the results as Excel, CSV or JSON.

- ⚡ **Speed:** about 150 profiles per minute (120 profiles in 41 seconds in our test)
- 🔓 **No login:** no LinkedIn account, cookies or API key needed, so no account can get restricted
- 🔎 **Search by name:** type "Satya Nadella Microsoft" and get the matching profiles
- ✉️ **Work emails:** emails published on the web, or a guess from the company's email format

### What can LinkedIn Profile Scraper do?

- Scrape **LinkedIn profiles** from a list of links or usernames
- **Find LinkedIn profiles by name**, optionally narrowed by company, job title or place
- Get the **headline, location, current company and followers** of each profile
- Get the **full work history and education** of profiles that LinkedIn shows in full (creators, founders, executives and other public figures)
- Get links to the person's **recent posts and activity**
- **Find work emails**: the company's email domain and email provider, an email published on the web for this person, or a guess built from the company's most common email format (for example `first.last@company.com`)
- Export to Excel, CSV, JSON, HTML or XML, or send the results to Google Sheets, HubSpot, Make, Zapier and more

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

| | | |
|---|---|---|
| 👤 Full name | 💼 Headline | 📍 Location and country |
| 🏢 Current company | 🧑‍💼 Job titles | 📜 Work history with dates |
| 🎓 Education | 👥 Followers and connections | 🏅 Badges (Creator, Top Voice) |
| 🖼️ Profile photo | 📝 About section | 📰 Recent activity links |
| ✉️ Work email or email guess | 🌐 Company email domain | 📮 Company email provider |

### How to scrape LinkedIn profiles

1. [Create a free Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open **LinkedIn Profile Scraper + Email Finder**.
3. Paste **profile links** such as `https://www.linkedin.com/in/satyanadella`, or type **names** under **Search by name**.
4. Turn on **Find work emails** if you want emails.
5. Click **Start**, and download the results when the run finishes.

### ⬇️ Input

| Setting | What it does |
|---|---|
| Profile links or usernames | Profiles to scrape: a link (`https://www.linkedin.com/in/williamhgates`) or just the username (`williamhgates`) |
| Search by name | Names to find, optionally followed by a company, title or place: `Satya Nadella Microsoft`. The first two words are the name (the first word for Chinese, Japanese and Korean names: `王伟 Microsoft`); put longer names in quotes: `"Mary Ann Smith" Boston` |
| Max profiles per name | How many matching profiles to scrape for each name (default 10) |
| Find work emails | Also look for each person's work email. Off by default; profiles with an email or a guess cost more |

Example:

```json
{
  "profileUrls": ["https://www.linkedin.com/in/satyanadella", "williamhgates"],
  "queries": ["Melanie Perkins Canva"],
  "maxResultsPerQuery": 3,
  "includeEmail": true
}
```

### ⬆️ Output

You get one row per profile. You can view them as a table in Apify Console (a **Profiles** view and an **Emails** view) or download them as Excel, CSV, JSON, HTML or XML. The email fields are included when **Find work emails** is on.

```json
{
  "linkedinUrl": "https://www.linkedin.com/in/satyanadella",
  "publicIdentifier": "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",
  "photo": "https://media.licdn.com/dms/image/v2/C5603AQHHUuOSlRVA1w/profile-displayphoto-shrink_200_200/...",
  "followers": 12189463,
  "connections": "500+",
  "badges": ["Creator", "Top Voice"],
  "currentCompany": "Microsoft",
  "jobTitles": ["Chairman and CEO", "Member Board Of Trustees"],
  "currentPositions": [
    {"name": "Microsoft", "url": "https://www.linkedin.com/company/microsoft", "startDate": "2014-02"},
    {"name": "University of Chicago", "url": "https://www.linkedin.com/school/uchicago/", "startDate": "2018"}
  ],
  "pastCompanies": [
    {"name": "Starbucks", "url": "https://www.linkedin.com/company/starbucks", "startDate": "2017", "endDate": "2024"}
  ],
  "education": [
    {"name": "The University of Chicago Booth School of Business", "url": "https://www.linkedin.com/school/universityofchicagoboothschoolofbusiness/", "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",
      "description": null
    }
  ],
  "recentPostUrls": ["https://www.linkedin.com/posts/satyanadella_were-building-copilot-as-a-new-os-for-work-activity-7509227111648452609-zk5Z"],
  "profileVisibility": "full",
  "companyDomain": "microsoft.com",
  "mxProvider": "Microsoft 365",
  "email": null,
  "emailSource": null,
  "emailGuess": "satya.nadella@microsoft.com",
  "emailFormat": "first.last",
  "emailFormatShare": 34.5,
  "emailFormatSource": "https://rocketreach.co/microsoft-email-format_b5c61dd9f42e0c4b",
  "source": "Satya Nadella Microsoft",
  "fetchedAt": "2026-09-27T11:58:06Z"
}
```

Each run also saves a short report with how many profiles it covered, and every profile or name that gave no row with the reason.

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

LinkedIn decides how much of a profile it shows to people who are not logged in, and this scraper returns exactly that. `profileVisibility` tells you which kind you got:

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

### ✉️ How are emails found?

When **Find work emails** is on, the scraper finds the person's current company, its website and the domain it uses for email, and checks that the domain receives email. Then it looks for:

1. **A published email** (`email`): an address for this person at the company's domain, published on a public web page (`emailSource` is that page).
2. **An email guess** (`emailGuess`), when nothing is published: the person's name in the company's most common email format, as published by email-finder sites (`emailFormat`, the share of the company's addresses that use it in `emailFormatShare`, and the page in `emailFormatSource`).

A guess is pattern-based and **not checked against the mailbox**, so some guesses will bounce. Formats quoted with a high share (for example 90%) are the most reliable. The scraper never guesses when the company's email format is unknown.

### How can I use LinkedIn profile data?

- **Lead generation:** turn a list of names or profile links into leads with company, title and work email
- **Recruiting:** check candidates' current roles, locations and work history
- **Sales prospecting:** find decision makers by name and company and reach them by email
- **CRM enrichment:** add headlines, companies, followers and emails to your contact records
- **Market and influencer research:** compare creators by followers and track what they post

### Use it from your own code

Run the scraper with the [Apify API](https://docs.apify.com/api/v2) or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("automly/linkedin-profile-scraper").call(run_input={
    "profileUrls": ["satyanadella", "williamhgates"],
    "includeEmail": True,
})
for profile in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(profile["name"], profile["headline"], profile.get("email") or profile.get("emailGuess"))
```

### ❓FAQ

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

You pay per 1,000 profiles. Profiles with a work email or an email guess cost more, and you pay the email price only when an email or a guess is returned. 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 or cookies?

No. The scraper only reads what LinkedIn shows to visitors who are not logged in, so you never risk your own account.

#### Why is the work history empty?

LinkedIn shows work history without login only for profiles it shows in full (see "Why do some profiles have fewer fields?" above). For other profiles you still get the headline and current company.

#### Why is there no email for some profiles?

An email needs the person's current company, a company domain that receives email, and either a published address or a known email format. Profiles without a company, companies without a website, and companies whose email format is not published get no email.

#### Are the email guesses verified?

No. A guess follows the company's most common format and is not checked against the mailbox. Use an email verification tool before a large send.

#### Is it legal to scrape LinkedIn profiles and find emails?

This scraper only collects what is publicly visible without login and emails published on the open web. You are responsible for how you use the data: personal data such as names and work emails is protected by laws like the GDPR in Europe and the CAN-SPAM Act in the US, which set rules for storing it and for sending marketing email. Only use the data for a legitimate purpose, and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

LinkedIn Profile Scraper + Email Finder is an independent tool. It is not affiliated with, endorsed by or sponsored by LinkedIn or Microsoft.

#### What happens if a profile can't be scraped?

The run continues with the other profiles, and the run report lists every profile or name that gave no row, with the reason (for example, a profile that does not exist).

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

Open the **Issues** tab and tell us the profile and what you expected. We usually reply within a day.

# Actor input Schema

## `profileUrls` (type: `array`):

LinkedIn profile links (https://www.linkedin.com/in/satyanadella) or just the username at the end of the link (satyanadella).

## `queries` (type: `array`):

Names to find, optionally followed by a company, job title or place, e.g. Satya Nadella Microsoft. The first two words are taken as the name (the first word for Chinese, Japanese and Korean names: 王伟 Microsoft); put a longer name in quotes: "Mary Ann Smith" Boston. Every profile found is scraped like a profile link.

## `maxResultsPerQuery` (type: `integer`):

How many matching profiles to scrape for each name in "Search by name" (people who share the name come after the best match).

## `includeEmail` (type: `boolean`):

Also look for each person's work email: an address published on the web, or else a guess built from the company's email format (for example first.last@company.com). Guesses are not checked against the mailbox. Profiles with an email or a guess cost more (see the Pricing tab).

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

Proxy settings. The default works for most runs.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/satyanadella",
    "williamhgates"
  ],
  "maxResultsPerQuery": 10,
  "includeEmail": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `emails` (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 = {
    "profileUrls": [
        "https://www.linkedin.com/in/satyanadella",
        "williamhgates"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/linkedin-profile-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 = {
    "profileUrls": [
        "https://www.linkedin.com/in/satyanadella",
        "williamhgates",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/linkedin-profile-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 '{
  "profileUrls": [
    "https://www.linkedin.com/in/satyanadella",
    "williamhgates"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/linkedin-profile-scraper --silent --output-dataset

```

## MCP server setup

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