# LinkedIn Profile Scraper — No Cookies (`lergassy/linkedin-profile-scraper`) Actor

\[$3/1K profiles] LinkedIn profiles without login or cookies: name, headline, current title and company, location, about, followers, connections, full experience with dates, education, website, latest posts. Missing and private profiles are free. No account at risk.

- **URL**: https://apify.com/lergassy/linkedin-profile-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Lead generation, Social media, Agents
- **Features:** Limited permissions
- **Stats:** 232 total users, 123 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.10 / 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 — No Cookies** turns LinkedIn profile URLs into clean rows: **name, headline, current title and company, location, about, followers, connections, the full experience history with dates, education, certifications, volunteering, publications, skills, recommendations, website** and, if you want, the person's **latest posts and articles**.

**$0.003 per profile**. No login, no cookies, no LinkedIn account to get restricted, no start fee. Profiles that do not exist or are private are free.

### What is LinkedIn Profile Scraper?

A people-enrichment tool for recruiting, sales and research. It reads the **public profile page** — the version LinkedIn shows search engines and logged-out visitors — and returns it as structured data. Nothing is logged in, so there is no session cookie to paste and no account at risk. Paste one URL or a hundred thousand; call it from the console, the API, a spreadsheet, n8n, Make, Zapier or an AI agent.

### Tested head-to-head — 5 October 2026

![Tested against the 4 most-used LinkedIn profile scrapers: degrees, similar profiles and a lower price per profile](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/linkedinprofile-tested-2026-10-05.png)

Three public profiles (Bill Gates, Satya Nadella, Reid Hoffman) went to this Actor and to the four most-used LinkedIn profile scrapers on the Apify Store, from an ordinary free account. Follower counts matched exactly wherever both returned them.

| | This Actor | The others |
|---|---|---|
| Price per 1,000 profiles | **$3.00** | $4 – $10 |
| Similar profiles per profile | **10 – 20** | 0 – 20 |
| Profiles per run | **any number** | 1 – any; 2 of 4 did not run on a free account |

### What is in every row

| Field | Meaning |
|---|---|
| `fullName`, `firstName`, `lastName`, `headline` | Identity as shown on the profile |
| `title`, `company`, `companyLinkedinUrl`, `currentPositions` | Current role(s) with the company page |
| `location`, `country`, `about`, `website` | Location, about text, website from the profile |
| `city`, `region`, `countryCode` | The location split into parts: `Redmond` / `Washington` / `US`. City and region stay empty when LinkedIn shows only a country or a metro area ("San Francisco Bay Area") |
| `followers`, `connections`, `badges` | Follower count, "500+" connections, Creator / Top Voice |
| `experience` | Every role in the Experience section — including each role inside a company group (several roles at one company): title, company, company URL, `companyLogo`, `location`, `employmentType` (when the page shows it), start, end, current flag, duration, full description |
| `currentPositions` | Current roles with company URL, `companyLogo`, location, start |
| `education` | Every school with `degree` and `fieldOfStudy` ("Master's Degree", "Computer Science"), `activities`, `grade`, `description`, `schoolLogo`, start and end |
| `certifications`, `volunteering`, `publications`, `honorsAndAwards`, `organizations` | Every such section the public profile shows — names, issuers or organizations, dates, links, descriptions; certifications also carry `credentialId`, `issuerLinkedinUrl` and `logoUrl` |
| `languages`, `languageProficiencies` | Languages, and each with its proficiency ("Native or bilingual proficiency") |
| `courses`, `projects`, `testScores` | Courses (name and number), projects (title, link, dates, description) and test scores the person lists |
| `coursesTaught` | LinkedIn Learning courses the person teaches: title, link, image, duration, viewers |
| `skills`, `recommendations` | Listed skills, and recommendations received (who wrote it, their profile, the text) |
| `imageUrl`, `coverImageUrl` | Profile photo and cover (background) image |
| `memberId`, `profileUrn` | LinkedIn member id and URN from the page (`1213`, `urn:li:member:1213`) |
| `similarProfiles` | "Other similar profiles" (LinkedIn's "People also viewed" rail as logged-out visitors see it, usually 10–20): name, headline as the card shows it (usually the current company), location, followers, profile URL, photo |
| `sameNameProfiles` | "Others named …" — other people with the same name, when LinkedIn shows that rail: name, location, profile URL, photo |
| `latestPosts`, `articles` | With **Add the latest posts and articles** on: 5–9 recent posts (text, date, likes, link) and up to 10 articles |

Every field is present in every row; a section the profile does not show comes back as an empty list or `null`.

**What a logged-out visitor cannot see** — and so this Actor does not return, because it never logs in: the exact number of connections (LinkedIn shows "500+"), the Featured section, interests, "open to work" / "hiring" flags, and on some long careers the oldest roles (Reid Hoffman's public page shows 13 of his 20 roles). We do not make these up.

### How much does it cost?

**$0.003 per profile** — one row, one charge (lower on Apify's higher discount tiers).

- Profiles that do not exist, are private or are refused after retries: **$0**. Input values that are not profile URLs: **$0** (an error row says why).
- Experience (every role, with company logos), education with degree and field of study, certifications, languages, courses, projects, test scores, volunteering, publications, skills, recommendations, posts and articles: included.

#### Bulk export: what 50,000 rows actually cost

This Actor is built for bulk jobs — paste a whole candidate or lead list into one run, or refresh
records on a schedule. There is **no fee per run, no fee per page and no proxy charge**: you pay for
the profile rows you keep, and error rows are free.

| Job | This Actor | Most-used Actor in this category |
|---|---|---|
| 50,000 profiles across 100 runs | **$150** | $200 |

Checked on the Apify Store on 23 September 2026 against the Actor with the most monthly users in
this category ($0.004 per profile). Some Actors here ask less per row — this table compares against
the one buyers actually use most.

#### Hidden profiles

Every profile is read through a residential address, a new one for each profile, included in the price.
About one profile in five (more on lists of ordinary employees) is not shown to logged-out visitors on
that route — LinkedIn answers HTTP 999 or a login wall for it. Those hidden profiles are opened through
a second route: a partner LinkedIn data API first (about 10 seconds a profile), then a web unblocker,
and a heavier unblocking service for the ones neither can open. A row from the partner API is marked
`profileSource: "partner-api"`: it has name, headline, location, about, followers, connections, full
experience and education with dates, photo and top skills, but no certifications, languages,
recommendations, volunteering, publications, awards or similar profiles. With "Include posts" on, the
partner API is skipped, because it has no posts.
The second route is included in the price and paid from the run's own margin, so on a very long list
of almost only hidden profiles some may not get it. This Actor never logs in: a profile that still
does not open comes back as an error row that says so and costs nothing. If you put your own proxy URLs
in the proxy field, they are used for every profile and the second route is off. A value that is not a
profile URL or slug (say, `not a url`) also comes back as a free error row that says so, instead of being skipped. Sales Navigator and
Recruiter links (`linkedin.com/sales/lead/ACwAA…`) carry an internal ID that LinkedIn opens only for a
logged-in user, so they come back as free error rows telling you to paste the public `linkedin.com/in/<name>`
URL instead (in Sales Navigator: lead page → ⋯ → View LinkedIn profile). Need the person's work
e-mail too? Use [LinkedIn Profile Scraper with Email](https://apify.com/lergassy/linkedin-profile-email-scraper).

#### Run health

When a run ends with many error rows, the Actor sends its developer the counts (rows delivered, error
types, run ID) so the cause gets fixed fast. Your input and your results are never sent.

#### Very long lists

LinkedIn rate-limits public profile pages. When most of the last 30 profiles in a run are refused
by rate limits, the rest of the list goes straight to the second route (with your own proxies: the run
pauses for 90 seconds, and after two pauses stops instead of grinding through the rest). A run that gets
within 30 seconds of its timeout stops taking new profiles the same way (one run reads about 20-25 profiles a
minute at 3 parallel pages — roughly 2,500 in the default 2-hour timeout; for a longer list raise **Timeout**
in Run options or split the list). A profile LinkedIn refuses on the first route needs another 20-60 seconds on
the second, so keep **Timeout** at 120 seconds or more even for a single profile — with a shorter one such a
profile is left untried and the status message says the timeout cut it. Refused profiles stay free, and
the URLs that were never tried are saved in the run's key-value store as `NOT_ATTEMPTED` — start a new
run with them later.

### How to use it in three steps

1. Paste LinkedIn profile URLs or slugs into **👤 Profiles** — `https://www.linkedin.com/in/satyanadella` or `satyanadella` — or link a Google Sheet.
2. Turn on **📰 Add the latest posts and articles** if you want recent activity in the row.
3. Press **Start**, then download JSON, CSV or Excel — or call it from the API, n8n, Make, Zapier or an AI agent.

### ⬇️ Input

```json
{
  "profileUrls": ["https://www.linkedin.com/in/satyanadella", "jeffweiner08", "justinwelsh"],
  "includePosts": false
}
```

### ⬆️ Output

```json
{
  "type": "profile",
  "fullName": "Satya Nadella",
  "firstName": "Satya",
  "lastName": "Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "title": "Chairman and CEO",
  "company": "Microsoft",
  "companyLinkedinUrl": "https://www.linkedin.com/company/microsoft",
  "location": "Redmond, Washington, United States",
  "country": "US",
  "city": "Redmond",
  "region": "Washington",
  "countryCode": "US",
  "followers": 12203128,
  "connections": "500+",
  "badges": "Creator, Top Voice",
  "experience": [
    { "title": "Chairman and CEO", "company": "Microsoft", "companyLinkedinUrl": "https://www.linkedin.com/company/microsoft", "startDate": "Feb 2014", "endDate": null, "current": true, "duration": "12 years 9 months", "description": null, "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQH32RJQCl3dDQ/company-logo_100_100/…", "location": "Greater Seattle Area", "employmentType": null },
    { "title": "Board Member", "company": "Starbucks", "companyLinkedinUrl": "https://www.linkedin.com/company/starbucks", "startDate": "2017", "endDate": "2024", "current": false, "duration": "7 years", "description": null, "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQEQxk9y2rk7Hw/company-logo_100_100/…", "location": null, "employmentType": null }
  ],
  "education": [
    { "school": "The University of Chicago Booth School of Business", "startDate": "1994", "endDate": "1996", "degree": null, "fieldOfStudy": null },
    { "school": "University of Wisconsin-Milwaukee", "startDate": null, "endDate": null, "degree": "Master’s Degree", "fieldOfStudy": "Computer Science" }
  ],
  "languageProficiencies": [],
  "coverImageUrl": "https://media.licdn.com/dms/image/v2/D5616AQFVwYcBLAcPqQ/profile-displaybackgroundimage-shrink_200_800/…",
  "memberId": "19186432",
  "profileUrn": "urn:li:member:19186432",
  "similarProfiles": [
    { "name": "Tony Bates", "headline": "Genesys", "location": "San Francisco Bay Area", "followers": 18000, "linkedinUrl": "https://www.linkedin.com/in/tony-bates-679227a5", "imageUrl": "https://media.licdn.com/dms/image/v2/…" }
  ],
  "sameNameProfiles": [],
  "linkedinUrl": "https://www.linkedin.com/in/satyanadella",
  "scrapedAt": "2026-09-23T12:04:11.004Z"
}
```

### Use cases

#### Recruiting

Current role, tenure and the full career path for every candidate on a shortlist — no seat licence, no account ban risk.

#### Sales enrichment

Title and company for every contact in a CRM, refreshed on a schedule so job changes show up. Pair with our **LinkedIn Email Finder** for the work address.

#### Research and influencer analysis

Followers, Creator badges and recent posts with likes for a list of voices in your market.

#### AI agents

Through the Apify MCP server an agent can ask *"what is this person's current role and background?"* and get a row back.

### Integrations

Every run is available through the Apify API, and the Actor works out of the box with n8n, Make, Zapier, Google Sheets, LangChain and the Apify MCP server.

### FAQ

**Do I need cookies or a LinkedIn account?** No. That is the point of this Actor: it reads public profiles only, so nothing can be restricted.

**Why are some fields empty?** LinkedIn hides parts of some profiles from logged-out visitors. The Actor delivers what the public profile shows and never invents the rest.

**Does it return e-mails or phone numbers?** No — public profiles do not show them. For a work e-mail, use **LinkedIn Email Finder**.

**Is this legal?** The Actor reads profiles that people have made public. The rows are personal data: under GDPR, CCPA and similar laws you need a lawful basis to process them, must respect opt-outs, and must follow LinkedIn's terms. Use it for legitimate business purposes only.

# Changelog

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

# Actor input Schema

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

LinkedIn profile URLs or slugs, one per line — <b>https://www.linkedin.com/in/satyanadella</b> or <b>satyanadella</b>. One row and one charge per profile; profiles that do not exist or are private are free. Sales Navigator / Recruiter links (<b>linkedin.com/sales/lead/…</b>) open only with a login — paste the public <b>/in/</b> URL instead.

## `startUrls` (type: `array`):

The same thing for long lists — upload a file or link a Google Sheet of profile URLs.

## `includePosts` (type: `boolean`):

The person's recent posts (usually 5–9) and articles (up to 10) inside the same row. No extra charge.

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

A hard ceiling on what one run reads and bills.

## `concurrency` (type: `integer`):

How many LinkedIn pages to read at the same time. Keep it low — LinkedIn dislikes bursts.

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

Residential, a new address for every profile — included in the price, nothing to set up. LinkedIn blocks direct and datacenter requests after a few dozen profiles, so those settings are ignored. Only your own proxy URLs replace it.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/jeffweiner08",
    "justinwelsh"
  ],
  "startUrls": [],
  "includePosts": false,
  "maxItems": 10000,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per profile: current role, experience, education, followers, optional posts.

## `runSummary` (type: `string`):

JSON summary of the run: rows delivered, rows filtered out, failed inputs (free) and request statistics.

## `notAttempted` (type: `string`):

JSON list of inputs the run did not reach (time limit or "Max cost per run"). Not charged — pass them as input to a new run to continue. Present only when the run stopped early.

# 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",
        "https://www.linkedin.com/in/jeffweiner08",
        "justinwelsh"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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