LinkedIn Post Reactions Scraper ✅ NO COOKIES avatar

LinkedIn Post Reactions Scraper ✅ NO COOKIES

Pricing

from $4.00 / 1,000 results

Go to Apify Store
LinkedIn Post Reactions Scraper ✅ NO COOKIES

LinkedIn Post Reactions Scraper ✅ NO COOKIES

Scrape LinkedIn post reactions to see who reacted: name, headline, profile URL, reaction type (like, celebrate, support, love, insightful, funny), and timestamp. No LinkedIn account or cookies needed. Auto-paginates the full reactions list and handles up to 1,000 posts per run.

Pricing

from $4.00 / 1,000 results

Rating

4.7

(4)

Developer

Atomus APIs

Atomus APIs

Maintained by Community

Actor stats

7

Bookmarked

187

Total users

41

Monthly active users

20 hours ago

Last modified

Share

LinkedIn Post Reactions Scraper

LINKEDIN REACTIONS SCRAPER  •  LINKEDIN REACTIONS API

Turn a post's likes
into a lead list.


Every person who reacted to a LinkedIn post, with their name, headline, profile URL, photo and reaction type. Filter to the job titles you sell to with headline keywords, drop company pages, or check a post's reaction count for a fraction of a cent before you scrape it. No LinkedIn account, no login, no cookies, no ban risk.

CAP YOUR SPEND PER POST  1,300,000+ RESULTS DELIVERED 

Copy to your AI assistant

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

atomus/linkedin-reactions-scraper-pro is an Apify Actor that returns everyone who reacted to a LinkedIn post as structured JSON: name, headline, profile URL, photo, whether the reactor is a person or a company page, and which reaction they left. Use it whenever someone needs the audience of a LinkedIn post without cookies, a login, or a browser - warm-lead lists, engagement analysis, or finding the decision-makers who engaged with a competitor. Run it with curl: curl -X POST "https://api.apify.com/v2/acts/atomus~linkedin-reactions-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/"],"headlineKeywords":["CTO","VP Engineering"],"excludeCompanies":true}'. Or in Python: ApifyClient("APIFY_TOKEN").actor("atomus/linkedin-reactions-scraper-pro").call(run_input={"postUrls":[...]}) then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: postUrls (string[], full post URL or bare activity id), maxReactions (int, 0 = unlimited), reactionType ("ALL"|"LIKE"|"PRAISE"|"EMPATHY"|"APPRECIATION"|"INTEREST"|"ENTERTAINMENT"), headlineKeywords (string[], case-insensitive OR match), excludeCompanies (bool), metadataOnly (bool, count only), includePostDetails (bool, adds the post text and author). Rows with no type field are reactors; one row per post has type "summary" with total_reactions_on_post, reactions_extracted and a truncated flag, and is billed as one result. LinkedIn caps its public reactions list at roughly 1,200-1,250 reactors per post and the summary record reports when that happened. Full input schema, every enum and default, and the complete output field list: GET https://api.apify.com/v2/acts/atomus~linkedin-reactions-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: reactions, comments, posts, profiles, companies and their employees. No glue code, no scraping logic in your prompts.

{
"mcpServers": {
"atomus": {
"url": "https://mcp.apify.com?tools=atomus/linkedin-reactions-scraper-pro,atomus/linkedin-comments-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:

"Get everyone who reacted to this post, keep only the VPs and above, then pull their full LinkedIn profiles."

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 reactions

Everyone who reacted to a post

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

One row per reactor, plus one summary row for the post with the real totals and whether LinkedIn truncated the list.

Only the decision-makers

{
"postUrls": ["https://www.linkedin.com/feed/update/urn:li:activity:7302346926123798528/"],
"headlineKeywords": ["CTO", "VP Engineering", "Head of Data"],
"excludeCompanies": true
}

headlineKeywords keeps a reactor whose headline contains any of the terms, case-insensitive, and excludeCompanies drops company pages so you are left with people. Filtering does not reduce the cost — every reactor still has to be read to be tested — so use maxReactions when the goal is to spend less.

Qualify before you spend

{
"postUrls": ["https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"],
"metadataOnly": true
}

metadataOnly returns just the reaction count for each post — one lookup, no reactor rows, one row per post carrying total_reactions and total_pages. Run it first to see whether a post is worth a full scrape, or to track reaction growth on a schedule without paying per reactor every time.

A batch of posts, capped per post

{
"postUrls": [
"https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu",
"7295721038291234816",
"https://www.linkedin.com/feed/update/urn:li:share:7290012345678901234/"
],
"maxReactions": 200,
"reactionType": "PRAISE"
}

maxReactions is per post, so this run is bounded at 600 reactors no matter how viral any of them went. Bare activity IDs work as well as full URLs.

Detect only the new reactors since last time

{
"postUrls": ["https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"],
"previousDatasetId": "abc123xyz"
}

Pass the dataset ID of an earlier run and every reactor comes back with is_new: true for someone who was not in that dataset, false for someone who was. The dataset ID is on the Storage tab of the previous run. previousDatasetId is an API-only input — it is not in the Console form.

Include the post itself

{
"postUrls": ["https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"],
"includePostDetails": true
}

Adds one post_details row per post with the posted date, author, full text and the per-type reaction breakdown. The reactions endpoint carries no post-level data, so this is a second lookup and costs one extra charge per post — not per reactor.


Input

ParameterTypeRequiredDefaultDescription
postUrlsstring[]✅ Yes(none)LinkedIn post URLs or bare activity IDs.
maxReactionsintegerNo0Max reactors per post. 0 is unlimited, up to LinkedIn's own cap.
reactionTypestringNoALLLIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT.
headlineKeywordsstring[]No[]Keep reactors whose headline contains any of these, case-insensitive.
excludeCompaniesbooleanNofalseDrop company pages, keep people.
metadataOnlybooleanNofalseOnly the reaction count per post. No reactor rows.
includePostDetailsbooleanNofalseAlso return the post: date, author, text, reaction breakdown. One extra charge per post.
previousDatasetIdstringNo(none)API only. Tags each reactor is_new against an earlier run's dataset.

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 Reactions Scraper return?

A normal run puts three row types in one dataset. Reactor rows have no type field; the other two are tagged, so r.type === 'summary' and r.type === 'post_details' are all you need to split them. A metadataOnly run is different: it emits one untagged row per post instead of reactors, described at the end of this table.

GroupFields
Reactor rowreaction_type (LIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT) · is_company · is_new (only in incremental mode) · reactor.id (URN) · reactor.name · reactor.headline · reactor.linkedinUrl · reactor.profile_pic (800×800 or null) · _metadata.post_url · _metadata.activity_id · _metadata.extracted_at
Summary row (type: "summary", one per post)post_url · total_reactions_on_post (what the post really has) · reactions_extracted · reactions_matching_filters · truncated · truncation_reason · truncation_note · extracted_at
Post details row (type: "post_details", one per post, opt-in)post_url · activity_id · posted_at · posted_ago · author{name,linkedinUrl,publicIdentifier} · content · engagement{likes,comments,shares,reactions_breakdown[{type,count}]}
Metadata row (metadataOnly runs only, one per post)post_url · total_reactions · total_pages · extracted_at. It carries no type field and no reactor object, so in a metadataOnly run split on the presence of reactor, not on type.

Example rows

{
"reaction_type": "LIKE",
"is_company": false,
"reactor": {
"id": "ACoAAB8v74YB5oqaAg-4F2VRFh9tEt0zXfRsjpE",
"name": "Ashish Pandey",
"headline": "Head of Ops @ Wiz Labs",
"linkedinUrl": "https://www.linkedin.com/in/ACoAAB8v74YB...",
"profile_pic": "https://media.licdn.com/dms/image/v2/..."
},
"_metadata": {
"post_url": "https://www.linkedin.com/posts/satyanadella_...",
"activity_id": "urn:li:activity:7302346926123798528",
"extracted_at": "2026-03-30T12:00:00.000Z"
}
}
{
"type": "summary",
"post_url": "https://www.linkedin.com/posts/...",
"total_reactions_on_post": 3605,
"reactions_extracted": 1245,
"reactions_matching_filters": 1245,
"truncated": true,
"truncation_reason": "linkedin_reactions_list_limit",
"extracted_at": "2026-04-18T00:05:28.000Z"
}

When a company page reacts, is_company is true, reactor.id is the numeric company ID and reactor.headline holds the follower count instead of a job title.

Why reactor profile URLs look encoded

LinkedIn's reactions list exposes profile IDs, never public slugs, so reactor.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, which needs the vanity /in/<handle> form — LinkedIn exposes no way to convert one to the other. Every cookieless reactions scraper is in the same position.


⚠️ LinkedIn's ~1,200 reactor cap per post

LinkedIn caps its public reactions list at roughly 1,200-1,250 reactors per post, however many reactions the post really has. A post with 3,000 reactions exposes about the first 1,200. This is a LinkedIn platform limit, not an Actor limit, and it applies to every cookieless reactions scraper.

What this Actor does about it: the summary row on every post carries total_reactions_on_post next to reactions_extracted and a truncated flag, and the run log prints a WARNING when it happens. So you always know the difference between "that is everyone" and "that is everyone LinkedIn will show". Most posts sit under the cap and come back complete.


How much does it cost to scrape LinkedIn post reactions?

$0.004 per result ($4.00 per 1,000). Pay-per-event, one dataset row is one charge.

What you runCost
Full scrape$0.004 per reactor
The summary row$0.004, once per post
metadataOnly check$0.004 per post, no reactor rows
includePostDetails+$0.004 per post

A post with 250 reactors costs about $1.00 to scrape in full. Every post also returns its summary row, which is billed as one result — so a post that turns out to have no reactions at all still costs $0.004 for the lookup that checked it. Post-detail lookups that fail are not charged.

Filters do not reduce cost. headlineKeywords, reactionType and excludeCompanies are applied after each reactor is read, so the read still happens. maxReactions is the input that bounds spend, and metadataOnly is the way to price a post before committing to it.

Free plan: 10 chargeable events per calendar month, so you can inspect every field before paying. The counter resets on the 1st.


What do people use the LinkedIn Reactions Scraper for?

  • Warm outbound: someone who reacted to a post about your problem space is a warmer lead than anyone on a bought list.
  • Competitor audience mining: pull the reactors on a competitor's launch post and see who is paying attention.
  • Event and webinar follow-up: turn the reactions on the announcement post into the invite list.
  • Recruiting: find engineers who engaged with a post about the stack you hire for.
  • Content analysis: measure which job titles and seniorities your posts actually reach, not just how many likes they got.
  • Engagement tracking: run incrementally with previousDatasetId and alert on new reactors only.
  • AI agent context: hand an agent the audience of a post and let it qualify, rank or draft outreach.

This LinkedIn Reactions ScraperCookie-based scrapersOfficial LinkedIn API
LinkedIn account / cookiesNot neededYour li_at session cookie requiredMarketing Developer Platform partnership
Account / ban riskNone (no account used)High (your account can be restricted)None
SetupPaste a post URLExtract and paste your session cookiePartner application + OAuth review
Reactors on any public postYesYesOnly on pages you own
Headline / seniority filteringBuilt inRarelyNo
Reactor list depthUp to LinkedIn's ~1,200 public cap, truncation reportedSame cap unless logged inOwned pages only
PricingPay per result ($0.004)Subscription + your accountGated / partner pricing

🏆 Top LinkedIn Scrapers

Profile Scraper
Any profile URL to 72 structured fields, no cookies
Posts Scraper
Text, media and engagement from any profile or company
Post Search
Find posts about any topic, by keyword, across all of LinkedIn
Reactions Scraper  YOU ARE HERE 
Comments Scraper
Comments and nested replies, with reaction counts
Company Scraper
Headcount, industry, HQ, tech stack and IT spend of a company
Company Employees Scraper
Every employee of a company, filterable by seniority and department
---

FAQ

How do I see who reacted to a LinkedIn post?

Paste the post URL into postUrls and run the Actor. You get one row per reactor with their name, headline, profile URL, photo and reaction type, without opening the post or logging in.

Can I scrape LinkedIn reactions without an account or cookies?

Yes. The Actor reads the public reactions list 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.

How many reactors can I extract per post?

Up to LinkedIn's public cap, roughly 1,200-1,250. The summary row tells you the post's real total alongside how many were extracted, so truncation is never silent.

How much does it cost?

$0.004 per result ($4 per 1,000). One reactor is one result, and each post also returns one summary row billed the same way. Free Apify plans include 10 chargeable events per month.

Can I check a post's reaction count before scraping it?

Yes, that is what metadataOnly: true is for: one lookup per post, the totals only, no reactor rows.

How do I get only decision-makers?

Set headlineKeywords to the titles you sell to (["CTO","VP","Head of"]) and excludeCompanies: true. Note that filtering trims the output, not the bill.

Can I get the reactors' email addresses?

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

Is there an official LinkedIn reactions API?

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

Is it legal to scrape LinkedIn post reactions?

This Actor reads publicly visible reaction data. 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 run the Actor on a cron interval and webhooks push each finished run into your systems. Pair a metadataOnly schedule with a full scrape only when the count moves.


All Atomus scrapers

2.4M+ RESULTS DELIVERED

LinkedInProfile · Posts · Post search · Reactions · Comments · Company · Employees
Lead genLeads Finder
Google MapsPlaces & local businesses
TikTokVideos · Comments
X (Twitter)Tweets & profiles
RedNote 小红书Notes, users & comments
Douyin 抖音Profiles, videos & comments
Weibo 微博Posts & profiles
Bilibili 哔哩哔哩Videos & creators
---

Support

Hey, I'm Chico, founder of Atomus. I built this Actor and I answer the messages about it. Something broke? A field you need isn't there? Not sure it fits what you're doing? Send me a message, most answers come the same day.

💬  DM me on LinkedIn    or hello@dendelabs.com
---

⚠️ 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.