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

Extract facts shown on known public LinkedIn profile pages, including name, headline, location, followers, connections, organizations, education, languages, and awards.

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

## Pricing

from $3.00 / 1,000 linkedin 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/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

### 📊 What does LinkedIn Profile Scraper do?

LinkedIn Profile Scraper turns known public LinkedIn profile URLs into clean
profile rows. Use it for public professional research, company and role
research, directory updates, reports, and scheduled profile checks.

Each input creates one row. A successful row can contain stable profile
identity, public profile details, organizations, education, languages, awards,
follower count, connection label, and observation time.

This Actor reads public LinkedIn profile pages. It does not sign in, use
customer LinkedIn accounts, collect private contact details, or reveal hidden
profile sections.

With LinkedIn Profile Scraper, you can:

- 🆔 Collect stable profile IDs, profile URNs, and clean profile URLs.
- 🧑‍💼 Build public professional and company research datasets.
- 🏢 Collect public organization and education details.
- 📈 Save public follower counts and connection labels for later comparison.
- 📦 Export rows as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
- 🔄 Send profile rows to an API, webhook, spreadsheet, or data pipeline.

### 📦 What LinkedIn profile data can I extract?

One dataset row represents one attempted public LinkedIn profile input.

| Data group          | Example fields                                                   |
| ------------------- | ---------------------------------------------------------------- |
| 🔗 Profile identity | `inputUrl`, `url`, `profileId`, `profileUrn`, `publicIdentifier` |
| 🧾 Public details   | `name`, `headline`, `description`, `location`, `imageUrl`        |
| 🏢 Organizations    | `currentOrganizations`, `organizationDetails`                    |
| 🎓 Education        | `education`, `educationDetails`                                  |
| 🗣️ Other details    | `languages`, `awards`                                            |
| 📊 Public counts    | `followersCount`, `connectionsLabel`                             |
| 🚦 Row state        | `status`, `statusReason`, `observedAt`                           |

Missing public values stay `null`. Missing list values stay as empty lists.
The Actor does not guess hidden values or change missing counts to zero.

### ⚙️ Can I use this Actor through an API?

Yes. Run the Actor in Apify Console or connect it through:

- Apify API
- Python SDK
- JavaScript SDK
- Webhooks
- Scheduled runs
- Apify integrations

This lets you send fresh profile rows to a spreadsheet, database, warehouse,
or internal service.

### 🎯 Why scrape LinkedIn profiles?

| Use case                 | How the data helps                                         |
| ------------------------ | ---------------------------------------------------------- |
| 🔎 Professional research | Review public roles, education, languages, and awards.     |
| 🏢 Company research      | Connect people with public organization details.           |
| 🧱 Data pipelines        | Load stable profile rows into a database or internal tool. |
| 📈 Profile monitoring    | Compare public profile snapshots from scheduled runs.      |
| 🧹 Directory updates     | Check known profile URLs and refresh public details.       |

### 💵 Pricing Event

This Actor uses pay-per-result pricing. One paid result means one successfully
resolved public profile row. Failed, private, missing, or unsupported profiles
are not paid results. Platform usage is included.

| Apify plan | Price per 1,000 successful profiles |
| ---------- | ----------------------------------: |
| Free       |                               $4.00 |
| Starter    |                               $3.50 |
| Scale      |                               $3.25 |
| Business   |                               $3.00 |

Use Apify's maximum charge setting to limit paid results before a run.

### 🚀 How do I use LinkedIn Profile Scraper?

1. Open **LinkedIn Profile Scraper** in Apify Console.
2. Add one or more public LinkedIn profile URLs.
3. Click **Start**.
4. Open the **Output** tab while the run is active to see completed rows.
5. Download the dataset or connect it to your workflow.

### ⬇️ Input

#### 🔗 LinkedIn profile URLs

Add public LinkedIn profile URLs to `startUrls`.

```json
{
  "startUrls": [
    "https://www.linkedin.com/in/timferriss",
    "https://uk.linkedin.com/in/clairebeasley"
  ]
}
```

The Actor supports standard and country LinkedIn domains with an `/in/`
profile path. Tracking parameters can remain in the input URL. The output
includes a clean profile URL when the profile resolves.

Exact duplicate input strings are checked once. Different URL forms for the
same profile can create separate attempts.

Results are saved as soon as each profile finishes.

### ⬆️ Output sample

The sample values below show the output shape. Public values vary by profile
and run time.

```json
{
  "inputUrl": "https://www.linkedin.com/in/example-person",
  "url": "https://www.linkedin.com/in/example-person",
  "profileId": "123456789",
  "profileUrn": "urn:li:member:123456789",
  "publicIdentifier": "example-person",
  "name": "Example Person",
  "headline": "Software Engineer",
  "description": "Public profile description",
  "location": "Toronto, Ontario, Canada",
  "imageUrl": "https://media.licdn.com/example-image",
  "currentOrganizations": ["Example Company"],
  "organizationDetails": [
    {
      "name": "Example Company",
      "url": "https://www.linkedin.com/company/example-company",
      "location": "Toronto, Ontario, Canada"
    }
  ],
  "education": ["Example University"],
  "educationDetails": [
    {
      "name": "Example University",
      "url": "https://www.linkedin.com/school/example-university",
      "description": "Computer Science",
      "startDate": "2018",
      "endDate": "2022"
    }
  ],
  "languages": ["English"],
  "awards": [],
  "followersCount": 1250,
  "connectionsLabel": "500+",
  "status": "ok",
  "statusReason": null,
  "observedAt": "2026-08-12T18:25:52.047Z"
}
```

#### 📌 Run summary

The `OUTPUT` record contains:

- `inputCount`: number of unique input strings;
- `usefulRows`: number of successful profile rows;
- `failedRows`: number of failed profile rows;
- `datasetId`: ID of the result dataset;
- `stopReason`: why the Actor stopped;
- `startedAt` and `finishedAt`: run times.

### 🎯 Status and quality fields

- `ok`: the Actor found a public profile and proved its stable profile
  identity.
- `failed`: the public profile could not be read or did not expose enough data
  to prove its identity.

Failed rows keep the same field order as successful rows. Unknown scalar
values stay `null`. Unknown list values stay empty. Check `statusReason` for a
safe explanation.

The `connectionsLabel` field is the public LinkedIn label. For example, LinkedIn
can show `500+` instead of an exact number. Education dates can contain a year,
month, or full date, based on what LinkedIn shows.

### 🔒 Source boundary

This Actor reads only public LinkedIn profile pages available without a
customer account. It does not:

- sign in to LinkedIn;
- use customer passwords, saved browser data, or accounts;
- collect email addresses or phone numbers;
- open private profiles or hidden profile sections;
- guess values that LinkedIn does not show.

### ⚠️ Limits and interpretation

- LinkedIn can show different public fields by profile, visitor region, and
  time.
- Private, deleted, missing, or login-limited profiles can return failed rows.
- A public headline, description, count, image, organization, or education
  field can be missing.
- Public image links can change or expire.
- Results are profile snapshots. Use scheduled runs to build history.
- LinkedIn can change its public pages. A later change can require an Actor
  update.

### ❓ FAQ

#### Does this Actor need a LinkedIn login or API key?

No. It reads public profile pages without a customer LinkedIn account.

#### Why is a field `null` or an empty list?

LinkedIn did not show that value publicly for the profile at run time. The
Actor does not guess the value.

#### Why did I receive a failed row?

The profile can be private, missing, deleted, limited to signed-in visitors,
or unavailable at run time. Check `statusReason` and confirm that the input is
a public LinkedIn `/in/` profile URL.

#### How are duplicate profiles handled?

The Actor checks an exact duplicate input string once per run. Different URL
forms for the same profile can create separate attempts.

### 🏠 Related Actors

Continue the same workflow on this platform or compare public data across
platforms.

#### Continue on LinkedIn

- [LinkedIn Post Scraper](https://apify.com/chronometrica/linkedin-post-scraper)
  — collect public post text, authors, media, dates, and engagement.
- [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper)
  — collect public comments, replies, authors, dates, and reactions.
- [LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)
  — find public job listings, employers, locations, and company details.

#### Compare profiles across platforms

- [Facebook Page Scraper](https://apify.com/chronometrica/facebook-channel-scraper)
  — collect public Page details, links, and audience stats.
- [Instagram Profile Scraper](https://apify.com/chronometrica/instagram-channel-scraper)
  — collect public profile details, links, and audience stats.
- [TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper)
  — collect public creator details, links, and audience stats.
- [YouTube Channel Scraper](https://apify.com/chronometrica/youtube-channel-scraper)
  — collect public channel details, links, and audience stats.
- [X Profile Metrics Scraper](https://apify.com/chronometrica/x-profile-metrics)
  — collect public profile details, audience counts, and activity stats.

### 🛟 Support

For help, share the run ID, public profile URL, expected result, and actual
result. State whether the issue affects one row or the full run. Never share a
LinkedIn password, saved browser data, or private token.

Use public data in line with applicable laws, LinkedIn rules, and Apify rules.

# Actor input Schema

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

Paste one or more public LinkedIn profile URLs.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.linkedin.com/in/timferriss"
  ]
}
```

# Actor output Schema

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

No description

## `output` (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 = {
    "startUrls": [
        "https://www.linkedin.com/in/timferriss"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/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 = { "startUrls": ["https://www.linkedin.com/in/timferriss"] }

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

```

## MCP server setup

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