# LinkedIn Profile Posts Scraper (`blueskyscraper/linkedin-profile-posts-scraper`) Actor

Scrape the latest LinkedIn posts and articles of any person, no login or cookies: post text, date, likes, link and image, plus the author's headline and follower count. Filter by date and likes, or get only new posts on a schedule. Export data, run via API or use with AI tools.

- **URL**: https://apify.com/blueskyscraper/linkedin-profile-posts-scraper.md
- **Developed by:** [BlueskyScraper](https://apify.com/blueskyscraper) (community)
- **Categories:** Social media, Marketing, For creators
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.12 / 1,000 posts

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**LinkedIn Profile Posts Scraper** collects the **latest LinkedIn posts and articles of any person**, **without a login, cookies or an API key**: post **text, publish date, likes and reactions, comments count, image, link card, mentions and hashtags**, quote-shares and **reposts**, article headlines, and the author's **headline and follower count**. Filter by date and likes, or schedule it with **Only posts not delivered before** to get each new post once. **$1.6 per 1,000 posts.**

### What is LinkedIn Profile Posts Scraper?

A **LinkedIn user posts scraper and profile-posts API** for creator research, ghostwriters, sales teams who follow their prospects, and AI content pipelines. Paste profile URLs or slugs (`justinwelsh`, `williamhgates`) and get one row per post or article, ready for Excel, CSV, JSON or the API. No official LinkedIn API access is needed and **your own LinkedIn account is never used**.

### What data can LinkedIn Profile Posts Scraper extract?

| Field | Example |
|---|---|
| `sourceName` | Justin Welsh |
| `postType` | post or article |
| `publishedAt` | 2026-10-02T11:48:22.675Z |
| `text` | Most people start building a reputation when they need something… |
| `headline` | Before you make the deal. (articles) |
| `likes` | 518 |
| `imageUrl` / `images` | image or article cover |
| `postUrl` | https://www.linkedin.com/posts/justinwelsh\_… or /pulse/… for articles |
| `activityId` | stable key to dedupe posts |
| `commentsCount` / `reactionsCount` / `topReactionTypes` | 31 / 926 / LIKE, PRAISE, EMPATHY |
| `videoThumbnail` | the video cover (people's posts show no video file to logged-out visitors) |
| `documentTitle` / `documentUrl` / `documentPageCount` | an attached document or carousel |
| `articleTitle` / `articleUrl` / `articleSubtitle` | the shared link card |
| `hashtags` / `mentions` / `links` | hashtags; tagged people and companies (name, URL, type); other links |
| `authorHeadline` / `authorImageUrl` | the author's headline (people) and photo or logo |
| `isRepost` / `repostedAt` / `repostedBy` / `originalActivityId` | reposts of other people's posts (switch off with **🔁 Include reposts**) |
| `quotedPost` | the post a quote-share comments on: author, text |
| `topComments` | the top ~8–10 comments shown to logged-out visitors: author, text, date, likes, link (with **💬 Add top comments** or for single post URLs) |
| `sourceHeadline` | the person's headline |
| `sourceFollowers` | the person's followers |
| `authorName`, `authorUrl`, `sourceUrl`, `sourceType`, `scrapedAt` | — |

Since 5 October 2026 posts are read from the profile's visible Activity cards as well as the page's search-engine data: comment counts are filled, and quote-shares and reposts — which the search-engine data leaves out — are returned, so the newest item matches what a visitor sees (Satya Nadella: newest 30 Sep instead of 25 Sep). Every post row has every field (`null` or `[]` when not shown). A person with fewer posts than **Maximum posts per page** adds one free `notice` row.

### 💰 How much does it cost to scrape LinkedIn profile posts?

| Row | Price |
|---|---|
| **Post** (a post or an article) | $0.0016 — $1.6 per 1,000 |

No start fee, proxies included. Posts removed by your filters, posts already delivered (with **Only posts not delivered before**), hidden and non-existent profiles are **free**. Apify's free plan ($5 of monthly credit) covers about **3,000 posts a month**. Paid Apify plans get tiered discounts automatically.

### How to scrape a LinkedIn user's posts

1. Click **Try for free**.
2. Paste profile URLs or slugs into **👤 LinkedIn profiles**, or link a Google Sheet / CSV in **📄 URLs from a file or sheet**.
3. Optional: switch off **📝 Include articles**, set **📅 Only posts published after**, **👍 Minimum likes** or **🔔 Only posts not delivered before**.
4. Click **Start**, or save it as a task and schedule it.

### ⬇️ Input

```json
{
    "profileUrls": [
        "https://www.linkedin.com/in/justinwelsh",
        "https://www.linkedin.com/in/williamhgates"
    ],
    "includeArticles": true,
    "postedAfter": "2026-09-01"
}
```

### ⬆️ Output

```json
{
    "type": "post",
    "postType": "post",
    "sourceName": "Bill Gates",
    "sourceType": "person",
    "publishedAt": "2026-10-01T21:57:52.849Z",
    "text": "The Global Fund has helped save 72 million lives since 2002. What an achievement…",
    "likes": 889,
    "postUrl": "https://www.linkedin.com/posts/williamhgates_results-report-2026-activity-7511544945862926336-2Ger",
    "activityId": "7511544945862926336",
    "sourceHeadline": "Chair, Gates Foundation and Founder, Breakthrough Energy",
    "sourceFollowers": 40696787
}
```

One row per post or article, newest first within each person.

### What LinkedIn shows without a login

A logged-out visitor sees a person's **most recent posts, quote-shares and reposts — usually 5 to 10 — plus up to 10 articles** for people who write them. Some people show no posts at all. Reposts come as rows with `isRepost: true` (switch **🔁 Include reposts** off to skip them, free); likes and comments the person merely gave are never returned. There is no paging back to older posts without an account, so for a full history from today on schedule the Actor daily with **🔔 Only posts not delivered before**.

About 1 in 5 profiles is hidden from logged-out visitors on the first route; those get one more try through an unblocking route paid only from your run's own margin, and the rest come back as **free error rows**.

### Use cases for LinkedIn profile posts

#### Creator and thought-leader research

See what top voices in your niche post, how often, and what gets likes.

#### Ghostwriting and content strategy

Collect a client's or a role model's recent posts as examples and inputs for AI drafting.

#### Sales signals

Follow prospects' posts on a schedule and reach out when they announce something.

#### AI pipelines

Feed new posts to an LLM for summaries or classification through the API or the MCP server.

#### Single posts and their top comments

Paste links to single posts — `https://www.linkedin.com/posts/…` or `https://www.linkedin.com/feed/update/urn:li:activity:…` — into **💬 Single post URLs**. Each gives one post row (billed as one post) with every post field plus `topComments`: the **top ~8–10 comments a logged-out visitor sees, not all** (a post with 129 comments shows 8), with author, text, date and likes. Measured on 12 posts (5 October 2026): 8–10 comments on every post, each with author URL, date and likes.

```json
{
    "postUrls": ["https://www.linkedin.com/posts/satyanadella_at-linkedin-every-day-we-talk-to-recruiters-activity-7510854041028108288-1zhY"],
    "includeComments": true
}
```

`includeComments` adds the same top comments to posts found on the pages you list (off by default: `topComments` is then `null`).

### Integrations and API

Use **LinkedIn Profile Posts Scraper** like any Apify Actor:

- **API**: start a run and read the dataset over HTTP — see the **API** tab for ready-made calls.
- **Python**:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("blueskyscraper/linkedin-profile-posts-scraper").call(run_input={"profileUrls": ["https://www.linkedin.com/in/justinwelsh", "https://www.linkedin.com/in/williamhgates"]})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

- **JavaScript**:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('blueskyscraper/linkedin-profile-posts-scraper').call({"profileUrls": ["https://www.linkedin.com/in/justinwelsh", "https://www.linkedin.com/in/williamhgates"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

- **No-code**: Make, Zapier, n8n, Google Sheets, Airtable, Slack and webhooks through Apify integrations — send every finished run's rows wherever your team works.
- **AI agents (MCP)**: add the Actor to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server (`https://mcp.apify.com`) and ask for LinkedIn data in plain words.
- **Schedules**: run it every day or week from the **Schedules** page; combine with **Maximum results per run** to cap the bill.

### ❓ FAQ

#### Is it legal to scrape LinkedIn?

The Actor reads only pages that LinkedIn shows to anyone without an account. Scraping public data is generally lawful, but names, job titles and e-mails are **personal data** under laws such as the GDPR and CCPA: have a lawful reason to process them, keep them safe, and honour opt-outs. When in doubt, ask a lawyer.

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

No. Nothing to log in to, no cookies to paste, no proxy to set up — your own LinkedIn account is never touched, so it cannot be restricted. Proxies are included in the price.

#### Can I use it with the Apify API?

Yes — every run can be started and read over the Apify API, from Python, JavaScript or any HTTP client. See **Integrations and API** above.

#### Can I use it through an MCP server?

Yes. Add it to the Apify MCP server (`https://mcp.apify.com`) and your AI assistant can call it directly.

#### Can I integrate it with other apps?

Yes: Make, Zapier, n8n, Google Sheets, Airtable, Slack and webhooks through Apify integrations.

#### Why did some pages come back as error rows?

Either the page does not exist (404), or LinkedIn hides it from logged-out visitors. Both are **free** — you pay only for rows with data. The `error` field says which.

#### Do I pay for errors, filtered-out posts or the start of a run?

No. There is no start fee; error rows and posts removed by your filters are never billed. **Maximum results per run** and Apify's **Max cost per run** are hard ceilings — when the cost limit is reached, the run stops by itself with everything written already paid for.

#### Can I get posts of a company page?

Yes — paste the company URL here, or use [LinkedIn Company Posts Scraper](https://apify.com/blueskyscraper/linkedin-company-posts-scraper).

#### Can I get the comments' text?

Yes — the **top ~8–10 comments a logged-out visitor sees**, in `topComments` (author name, profile URL, photo, text, images, date, likes, comment link). LinkedIn does not show logged-out visitors all comments of a post, nor replies: `commentsCount` gives the full number, `topComments` only what is visible. Paste post links into **💬 Single post URLs** (comments always included), or switch on **💬 Add top comments to posts from pages** to add them to the posts found on pages — one extra page request per post, so the run is slower; no extra charge. Per-type reaction counts and repost counts need a login.

#### Why did a profile return no posts?

The person has not posted recently, or LinkedIn does not show their activity to logged-out visitors. A free `notice` row says how many posts LinkedIn showed. Nothing is billed for it.

### Your feedback

Something missing or wrong? Open an issue on the **Issues** tab — we read every one.

### You might also like

| Actor | What it does |
|---|---|
| [LinkedIn Scraper](https://apify.com/blueskyscraper/linkedin-scraper) | Profiles, work e-mails, company pages and latest posts in one Actor |
| [LinkedIn Profile Details Scraper](https://apify.com/blueskyscraper/linkedin-profile-details-scraper) | Full public profiles from a list of profile URLs |
| [LinkedIn Profile Email Finder](https://apify.com/blueskyscraper/linkedin-profile-email-finder) | Work e-mail for each profile, with layout evidence and confidence |
| [LinkedIn Company Details Scraper](https://apify.com/blueskyscraper/linkedin-company-details-scraper) | Company pages: website, industry, size, followers, address |
| [LinkedIn Company Posts Scraper](https://apify.com/blueskyscraper/linkedin-company-posts-scraper) | Latest posts of company pages with likes and comments |

# Actor input Schema

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

Profile URLs or slugs, one per line — <code>https://www.linkedin.com/in/satyanadella</code> or just <code>satyanadella</code>. Profiles that do not exist or that LinkedIn hides from logged-out visitors come back as free error rows.

## `postUrls` (type: `array`):

links to single posts — <code>https://www.linkedin.com/posts/…</code> or <code>…/feed/update/urn:li:activity:…</code> (they also work in the other URL fields). One row per post with all post fields plus <code>topComments</code>: the top ~8–10 comments LinkedIn shows a logged-out visitor, not all. Billed as one post; the comments are free.

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

For long lists: upload a file or link a Google Sheet (or any text / CSV URL) that contains LinkedIn URLs. Each link is routed by its kind.

## `includeReposts` (type: `boolean`):

what the company or person reposted from someone else, marked <code>isRepost: true</code> with <code>repostedAt</code> and <code>repostedBy</code> (the author fields are the original author). Turn off to keep only their own posts — skipped reposts are free.

## `includeComments` (type: `boolean`):

for posts found on company and profile pages, also open each post's own page and add its top ~8–10 visible comments in <code>topComments</code>. One extra page request per post, so the run is slower; no extra charge. Off: <code>topComments</code> is null. Single post URLs always include comments.

## `includeArticles` (type: `boolean`):

people's long-form LinkedIn articles (headline, date, likes, link) next to their posts. Each article is billed as a post.

## `postedAfter` (type: `string`):

skip older posts (free). Date like <code>2026-09-01</code>.

## `minLikes` (type: `integer`):

skip posts below this many likes (free).

## `maxPostsPerSource` (type: `integer`):

Cap per person. Logged out, LinkedIn shows a person's ~5–10 newest posts and reposts plus up to 10 articles. A page with fewer posts than this adds one free <code>notice</code> row saying how many LinkedIn showed.

## `onlyNewPosts` (type: `boolean`):

skip every post this account already got from an earlier run (free) — put the run on a daily schedule and get only new posts.

## `maxItems` (type: `integer`):

A hard ceiling on the posts one run bills.

## `concurrency` (type: `integer`):

How many LinkedIn pages to read at the same time. Keep it low — LinkedIn dislikes bursts.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/justinwelsh",
    "https://www.linkedin.com/in/williamhgates"
  ],
  "postUrls": [
    "https://www.linkedin.com/posts/satyanadella_at-linkedin-every-day-we-talk-to-recruiters-activity-7510854041028108288-1zhY"
  ],
  "includeReposts": true,
  "includeComments": false,
  "includeArticles": true,
  "minLikes": 0,
  "maxPostsPerSource": 50,
  "onlyNewPosts": false,
  "maxItems": 10000,
  "concurrency": 3
}
```

# Actor output Schema

## `rows` (type: `string`):

One row per profile, company or post; free error rows explain pages that could not be read.

## `summary` (type: `string`):

Counts, routes and proxy use of the run.

# 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/justinwelsh",
        "https://www.linkedin.com/in/williamhgates"
    ],
    "postUrls": [
        "https://www.linkedin.com/posts/satyanadella_at-linkedin-every-day-we-talk-to-recruiters-activity-7510854041028108288-1zhY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("blueskyscraper/linkedin-profile-posts-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/justinwelsh",
        "https://www.linkedin.com/in/williamhgates",
    ],
    "postUrls": ["https://www.linkedin.com/posts/satyanadella_at-linkedin-every-day-we-talk-to-recruiters-activity-7510854041028108288-1zhY"],
}

# Run the Actor and wait for it to finish
run = client.actor("blueskyscraper/linkedin-profile-posts-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": [
    "https://www.linkedin.com/in/justinwelsh",
    "https://www.linkedin.com/in/williamhgates"
  ],
  "postUrls": [
    "https://www.linkedin.com/posts/satyanadella_at-linkedin-every-day-we-talk-to-recruiters-activity-7510854041028108288-1zhY"
  ]
}' |
apify call blueskyscraper/linkedin-profile-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,blueskyscraper/linkedin-profile-posts-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/ebY6dX3oomw5k6fRg/builds/12ekSFENdzDTPV85W/openapi.json
