LinkedIn Post Scraper with Comments & Reactions (No Login) avatar

LinkedIn Post Scraper with Comments & Reactions (No Login)

Pricing

from $0.00005 / actor start

Go to Apify Store
LinkedIn Post Scraper with Comments & Reactions (No Login)

LinkedIn Post Scraper with Comments & Reactions (No Login)

Scrape LinkedIn posts without login or cookies: full text, date, reactions, comment count, media, repost info, and the first 10 comments with commenter name, headline and profile URL. From post URLs, company pages or profile URLs. $1.50 per 1,000 posts, comments included, misses free.

Pricing

from $0.00005 / actor start

Rating

0.0

(0)

Developer

Deependra Singh

Deependra Singh

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

a month ago

Last modified

Categories

Security

Limited permissions

Share

LinkedIn Post Scraper with Comments & Reactions (No Login): $1.50 per 1,000 posts

Scrape public LinkedIn posts without login, cookies or a browser. Paste post URLs, company pages or profile URLs and get one clean row per post: full text, exact publish time, author, reactions, comment count, the first 10 comments with commenter name, headline and profile URL, images, video, shared links, hashtags, mentions, and repost attribution.

$1.50 per 1,000 posts, down to $1.00 on Gold plans. Comments, reactions and media are included in the post price. Posts that can't be found are free. No subscription, no monthly minimum, no LinkedIn account.

Why use this scraper?

  • 💸 One price, every field. Other LinkedIn post scrapers bill the post, each comment and each reaction as separate $2 per 1,000 events, plus a start fee. Here a post with its 10 comments, reaction count, media and links is one $0.0015 charge.
  • 🔓 No LinkedIn account, ever. The Actor reads only the pages LinkedIn shows to logged-out visitors. Your account is never at risk, and autonomous agents and n8n or Make workflows can run it without supplying cookies.
  • 🎯 Any post link works. /posts/...-activity-7514069962865500160-CDii, /feed/update/urn:li:activity:..., /embed/feed/update/urn:li:share:..., a bare urn:li:activity: or the 19-digit ID. Pulse article URLs too.
  • 🏢 Company and profile pages as input. Paste https://www.linkedin.com/company/stripe/ (or just stripe) to get the latest posts on the company's public page, or a profile URL for a person's latest public posts.
  • 💬 Commenters as leads. Every comment comes with the commenter's name, headline, profile URL, text, time, reaction count and whether they are the post's author. Comment IDs let you dedupe across runs.
  • 🔁 Honest repost attribution. For reposts, author* fields are the original author and repostedBy* is who reposted. Quote reposts carry the embedded original in quotedPost.
  • 📏 Honest limits. LinkedIn shows logged-out visitors at most 10 comments per post and about 10 posts per company or profile page. Every row says how many comments were returned (commentsReturned) and whether more exist (commentsTruncated).
  • ✅ Every input is accounted for, misses are free. Each line you send ends in a row. Deleted or private posts, invalid lines, duplicates and inputs beyond your limits get a free row that says why. You pay only for status: ok rows.
  • 🚨 No fake "success". If LinkedIn blocks every request, the run is marked Failed and nothing is charged, so your schedule or integration notices instead of getting an empty sheet. A RUN-SUMMARY record lists requests by outcome.
  • 📅 Date filters that work. postedAfter / postedBefore accept dates or "7 days ago"; posts outside the range are never fetched and never charged.
  • 🔔 Monitoring mode. Give seenPostsStoreName a name and each run returns only posts it has not delivered before. Companies with nothing new get a free no_new_posts row, so a daily schedule costs only what it finds.
  • 🧱 Stable output. Every row carries schemaVersion; within a version fields are only added, never renamed or removed, so your n8n, Make and Sheets integrations keep working.
  • ⚡ Fast and light. Pure HTTP at 512 MB of memory, about 50 posts a minute at the default concurrency of 6 on datacenter proxies (88 of 88 requests succeeded in the platform test).

What data do you get?

FieldExample
postUrl, activityId, activityUrn, attributedUrnCanonical post URL, 7514069962865500160, urn:li:activity:..., urn:li:ugcPost:...
postTypetext, image, video, article (shared link), document, quote (repost with commentary), pulse_article
publishedAt, isEdited2026-10-08T21:11:23.815Z, false
text, headlineFull post text with line breaks; LinkedIn's one-line summary
authorName, authorUrl, authorType, authorHeadline, authorFollowerCount, authorImageUrlBill Gates, https://www.linkedin.com/in/williamhgates, person, Chair, Gates Foundation..., 40719640, avatar URL
isRepost, repostedByName, repostedByUrltrue, Stripe, https://www.linkedin.com/company/stripe
isGatedtrue when LinkedIn served only the logged-out teaser of the post (about 1 in 150 company posts): text, author, date and counts are present, media and most comments are not.
quotedPost{ activityUrn, url, author { name, url, type, followerCount }, text, publishedAt } for quote reposts
reactionCount, commentCount, topReactionTypes[]3189, 422, ["LIKE", "INTEREST", "EMPATHY"]
images[], video, articleImage URLs; { url, thumbnailUrl, captionsUrl, duration, durationSeconds }; { url, title, source } with LinkedIn's redirect unwrapped
links[], hashtags[], mentions[]External URLs in the text (unwrapped), hashtags without #, tagged people and companies with name, url, type
comments[]Up to 10: commentId, commentUrn, author { name, url, headline, type }, text, publishedAt, relativeTime, reactionCount, isPostAuthor
commentsReturned, commentsTruncated10, true when the post has more comments than LinkedIn shows logged out
input, sourceType, status, error, scrapedAtWhich input the row answers; post / article / company / profile; ok (charged) or a free not_found / invalid_input / duplicate / skipped / no_posts / error row with the reason

How to use it

  1. Open the Actor and paste your post, company or profile URLs into Posts, companies or profiles, one per line.
  2. Click Start.
  3. Download the results as JSON, CSV or Excel, or fetch them with the Apify API. The Posts view is one row per post; the Engagement view is the metrics only.

Input example

{
"startUrls": [
"https://www.linkedin.com/posts/williamhgates_those-white-clouds-you-see-behind-planes-activity-7514069962865500160-CDii",
"https://www.linkedin.com/feed/update/urn:li:activity:7513299438086332416",
"https://www.linkedin.com/company/stripe/",
"https://www.linkedin.com/in/williamhgates"
],
"includeComments": true,
"maxPostsPerSource": 0,
"maxPosts": 0
}
FieldDefaultNotes
startUrlsrequiredPost URLs or IDs, Pulse article URLs, company URLs or slugs, profile URLs. Several URLs on one line are split.
includeCommentstrueUp to 10 comments per post with commenter details. Turn off if you only need the post.
includeArticlesfalseFor profile inputs, also return the person's Pulse articles.
maxPostsPerSource0 (all shown)Cap per company or profile page.
maxPosts0 (no limit)Cap across the whole run. Explicit post links are processed first.
postedAfter, postedBeforeemptyDate (2026-10-01), ISO timestamp, or relative (7 days ago, 24 hours ago). Out-of-range posts are skipped before they are fetched.
seenPostsStoreNameemptyMonitoring mode: a key-value store name; posts delivered by earlier runs with the same name are skipped for free. The Actor creates the store on its first run; a store created elsewhere is not writable (the Actor runs with limited permissions).
summaryStoreNameemptyAlso write the run summary as latest into a key-value store of this name, for scheduled health checks. Same rule: let the first run create it.
maxConcurrency6Parallel requests.
failIfEmptytrueMark the run Failed when nothing was scraped.
minPosts0 (off)Health checks: mark the run FAILED when fewer posts than this were delivered, so a partial result raises an alert.
proxyConfigurationApify datacenterPosts and company pages: datacenter, 100% in testing. Profile pages: residential only (datacenter loaded 0 of 12); set maxConcurrency to 1 or 2.

Output example (shortened)

{
"input": "https://www.linkedin.com/company/stripe/",
"sourceType": "company",
"status": "ok",
"postUrl": "https://www.linkedin.com/posts/stripe_introducing-personal-agent-protocol-activity-7513299438086332416-zrLF",
"activityId": "7513299438086332416",
"postType": "article",
"publishedAt": "2026-10-06T18:09:36.392Z",
"text": "We're working with Meta, Sierra, Genesys, Instinct, Rocket, Shopify, and Walmart as founding partners for the Personal Agent Protocol: an open standard defining how personal agents interact with businesses. https://lnkd.in/g9sym-J9",
"authorName": "Stripe",
"authorUrl": "https://www.linkedin.com/company/stripe",
"authorType": "company",
"authorFollowerCount": 1761293,
"isRepost": false,
"reactionCount": 438,
"commentCount": 48,
"topReactionTypes": ["LIKE", "INTEREST", "EMPATHY"],
"article": {
"url": "https://sierra.ai/blog/introducing-personal-agent-protocol",
"title": "Introducing Personal Agent Protocol",
"source": "sierra.ai"
},
"links": ["https://lnkd.in/g9sym-J9"],
"comments": [
{
"commentId": "7513302595306835968",
"author": {
"name": "Jules Nsenda",
"url": "https://www.linkedin.com/in/jules-nsenda",
"headline": null,
"type": "person"
},
"text": "The third route is the one to watch: a personal agent working through the company's own agent...",
"publishedAt": "2026-10-06T18:22:09.134Z",
"reactionCount": 6,
"isPostAuthor": false
}
],
"commentsReturned": 10,
"commentsTruncated": true,
"scrapedAt": "2026-10-11T15:48:01.112Z"
}

Where can you run it?

  • Apify Console: paste inputs, click Start, download CSV or Excel.
  • API: POST https://api.apify.com/v2/acts/superxcoder~linkedin-post-scraper-no-login/run-sync-get-dataset-items?token=... with the input JSON; one post URL per call works well for Clay, n8n and Make enrichment columns.
  • Schedules: run a list of competitor company pages every morning and diff activityId against yesterday's dataset to get only new posts.
  • MCP: the Actor is available to AI agents through the Apify MCP server; it needs no cookies, so agents can call it unattended.
  • Chaining: feed the companyUrl column of the LinkedIn Company Scraper's dataset in as startUrls, and feed this Actor's comments[].author.url into your enrichment step.

What are the limits? (read this first)

LinkedIn shows logged-out visitors a fixed window. This Actor works inside it and tells you when you hit it, instead of letting you find out in the Issues tab.

LimitValueHow the output tells you
Comments per postup to 10 (LinkedIn's public page shows the most relevant ones)commentCount is the real total; commentsTruncated: true when more exist
Replies to commentsnot shown logged outcomments[] holds top-level comments only
Posts per company or profile pagethe latest shown on the public page, about 10RUN-SUMMARY.sources[input].postsFound
Older posts, full post historybehind the login walluse a schedule plus seenPostsStoreName to build history forward
Who reacted (reactor list)not shown logged outreactionCount plus topReactionTypes (up to 3 kinds)
Keyword or hashtag search of postslogin onlynot offered
Very large runs on datacenter proxyLinkedIn throttles a datacenter IP pool as one run grows: measured under 1% of page loads blocked up to about 500 loads, about 4% at 1,000 loads in one run. A block is retried on a fresh IP (8 tries); the rare post that still fails becomes a free error rowsplit runs above about 1,000 posts, or rerun the error rows (free)
Profile pagesLinkedIn answers HTTP 999 to most /in/ requests; datacenter IPs never get through, residential about 2 in 3 per attemptresidential proxy, maxConcurrency 1 to 2, rerun the error rows (free), or paste post URLs

The RUN-SUMMARY record in every run's key-value store repeats these limits and shows requests by outcome, posts skipped by date, posts skipped as already seen, and why the run stopped.

Is it working right now?

Three layers tell you, so a LinkedIn markup change never goes unnoticed for long:

  1. Fail-loud runs. A run where nothing could be scraped ends FAILED, not SUCCEEDED with an empty dataset. Set minPosts to make a partial result fail too.
  2. The maintainer's health check. A schedule runs this Actor every 6 hours on three company pages and two posts with minPosts: 10, and writes the run summary as latest into the linkedin-post-scraper-health store. Failures email the maintainer. The changelog below records every LinkedIn-side change and the day it was handled.
  3. Your own monitor. Schedule the Actor on your inputs with summaryStoreName set, and read latest from that store from anywhere: outcome, finishedAt, requests.blocked and rows.ok are all there. scripts/health-status.mjs in the repository is a 40-line example that exits non-zero when the last run failed or is older than 7 hours, ready for cron or CI.

How does it compare?

Store prices checked on 2026-10-11; they change often, so check the live listings. We read 153 reviews and 233 issue threads of the ten biggest LinkedIn post scrapers before building this one. The most frequent complaints were undocumented caps (58 threads), outages (58), date filters ignored (50), wrong-locale results (45), empty results (44) and billing surprises (39: "860 'No posts found' markers were each billed as a post", "I set the cap at 100 posts and it ran to 7k+" because comments and reactions were separate billable events). This Actor's design answers the caps, date-filter, billing, repost-attribution and schema-stability complaints directly; the limits table above is the honest answer to the rest.

This ActorMarket leaders (harvestapi, apimaestro, supreme_coder)
Price per 1,000 posts$1.50, $1.00 on Gold$2.00 to $5.00
CommentsIncluded (first 10 per post with commenter details)$2.00 per 1,000 comments as a separate event or separate Actor
Reaction count and top reaction typesIncludedReaction lists sold as a separate $2 per 1,000 event
Start fee per runPlatform default only ($0.00005 per GB)$0.01 to $0.02 on several
Login or cookiesNever"No cookies" for you, but people search, full comment lists and 2,500-result queries are only possible with a logged-in session on the vendor's side
Full comment history, reactor lists, post search by keyword❌ Not available logged out, and we say so✅ via logged-in sessions
Posts per company or profileLatest ~10 shown on the public pageHundreds, via logged-in sessions
Free rows for misses, invalid lines, duplicates, with reason✅Some
Run fails when LinkedIn blocks everything✅ no charge❌ (empty "succeeded" runs reported in Issues)
Repost attribution (original author vs reposter), quote posts✅Partial (17 threads and reviews report mixed-up author fields)
postedAfter / postedBefore honoured, out-of-range posts not charged✅50 threads report date filters ignored or missing
Only-new-posts monitoring with free "nothing new" rows✅❌ (empty profiles billed as posts)
schemaVersion, additive-only output changes✅❌ (schema changes broke integrations, 17 reports)

If you need thousands of posts per profile or every comment on a viral post, you need a logged-in tool and should weigh the account and legal risk that comes with it. If you need reliable, cheap, cookie-free engagement data for lists of posts and companies, this Actor is built for that.

How much does it cost?

Pay per result, no subscription:

PlanPer postPer 1,000
Free and Starter$0.0015$1.50
Bronze (Scale)$0.0013$1.30
Silver (Business)$0.0012$1.20
Gold (Enterprise)$0.0010$1.00
  • Comments, reactions, media, links and repost info are part of the post price
  • Rows for posts that couldn't be found, invalid lines, duplicates and skipped inputs are free
  • Nothing is charged when the run ends Failed
  • Apify's standard $0.00005 run-start fee per GB of memory (about 5 cents per 1,000 runs)
  • No platform usage charges: the per-post price is the whole bill

1,000 posts with their comments cost $1.50. Test it on the Apify Free plan before you pay anything.

FAQ

Do I need a LinkedIn account or cookies? No. The Actor reads only pages LinkedIn shows to logged-out visitors, never logs in and never bypasses a login wall.

How many comments do I get? The ones LinkedIn shows on the public post page, up to 10, usually the most relevant ones. commentCount is the real total and commentsTruncated tells you when more exist. Loading more requires a logged-in session, which this Actor does not use.

How many posts per company or profile? The latest posts LinkedIn shows on the public page, about 10. Older posts are behind the login wall. To build history, schedule the Actor and keep the dataset.

Why do profile inputs sometimes fail? LinkedIn answers HTTP 999 to most /in/ page requests, far more aggressively than for post and company pages. Measured on 2026-10-11: datacenter proxy loaded 0 of 12 profiles; residential loaded 13 of 20 across two attempts, with 3 more resolved as not public. Use residential proxy, set maxConcurrency to 1 or 2, and rerun the error rows: failed profiles cost nothing. Post pages reached from a profile are not affected (44 of 44 loaded).

A post came back not_found. The post was deleted, is visible only to logged-in members (some authors restrict visibility), or the ID is wrong. LinkedIn redirects such URLs to a sign-up page, which the Actor recognises and reports as a free row.

Is publishedAt exact? Yes. It comes from LinkedIn's structured data on the post page; when missing it is decoded from the activity ID, which encodes the creation time to the millisecond.

Results in the wrong language or country? Post pages are the same for everyone, so this Actor has no locale problem on post inputs. If you still want a specific exit country, set it in the proxy settings (Apify Proxy country).

How do I get only new posts every day? Schedule the Actor with your company list and set seenPostsStoreName to any name, for example competitor-posts. The first run delivers the current posts; every later run delivers only posts not seen before and gives each company with nothing new a free no_new_posts row.

Does it return who reacted? No. Reactor lists are only visible logged in. You get the total and the up-to-three reaction kinds LinkedIn shows.

Is scraping LinkedIn legal? This Actor reads only pages LinkedIn shows to logged-out visitors, never logs in, never creates accounts and never bypasses a login wall. US courts have held that scraping publicly available pages is not unauthorized access (hiQ v. LinkedIn) and that logged-out scraping does not breach a platform's terms (Meta v. Bright Data, 2024); the cases LinkedIn has won (Proxycurl 2025, ProAPIs 2026) involved fake logged-in accounts. Post text and reaction counts are content about a public post; commenter names and headlines are personal data, so includeComments should be used with a lawful basis (for example a GDPR legitimate-interest assessment) and the output handled accordingly. LinkedIn's User Agreement prohibits automated access, and you are responsible for how you use the output, including GDPR and CCPA where they apply. This Actor is not affiliated with or endorsed by LinkedIn.

Tested

Every build runs 83 unit tests on saved LinkedIn pages. The deployed Actor is also put through a 15-case stress and load suite on the platform (3,151 page loads in the last pass): 50 and 111 company pages at concurrency 10 to 20, 200 post URLs at concurrency 20, monitoring mode twice in a row, 100 mixed and broken input lines, run-wide caps, date filters, comments off, only-missing inputs, minPosts, residential profiles. Results and the bugs each pass found are in STRESS-REPORT.md in the repository.

Support

Open an issue in the Issues tab with the input that failed and the run ID; issues are answered within one business day. Every run writes a RUN-SUMMARY record to its key-value store with request counts by outcome, which helps diagnose blocks.