# LinkedIn Profile Scraper - People, Job Changes & B2B Leads (`scrapesage/linkedin-profile-scraper`) Actor

Scrape public LinkedIn profiles into rich people records: name, headline, current company & title, location, full work experience, education, languages, follower & connection counts and a lead score. Feed profile URLs or search by keyword. Job-change monitor mode. No login, no cookies, no browser.

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

## Pricing

$4.00 / 1,000 profile scrapeds

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/platform/actors/running/actors-in-store#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 — People, Job Changes & B2B Leads

Turn any list of **public LinkedIn profiles** into rich, structured people records — **full name, headline, current company & title, location, complete work experience, education, languages, exact follower & connection counts, and a 0–100 lead score**. Feed profile URLs (or usernames) straight from your CRM or Sales Navigator export, and optionally **expand into related profiles** ("People also viewed") to snowball a small seed list into hundreds of similar prospects. Then switch on **monitor mode** to get **job-change alerts** — the single strongest B2B buying signal there is.

No login, no cookies, no browser — fast, public-data extraction.

### Why this LinkedIn profile scraper?

Most LinkedIn scrapers either need your account cookies (risky) or return a thin record with the headline and little else. This actor merges **two sources on every public profile** — the embedded JSON-LD and the rendered page — to ship the **richest dataset in the category**, and it never asks for your login.

| Data | Typical scrapers | This actor |
|---|---|---|
| Full name, headline, location | ✅ | ✅ |
| Current company, title & seniority | partial | ✅ |
| **Complete work experience** (title, company, company URL, date range, duration) | ❌ | ✅ |
| **Education** (school, school URL, degree, years) | ❌ | ✅ |
| **Exact follower count** (not "12M") | ❌ | ✅ |
| Connection count | partial | ✅ |
| Languages, awards, external links | ❌ | ✅ |
| **Lead score (0–100)** per profile | ❌ | ✅ |
| **Job-change / title-change / headline-change detection** | ❌ | ✅ monitor mode |
| **Related-profile discovery** ("People also viewed") | ❌ | ✅ snowball |
| Needs your LinkedIn cookies? | often | **❌ never** |

### Use cases

- **B2B lead generation & prospecting** — enrich a list of profile URLs into a complete sales record: name, title, company, seniority, location and lead score. Prioritize decision-makers (`seniorityLevel` = Owner/C-Level or VP/Director).
- **Job-change alerts (buying signals)** — run in monitor mode on a schedule and get a record the moment a prospect changes jobs, gets promoted, or updates their headline. New-in-role buyers are the warmest leads in B2B.
- **Recruiting & sourcing** — build candidate shortlists with full experience and education history; track when passive candidates become open to work.
- **CRM enrichment** — keep contact records fresh with current title, company and location.
- **Market & talent intelligence** — map who works where, seniority distribution, and follower influence across a company or industry.
- **Influencer & creator research** — rank profiles by exact follower count and recent activity.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **LinkedIn Profile Scraper**, paste **Profile URLs** (or usernames) — optionally turn on **Discover related profiles** — and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "profileUrls": [
        "https://www.linkedin.com/in/williamhgates",
        "satyanadella"
    ],
    "discoverRelated": false,
    "maxRelatedPerProfile": 20,
    "maxProfiles": 100,
    "includeExperience": true,
    "includeEducation": true,
    "includeActivity": false,
    "monitorMode": false
}
```

- **profileUrls** — LinkedIn profile URLs (`https://www.linkedin.com/in/<username>`) or bare usernames. The primary, fastest, most reliable input.
- **startUrls** — alternative request-list of profile URLs (handy when chaining from another actor).
- **discoverRelated** *(default false)* — expand each seed profile into its **"People also viewed"** people (one level deep), bounded by **maxRelatedPerProfile** and **maxProfiles**. The reliable way to grow a seed list into similar prospects without supplying every URL.
- **maxProfiles** *(default 100)* — cap the number of profiles; set `0` for no limit (explicit opt-in).
- **includeExperience / includeEducation** *(default true)* — full experience & education lists (same page, no extra request).
- **includeActivity** *(default false)* — recent public posts/activity when present.
- **monitorMode** *(default false)* — emit a record only when a profile **changed** since the last run (new job / title / headline). See below.
- **maxConcurrency** *(default 8)* — profiles fetched in parallel.
- **proxyConfiguration** — keep the default (Apify **residential**, US); LinkedIn blocks datacenter IPs.

### Output

One record per profile (`type: "profile"`):

```json
{
    "type": "profile",
    "profileUrl": "https://www.linkedin.com/in/williamhgates",
    "publicId": "williamhgates",
    "fullName": "Bill Gates",
    "firstName": "Bill",
    "lastName": "Gates",
    "headline": "Chair, Gates Foundation and Founder, Breakthrough Energy",
    "currentTitle": "Co-chair",
    "currentCompany": "Gates Foundation",
    "currentCompanyUrl": "https://www.linkedin.com/company/gates-foundation",
    "seniorityLevel": "Owner/C-Level",
    "locationName": "Seattle, Washington, United States",
    "city": "Seattle",
    "country": "United States",
    "about": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft…",
    "profilePhotoUrl": "https://media.licdn.com/dms/image/v2/…/profile-displayphoto.jpg",
    "followerCount": 40467271,
    "connectionCount": 500,
    "connectionCountText": "500+",
    "experience": [
        { "title": "Co-chair", "company": "Gates Foundation", "companyUrl": "https://www.linkedin.com/company/gates-foundation", "dateRange": "2000 - Present", "durationText": "26 years", "startDate": 2000, "isCurrent": true },
        { "title": "Co-founder", "company": "Microsoft", "dateRange": "1975 - Present", "startDate": 1975, "isCurrent": true }
    ],
    "experienceCount": 3,
    "education": [
        { "school": "Harvard University", "schoolUrl": "https://www.linkedin.com/school/harvard-university", "dateRange": "1973 - 1975", "startYear": 1973, "endYear": 1975 }
    ],
    "educationCount": 2,
    "languages": ["English"],
    "jobTitles": ["Co-chair", "Founder", "Co-founder"],
    "isInfluencer": true,
    "leadScore": 92,
    "source": "url",
    "scrapedAt": "2026-06-26T12:00:00.000Z"
}
```

### Job-change monitoring (the killer feature)

Turn on **monitorMode** and combine it with an Apify **Schedule** (e.g. weekly). On the first run every profile is emitted as `first_seen`. On later runs the actor compares each profile to its stored snapshot and emits a record **only when something changed**:

```json
{
    "fullName": "Jane Doe",
    "changeType": "new_job",
    "currentTitle": "VP of Marketing",
    "currentCompany": "Acme Corp",
    "previousTitle": "Director of Marketing",
    "previousCompany": "Globex",
    "changedFields": ["company", "title"],
    "lastChangedAt": "2026-06-26T12:00:00.000Z",
    "profileUrl": "https://www.linkedin.com/in/janedoe"
}
```

Monitor mode is **orthogonal to Apify Schedules** — the Schedule decides *when* the actor runs; monitor mode decides *what* it emits. Wire a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier](https://docs.apify.com/platform/integrations/zapier) zap to push job-change alerts straight into your CRM or Slack. State is kept in a named key-value store (`monitorStoreName`).

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run hourly/daily/weekly to refresh records or watch a set of prospects for job changes.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/linkedin-profile-scraper').call({
    profileUrls: [
        'https://www.linkedin.com/in/williamhgates',
        'satyanadella',
    ],
    maxProfiles: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} LinkedIn profiles`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new profiles or job-change alerts straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored prospect changes jobs.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "enrich these LinkedIn URLs into a lead list and flag anyone who changed jobs this month" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **B2B lead-gen & sales-intelligence stack**:

- **[LinkedIn Company Scraper](https://apify.com/scrapesage/linkedin-company-scraper)** — firmographics & company B2B leads (size, industry, HQ, website).
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings as hiring-intent signals.
- **[LinkedIn Ad Library Scraper](https://apify.com/scrapesage/linkedin-ad-library-scraper)** — competitor B2B ads & creatives.
- **[Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper)** — emails, phones & socials from any domain (enrich your profile leads with contact details).
- **[Google Maps Scraper](https://apify.com/scrapesage/google-maps-scraper)** — local business leads, emails & contacts.
- **[Salesforce AppExchange Scraper](https://apify.com/scrapesage/salesforce-appexchange-scraper)** — ISV vendor & publisher leads.
- **[IndiaMART Scraper](https://apify.com/scrapesage/indiamart-scraper)** — B2B supplier & product leads.

### Tips

- **Profile URLs are the most reliable input.** Turn on **Discover related profiles** to snowball from a handful of seeds into many similar prospects.
- **Keep the residential proxy.** LinkedIn blocks datacenter IPs; the actor rotates a fresh residential IP per request and retries transient rate-limits automatically.
- **For job-change monitoring**, reuse the same `monitorStoreName` across scheduled runs so snapshots persist.
- **Cost control** — each profile is one request; lower `maxConcurrency` for steadier runs on very large lists.

### FAQ

**Do I need my LinkedIn account or cookies?** No. This actor reads **public** profile pages only — no login, no cookies, no browser.

**Which fields can it get?** Name, headline, current company/title, seniority, location, about, profile photo, exact follower count, connection count, full work experience (with company URLs and dates), education, languages, awards, external links, and recent activity (opt-in) — plus a lead score.

**Why is a field sometimes empty?** Profiles are member-filled. Sections like About, Languages, Awards or external links are `null` only when the member didn't add them (or LinkedIn doesn't expose them to logged-out visitors), never because the scraper skipped them. Skills and certifications are not shown on logged-out public profiles.

**Can I discover profiles without supplying every URL?** Yes — turn on `discoverRelated` and the actor expands each seed profile into the people LinkedIn lists under "People also viewed" (one level deep, bounded by your caps). Start with a few good seeds and let it snowball into similar prospects.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is scraping LinkedIn legal?** This actor collects only publicly available data. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and LinkedIn's terms. Scraping of public profile data has been upheld in the U.S. (hiQ v. LinkedIn), but rules vary by jurisdiction and use case — get advice for your situation.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

LinkedIn profile URLs (https://www.linkedin.com/in/<username>) or bare usernames. The primary, fastest, most reliable input — paste a list exported from your CRM, Sales Navigator, or a spreadsheet.

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

Alternative to Profile URLs — a standard Apify request list of LinkedIn profile URLs. Useful when chaining from another actor or integration.

## `discoverRelated` (type: `boolean`):

Expand each seed profile into the people LinkedIn shows under "People also viewed" on that profile — a reliable way to snowball a small seed list into many similar prospects (same role, network or industry). Bounded to one level of expansion and the Max profiles cap.

## `maxRelatedPerProfile` (type: `integer`):

When Discover related profiles is on, how many related people to harvest from each seed profile (before the overall Max profiles cap is applied).

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

Maximum number of profile records to return. Keep modest for a fast run; set 0 for no limit (explicit opt-in).

## `includeExperience` (type: `boolean`):

Extract the full work-experience list (title, company, company URL, date range, duration, location). Same page — no extra request.

## `includeEducation` (type: `boolean`):

Extract the education list (school, school URL, degree, field, years). Same page — no extra request.

## `includeActivity` (type: `boolean`):

Also extract the profile's recent public posts / activity (text + link) when present. Same page — no extra request.

## `monitorMode` (type: `boolean`):

Re-scan the same profiles on a schedule and emit a record ONLY when something changed since the last run — a new job, a title change, a company change or a headline change. Perfect for sales/recruiting buying-signals. Works alongside Apify Schedules (the schedule controls WHEN it runs; monitor mode controls WHAT is emitted). State is stored in a named key-value store.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers each profile's last snapshot for monitor mode. Reuse the same name across scheduled runs.

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

How many profiles to fetch in parallel. Lower = gentler on rate limits and steadier; higher = faster.

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

LinkedIn requires residential proxies. Keep the default (Apify residential, US) for the most reliable results.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "discoverRelated": false,
  "maxRelatedPerProfile": 20,
  "maxProfiles": 100,
  "includeExperience": true,
  "includeEducation": true,
  "includeActivity": false,
  "monitorMode": false,
  "monitorStoreName": "linkedin-profile-monitor",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped LinkedIn profile / people-lead records as JSON items in the default dataset.

# 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",
        "satyanadella"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/linkedin-profile-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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",
    "satyanadella"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapesage/linkedin-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/linkedin-profile-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/9scfzowxid31IIDsV/builds/YHJhwrc2k7ln1MPvf/openapi.json
