# LinkedIn Profile Scraper (`deepmine/linkedin-profile-scraper`) Actor

LinkedIn profile scraper with no login or cookies: paste profile URLs or public identifiers and get name, headline, job title, company, about, location, followers, education, certifications and languages as JSON, CSV or Excel.

- **URL**: https://apify.com/deepmine/linkedin-profile-scraper.md
- **Developed by:** [DeepMine](https://apify.com/deepmine) (community)
- **Categories:** Lead generation, Social media, Jobs
- **Stats:** 2 total users, 1 monthly users, 90.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 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.
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 Profile Scraper

**LinkedIn profile scraper with no login or cookies:** paste LinkedIn profile URLs or public identifiers and get each profile's public details as JSON, CSV or Excel: name, headline, current job title and company, about, location, followers, education, certifications, languages and more. Full job history, dates and skills come only for members who show them publicly: [see what you get](#what-linkedin-shows-without-a-login-measured).

| Name | Job title | Company | Followers | Skills | Positions |
|---|---|---|---:|---:|---:|
| Reid Hoffman | Co-Founder, Executive Board Chair | Manas AI | 2,798,847 | 47 | 13 |
| Satya Nadella | Chairman and CEO | Microsoft | 12,272,998 | – | 5 |
| Jeff Weiner | Founding Partner | Next Play Ventures | 10,353,389 | 26 | 24 |

<sub>Collected 2026-10-31 from the prefilled run (5 well-known members who show their job titles; most members show less, see below).</sub>

**$1.29 per 1,000 profiles on Starter** ($1.49 Free, $1.09 Scale, $0.99 Business). The prefilled run (5 profiles) costs about $0.006. You pay for each profile delivered, once per run. Links that aren't profiles, profiles that no longer exist and profiles LinkedIn doesn't open are free and listed in the run summary.

### What you type

One profile per line in **Profile URLs or public identifiers**: `https://www.linkedin.com/in/williamhgates` or just `williamhgates`. Repeats are read once. A run built for another LinkedIn profile Actor works unchanged: `queries`, `urls` and `publicIdentifiers` are read like `profileUrls`.

| Input | What it does |
|---|---|
| `profileUrls` | Profile URLs or public identifiers, one per line (the main field). |
| `includeSkills` | On by default. Also reads the page a logged-out browser gets, which has the Skills section and, for members who show their job titles publicly, every position with its title and dates. Adds no cost. |
| `googleLookup` | On by default. A profile still without a job title or company after LinkedIn's page and Yahoo asks Google, up to 100 profiles a run. Adds no cost. |
| `publicIdentifiers`, `queries`, `urls` | More profiles, read the same way. |
| `maxProfiles` | Read only the first N of the list. |
| `maxGoogleLookups` | Lower the 100 Google lookups a run. |

A LinkedIn profile ID (`ACoAA...`) can't be turned into a page without a login, and company or school links aren't profiles: those inputs are listed in the run summary and cost nothing.

### What you get

One row per profile, camelCase keys in the shape of the other LinkedIn profile Actors on the Store (`publicIdentifier`, `linkedinUrl`, `firstName`, `lastName`, `headline`, `about`, `photo`, `location.parsed.city`, `followerCount`, `connectionsCount`, `currentPosition`, `experience`, `education`, `skills`, `certifications`, `languages`, `projects`, `volunteering`, `courses`, `publications`, `patents`, `honorsAndAwards`, `receivedRecommendations`, `moreProfiles`). Fields LinkedIn doesn't show are `null`.

```json
{
  "fullName": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "jobTitle": "Chairman and CEO",
  "currentCompany": "Microsoft",
  "location": {"linkedinText": "Redmond, Washington, United States", "countryCode": "US",
               "parsed": {"country": "United States", "state": "Washington", "city": "Redmond"}},
  "followerCount": 12266789,
  "connectionsCount": 500,
  "publicView": "full",
  "experience": [{"position": "Chairman and CEO", "companyName": "Microsoft", "companyUniversalName": "microsoft",
                  "startDate": {"month": "Feb", "year": 2014, "text": "Feb 2014"},
                  "endDate": {"text": "Present"}, "duration": "12 years 9 months", "isCurrent": true}],
  "education": [{"schoolName": "University of Wisconsin-Milwaukee", "degree": "Master’s Degree"}]
}
```

### What LinkedIn shows without a login (measured)

No login means you get what LinkedIn shows a signed-out visitor, plus what search engines show for that profile. LinkedIn shows far more for some members than for others: the member's own settings decide, and most members show less. We read 170 profiles of ordinary members (found by People Search for job-title queries) in three platform runs on 2026-10-31:

| Field | Ordinary members (170 profiles) | Members who show their job titles |
|---|---:|---|
| Name, location, followers, memberId | 100% | yes |
| Current company | 95% | yes |
| Headline | 95% | yes |
| Current job title (read from the headline) | 85% | yes |
| Education: school | 91% | yes, with degrees |
| About | 68% (LinkedIn cuts it short for most) | full text |
| Photo | 63% | yes |
| Certifications / languages | 45% / 34% | yes |
| Job title and dates of each position | **0%** | yes |
| Past employers | place and logo only | every position |
| Skills | **0%** | when the member lists them |

Recommendations received, volunteering, honors, projects, courses and publications came on 29% / 28% / 21% / 11% / 10% / 9% of 298 other ordinary members (2026-10-29).

`publicView` says which kind of profile a row is: `full` when LinkedIn shows the member's job titles to signed-out visitors, `limited` when it hides titles, dates and skills. In our sample of 298 ordinary members none was `full`; among 30 well-known members (executives, authors, investors) 10 of 22 that opened were.

#### Where the job title and company come from

LinkedIn hides the headline and job titles of most members from signed-out visitors, so for those `headline` and `jobTitle` come from the search result for that exact profile. Three columns tell you where each value came from: `headlineSource`, `jobTitleSource` and `currentCompanySource` say `linkedin`, `yahoo` or `google`.

| Source | Job title (170 ordinary members) | Current company |
|---|---:|---:|
| LinkedIn's page | 0% | 85% |
| Yahoo's result | 66% | 9% |
| Google's result | 18% | 1% |
| None | 15% | 5% |

- `jobTitle` is the start of the headline the member wrote, not a verified employment record, and some headlines aren't job titles at all ("Builder"). A headline that is only a degree, a place, a school or the employer gives no `jobTitle`.
- A search result is what the engine last read, so it can lag the member's profile.
- Google is asked only for a profile still missing a job title or company (about a third of ordinary members), up to 100 profiles a run. If a run needs more, or Google stops answering, the remaining profiles still go out, without those fields, and the run's status says so. You pay the same either way.

#### What you will not get

These fields exist only for a logged-in viewer, so there is no key for them: LinkedIn's internal member id (`ACoAA...`), `premium`, `verified`, `openToWork`, `hiring`, `influencer`, `registeredAt`, `featured`, `topSkills`, employment type and skills per job, and email addresses (this Actor does not look for emails). A profile ID can't be used as input.

### How fast

Measured on Apify's own clock from the moment the run started, at the default 512 MB, on ordinary members with Google lookups on (seven platform runs on 2026-11-01):

| Run | Time |
|---|---:|
| First row, on a machine that has to load this Actor first | 5.6 to 6.6 seconds |
| 10 profiles, whole run | 15 to 21 seconds |
| 30 to 40 profiles, whole run | 24 to 34 seconds |

Loading the Actor was 3 to 4 of those first-row seconds, and a machine that already has it skips them. A profile that waits for Google's result arrives after the others: a run of one such profile took 22 seconds, with Google refusing one IP first.

### Tips

- Run big lists in one run: profiles are read about 30 at a time and rows are delivered as they finish, so you can start using the dataset while it runs.
- A profile listed under `profilesNotOpened` in the run summary (OUTPUT) was not opened by LinkedIn after several tries on new IPs. It was not charged; run it again.
- A list with thousands of ordinary members gets its job titles mostly from Yahoo: the 100 Google lookups a run cover the first profiles that need one.
- Use [LinkedIn People Search](https://apify.com/deepmine/linkedin-people-search) to find profiles by job title, company and place, then paste the URLs here for the full public profile.

### Found it useful?

A short review on the Store helps other people find this Actor, and tells us what to build next.

# Actor input Schema

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

One per line: a LinkedIn profile URL like <code>https://www.linkedin.com/in/williamhgates</code>, or just its last part <code>williamhgates</code>. Repeats are read once. Each profile delivered costs one result; links that aren't profiles, profiles that no longer exist and profiles LinkedIn doesn't open are free and listed in the run summary.

## `includeSkills` (type: `boolean`):

Also ask for the page a logged-out browser gets, which has the Skills section and, for members whose profile is public in full, every position with its title and dates. Only members who show their job titles publicly have skills logged out (see the README); it adds no cost. Turn off to read faster.

## `googleLookup` (type: `boolean`):

For a profile still without a job title or company after LinkedIn's page and Yahoo, read them from Google's result for that profile. jobTitleSource and currentCompanySource say where each value came from. Up to 100 lookups a run; it adds no cost.

## `publicIdentifiers` (type: `array`):

More profiles, as public identifiers (the last part of the profile URL). Read exactly like the field above; kept so a run built for another LinkedIn profile Actor works unchanged.

## `maxProfiles` (type: `integer`):

Read only the first this many profiles of the list. Empty = all. Your max cost per run also applies.

## `maxGoogleLookups` (type: `integer`):

The most profiles of this run that ask Google. Google answers a limited number of lookups, so 100 is the ceiling; profiles past it go out without them, and the run says how many.

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

Leave as is: profiles and search results run on Apify datacenter proxy, at no extra cost to you. Your own proxy URLs, if you set them, are used for both.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/jeffweiner08",
    "https://www.linkedin.com/in/reidhoffman",
    "https://www.linkedin.com/in/garyvaynerchuk"
  ],
  "includeSkills": true,
  "googleLookup": true,
  "maxGoogleLookups": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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/williamhgates",
        "https://www.linkedin.com/in/satyanadella",
        "https://www.linkedin.com/in/jeffweiner08",
        "https://www.linkedin.com/in/reidhoffman",
        "https://www.linkedin.com/in/garyvaynerchuk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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/williamhgates",
        "https://www.linkedin.com/in/satyanadella",
        "https://www.linkedin.com/in/jeffweiner08",
        "https://www.linkedin.com/in/reidhoffman",
        "https://www.linkedin.com/in/garyvaynerchuk",
    ] }

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

```

## MCP server setup

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