# LinkedIn Posts Scraper - No Login, With Comments (`benthepythondev/linkedin-posts-scraper`) Actor

Scrape LinkedIn posts without login or cookies: give post links, profiles or company pages and get each post's full text, date, author with followers, reactions, comment total, the comments LinkedIn shows (with authors), images, video, links and hashtags. JSON/CSV.

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

## Pricing

from $1.60 / 1,000 shows

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 Posts Scraper (No Login, With Comments)

Give LinkedIn post links, member profiles or company pages and get one clean row per post: full text, date, author with follower count, reactions, comment total, the comments LinkedIn shows with their authors and likes, images, video and caption links, links in the text and hashtags. No LinkedIn account, no cookies. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**What a run costs:** $0.002 per saved post on the Free plan, $0.0018 on Bronze, $0.0017 on Silver and $0.0016 from Gold up, plus $0.00005 per run start. Comments come with the post at no extra charge. Posts that do not exist and pages that stayed unreadable are not charged.

### 🔎 What is the LinkedIn Posts Scraper?

It reads the public post pages LinkedIn shows every logged-out visitor. A profile or company link is read first for its latest posts, then every post is opened for its full row.

#### What data does it extract?

- **Post:** `id`, `linkedinUrl`, `type` (post or repost), `content`, `headline`, `hashtags[]`, `links[]`, `sharedContent`
- **Author:** `author.name`, `author.linkedinUrl`, `author.followers`, `author.avatar`
- **Time:** `postedAt.date` (exact timestamp), `postedAt.postedAgoText`
- **Engagement:** `engagement.reactions`, `engagement.likes`, `engagement.comments` (the exact total)
- **Comments:** `comments[]` with `text`, `postedAt`, `likes`, `author.name`, `author.linkedinUrl`, `postedAgo`
- **Media:** `postImages[]`, `video.url` (mp4), `video.thumbnail`, `video.duration`, `video.captionsUrl`
- **Origin:** `source` (the link the post was found through)

### ⬇️ Input

| Field | Type | Description |
|---|---|---|
| `urls` | array | Post links (`linkedin.com/posts/…`, `linkedin.com/feed/update/urn:li:activity:…`), member profiles (`linkedin.com/in/…`) or company pages (`linkedin.com/company/…`) |
| `maxPostsPerSource` | integer | Latest posts to read per profile or company (default 20; LinkedIn shows a visitor about 10 to 18) |
| `maxPosts` | integer | Stop after this many posts in total (default 1000) |

`postUrls`, `profileUrls`, `companyUrls`, `startUrls` and `limitPerSource` are accepted as well.

#### Example input

```json
{
  "urls": [
    "https://www.linkedin.com/company/microsoft/",
    "https://www.linkedin.com/in/satyanadella/",
    "https://www.linkedin.com/feed/update/urn:li:activity:7513977926971887617/"
  ],
  "maxPostsPerSource": 10
}
```

### ⬆️ Output

One row per post (shortened):

```json
{
  "type": "post",
  "id": "7513977926971887617",
  "linkedinUrl": "https://www.linkedin.com/posts/jeffteper_drive-revenue-and-customer-satisfaction-with-activity-7513977926971887617-1gEa",
  "content": "Drive revenue and customer satisfaction with Dynamics 365 CRM and the next wave of our headless platform…",
  "author": { "name": "Jeff Teper", "linkedinUrl": "https://www.linkedin.com/in/jeffteper", "followers": 64947 },
  "postedAt": { "date": "2026-10-08T15:05:40.748Z", "postedAgoText": "4d Edited" },
  "engagement": { "reactions": 140, "likes": 140, "comments": 12 },
  "comments": [
    {
      "text": "What happens when CRM no longer feels like a place you have to go from somewhere else?…",
      "postedAt": "2026-10-12T22:16:34.646Z",
      "likes": 0,
      "author": { "name": "Bryan Goode", "linkedinUrl": "https://www.linkedin.com/in/bryangoode" }
    }
  ],
  "postImages": ["https://media.licdn.com/dms/image/…"],
  "links": ["https://aka.ms/cx-blog"],
  "hashtags": [],
  "source": "https://www.linkedin.com/feed/update/urn:li:activity:7513977926971887617/"
}
```

### 💡 Use cases

- 📣 **Competitor and brand monitoring:** what companies and executives post, and how much reaction it gets.
- 🎯 **Lead signals:** who comments on posts in your niche, with their profile links.
- ✍️ **Content research:** text, hashtags and engagement of top creators' recent posts.
- 🧪 **Dataset building:** clean post text with exact dates for analysis or AI training sets.

### 🤖 For AI agents

```json
{ "urls": ["https://www.linkedin.com/company/stripe/"], "maxPostsPerSource": 5 }
```

One input field, no credentials. `engagement.comments` is the exact total; `comments[]` holds the ones LinkedIn shows a visitor.

### 📏 Limits

- **Comments:** a visitor sees about ten comments per post. The exact total is in `engagement.comments`. Older comments need a login (the page has no call that loads more for a visitor), so they are not read.
- **Posts per profile or company:** LinkedIn shows a visitor the latest 10 to 18. Older posts need a login.
- **No keyword search:** LinkedIn's post search needs an account. Give post, profile or company links.
- **Reposts:** a repost is saved with `type: "repost"`, the original author and the original text; its exact date is not on the page.
- **Refusals:** LinkedIn turns some visitors away. Each page is tried up to six times through fresh visitors; one that stays unreadable is listed in the key-value record `NOT_SAVED` and not charged.

### ❓ FAQ

**Do I need a LinkedIn account or cookies?** No.

**Are comments charged separately?** No. One price per post, comments included.

**Can I monitor a company's posts?** Yes. Schedule the Actor with the company link; every run returns its latest posts.

**What links work?** `linkedin.com/posts/…`, `linkedin.com/feed/update/urn:li:activity:…`, `linkedin.com/in/…` and `linkedin.com/company/…` (named, not numeric), on any country subdomain.

**Is it legal?** It reads pages LinkedIn publishes to every visitor, without logging in. Comments contain personal data: respect GDPR and CCPA, have a lawful basis for processing, and do not use it for spam.

### 🔗 You might also like

- [LinkedIn Profile Scraper](https://apify.com/benthepythondev/linkedin-intelligence-scraper)
- [LinkedIn Company Scraper](https://apify.com/benthepythondev/linkedin-company-scraper)
- [LinkedIn Jobs Scraper](https://apify.com/benthepythondev/linkedin-jobs-scraper)

**Keywords:** LinkedIn posts scraper, LinkedIn post scraper no login, LinkedIn comments scraper, LinkedIn company posts, LinkedIn profile posts, LinkedIn post engagement, LinkedIn reactions count, LinkedIn content monitoring, LinkedIn post export CSV, LinkedIn post API, LinkedIn activity scraper, LinkedIn hashtags

# Actor input Schema

## `urls` (type: `array`):

LinkedIn post links (linkedin.com/posts/… or linkedin.com/feed/update/urn:li:activity:…), member profile links (their latest posts) or company page links (the company's latest posts). Any country subdomain works.

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

How many of the latest posts to read from each profile or company link. LinkedIn shows a visitor about 10 to 18.

## `maxPosts` (type: `integer`):

Stops after this many posts in total. Only saved posts are charged.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/company/microsoft/",
    "https://www.linkedin.com/in/satyanadella/"
  ],
  "maxPostsPerSource": 20,
  "maxPosts": 1000
}
```

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

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

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

```

## MCP server setup

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