# LinkedIn Profile Scraper - No Cookies, Pay Per Result (`thirdwatch/linkedin-profile-scraper`) Actor

Scrape LinkedIn public profiles without login or cookies. Extracts name, headline, current and past positions, education, about section, follower count, and articles.

- **URL**: https://apify.com/thirdwatch/linkedin-profile-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 169 total users, 23 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.50 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Profile Scraper

> **Thirdwatch portfolio:** 5K users across 88 public Actors, 2M+ records delivered, and >99% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

Scrape structured data from public LinkedIn profile URLs and usernames. Get names, headlines, current roles, companies, locations, education, profile summaries, follower counts, profile photos, and recent articles without using a LinkedIn account or cookies.

### Value proposition

LinkedIn profile URLs are common in CRMs, applicant lists, conference exports, Google results, and prospecting workflows, but they are not directly usable as clean structured data. This actor turns public LinkedIn profile URLs into JSON records that can be loaded into a CRM, ATS, enrichment pipeline, spreadsheet, or internal research tool.

Use it when you need a reliable profile-enrichment step for:

- Sales prospecting and SDR research
- RevOps and CRM enrichment
- Recruiting and candidate research
- Founder, executive, or investor research
- Talent movement and market-mapping workflows

### What's new

- **No-login profile enrichment**: scrape public `/in/{username}` profile pages without cookies or a paid LinkedIn seat.
- **Flexible URL input**: accepts full profile URLs, `/in/...` paths, or plain usernames.
- **CRM-friendly fields**: current title, current company, location, headline, education, and profile URL are returned as structured fields.
- **Pairs with company discovery**: use LinkedIn Company Employees Scraper to find profile URLs, then this actor to enrich them.

### What data you get

| Field | Description |
| --- | --- |
| `name` | Full name |
| `headline` | Public professional headline |
| `current_titles` | Current visible job titles |
| `current_companies` | Current companies with start dates when available |
| `past_positions` | Previous positions with company, title, and date range when available |
| `education` | Schools, degrees, and fields of study when available |
| `about` | Public About or summary section |
| `location` | Public profile location |
| `profile_photo_url` | Profile image URL |
| `followers_count` | Public follower count |
| `profile_url` | Canonical LinkedIn profile URL |
| `articles` | Recent public articles when available |

### Quick-start input examples

#### 1. Enrich one profile URL

```json
{
  "profileUrls": ["https://www.linkedin.com/in/satyanadella/"],
  "maxProfiles": 1
}
```

#### 2. Enrich usernames and profile paths

```json
{
  "profileUrls": ["satyanadella", "/in/williamhgates", "https://www.linkedin.com/in/example/"],
  "maxProfiles": 3
}
```

#### 3. Batch-enrich CRM records

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/profile-one/",
    "https://www.linkedin.com/in/profile-two/",
    "https://www.linkedin.com/in/profile-three/"
  ],
  "maxProfiles": 100
}
```

### Input parameters

| Parameter | Required | Default | Description |
| --- | --- | --- | --- |
| `profileUrls` | Yes | - | LinkedIn profile URLs, `/in/...` paths, or usernames. |
| `maxProfiles` | No | `5` | Maximum number of profiles to process from the input list. |
| `maxConcurrency` | No | `5` | Profiles resolved in parallel; maximum `10`. |
| `proxyConfiguration` | No | Residential fallback | Direct HTTP and free search run first. The configured proxy is used only after those paths fail. |
| `preferFullProfile` | No | `false` | Try paid residential recovery before accepting a partial search result. |

### Sample output snippet

```json
{
  "name": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "current_titles": ["Chairman and CEO"],
  "current_companies": [
    {
      "name": "Microsoft",
      "start_date": "2014"
    }
  ],
  "past_positions": [
    {
      "name": "EVP, Cloud and Enterprise",
      "company": "Microsoft",
      "start_date": "2011",
      "end_date": "2014"
    }
  ],
  "education": [
    {
      "school": "University of Wisconsin-Milwaukee",
      "degree": "MS",
      "field": "Computer Science"
    }
  ],
  "about": "Public profile summary text...",
  "location": "Redmond, Washington",
  "followers_count": 10000000,
  "profile_url": "https://www.linkedin.com/in/satyanadella/"
}
```

### Use cases

- **CRM enrichment**: update contact records with current title, company, location, headline, and canonical profile URL.
- **Sales prospecting**: enrich LinkedIn URLs from search exports, conference lists, founder directories, or account research.
- **Recruiting research**: summarize public candidate backgrounds before outreach or screening.
- **Investor research**: profile founders, operators, and executive teams across a portfolio or market segment.
- **Data pipelines**: normalize LinkedIn usernames and URLs into structured fields for downstream workflows.

### Pricing examples

This actor uses path-aware pay-per-event pricing. Ordinary direct profiles cost **$0.0012-$0.0003 each**, depending on your Apify tier. A paid fallback is charged only after it successfully recovers a profile that the direct path could not return.

| Path | FREE | GOLD |
| --- | ---: | ---: |
| Direct HTTP / free search | $1.20 / 1,000 | $0.30 / 1,000 |
| Rendered-search recovery | +$4.00 / 1,000 recovered | +$4.00 / 1,000 recovered |
| Residential recovery | +$12.00 / 1,000 recovered | +$12.00 / 1,000 recovered |

Failures are not pushed to the dataset, so they do not incur a result or fallback event.

### Limitations

- Only public profile data is returned. Restricted profiles may return limited or no data.
- Skills, endorsements, recommendations, and certifications are not returned when they require login-only access.
- Some fields are optional because LinkedIn profiles vary by user privacy settings and public visibility.
- The actor does not create LinkedIn sessions, send messages, connect with users, or access private LinkedIn data.

### FAQ

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

No. The actor uses public profile URLs and does not require a logged-in LinkedIn session.

#### What input formats work?

Full URLs, `/in/...` paths, and plain usernames are accepted when they resolve to public LinkedIn profile pages.

#### Can I enrich profiles found through Google or another scraper?

Yes. If the result resolves to a public LinkedIn `/in/{username}` profile, it can be used as input.

#### How many profiles can I scrape in one run?

The actor supports batch input. Use `maxProfiles` to control how many profiles from your input list are processed in a run.

#### Is the data fresh?

Data is pulled at run time from public profile pages, subject to what LinkedIn makes publicly visible.

### Support and custom builds

Need a custom LinkedIn enrichment flow, CRM mapper, webhook integration, or combined company-employee plus profile-enrichment actor? Contact Thirdwatch through Apify or visit [thirdwatch.dev](https://thirdwatch.dev) for custom builds.

Pairs well with [LinkedIn Company Employees Scraper](https://apify.com/thirdwatch/linkedin-company-employees-scraper?fpr=9m2cd6) to find profiles and [LinkedIn Jobs Scraper](https://apify.com/thirdwatch/linkedin-jobs-scraper?fpr=9m2cd6) to connect people data with hiring signals.

### Use cases and recipes

Step-by-step guides on [thirdwatch.dev/blog](https://thirdwatch.dev/blog):

- [Build a Candidate Shortlist from LinkedIn Profiles (2026)](https://thirdwatch.dev/blog/build-candidate-shortlist-from-linkedin-profiles)
- [Enrich Your CRM with LinkedIn Profile Data (2026 Guide)](https://thirdwatch.dev/blog/enrich-crm-with-linkedin-profile-data)
- [Find Decision-Makers by Title and Company on LinkedIn (2026)](https://thirdwatch.dev/blog/find-decision-makers-by-title-and-company)
- [Scrape LinkedIn Profiles Without Login at Scale (2026)](https://thirdwatch.dev/blog/scrape-linkedin-profiles-without-login)

Last verified: 2026-07

# Actor input Schema

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

LinkedIn profile URLs or usernames. Examples: 'satyanadella', 'https://www.linkedin.com/in/satyanadella/', '/in/satyanadella'.

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

Maximum number of profiles to scrape. Capped to keep exploratory runs affordable.

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

Number of profiles resolved in parallel. Ten minimizes per-profile compute while staying within the tested request limit.

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

Optional residential fallback. Direct HTTP and free search paths run first; paid fallback is used only after they fail.

## `linkedinCookies` (type: `string`):

Optional. Paste one or more LinkedIn 'li\_at' session cookies for authenticated scraping (one cookie per line). When provided, achieves 95%+ reliability on any profile, including obscure/private ones that public scraping can't reach. Get yours from a logged-in LinkedIn session via browser DevTools > Application > Cookies > linkedin.com > li\_at. WARNING: only use cookies from accounts you own -- LinkedIn may flag automated activity. Without cookies, the actor still works via public search-engine fallback for ~85% of indexed profiles.

## `useFallbacks` (type: `boolean`):

When direct LinkedIn access is authwalled (common in 2026), fall back to extracting public profile data from Brave Search, Google, and Bing. Returns partial data (name, headline, company) for ~95% of indexed profiles.

## `preferFullProfile` (type: `boolean`):

When enabled, try residential LinkedIn recovery before partial search results. This can return richer data but may trigger the residential fallback event.

## `usePremiumFallback` (type: `boolean`):

When all our scraping tiers fail, call harvestapi's LinkedIn scraper as a final fallback. They maintain a server-side LinkedIn cookie pool and can retrieve any profile that still exists. Cost: $0.004 per successful profile, charged directly to your Apify account (in addition to this actor's PPE). Disabled by default to avoid surprise costs; enable only when you need maximum recall.

## Actor input object example

```json
{
  "profileUrls": [
    "satyanadella"
  ],
  "maxProfiles": 5,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "useFallbacks": true,
  "preferFullProfile": false,
  "usePremiumFallback": false
}
```

# Actor output Schema

## `results` (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": [
        "satyanadella"
    ],
    "maxProfiles": 5,
    "maxConcurrency": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/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": ["satyanadella"],
    "maxProfiles": 5,
    "maxConcurrency": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/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": [
    "satyanadella"
  ],
  "maxProfiles": 5,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call thirdwatch/linkedin-profile-scraper --silent --output-dataset

```

## MCP server setup

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