Extracting audience engagement data from social platforms often presents a common engineering hurdle: UI limitations. On LinkedIn, when a post accumulates thousands of reactions, clicking the reaction count only reveals a partial modal. The interface caps the visible list of users, preventing manual or basic DOM-scraping tools from capturing the full picture.
For data engineers building lead generation pipelines or sentiment analysis models, this restriction is a critical bottleneck. Safely extracting this data requires interacting with the platform's internal APIs while managing session states and rate limits.
The LinkedIn Post Reactions Scraper solves this by querying the internal Voyager API—the same data layer that powers the official web application. This allows developers to retrieve structured profiles of users who engaged with any specific post.
Parsing LinkedIn Reactor Data Structures
When querying the reactions surface, the scraper bypasses the heavy web UI and directly extracts structured JSON. The output normalizes varied user interaction states into a clean, predictable schema.
For each reactor, the tool returns a dataset containing the following fields:
-
reactorName: The full name of the user. -
reactorProfileUrl: The direct link to their LinkedIn profile. -
reactorHeadline: The user's current headline or professional title. -
reactionType: The specific interaction type, mapped from raw API codes to human-readable strings (like,celebrate,love,support,insightful,funny,curious). -
postId: The unique numerical activity ID associated with the update. -
scrapedAt: An ISO 8601 UTC timestamp recording when the extraction occurred.
This structured format makes it easy to pipe data directly into downstream database tables or CRM systems without complex post-processing regex.
Here is an example of the structured JSON payload returned by the actor:
{
"reactorName": "Jane Doe",
"reactorProfileUrl": "https://www.linkedin.com/in/janedoe",
"reactorHeadline": "Senior Engineer at Acme Corp",
"reactionType": "like",
"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7234567890123456789/",
"postId": "7234567890123456789",
"inputPostUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7234567890123456789/",
"scrapedAt": "2025-01-15T10:30:00+00:00"
}
Configuring the Input Schema for Targeted Scraping
To execute a run, the scraper requires specific configuration parameters to navigate authentication and scope the request.
The Session Cookie (cookie)
Because the LinkedIn reaction modal is not publicly accessible without authentication, you must provide a valid session cookie. Specifically, the scraper requires the li_at cookie value, which authenticates requests to the Voyager API. You can extract this from your browser's Developer Tools under the Application tab, or export your full cookies array using a browser extension.
Target Posts (postUrls)
This array accepts complete LinkedIn URLs or bare activity IDs. The scraper natively parses standard formats, including:
- Activity URNs:
urn:li:activity:7234567890123456789 - Bare IDs:
7234567890123456789 - Feed update URLs:
https://www.linkedin.com/feed/update/urn:li:activity:7234567890123456789/
Scrape Volume and Filtering (maxReactorsPerPost and reactionTypeFilter)
LinkedIn strictly limits the visible list of reactors to approximately 1,000 per post, regardless of whether the post shows a higher reaction count in the UI. To optimize your run and control data volume, set the maxReactorsPerPost parameter (defaults to 100, with a maximum cap of 5,000 to accommodate edge-case API behavior).
If you only want to extract high-intent leads—such as users who left an "insightful" or "curious" reaction—you can configure the reactionTypeFilter array. Passing specific values like insightful or love instructs the scraper to drop other reaction types before writing to the dataset.
Step-by-Step Extraction Workflow
-
Retrieve your session cookie: Log into LinkedIn, open your browser's Developer Tools, navigate to the Cookies storage section for
www.linkedin.com, and copy the value of theli_atcookie. - Collect target URLs: Copy the URLs of the LinkedIn posts you want to analyze.
- Configure the input JSON: Construct your payload with the required variables. Below is a standard configuration payload:
{
"postUrls": [
"https://www.linkedin.com/feed/update/urn:li:activity:7234567890123456789/"
],
"cookie": "YOUR_LI_AT_COOKIE_VALUE_HERE",
"maxReactorsPerPost": 500,
"reactionTypeFilter": ["insightful", "love"],
"proxyConfiguration": {
"useApifyProxy": true,
"groups": ["RESIDENTIAL"]
}
}
- Run the Actor: Execute the run on the Apify platform. The scraper will automatically handle rate limits using exponential backoff, mimicking human pacing to avoid session invalidation.
Calculating Run Costs on the Pay-Per-Event Model
This scraper operates under a strict Pay-Per-Event pricing model, meaning you are only billed for specific successful actions rather than execution time or arbitrary platform units.
The costs are calculated using two distinct event types:
- "Actor Start" (apify-actor-start): Charged once per run at a flat rate of $0.005 per GB of memory allocated to the run.
-
"result" (apify-default-dataset-item): Charged per individual reactor profile successfully written to the default dataset. This event uses volume-tier pricing:
- FREE: $0.005 per result
- BRONZE: $0.00433 per result
- SILVER: $0.00367 per result
- GOLD: $0.003 per result
- PLATINUM: $0.003 per result
- DIAMOND: $0.003 per result
For example, running a single-GB execution to extract 500 reactors under the FREE tier would cost exactly $0.005 for the start event and $2.50 for the 500 result events, bringing the total run cost to $2.505.
Knowing When to Use a Different Tool
While this scraper is highly efficient for targeted engagement analysis, it is not a general-purpose search tool. It cannot search for posts globally by keyword or hashtag; it requires specific, pre-determined post URLs or activity IDs to begin extraction. If your pipeline requires finding high-performing posts before analyzing who reacted to them, you would need to feed this actor with URLs extracted from a separate keyword-search scraper first.
Source for the runs in this article: LinkedIn Post Reactions Scraper. The input schema there is authoritative; treat anything in this post that contradicts it as out of date.
Top comments (0)