LinkedIn Post Reactions & Reactor Profiles Pro
Pricing
from $4.00 / 1,000 results
LinkedIn Post Reactions & Reactor Profiles Pro
Extract every reactor from LinkedIn posts: name, headline, profile URL, reaction type (like, celebrate, support, love, insightful, funny), and timestamp. Filter by headline keyword and run incremental scrapes to capture new reactors only. Auto-pagination, no LinkedIn account needed.
Pricing
from $4.00 / 1,000 results
Rating
5.0
(2)
Developer
Atomus APIs
Actor stats
2
Bookmarked
10
Total users
8
Monthly active users
2 days ago
Last modified
Categories
Share
๐ LinkedIn Post Reactions Scraper Pro
Extract detailed reaction data from any LinkedIn post โ including reactor names, headlines, profile URLs, and photos. Supports batch processing of up to 1,000 posts in a single run.
No LinkedIn account or cookies required.
๐ก For other LinkedIn tools by Dende Labs, check: https://apify.com/dendelabs
โจ Key Features
| Feature | Description |
|---|---|
| ๐ Auto-pagination | One run extracts every reaction LinkedIn exposes. No manual page management. See the LinkedIn Reactions Limit section for details on posts with very high engagement. |
| ๐ฆ Batch processing | Scrape up to 1,000 posts in a single run. |
| ๐ Headline keyword filters | Only include reactors matching specific keywords (e.g., "CEO", "VP"). |
| ๐ข Company detection | Each reactor is flagged as person or company page. |
| ๐ Incremental tracking | Compare with previous runs โ each reactor is marked as new or existing. |
| ๐ซ Exclude companies | Filter out company pages, keep only people. |
| ๐ All URL formats | Paste any LinkedIn post link โ even with tracking parameters. |
| ๐ No cookies needed | No risk of account restrictions or bans. |
๐ฅ 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
postUrls | string[] | โ Yes | โ | LinkedIn post URLs or activity IDs (up to 1,000) |
reactionType | string | No | ALL | Filter: ALL, LIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT |
maxReactions | integer | No | 0 | Max reactions per post. 0 = unlimited |
headlineKeywords | string[] | No | [] | Only include reactors whose headline contains these keywords |
excludeCompanies | boolean | No | false | Exclude company/org pages from results |
previousDatasetId | string | No | โ | Dataset ID from previous run for incremental tracking |
metadataOnly | boolean | No | false | Only fetch reaction counts, not individual reactions (see Metadata Only Mode) |
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 two record types:
- Reaction records โ one per reactor (the main output, described below).
- 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.
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 !== 'summary' && r.type !== 'error');const summaries = dataset.filter(r => r.type === 'summary');
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.
Output Fields Reference
Reaction record:
| Field | Type | Description |
|---|---|---|
reaction_type | string | LIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, or ENTERTAINMENT |
is_company | boolean | true if the reactor is a company page, false if a person |
is_new | boolean | Only present when using incremental tracking. true = new reactor, false = seen before |
reactor.id | string | LinkedIn profile or company URN |
reactor.name | string | Full name of the person or company |
reactor.headline | string | LinkedIn headline / tagline |
reactor.linkedinUrl | string | Direct link to the reactor's LinkedIn profile |
reactor.profile_pic | string | URL to profile photo (800x800) or null |
_metadata.post_url | string | The original post URL you provided as input |
_metadata.activity_id | string | LinkedIn activity URN of the post |
_metadata.extracted_at | string | ISO timestamp of when the data was extracted |
Summary record (type: "summary"):
| Field | Type | Description |
|---|---|---|
type | string | Always "summary" โ use to distinguish from reaction records |
post_url | string | The post this summary applies to |
total_reactions_on_post | integer | Total reactions the post has on LinkedIn |
reactions_extracted | integer | How many reactors the Actor actually extracted |
reactions_matching_filters | integer | Of those extracted, how many match your headline/reaction-type filters |
truncated | boolean | true if LinkedIn's ~1,200-reactor cap was hit; false if all reactors were extracted |
truncation_reason | string | null | "linkedin_reactions_list_limit" when truncated, null otherwise |
truncation_note | string | null | Human-readable explanation when truncated, null otherwise |
extracted_at | string | ISO 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. For example, 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.
๐ก Metadata-only mode costs just $0.004 per post (one result in the dataset). A full scrape of 1,000 reactions would cost $4.00. Use metadata to decide if the full scrape is worth it.
๐ค Integration with AI Agents
This actor is optimized for use with AI agents and LLMs via the Apify MCP server.
Output Schema
The actor produces a flat dataset. Most items are reaction records; one summary record (type: "summary") is pushed at the end of each post. Filter item.type !== 'summary' to get only reactions. Key fields on reaction records:
reactor.nameโ Who reactedreactor.headlineโ Their professional contextreaction_typeโ How they reactedis_companyโ Whether it's a company or person
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 use headlineKeywords: ["CEO", "VP", "Director"] to filter directly at scrape time, reducing post-processing.
๐ฏ 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
โน๏ธ 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.
โ ๏ธ 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 includestotal_reactions_on_post,reactions_extracted, and atruncatedflag โ see the Summary Record section for the full schema. - The Actor also logs a
WARNINGin the run log when truncation is detected, so it's 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.
โ ๏ธ 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.