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

Extract structured data from public LinkedIn profiles using URLs or usernames — no LinkedIn login required. Export names, headlines, locations, experience, education, skills, posts, articles, and recommendations as clean JSON. Only successfully retrieved profiles are saved to your dataset.

- **URL**: https://apify.com/calm\_builder/linkedin-profile-scraper.md
- **Developed by:** [Coder](https://apify.com/calm_builder) (community)
- **Categories:** Lead generation, Social media, Developer tools
- **Stats:** 28 total users, 17 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
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

Collect structured profile data from public [LinkedIn](https://www.linkedin.com) profiles using profile URLs or public usernames. Add one or more entries, start a run, and receive clean JSON records in your Apify dataset — no LinkedIn login required.

Use it for **recruiting**, **lead generation**, **sales intelligence**, **investor research**, **talent mapping**, and **market analysis** — without copying profile sections manually.

***

### What you get

Each saved row is **one LinkedIn profile**, organized into clear sections:

| Section | What it contains |
| -------- | ---------------- |
| **Identity** | Profile URL, public identifier, success flag, full name, headline, and location |
| **Social stats** | Follower count, follower label, and connections label when LinkedIn shows them |
| **About** | Summary text from the public profile page |
| **Media** | Profile picture and background image URLs when available |
| **`currentCompany`** | Current employer name and company page link |
| **`currentSchool`** | Current or most recent school name and link |
| **`websites`** | External links listed on the profile (label + URL) |
| **`experience`** | Work history — title, company, dates, location, logo, and company URL |
| **`education`** | Schools — degree, dates, activities, logo, and school URL |
| **`skills`** | Skills listed on the public profile |
| **`languages`** | Languages when published |
| **`awards`** | Awards when published |
| **`projects`** | Projects with descriptions and contributors when visible |
| **`posts`** | Recent activity — post URL, text, publish date, likes, and post type |
| **`articles`** | LinkedIn articles — headline, snippet, publish date, likes, and cover image |
| **`recommendations`** | Recommendations — author name, profile link, and text when visible |

Results are saved to the dataset **as each profile is processed**, so you can preview progress before the run finishes.

***

### Quick start on Apify

1. Open the Actor in the Apify Console.
2. Under **LinkedIn profiles**, add one or more profile URLs or public usernames (one per line).
3. Click **Start** and open the **Dataset** tab as profiles are saved.

**Supported input formats:**

- Public username: `satyanadella`
- Full profile URL: `https://www.linkedin.com/in/williamhgates`
- Regional profile URL: `https://pk.linkedin.com/in/username`

**Example input:**

```json
{
  "profiles": [
    "satyanadella",
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/dharmesh"
  ]
}
```

***

### Input parameters

#### LinkedIn profiles

| | |
| --- | --- |
| **Type** | List of text entries (one profile per line) |
| **Required** | Yes — at least one entry |
| **Formats** | Public username, `linkedin.com/in/...` URL, or regional LinkedIn URL (`pk.linkedin.com`, `uk.linkedin.com`, etc.) |

Duplicate entries in the same run are processed once.

Invalid entries that cannot be recognized as a profile URL or username are skipped with a warning and saved to the dataset with `success: false`.

***

### What you will see during a run

The run log is written for end users — messages describe collection progress only.

Typical messages:

- `Starting profile collection for N profile(s).`
- `Saved profile: Bill Gates.` (after each successful profile)
- `Retrying N profile(s) that could not be retrieved on the first attempt.`
- `Run complete. Saved N profile record(s); M retrieved successfully.`

If a profile cannot be retrieved, you will see a warning for that entry; other profiles in the same run can still succeed.

On the Apify **free plan**, you may also see a notice when free-tier limits apply (see [Free plan limits](#free-plan-limits)).

***

### Output overview

#### Dataset structure

- Results are saved to a **single Apify dataset**
- Each row is one profile object with nested sections (`experience`, `education`, `posts`, etc.)
- Check **`success`** on each row — `true` means the profile was retrieved; `false` means only identity fields and an **`error`** message are returned

Field presence varies by profile: not every person publishes skills, projects, posts, articles, or recommendations on their public page. Missing sections are omitted from the output — not necessarily a scraper error.

***

### Output fields

#### Status and identity

| Field | Description |
| ----- | ----------- |
| `success` | Whether the profile was retrieved successfully |
| `error` | Short explanation when `success` is `false` |
| `linkedinUrl` | Canonical LinkedIn profile URL |
| `publicIdentifier` | Public username slug (the part after `/in/`) |
| `fullName` | Display name |
| `headline` | Professional headline |
| `location` | Location string when shown |
| `country` | Country code when available |
| `followers` | Numeric follower count when available |
| `followersText` | Follower label as shown on the profile (for example `40M followers`) |
| `connections` | Connections label when shown (for example `500+ connections`) |
| `about` | About / summary text |
| `profilePictureUrl` | Profile photo URL |
| `backgroundImageUrl` | Cover / background image URL |

#### `currentCompany` and `currentSchool`

| Field | Description |
| ----- | ----------- |
| `name` | Organization name |
| `url` | Link to the LinkedIn company or school page |

#### `websites`

| Field | Description |
| ----- | ----------- |
| `label` | Link label as shown on the profile |
| `url` | Destination URL |

#### `experience` (array)

| Field | Description |
| ----- | ----------- |
| `title` | Job title |
| `company` | Company name |
| `companyUrl` | LinkedIn company page link |
| `location` | Role location or date context when shown |
| `dateRange` | Display date range |
| `startDate` | Start date when parsed |
| `endDate` | End date when parsed |
| `logoUrl` | Company logo URL |

#### `education` (array)

| Field | Description |
| ----- | ----------- |
| `school` | School or university name |
| `schoolUrl` | LinkedIn school page link |
| `degree` | Degree or program when listed |
| `dateRange` | Display date range |
| `startDate` | Start date when parsed |
| `endDate` | End date when parsed |
| `activities` | Activities and societies when listed |
| `logoUrl` | School logo URL |

#### `projects` (array)

| Field | Description |
| ----- | ----------- |
| `name` | Project name |
| `dateRange` | Project date range when listed |
| `description` | Project description |
| `contributors` | Contributors with `name` and `profileUrl` when listed |

#### `posts` (array)

| Field | Description |
| ----- | ----------- |
| `url` | Post URL |
| `text` | Post body text when available |
| `headline` | Post headline when available |
| `publishedAt` | Publish timestamp when available |
| `likes` | Like count when available |
| `authorName` | Author name when shown |
| `postType` | `original`, `repost`, or `activity` |

#### `articles` (array)

| Field | Description |
| ----- | ----------- |
| `url` | Article URL |
| `headline` | Article title |
| `snippet` | Short preview text |
| `publishedAt` | Publish date when available |
| `likes` | Reaction count when available |
| `imageUrl` | Cover image URL |

#### `recommendations` (array)

| Field | Description |
| ----- | ----------- |
| `authorName` | Recommender's name |
| `authorProfileUrl` | Recommender's profile link |
| `text` | Recommendation text |

#### Other arrays

| Field | Description |
| ----- | ----------- |
| `skills` | List of skill names |
| `languages` | List of language names |
| `awards` | List of award names |

***

### Example output

The excerpts below come from a real run of public profiles. Full output is available in the run dataset.

#### Example input

```json
{
  "profiles": [
    "williamhgates",
    "https://www.linkedin.com/in/dharmesh",
    "michelleobama"
  ]
}
```

#### Excerpt — successful profile with experience, posts, and articles

```json
{
  "linkedinUrl": "https://www.linkedin.com/in/williamhgates",
  "publicIdentifier": "williamhgates",
  "success": true,
  "fullName": "Bill Gates",
  "headline": "Chair, Gates Foundation and Founder, Breakthrough Energy",
  "location": "Seattle, Washington, United States",
  "country": "US",
  "followers": 40466431,
  "followersText": "40M followers",
  "connections": "8 connections",
  "about": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.",
  "currentCompany": {
    "name": "Gates Foundation",
    "url": "https://www.linkedin.com/company/gates-foundation?trk=public_profile_topcard-current-company"
  },
  "currentSchool": {
    "name": "Harvard University",
    "url": "https://www.linkedin.com/school/harvard-university/?trk=public_profile_topcard-school"
  },
  "experience": [
    {
      "title": "Co-chair",
      "company": "Gates Foundation",
      "companyUrl": "https://www.linkedin.com/company/gates-foundation?trk=public_profile_experience-item_profile-section-card_image-click",
      "dateRange": "2000",
      "startDate": 2000
    },
    {
      "title": "Co-founder",
      "company": "Microsoft",
      "companyUrl": "https://www.linkedin.com/company/microsoft?trk=public_profile_experience-item_profile-section-card_image-click",
      "dateRange": "1975",
      "startDate": 1975
    }
  ],
  "education": [
    {
      "school": "Harvard University",
      "schoolUrl": "https://www.linkedin.com/school/harvard-university/?trk=public_profile_school_profile-section-card_image-click",
      "dateRange": "1973 - 1975",
      "startDate": 1973,
      "endDate": 1975
    }
  ],
  "posts": [
    {
      "url": "https://www.linkedin.com/posts/williamhgates_contrailbench-activity-7475933533346381832-unQ5",
      "text": "Contrails.org has launched a new tool that compares contrail forecasts with real-world observations…",
      "publishedAt": "2026-06-25T15:30:50.459Z",
      "likes": 596,
      "authorName": "Bill Gates",
      "postType": "original"
    }
  ]
}
```

#### Excerpt — profile with projects, skills, and articles

```json
{
  "linkedinUrl": "https://www.linkedin.com/in/dharmesh",
  "publicIdentifier": "dharmesh",
  "success": true,
  "fullName": "Dharmesh Shah",
  "headline": "Founder and CTO at HubSpot. Helping millions grow better.",
  "skills": [
    "Entrepreneurship",
    "Start-ups",
    "SaaS",
    "Software as a Service (SaaS)"
  ],
  "languages": [
    "English",
    "Gujarati"
  ],
  "projects": [
    {
      "name": "agent.ai",
      "dateRange": "Apr 2024",
      "description": "Agent.ai is the professional network for AI agents. Discover, build and engage AI agents."
    }
  ],
  "articles": [
    {
      "url": "https://www.linkedin.com/pulse/learning-write-your-first-ai-loop-dharmesh-shah-rbhle",
      "headline": "Learning To Write Your First AI Loop",
      "snippet": "Boris Cherny, the creator of Claude Code, has given up on prompting AI…",
      "publishedAt": "2026-06-11T19:08:25.000+00:00",
      "likes": 554
    }
  ]
}
```

#### Excerpt — profile that could not be retrieved

```json
{
  "linkedinUrl": "https://www.linkedin.com/in/michelleobama",
  "publicIdentifier": "michelleobama",
  "success": false,
  "error": "LinkedIn blocked the request"
}
```

When `success` is `false`, the dataset row contains the profile identifier and a user-friendly **`error`** message. No partial profile data is included.

***

### Free plan limits

On the Apify **free plan**, the Actor may automatically apply:

| Limit | Value |
| ----- | ----- |
| Profiles processed per run | **2** (only the first entries in your list) |

Additional profiles in the same run receive a dataset record with `success: false` and an error message explaining the limit.

Paid Apify plans can process the full input list without this cap. If limits apply, the run log will include a short notice.

***

### Public profiles and data coverage

**No LinkedIn login required**\
The Actor reads publicly visible profile pages. It does not sign in to LinkedIn and does not use your account or cookies.

**Guest view vs signed-in view**\
Results reflect what LinkedIn shows to visitors who are not logged in. Compared with what you see when signed in, output may include:

- Fewer experience or education entries
- Shorter or truncated About text
- Limited activity, posts, or articles
- Missing skills, recommendations, or contact details

Coverage varies by profile and by each member's privacy settings.

**High-profile or restricted profiles**\
Some profiles may return `success: false` with messages such as "LinkedIn blocked the request" or "Profile not found." Retrying the run later or reducing batch size can help in some cases.

**Activity and posts**\
Only activity visible on the public profile page is collected. Full post history or private activity is not available without a logged-in session.

**Compliance**\
You are responsible for using collected data in line with applicable laws and [LinkedIn's terms of service](https://www.linkedin.com/legal/user-agreement).

***

### Tips for best results

1. **Use public usernames or full profile URLs** — Both formats work; regional URLs (`pk.linkedin.com/in/...`) are supported.
2. **Start with a small batch** — Test with 5–10 profiles before large exports.
3. **Check `success` on every row** — Filter the dataset on `success: true` for completed profiles only.
4. **Expect variation** — Executives, creators, and private individuals expose different sections publicly.
5. **Schedule recurring runs** — Use Apify schedules to refresh profile data for your target list over time.
6. **Export flexibly** — Download the dataset as JSON, CSV, Excel, or connect via API to your CRM or data warehouse.
7. **Deduplicate on `publicIdentifier`** — Use the username slug as a stable key across runs.

***

### Frequently asked questions

**Why is `success` false for some profiles?**\
The profile may be private, restricted, temporarily unavailable, or blocked during that run. Check the `error` field for a short explanation.

**Why is my About text truncated?**\
LinkedIn often shows a shortened About section to non-logged-in visitors. The full text visible when you are signed in may not appear in the output.

**Why are skills or recommendations empty?**\
Those sections are only included when LinkedIn publishes them on the public profile page. Many profiles hide some sections from guest viewers.

**Can I scrape company pages or job listings?**\
This Actor is built for **person profiles** (`linkedin.com/in/...`). Company and job pages are not supported.

**Why does the same person look different from my browser?**\
If you are signed in to LinkedIn, you may see more data than a public guest visitor. This Actor matches the guest view.

**Will failed profiles be charged?**\
Billing depends on the Actor's pricing model on the Apify Store — see the **Pricing** tab on the listing. Failed profiles are still saved to the dataset with `success: false` so you can audit results.

**Can I run hundreds of profiles at once?**\
Yes on paid plans. Profiles are processed in parallel; results appear in the dataset as each one completes.

***

### Support

For Actor-specific issues, use the **Issues** tab on the Apify Store listing or contact the publisher through Apify.

For platform questions (runs, billing, API, schedules), see [Apify documentation](https://docs.apify.com) and Apify support.

# Actor input Schema

## `profiles` (type: `array`):

Enter profile URLs or public usernames, one per line. Supported formats include full profile links (for example, https://www.linkedin.com/in/satyanadella), regional links (for example, https://pk.linkedin.com/in/username), and plain usernames (for example, satyanadella).

## Actor input object example

```json
{
  "profiles": [
    "satyanadella",
    "https://www.linkedin.com/in/williamhgates"
  ]
}
```

# 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 = {
    "profiles": [
        "satyanadella",
        "https://www.linkedin.com/in/williamhgates"
    ]
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/G3EZsXsaGaLDcc4uc/builds/Jhr06IAvhGaWNtDqt/openapi.json
