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

5.0

(3)

Developer

Atomus APIs

Atomus APIs

Maintained by Community

Actor stats

3

Bookmarked

49

Total users

27

Monthly active users

3 days ago

Last modified

Share

LinkedIn Post Reactions Scraper

A LinkedIn reactions scraper that extracts everyone who reacted to a LinkedIn post: reactor name, headline, profile URL, profile photo, reaction type (like, celebrate, support, love, insightful, funny), and timestamp. Paste a post URL and the Actor auto-paginates through the full public reactions list. No LinkedIn account, login, or cookies required.

Over 1 million reactions scraped and counting. Scrape up to 1,000 posts in a single run, with auto-pagination through the full public reactions list.

๐Ÿ’ก More LinkedIn tools by Atomus: https://apify.com/atomus


What does this LinkedIn Reactions Scraper do?

FeatureDescription
๐Ÿ”„ Auto-paginationOne run extracts every reaction LinkedIn exposes. No manual page management. See the LinkedIn reactions limit section for very high-engagement posts.
๐Ÿ“ฆ Batch processingScrape reactions from up to 1,000 posts in a single run.
๐Ÿ” Headline keyword filtersOnly include reactors matching specific keywords (e.g. "CEO", "VP", "Founder").
๐Ÿข Company detectionEach reactor is flagged as a person or a company page.
๐Ÿ“Š Incremental trackingCompare with previous runs. Each reactor is marked as new or existing.
๐Ÿšซ Exclude companiesFilter out company pages and keep only people.
๐Ÿ”— Any URL formatPaste any LinkedIn post link, even with tracking parameters, or just the activity ID.
๐Ÿ” No cookies neededNo login, no li_at cookie, no risk of account restrictions or bans.
๐Ÿ“ˆ Metadata-only modeCheck a post's total reaction count for a fraction of a cent before a full scrape.

What data can you extract from LinkedIn reactions?

For every reactor on a post, the Actor returns:

Data pointExample
Reactor nameAshish Pandey
HeadlineHead of Ops @ Wiz Labs
Profile URLhttps://www.linkedin.com/in/ACoAAB8v74YB...
Profile photohttps://media.licdn.com/dms/image/... (800x800) or null
Reaction typeLIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT
Person or companyis_company: true / false
New vs existingis_new flag when using incremental tracking

See the output reference below for the full schema and a per-post summary record.


How do I scrape LinkedIn post reactions?

  1. Open the Actor and paste one or more LinkedIn post URLs into Post URLs or IDs.
  2. (Optional) Add Headline keywords like CEO, VP, Founder to keep only decision-makers.
  3. (Optional) Toggle Exclude company pages to keep only people.
  4. Click Start. The Actor auto-paginates and writes one record per reactor to the dataset.
  5. When the run finishes, view the reactor records in the run's dataset or fetch them via the Apify API. You can also run it on a schedule.

You can also run it on a schedule, call it through the Apify API, or drive it from an AI agent via the Apify MCP server. See Use it with AI agents.


Input

Basic usage

Just paste one or more LinkedIn post URLs:

{
"postUrls": [
"https://www.linkedin.com/posts/satyanadella_no-one-becomes-a-clinician-to-do-paperwork-activity-7302346926123798528-jitu"
]
}

All input parameters

ParameterTypeRequiredDefaultDescription
postUrlsstring[]โœ… Yesโ€”LinkedIn post URLs or activity IDs (up to 1,000)
reactionTypestringNoALLFilter: ALL, LIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT
maxReactionsintegerNo0Max reactions per post. 0 = unlimited
headlineKeywordsstring[]No[]Only include reactors whose headline contains these keywords
excludeCompaniesbooleanNofalseExclude company/org pages from results
previousDatasetIdstringNoโ€”Dataset ID from previous run for incremental tracking
metadataOnlybooleanNofalseOnly fetch reaction counts, not individual reactions (see Metadata Only mode)
includePostDetailsbooleanNofalseAlso return the post itself (posted date, author, text, reaction-type breakdown) as one post_details record per post. Costs +$0.004 per post (see Post details record)

Supported URL formats

All of these work, just paste whatever you have:

โœ… 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&utm_medium=...
โœ… 7302346926123798528

Output

The dataset contains these record types:

  1. Reaction records โ€” one per reactor (the main output, described below).
  2. Summary records โ€” one per post (type: "summary"), pushed at the end of each post's scrape with totals and a truncation flag. See Summary record and the LinkedIn reactions limit section.
  3. Post details records โ€” one per post (type: "post_details"), only when includePostDetails is enabled. Carries the post itself: posted date, author, text, and reaction-type breakdown. See Post details record.

If your integration iterates the dataset, filter by the type field (or check for the absence of reactor):

const reactions = dataset.filter(r => !r.type); // reaction rows have no `type`
const summaries = dataset.filter(r => r.type === 'summary');
const postDetails = dataset.filter(r => r.type === 'post_details');

Single reaction

Each reaction in the dataset looks like this:

{
"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"
}
}

Company reactor example

When a company page reacts to a post, is_company is true:

{
"reaction_type": "LIKE",
"is_company": true,
"reactor": {
"id": "106345960",
"name": "Dende Labs",
"headline": "2 followers",
"linkedinUrl": "https://www.linkedin.com/company/dendelabs/",
"profile_pic": null
},
"_metadata": {
"post_url": "https://www.linkedin.com/posts/...",
"activity_id": "urn:li:activity:7399183215997108224",
"extracted_at": "2026-03-30T12:00:00.000Z"
}
}

Summary record (one per post)

At the end of every post's scrape, the Actor pushes one extra record with type: "summary". It reports how many reactions the post actually has, how many were extracted, and whether the result was truncated by LinkedIn's ~1,200-reactor cap.

{
"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",
"truncation_note": "LinkedIn limits the public reactions list to approximately 1,200-1,250 reactors per post...",
"extracted_at": "2026-04-18T00:05:28.000Z"
}

For posts where all reactors were extracted, truncated: false and truncation_reason/truncation_note are null.

Post details record (one per post, optional)

When you enable includePostDetails, the Actor pushes one extra record per post with type: "post_details" before that post's reactions. The reactions list alone has no post-level data โ€” this record is a separate lookup that returns the post's posted date, author, full text, and the count of each reaction type.

{
"type": "post_details",
"post_url": "https://www.linkedin.com/feed/update/urn:li:activity:7302346926123798528/",
"activity_id": "7302346926123798528",
"posted_at": "2025-03-03T15:19:38.233Z",
"posted_ago": "1 year ago โ€ข Visible to anyone on or off LinkedIn",
"author": {
"name": "Satya Nadella",
"linkedinUrl": "https://www.linkedin.com/in/satyanadella/",
"publicIdentifier": "satyanadella"
},
"content": "No one becomes a clinician to do paperwork...",
"engagement": {
"likes": 20367,
"comments": 762,
"shares": 2346,
"reactions_breakdown": [
{ "type": "LIKE", "count": 17352 },
{ "type": "PRAISE", "count": 1267 },
{ "type": "EMPATHY", "count": 1174 },
{ "type": "INTEREST", "count": 460 },
{ "type": "APPRECIATION", "count": 100 },
{ "type": "ENTERTAINMENT", "count": 14 }
]
},
"extracted_at": "2026-05-27T12:00:00.000Z"
}

This adds one request per post (+$0.004/post). If a post's details can't be fetched (private, deleted, or a temporary upstream issue), the record is skipped and you are not charged for it โ€” the reactions scrape continues normally.

Output fields reference

Reaction record:

FieldTypeDescription
reaction_typestringLIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, or ENTERTAINMENT
is_companybooleantrue if the reactor is a company page, false if a person
is_newbooleanOnly present when using incremental tracking. true = new reactor, false = seen before
reactor.idstringLinkedIn profile or company URN
reactor.namestringFull name of the person or company
reactor.headlinestringLinkedIn headline / tagline
reactor.linkedinUrlstringDirect link to the reactor's LinkedIn profile
reactor.profile_picstringURL to profile photo (800x800) or null
_metadata.post_urlstringThe original post URL you provided as input
_metadata.activity_idstringLinkedIn activity URN of the post
_metadata.extracted_atstringISO timestamp of when the data was extracted

Summary record (type: "summary"):

FieldTypeDescription
typestringAlways "summary" โ€” use to distinguish from reaction records
post_urlstringThe post this summary applies to
total_reactions_on_postintegerTotal reactions the post has on LinkedIn
reactions_extractedintegerHow many reactors the Actor actually extracted
reactions_matching_filtersintegerOf those extracted, how many match your headline/reaction-type filters
truncatedbooleantrue if LinkedIn's ~1,200-reactor cap was hit; false if all reactors were extracted
truncation_reasonstring | null"linkedin_reactions_list_limit" when truncated, null otherwise
truncation_notestring | nullHuman-readable explanation when truncated, null otherwise
extracted_atstringISO timestamp of when the post finished scraping

Examples

Example 1: Get all reactions from a single post

{
"postUrls": [
"https://www.linkedin.com/posts/satyanadella_no-one-becomes-a-clinician-to-do-paperwork-activity-7302346926123798528-jitu"
]
}

Example 2: Batch โ€” scrape reactions from multiple posts

{
"postUrls": [
"https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu",
"https://www.linkedin.com/posts/billgates_activity-7300000000000000000-abcd",
"https://www.linkedin.com/feed/update/urn:li:activity:7298765432109876543/"
]
}

Example 3: Only get reactions from decision-makers

Use headlineKeywords to filter reactors by their LinkedIn headline:

{
"postUrls": [
"https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528-jitu"
],
"headlineKeywords": ["CEO", "CTO", "VP", "Founder", "Director", "Head of"]
}

Only reactors whose headline contains at least one of these keywords will be included.

Example 4: Only people, no company pages

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

Example 5: Filter by reaction type

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

Available types: ALL, LIKE, PRAISE (Celebrate), EMPATHY (Love), APPRECIATION (Insightful), INTEREST (Curious), ENTERTAINMENT (Funny)

Example 6: Limit results per post

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

Example 7: Incremental tracking โ€” detect new reactors

First run โ€” scrape all reactions:

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

Second run โ€” pass the previous dataset ID to tag each reactor as new or existing:

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

Each reactor in the output will have an is_new field:

  • true โ€” this reactor was NOT in the previous dataset (new engagement)
  • false โ€” this reactor was already in the previous dataset

๐Ÿ’ก You can find the dataset ID in the Apify Console under the Storage tab of your previous run.

Example 8: Metadata only โ€” check reaction count before scraping

Use metadataOnly to quickly check how many reactions a post has without extracting them all. This makes just one API call per post and returns only the totals.

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

Output:

{
"post_url": "https://www.linkedin.com/posts/satyanadella_...",
"total_reactions": 847,
"total_pages": 9,
"extracted_at": "2026-03-31T12:00:00.000Z"
}

When to use this:

  • Avoid unnecessary scrapes โ€” Check if a post has new reactions since your last run before paying for a full extraction. If you scraped 847 reactions yesterday and the metadata still shows 847 today, you can skip the full scrape.
  • Cost estimation โ€” Know exactly how many reactions (and how much it will cost) before committing to a full run.
  • Monitoring dashboards โ€” Track reaction growth over time without extracting every reactor each time.

How much does it cost to scrape LinkedIn reactions?

This Actor uses Apify's pay-per-event pricing, so you only pay for what you extract:

What you runCost
Metadata only (reaction count for one post)$0.004 per post
Full scrape$0.004 per reaction extracted ($4.00 per 1,000 reactors)
Post details (includePostDetails)+$0.004 per post

A post with 250 reactions costs about $1.00 to scrape in full. Use Metadata Only mode first to check a post's reaction count for a fraction of a cent before committing to a full run. includePostDetails adds one flat charge per post (not per reactor) for the post's date, author, text, and reaction breakdown.

๐Ÿ’ก Filtering with headlineKeywords, reactionType, or excludeCompanies does not reduce cost, because the Actor still has to read every reactor to apply the filter. Use maxReactions to hard-cap spend per post.


โš ๏ธ LinkedIn reactions limit (~1,200 per post)

LinkedIn caps its public reactions list at approximately 1,200-1,250 reactors per post, no matter how many reactions the post actually has. If you scrape a post with 3,000 reactions, only the first ~1,200 reactors are exposed by LinkedIn's public list. The rest are invisible to any scraper that does not use a logged-in LinkedIn account cookie (li_at).

This is a LinkedIn platform limitation, not a limitation of this Actor. Every cookieless reactions scraper is subject to the same cap.

How this Actor handles it:

  • Every post's output ends with a summary record (type: "summary") that includes total_reactions_on_post, reactions_extracted, and a truncated flag. See the Summary record section.
  • The Actor logs a WARNING in the run log when truncation is detected, so it is visible without parsing the dataset.
  • Use Metadata Only mode to check the true total reaction count on a post before running a full scrape, with no per-reaction cost.

What this means for you:

  • For posts with โ‰ค 1,200 reactions (the vast majority of posts), you get the full list.
  • For high-engagement posts (viral content, posts from top influencers), the Actor extracts the first ~1,200 reactors and reports the truncation transparently. No silent data loss.

๐Ÿค– Use it with AI agents and MCP

This Actor is optimized for use with AI agents and LLMs via the Apify MCP server. An agent can scrape a post and filter for decision-makers in a single call.

Example agent prompt:

"Scrape all reactions from this LinkedIn post and find decision-makers (CEOs, VPs, Directors) who engaged with it. Return their names and LinkedIn URLs."

The agent can pass headlineKeywords: ["CEO", "VP", "Director"] to filter directly at scrape time, reducing post-processing. The dataset is flat: most items are reaction records, and one summary record (type: "summary") is pushed per post. Filter item.type !== 'summary' to get only reactions.


Use cases

  • ๐Ÿ”Ž Sales prospecting โ€” Find decision-makers engaging with competitor or industry content.
  • ๐Ÿ“Š Market research โ€” Analyze who engages with thought leaders in your space.
  • ๐Ÿ† Competitor analysis โ€” Track engagement patterns on competitor posts.
  • ๐Ÿ“‹ Lead generation โ€” Build targeted lists from post engagement data.
  • ๐Ÿ“ˆ Content strategy โ€” Understand what types of professionals engage with specific topics.
  • ๐Ÿ”„ Engagement monitoring โ€” Track reaction growth over time with incremental mode.

CapabilityThis scraper (cookieless)Cookie-based scrapersOfficial LinkedIn API
LinkedIn account / cookieNot neededRequired (li_at)OAuth app required
Account restriction riskNoneYesNone
Reactor name, headline, profile URLโœ…โœ…Not available for third-party posts
Reaction type per reactorโœ…โœ…Not available
Max reactors per post~1,200 (LinkedIn public-list cap)Can exceed ~1,200 when logged inNot applicable
SetupPaste a post URLExtract and paste your cookieApp review + permissions

For the vast majority of posts (โ‰ค 1,200 reactions), the cookieless approach returns the full list with zero account risk. Cookie-based tools only pull ahead on rare viral posts with several thousand reactions, and they put your account at risk to do it.


Other LinkedIn scrapers by Atomus

ActorWhat it does
LinkedIn Post Comments & Replies Scraper ProExtract every comment and reply on a LinkedIn post, with reaction counts and reply tracking.
LinkedIn Posts ScraperScrape posts, text, media, and engagement counts from any LinkedIn profile or company.
LinkedIn Profile ScraperEnrich LinkedIn profile URLs into full structured profiles: experience, education, skills, and more.

See all tools at apify.com/atomus.


FAQ

How do I see who reacted to a LinkedIn post?

Paste the post URL into this Actor and run it. It returns every reactor LinkedIn exposes publicly, including their name, headline, profile URL, profile photo, and the exact reaction type (like, celebrate, support, love, insightful, funny). No LinkedIn account or cookie is needed.

Can I scrape LinkedIn reactions without a LinkedIn account or cookies?

Yes. This is a cookieless scraper. You never log in, never paste a li_at cookie, and never put a LinkedIn account at risk. You only provide the public post URL.

Is there an official LinkedIn reactions API?

LinkedIn's official API does not expose reactor-level data for arbitrary third-party posts, which is why most teams use a scraper. This Actor gives you the same reactor data through a simple URL input, with no app review or OAuth required.

How many reactions can I extract per post?

LinkedIn caps its public reactions list at approximately 1,200-1,250 reactors per post. For most posts that is the full list. For viral posts with more reactions, the Actor extracts the first ~1,200 and reports the truncation transparently in a summary record. See the LinkedIn reactions limit section.

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

Yes. Turn on Metadata Only mode to fetch just the total reaction count for each post in one cheap call. Use it to decide whether a full scrape is worth it, or to detect whether a post has new reactions since your last run.

How do I scrape only decision-makers from a post?

Use the headlineKeywords filter with terms like CEO, VP, Founder, or Head of. Only reactors whose LinkedIn headline contains at least one of those keywords are returned. Combine it with excludeCompanies: true to drop company pages.

Is it legal to scrape LinkedIn post reactions?

This Actor only collects data that LinkedIn already exposes publicly, without logging in. Whether a given use is permitted depends on your jurisdiction and how you use the data (for example, GDPR/CCPA obligations apply to personal data). Consult your legal counsel for your specific use case.


โ„น๏ธ Profile URL format

LinkedIn returns profile URLs in profile ID format for reactions, for example:

https://www.linkedin.com/in/ACoAAB8v74YB5oqaAg-4F2VRFh9tEt0zXfRsjpE

Instead of the human-friendly slug format:

https://www.linkedin.com/in/john-doe

This is a LinkedIn limitation. The reactions popup only exposes profile IDs, not public slugs. Both formats are valid and redirect to the same profile. This is the standard behavior across all LinkedIn reaction scrapers.


โš ๏ธ 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.