LinkedIn Post Reactions Scraper ✅ NO COOKIES
Pricing
from $4.00 / 1,000 results
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
Maintained by CommunityActor stats
7
Bookmarked
187
Total users
41
Monthly active users
20 hours ago
Last modified
Categories
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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
postUrls | string[] | ✅ Yes | (none) | LinkedIn post URLs or bare activity IDs. |
maxReactions | integer | No | 0 | Max reactors per post. 0 is unlimited, up to LinkedIn's own cap. |
reactionType | string | No | ALL | LIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT. |
headlineKeywords | string[] | No | [] | Keep reactors whose headline contains any of these, case-insensitive. |
excludeCompanies | boolean | No | false | Drop company pages, keep people. |
metadataOnly | boolean | No | false | Only the reaction count per post. No reactor rows. |
includePostDetails | boolean | No | false | Also return the post: date, author, text, reaction breakdown. One extra charge per post. |
previousDatasetId | string | No | (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.
| Group | Fields |
|---|---|
| Reactor row | reaction_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 run | Cost |
|---|---|
| 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
previousDatasetIdand alert on new reactors only. - AI agent context: hand an agent the audience of a post and let it qualify, rank or draft outreach.
LinkedIn Reactions Scraper vs cookie-based tools vs the official LinkedIn API
| This LinkedIn Reactions 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 |
| Reactors on any public post | Yes | Yes | Only on pages you own |
| Headline / seniority filtering | Built in | Rarely | No |
| Reactor list depth | Up to LinkedIn's ~1,200 public cap, truncation reported | Same cap unless logged in | Owned pages only |
| Pricing | Pay per result ($0.004) | Subscription + your account | Gated / partner pricing |
🏆 Top LinkedIn Scrapers
|
Any profile URL to 72 structured fields, no cookies | |
|
Text, media and engagement from any profile or company | |
|
Find posts about any topic, by keyword, across all of LinkedIn | |
|
| |
|
Comments and nested replies, with reaction counts | |
|
Headcount, industry, HQ, tech stack and IT spend of a company | |
|
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
| Profile · Posts · Post search · Reactions · Comments · Company · Employees | |
| Leads Finder | |
| Places & local businesses | |
| Videos · Comments | |
| Tweets & profiles | |
| Notes, users & comments | |
| Profiles, videos & comments | |
| Posts & profiles | |
| 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.