# LinkedIn Profile Details Scraper (`khadinakbar/linkedin-profile-details-scraper`) Actor

Scrape public LinkedIn profile details by profile URL or handle. Returns name, about summary, location, follower and connection counts, work experience (companies + dates), education, and published articles. Provider-backed, no login or cookies. Charged $0.01 per profile. MCP/API-ready.

- **URL**: https://apify.com/khadinakbar/linkedin-profile-details-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Lead generation, MCP servers
- **Stats:** 8 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 linkedin profile scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Details Scraper

Scrape **public LinkedIn profile details** by profile URL or handle — no login, no cookies, no LinkedIn account. Give it a list of `/in/<handle>` URLs and get one clean, flat row per person: name, about summary, location, follower and connection counts, work experience (companies + dates), education, and the LinkedIn articles they've published.

Built for AI agents and pipelines: narrow input, structured JSON output, predictable per-profile pricing.

### What you get

| Field | Description |
|---|---|
| `fullName`, `firstName`, `lastName` | Person's name |
| `about` | The public "About" summary (when present) |
| `location` | City / region / country string |
| `currentCompany` | Most recent / current organization, derived from experience |
| `connectionsCount`, `followerCount` | Public counters (parsed from `1.2k`, `3M`, `500+`, `64,803`) when shown |
| `experience[]` | Organizations the person is affiliated with: company, companyUrl, location, startDate, endDate, isCurrent, and the org description |
| `education[]` | Schools / institutions: name, url, dates |
| `articles[]` | LinkedIn articles the person published: title, url, publishedAt, image |
| `experienceCount`, `educationCount`, `articlesCount` | Quick counts for filtering |
| `profileImageUrl` | Avatar URL |
| `provider` | Which provider resolved the row (`scrapecreators` / `sociavault`) |
| `profileUrl`, `publicId`, `scrapedAt` | Canonical URL, handle, ISO 8601 timestamp |

> **Honest scope:** these providers return LinkedIn's **public structured-data** view of a profile. That reliably includes name, about, location, follower count, affiliated organizations (with dates), education, and published articles. It does **not** include the free-text headline, per-role job titles, a skills list, languages, certifications, emails, or connection-network data. If you need exact job titles or skills you will not get them here.

### When to use

- Enrich a list of known LinkedIn profile URLs into structured people records.
- Build sourcing datasets keyed by profile (name, location, orgs, articles).
- Feed a person's public professional background to an LLM or CRM.

**When NOT to use:**

- For a person's posts → use **linkedin-profile-posts-scraper**.
- For company pages → use the **LinkedIn Company** scrapers.
- For verified emails → use **linkedin-profile-email-scraper**.
- To *search/discover* profiles by keyword → use **linkedin-profile-search-scraper**.

### Input

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates/",
    "satyanadella"
  ],
  "maxProfiles": 10,
  "outputMode": "full",
  "providerOrder": "scrapecreators-first"
}
```

- `profileUrls` (required) — full `/in/` URLs or bare handles.
- `maxProfiles` — budget cap (default 1000).
- `outputMode` — `full` (default) or `compact` (first 3 of each array, smaller records).
- `providerOrder` — `scrapecreators-first` (default) → SociaVault fallback; or reverse / single-provider.
- `includeRawData` — attach the raw provider payload under `rawProfile`.

### Output (one row, abbreviated)

```json
{
  "profileUrl": "https://www.linkedin.com/in/satyanadella/",
  "publicId": "satyanadella",
  "fullName": "Satya Nadella",
  "about": "Chairman and CEO of Microsoft...",
  "location": "Redmond, Washington, United States",
  "followerCount": 12042644,
  "currentCompany": "Microsoft",
  "experience": [
    { "company": "Microsoft", "companyUrl": "https://www.linkedin.com/company/microsoft", "location": "Greater Seattle Area", "startDate": "2014-02", "isCurrent": true }
  ],
  "education": [{ "school": "University of Chicago", "startDate": "1994", "endDate": "1996" }],
  "articles": [{ "title": "How do we build a frontier intelligence ecosystem?", "url": "https://www.linkedin.com/pulse/...", "publishedAt": "2026-06-02T19:41:31.000+00:00" }],
  "experienceCount": 5,
  "provider": "scrapecreators",
  "scrapedAt": "2026-06-26T00:00:00.000Z"
}
```

### Pricing

Pay-per-event (PPE) **and** pay-per-usage are both enabled — pick at run time.

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Profile scraped | **$0.01** per profile saved |

A 10-profile run costs ~$0.10. You are only charged for profiles that actually resolve to a saved record — not-found profiles are not billed.

### How it works

Cookieless and provider-backed. **ScrapeCreators** is the primary data source (`GET /v1/linkedin/profile`); **SociaVault** (`GET /v1/scrape/linkedin/profile`) is the automatic fallback when the primary errors, rate-limits, or returns nothing. Provider API keys are the actor owner's secrets — you never supply credentials. Switch the order or pin a single provider with `providerOrder`.

### Limits & honesty

- Returns the **public, incognito-visible** profile only. No private, login-only, email, or connection-network data.
- Field depth depends on what the person made public and what the provider exposes. `connectionsCount` is often blank; `experience` items are organizations with dates but **no job title**; there is no headline or skills list (see the scope note above).
- A profile that does not exist or has no public profile finishes gracefully (counted as not-found, not billed), not as a failure.

### Legal

Use this actor only for data that is publicly accessible and in compliance with LinkedIn's terms, applicable laws (including GDPR/CCPA), and the rights of the individuals whose data you process. You are responsible for how you collect and use scraped data. This actor returns only public information and does not bypass authentication.

# Actor input Schema

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

List of public LinkedIn person profiles to scrape. Accepts full URLs (https://www.linkedin.com/in/williamhgates/) or bare vanity handles (williamhgates). Each resolves to one output row. NOT company pages (/company/...) — those are skipped; for companies use the LinkedIn Company scrapers.

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

Hard cap on how many profiles to scrape from profileUrls in one run, protecting your budget. Defaults to 1000 (the absolute max). Extra profiles beyond this cap are skipped and noted in the run summary. Does not add results that were not supplied in profileUrls.

## `outputMode` (type: `string`):

How much per-profile data to return. 'full' (default) returns the complete experience, education, and published-articles arrays. 'compact' returns only the first 3 of each for smaller, agent-friendly records. Pricing is identical in both modes.

## `providerOrder` (type: `string`):

Which managed data provider to try first. 'scrapecreators-first' (default) uses ScrapeCreators then falls back to SociaVault. 'sociavault-first' reverses it. The '-only' values disable fallback. Leave default unless one provider is degraded. NOT a place for API keys — keys are owner secrets.

## `includeRawData` (type: `boolean`):

When true, each output row also includes the unmodified provider JSON under rawProfile for debugging or accessing fields not yet mapped. Defaults to false to keep records small and agent-friendly. Turn on only when you need fields the normalized schema does not expose yet.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates/",
    "satyanadella"
  ],
  "maxProfiles": 10,
  "outputMode": "full",
  "providerOrder": "scrapecreators-first",
  "includeRawData": false
}
```

# Actor output Schema

## `profiles` (type: `string`):

No description

## `runSummary` (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/"
    ],
    "maxProfiles": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/linkedin-profile-details-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/"],
    "maxProfiles": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/linkedin-profile-details-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/"
  ],
  "maxProfiles": 10
}' |
apify call khadinakbar/linkedin-profile-details-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/96FrUYrH0Zm6SU9K5/builds/1YJPVB0OUrKkIfTqb/openapi.json
