# LinkedIn Post Comments Scraper ✅ NO COOKIES (`atomus/linkedin-comments-scraper-pro`) Actor

Extract every comment and reply from any LinkedIn post: comment text, author name, headline, profile URL, reaction breakdown, and timestamps. Opt into nested replies, batch up to 1,000 posts per run, and pay only for the comments extracted. No LinkedIn account or cookies needed.

- **URL**: https://apify.com/atomus/linkedin-comments-scraper-pro.md
- **Developed by:** [Atomus APIs](https://apify.com/atomus) (community)
- **Categories:** Social media, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 248 total users, 48 monthly users, 99.9% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.80 / 1,000 comment scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Post Comments & Replies Scraper

<table width="100%" style="border:none;border-radius:10px;background:#120306">
<tr><td style="padding:34px;border:none">
<span style="color:#F59E0B;font-size:13px;font-weight:700;letter-spacing:2px">LINKEDIN COMMENTS SCRAPER &nbsp;&bull;&nbsp; LINKEDIN COMMENTS API</span><br><br>
<span style="color:#F5F5F6;font-size:40px;font-weight:800;letter-spacing:-1.2px">The people who replied<br>are your warmest leads.</span><br><br>
<span style="color:#D6D3D1;font-size:16px">Every comment on a LinkedIn post and, optionally, every reply nested under it: full text, the commenter's name, headline, profile URL and photo, plus reaction counts per comment. A comment takes more intent than a like, and <b style="color:#F5F5F6">it tells you what they actually think</b>. No LinkedIn account, no login, no cookies, no ban risk.</span><br><br>
<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">REPLIES ARE OPT-IN, NEVER SURPRISE COST</span>
<span style="background:#1C1917;color:#F59E0B;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">&nbsp;170,000+ RESULTS DELIVERED&nbsp;</span>
</td></tr>
</table>

#### Copy to your AI assistant

Paste this into ChatGPT, Claude, Cursor, or any LLM to start using this Actor right away.

```
atomus/linkedin-comments-scraper-pro is an Apify Actor that returns every comment on a LinkedIn post as structured JSON, and optionally the replies nested under each one: comment text, the commenter's name, headline, profile URL and photo, reaction counts, pinned/edited/author flags, and timestamps. Use it whenever someone needs LinkedIn post discussion without cookies, a login, or a browser - warm-lead lists, objection and sentiment analysis, or finding who argued with a competitor's launch. Run it with curl: curl -X POST "https://api.apify.com/v2/acts/atomus~linkedin-comments-scraper-pro/run-sync-get-dataset-items?token=APIFY_TOKEN" -H "Content-Type: application/json" -d '{"postUrls":["https://www.linkedin.com/feed/update/urn:li:activity:7302346926123798528/"],"includeReplies":true,"maxComments":200}'. Or in Python: ApifyClient("APIFY_TOKEN").actor("atomus/linkedin-comments-scraper-pro").call(run_input={"postUrls":[...]}) then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: postUrls (string[], full post URL or bare activity id), maxComments (int, 0 = unlimited), sortBy ("date"|"relevance" - use date to get all of them, relevance stops at LinkedIn's top ~600), metadataOnly (bool, count only), includeReplies (bool), maxRepliesPerComment (int, 0 = all). Each top-level comment is one row with comment_type "comment"; replies are nested in a replies array with comment_type "reply" and a parent_comment_id. Billing is one event per comment and one per reply, replies only when includeReplies is on; every post bills at least one comment for the lookup, and summary rows are free. Full input schema, every enum and default, and the complete output field list: GET https://api.apify.com/v2/acts/atomus~linkedin-comments-scraper-pro/build/default
```

***

### LinkedIn MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Atomus and it can read LinkedIn on its own: comments, reactions, posts, profiles, companies and their employees. No glue code, no scraping logic in your prompts.

```json
{
  "mcpServers": {
    "atomus": {
      "url": "https://mcp.apify.com?tools=atomus/linkedin-comments-scraper-pro,atomus/linkedin-reactions-scraper-pro,atomus/linkedin-posts-scraper-pro,atomus/linkedin-profile-scraper,atomus/linkedin-company-scraper,atomus/linkedin-company-employees,atomus/leads-finder",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Then ask, in plain language:

> "Pull every comment on this launch post, group them by what people are complaining about, and list the commenters who work at companies over 200 people."

That one sentence uses two Actors in a row. Pinning the `tools=` list is what keeps your assistant on these Actors instead of reaching for whatever scraper it finds first.

***

### How to scrape LinkedIn post comments

#### Every comment on a post

```json
{ "postUrls": ["https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"] }
```

One row per top-level comment, newest first. Keep `sortBy` at its default `date` — that is the ordering that reaches every comment.

#### Comments and the replies under them

```json
{
  "postUrls": ["https://www.linkedin.com/feed/update/urn:li:activity:7302346926123798528/"],
  "includeReplies": true,
  "maxRepliesPerComment": 5
}
```

Replies arrive nested inside each comment's `replies` array, each one carrying `parent_comment_id`. The Console form starts with them switched on, so clear the checkbox if you want top level comments only. Over the API the field stays `false` unless you ask for it, so send `includeReplies: true`. Every reply bills at the same rate as a comment, and `maxRepliesPerComment` caps how many you take from each one.

#### Find the posts worth scraping first

```json
{
  "postUrls": [
    "https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu",
    "7295721038291234816",
    "https://www.linkedin.com/feed/update/urn:li:share:7290012345678901234/"
  ],
  "metadataOnly": true
}
```

`metadataOnly` returns one row per post with just the comment count. Screen a long list of posts for the ones with real discussion, then scrape only those in full.

#### Cap the spend on a viral post

```json
{
  "postUrls": ["https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"],
  "maxComments": 300
}
```

`maxComments` is per post, so a thread with 4,000 comments cannot surprise you.

#### Top comments only

```json
{
  "postUrls": ["https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"],
  "sortBy": "relevance",
  "maxComments": 50
}
```

`sortBy: "relevance"` uses LinkedIn's own "Most relevant" ordering, which is what you want when you only need the loudest voices. Be aware that LinkedIn's relevance view stops at roughly the first ~600 comments — use `date` whenever you need the complete set.

***

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `postUrls` | string\[] | ✅ Yes | (none) | LinkedIn post URLs or bare activity IDs. |
| `maxComments` | integer | No | `0` | Max comments **per post**. `0` is unlimited. |
| `sortBy` | string | No | `date` | `date` (most recent first, reaches all comments) or `relevance` (LinkedIn's top ~600). |
| `metadataOnly` | boolean | No | `false` | Only the comment count per post. Comment and reply options are ignored. |
| `includeReplies` | boolean | No | `false` | Also fetch replies and nest them under their comment. |
| `maxRepliesPerComment` | integer | No | `0` | Max replies per comment when `includeReplies` is on. `0` is all. |

#### Which URLs work

```
✅ https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu
✅ https://www.linkedin.com/feed/update/urn:li:activity:7302346926123798528/
✅ https://www.linkedin.com/feed/update/urn:li:share:7302346926123798528/
✅ https://www.linkedin.com/posts/user_slug-activity-123/?utm_source=share
✅ 7302346926123798528
```

Tracking parameters are fine. If you only have the numeric activity ID, paste it on its own.

***

### What data does the LinkedIn Comments Scraper return?

One row per top-level comment. Replies live inside that row's `replies` array rather than as separate rows, so a comment and its thread stay together.

| Group | Fields |
|---|---|
| **Comment** | `comment_type` (`"comment"` or `"reply"`) · `text` · `is_pinned` · `is_edited` · `is_author` (the commenter is the post's author) · `reply_count` · `posted_at.timestamp` (ms) · `posted_at.date` (ISO) |
| **Commenter** | `author.id` (URN) · `author.name` · `author.headline` · `author.linkedinUrl` · `author.profile_pic` |
| **Engagement** | `stats.total_reactions` · `stats.reactions{like,appreciation,empathy,interest,praise}` · `stats.replies` |
| **Replies** | `replies[]` — present on top-level comments only when `includeReplies` is on. Each reply has `comment_type: "reply"` and `_metadata.parent_comment_id` / `parent_comment_url` |
| **Provenance** | `_metadata.comment_id` · `comment_url` · `post_url` (the input you gave) · `post_id` (activity URN) · `extracted_at` |
| **Per-post rows** | `type: "metadata"` in `metadataOnly` mode (`total_comments`, `total_pages`), and a free `type: "summary"` row after every post (`total_comments_on_post`, `comments_extracted`, `replies_extracted`, `estimated_cost_usd`) |

#### Example row

```json
{
  "comment_type": "comment",
  "text": "This is a great point. Healthcare professionals need better tools to focus on patient care.",
  "is_pinned": false,
  "is_edited": false,
  "is_author": false,
  "reply_count": 3,
  "posted_at": { "timestamp": 1626782941000, "date": "2026-03-20T12:49:01.000Z" },
  "author": {
    "id": "ACoAAB8v74YB5oqaAg-4F2VRFh9tEt0zXfRsjpE",
    "name": "John Smith",
    "headline": "Healthcare Professional | Digital Health Advocate",
    "linkedinUrl": "https://www.linkedin.com/in/ACoAAB8v74YB...",
    "profile_pic": "https://media.licdn.com/dms/image/v2/..."
  },
  "stats": {
    "total_reactions": 25,
    "reactions": { "like": 20, "appreciation": 3, "empathy": 2 },
    "replies": 3
  },
  "replies": [
    {
      "comment_type": "reply",
      "text": "Exactly. We saw the same thing in our clinics.",
      "author": { "name": "Maria Lopez", "headline": "Clinical Operations Lead" },
      "_metadata": { "comment_id": "7302400000000000001", "parent_comment_id": "7302375502034411520" }
    }
  ],
  "_metadata": {
    "comment_id": "7302375502034411520",
    "comment_url": "https://www.linkedin.com/feed/update/...",
    "post_url": "https://www.linkedin.com/posts/satyanadella_...",
    "post_id": "urn:li:activity:7302346926123798528",
    "extracted_at": "2026-03-30T12:00:00.000Z"
  }
}
```

The `summary` row that follows each post is free and reports what actually happened:

```json
{
  "type": "summary",
  "post_url": "https://www.linkedin.com/posts/satyanadella_...",
  "total_comments_on_post": 1243,
  "comments_extracted": 1243,
  "replies_extracted": 0,
  "include_replies": false,
  "estimated_cost_usd": 5.9664,
  "extracted_at": "2026-03-30T12:00:00.000Z"
}
```

#### Why commenter profile URLs look encoded

LinkedIn's comment payload exposes profile IDs, not public slugs, so `author.linkedinUrl` comes back as `linkedin.com/in/ACoAAB8v74YB...`. It opens the same profile in a browser. It is **not** usable as input to the [LinkedIn Profile Scraper](https://apify.com/atomus/linkedin-profile-scraper), which needs the vanity `/in/<handle>` form — LinkedIn exposes no way to convert one to the other. Every cookieless comments scraper is in the same position.

***

### How much does it cost to scrape LinkedIn comments?

**$4.80 per 1,000 comments** ($0.0048 each), and the same rate per reply when `includeReplies` is on. Pay-per-event: you pay for what is extracted.

| Extracted | Cost |
|---|---|
| 100 comments | $0.48 |
| 1,000 comments | $4.80 |
| 10,000 comments | $48.00 |

- **Replies bill separately**, at the same rate, and only when you turn `includeReplies` on.
- **Every post bills at least one comment**, even a post with none — the lookup that checked still happened, and it does the same work whether it comes back full or empty.
- **`metadataOnly` bills one comment per post**, and returns just the count.
- **Summary and error rows are free.**

**Free plan:** 10 extracted items (comments + replies) per calendar month, so you can inspect every field before paying. The counter resets on the 1st.

***

### What do people use the LinkedIn Comments Scraper for?

- **Warm outbound**: a comment costs more effort than a like, so a commenter on a post about your problem space is the warmest lead a public feed can give you.
- **Objection mining**: read what people actually push back on under a competitor's launch, in their own words.
- **Voice-of-customer research**: pull the discussion under industry posts and let it write your positioning for you.
- **Community management**: track every reply thread on your own company page without refreshing the app.
- **Recruiting**: find practitioners who argue about the stack you hire for, not just people who liked a post about it.
- **Sentiment and trend analysis**: feed comment text to an LLM for grouping, sentiment and theme extraction.
- **AI agent context**: hand an agent a whole discussion thread with authors attached.

***

### LinkedIn Comments Scraper vs cookie-based tools vs the official LinkedIn API

| | This LinkedIn Comments Scraper | Cookie-based scrapers | Official LinkedIn API |
|---|---|---|---|
| **LinkedIn account / cookies** | Not needed | Your `li_at` session cookie required | Marketing Developer Platform partnership |
| **Account / ban risk** | None (no account used) | High (your account can be restricted) | None |
| **Setup** | Paste a post URL | Extract and paste your session cookie | Partner application + OAuth review |
| **Comments on any public post** | Yes | Yes | Only on pages you own |
| **Nested replies** | Yes, opt-in and priced separately | Varies | Owned pages only |
| **Commenter headline and photo** | Yes | Varies | Limited |
| **Pricing** | Pay per comment ($0.0048) | Subscription + your account | Gated / partner pricing |

***

### 🏆 Top LinkedIn Scrapers

### FAQ

#### What is a LinkedIn comments scraper?

A LinkedIn comments scraper turns a post URL into the full discussion under it: every comment's text, who wrote it, their headline and profile link, how many reactions the comment got, and optionally the replies nested underneath. This Actor returns that as JSON rows, without opening a browser or logging in.

#### How do I scrape comments without a LinkedIn account?

Paste the post URL into `postUrls` and run it. The Actor reads the public comment thread through a cookieless data source, so you never connect an account, paste an `li_at` cookie, or risk a restriction.

#### Can I use this from ChatGPT or Claude?

Yes, two ways. Paste the "Copy to your AI assistant" block above into any LLM and it will write the call for you. Or connect the **LinkedIn MCP server** config above, and every Atomus Actor becomes a native tool your assistant can call on its own, including chaining several in one request.

#### Can I get the replies under each comment?

Yes. In the Console the option starts on, so you get them already; clear it for top level comments only. Over the API, set `includeReplies: true`. Each comment then carries a `replies` array, capped by `maxRepliesPerComment`, and every reply bills at the same rate as a comment.

#### How many comments can it extract per post?

All of them, as long as `sortBy` stays at `date`. LinkedIn's "Most relevant" view stops at roughly the first ~600 comments, so `sortBy: "relevance"` is for when you want the top of the thread rather than the whole thread.

#### How much does it cost?

$0.0048 per comment ($4.80 per 1,000), and the same per reply when `includeReplies` is on. Every post bills at least one comment for the lookup; summary rows are free. Free Apify plans include 10 extracted items per month.

#### What is metadata-only mode for?

Screening. `metadataOnly: true` returns just the comment count per post, so you can find the posts with real discussion in a long list before paying to scrape them all.

#### Can I get commenters' email addresses?

No. LinkedIn does not expose contact details in a comment thread, and this Actor returns only what is publicly visible on the post.

#### Is there an official LinkedIn API for post comments?

Not for arbitrary posts. LinkedIn's Marketing Developer Platform exposes comment data on pages you own, behind a partnership. For public posts, a cookieless scraper is the practical route.

#### Is it legal to scrape LinkedIn comments?

This Actor reads publicly visible comments. You are responsible for using the output in line with applicable laws (GDPR/CCPA), LinkedIn's terms, and your own compliance requirements. It is an independent tool, not affiliated with LinkedIn.

#### Can I run this on a schedule?

Yes. Apify [Schedules](https://docs.apify.com/platform/schedules) run the Actor on a cron interval and [webhooks](https://docs.apify.com/platform/integrations/webhooks) push each finished run into your systems. A daily `metadataOnly` pass plus a full scrape only when the count moves keeps a monitor cheap.

***

### All Atomus scrapers

<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">2.4M+ RESULTS DELIVERED</span>

### Support

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. LinkedIn® is a registered trademark of LinkedIn Corporation. All trademarks are property of their respective owners.

Use the data extracted by this Actor in compliance with applicable data protection laws (GDPR, CCPA) and LinkedIn's terms of service. Do not use it for spam, harassment, or unlawful purposes.

# Actor input Schema

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

List of LinkedIn post URLs or activity IDs. Supports full URLs, activity IDs, share URLs, and URLs with tracking parameters.

## `maxComments` (type: `integer`):

Maximum comments to extract per post. 0 = unlimited (extracts all). Every post bills at least 1 comment ($0.0048), even a post with no comments at all. Why there is a minimum: one request is one lookup, and that lookup does the same work whether it comes back full, with a single row, or empty. The minimum covers the request itself, which is what keeps thin targets worth running instead of being refused outright. Requests that fail are free.

## `sortBy` (type: `string`):

Keep "Most recent first" to extract ALL comments on a post. LinkedIn caps its "Most relevant" view at roughly the first ~600 comments, so "Most relevant first" will only return those top ~600 no matter how many the post has. That is a LinkedIn limit, not the actor. Use "Most relevant first" only when you specifically want the top engaged comments and don't need the full set.

## `metadataOnly` (type: `boolean`):

Only return how many comments each post has, without scraping the comments themselves. Fetches a single page per post to read the total, then stops. Great for pre-filtering a large list of posts to find the high-discussion ones before paying to scrape them all. Charges 1 comment per post (the API call still happens). When on, the comment and reply options below are ignored.

## `includeReplies` (type: `boolean`):

Also fetch the replies to each comment and nest them under that comment in the output. On by default. Every reply is billed at the same rate as a comment, so turning it off lowers the cost of a run on posts with long threads.

## `maxRepliesPerComment` (type: `integer`):

Maximum replies to fetch per comment when Include Replies is on. 0 = all replies. Ignored when Include Replies is off.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.linkedin.com/posts/satyanadella_no-one-becomes-a-clinician-to-do-paperwork-activity-7302346926123798528-jitu"
  ],
  "maxComments": 0,
  "sortBy": "date",
  "metadataOnly": false,
  "includeReplies": true,
  "maxRepliesPerComment": 0
}
```

# Actor output Schema

## `comments` (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 = {
    "postUrls": [
        "https://www.linkedin.com/posts/satyanadella_no-one-becomes-a-clinician-to-do-paperwork-activity-7302346926123798528-jitu"
    ],
    "includeReplies": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("atomus/linkedin-comments-scraper-pro").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 = {
    "postUrls": ["https://www.linkedin.com/posts/satyanadella_no-one-becomes-a-clinician-to-do-paperwork-activity-7302346926123798528-jitu"],
    "includeReplies": True,
}

# Run the Actor and wait for it to finish
run = client.actor("atomus/linkedin-comments-scraper-pro").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 '{
  "postUrls": [
    "https://www.linkedin.com/posts/satyanadella_no-one-becomes-a-clinician-to-do-paperwork-activity-7302346926123798528-jitu"
  ],
  "includeReplies": true
}' |
apify call atomus/linkedin-comments-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atomus/linkedin-comments-scraper-pro"
        }
    }
}
```

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/QEsyXru1TiU6s7ItR/builds/bfWl24MVd5qFmIugN/openapi.json
