# LinkedIn Profile Reactions Scraper (`khadinakbar/linkedin-profile-reactions-scraper`) Actor

Extract posts a public LinkedIn profile reacted to (liked, celebrated, supported) with action type, post URL, author handle, and text preview. Provider-backed plus public HTML fallback. Cookieless, no login and MCP-ready.

- **URL**: https://apify.com/khadinakbar/linkedin-profile-reactions-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 linkedin profile reaction scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Profile Reactions Scraper

Turn a public LinkedIn person profile URL or vanity handle into one dataset row per visible reaction that person gave — like, celebrate, support, love, insightful, or funny — with the reacted-to post URL, author handle, action label, and a short post preview. Designed for lead-intent researchers, creator-vetting teams, and outreach agents who want topic-interest signals from public activity. No LinkedIn login or cookies.

The Actor reads public guest activity LinkedIn already shows on a profile, plus any reaction items a managed profile provider returns. Typical yield is a handful of recent public likes, which is enough to see what a person engages with.

### Best fit for this Actor

- Start with a person profile (`/in/handle` or a bare handle) when you want the posts that person reacted to, not reactors on a post you already have.
- Use `maxReactionsPerProfile` to keep each profile to a bounded public-activity sample (default 25, quality prefill 10).
- After you have reacted-to post URLs, continue with [LinkedIn Profile Details Scraper](https://apify.com/khadinakbar/linkedin-profile-details-scraper) on the post authors, or [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper) when you still need to find people by keyword first.

### Practical scenario

An agency researcher pastes `https://www.linkedin.com/in/parrsam/` with `maxReactionsPerProfile` set to 10. The run returns rows such as `reactionType: LIKE`, the boutique-hotel post URL, `postAuthorHandle`, and a text preview. The researcher keeps authors whose topics match the client brief, then passes those author URLs into LinkedIn Profile Details Scraper for public about and experience fields.

### Quick start input

```json
{
  "profileUrls": ["https://www.linkedin.com/in/parrsam/"],
  "maxReactionsPerProfile": 10,
  "includeShares": false,
  "enrichPosts": false,
  "providerOrder": "scrapecreators-first",
  "maxConcurrency": 2
}
```

`profileUrls` accepts full `/in/` URLs or bare vanity handles. One unique profile can produce several reaction rows, capped by `maxReactionsPerProfile`. Company pages and post URLs belong in a company or post Actor.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `profileUrls` | array | Required person profiles. Example: `https://www.linkedin.com/in/parrsam/`. Max 50 unique values. |
| `maxReactionsPerProfile` | integer | Cap per profile. Default 25, prefill 10, max 100. Caps cost to public activity LinkedIn shows without login. |
| `includeShares` | boolean | When true, public share and repost activity is saved with the reaction rows. Default false. |
| `enrichPosts` | boolean | When true, each reacted-to post is fetched for author name and counts. Adds a `post-enriched` event. |
| `providerOrder` | enum | `scrapecreators-first` (default), `sociavault-first`, or a single-vendor option. Keys stay owner secrets. |
| `maxConcurrency` | integer | Parallel profiles. Default 2, range 1–5. |

### What data you receive

One dataset item is one public reaction a source profile gave.

```json
{
  "profileUrl": "https://www.linkedin.com/in/parrsam/",
  "profileHandle": "parrsam",
  "profileName": "Sam Parr",
  "reactionType": "LIKE",
  "actionLabel": "Sam Parr liked this",
  "postUrl": "https://www.linkedin.com/posts/annacogswell_whats-the-best-boutique-hotel-youve-ever-activity-7495130403033272320-hzaE",
  "postId": "7495130403033272320",
  "postAuthorHandle": "annacogswell",
  "postTextPreview": "What's the best boutique hotel you've ever stayed at?",
  "enriched": false,
  "provider": "scrapfly",
  "source": "public-html",
  "scrapedAt": "2026-08-21T12:00:00.000Z"
}
```

| Field | Meaning |
|---|---|
| `reactionType` | `LIKE`, `PRAISE`, `EMPATHY`, `INTEREST`, `APPRECIATION`, `ENTERTAINMENT`, or `SHARE` when shares are enabled. |
| `postUrl` | LinkedIn URL of the post this profile reacted to. |
| `source` | `provider-activity` or `public-html`. |
| `outcome` in OUTPUT | `COMPLETE` when rows saved; `VALID_EMPTY` when the profile is public but no guest reactions are visible (no `reaction-scraped` charge). |

`OUTPUT` and `RUN_SUMMARY` in the default key-value store hold `outcome`, `itemsPushed`, and `chargedEventCounts`.

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~linkedin-profile-reactions-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profileUrls":["https://www.linkedin.com/in/parrsam/"],"maxReactionsPerProfile":10}'
```

Download rows as JSON, CSV, Excel, or HTML from the Dataset tab.

### Use with AI agents through Apify MCP

> Extract public LinkedIn profile reactions for https://www.linkedin.com/in/parrsam/. Return reactionType, postUrl, postAuthorHandle, postTextPreview, provider, and scrapedAt. Cap at 10 reactions. Read OUTPUT.outcome and itemsPushed before treating an empty dataset as a miss.

Connect via <https://mcp.apify.com>. Keep source `postUrl` values for provenance. Confirm cost on the live Pricing tab before raising `maxReactionsPerProfile`.

### Connect the workflow

- Start with [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper) when you have a keyword instead of profile URLs, then pass the returned `profileUrl` values here.
- After you have post authors, enrich public about and experience with [LinkedIn Profile Details Scraper](https://apify.com/khadinakbar/linkedin-profile-details-scraper).
- For work emails on those profiles, use [LinkedIn Profile Email Scraper](https://apify.com/khadinakbar/linkedin-profile-email-scraper).
- After you have people from this Actor, search open roles around them with [LinkedIn Jobs Scraper](https://apify.com/khadinakbar/linkedin-jobs-scraper).

### Pricing

Pay per event plus platform usage. Confirm current event prices on the live Pricing tab; that tab is the source of truth if this page ever lags.

- `apify-actor-start`: $0.00005 per run
- `reaction-scraped`: **$0.005** per saved reaction row
- `post-enriched`: $0.008 per successfully enriched reacted-to post

A one-profile, 10-reaction check is about $0.05 in result events plus Apify platform usage. `VALID_EMPTY` profiles have no `reaction-scraped` charge. Provider credits are paid by the Actor owner.

### How it works

1. Normalize and deduplicate profile URLs and handles.
2. Fetch public profile identity from ScrapeCreators, then SociaVault, and parse any reaction items in `activity`.
3. When more public reactions are needed, render the public profile HTML and parse guest “liked this” / “celebrated this” cards, pairing each action with the nearest other-author post URL.
4. Charge `reaction-scraped` only after a usable row, then write the dataset item. Optional post enrichment adds `post-enriched`.

### Best results

- Provide `/in/` person URLs or vanity handles. Keep company pages for the company Actor and post URLs for a post Actor.
- Start with `maxReactionsPerProfile` at 10 for a cheap sample, then raise toward 25 when the public activity list is long.
- Leave `enrichPosts` off when action type plus post URL is enough; turn it on when you need author name and post counts.
- A missing or private-looking handle finishes `SUCCEEDED` with `VALID_EMPTY` and no `reaction-scraped` charge when public data has no guest reactions.

### Builder's note

I found that LinkedIn’s public profile JSON from managed providers often returns an empty `activity` array even when the live profile page still shows “liked this” cards for other authors. I designed the runtime to keep those provider identity fields, then fall back to public HTML for the reaction rows guests can already see. The login-gated Reactions tab stays out of this contract; the useful signal is the handful of public likes LinkedIn already renders without cookies.

### Legal and responsible use

Use this Actor on public LinkedIn data you are authorized to process, follow applicable law and LinkedIn's terms, and keep the output in your own compliance workflow. This Actor is independent of LinkedIn.

Issues and feature requests: use the Actor Issues tab on Apify.

# Actor input Schema

## `profileUrls` (type: `array`):

Public LinkedIn person profiles to read reactions from. Accepts full URLs (https://www.linkedin.com/in/parrsam/) or bare vanity handles (parrsam). Up to 50 unique profiles per run. NOT company pages (/company/...) and NOT post URLs — use a company or post Actor for those.

## `maxReactionsPerProfile` (type: `integer`):

Maximum reaction rows to save per profile. Default 25 matches the public activity LinkedIn shows without login. This caps output and cost; it does not invent extra reactions. Raise toward 100 only when you expect a long public activity list.

## `includeShares` (type: `boolean`):

When enabled, public share/repost activity is saved alongside likes and other reactions. Default false keeps the dataset to reaction actions (like, celebrate, support, love, insightful, funny). Shares are not billed differently.

## `enrichPosts` (type: `boolean`):

When enabled, each reacted-to post URL is fetched for author name, reaction count, and comment count. Enrichment costs an additional $0.008 per successfully enriched row on top of the $0.005 reaction charge. Leave disabled when action plus post URL is enough.

## `providerOrder` (type: `string`):

Which managed public-profile provider to try first for identity and any activity array. Public HTML fallback still runs when more reactions are needed. Keep the default unless one provider is degraded. NOT a place for API keys — keys are owner secrets.

## `maxConcurrency` (type: `integer`):

How many profiles to process in parallel. Default 2 balances speed against provider rate limits. Lower to 1 if you see rate-limit errors.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/parrsam/"
  ],
  "maxReactionsPerProfile": 10,
  "includeShares": false,
  "enrichPosts": false,
  "providerOrder": "scrapecreators-first",
  "maxConcurrency": 2
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset items containing source profile, reaction type, reacted-to post URL, author handle, and optional post enrichment.

## `summary` (type: `string`):

Run summary including outcome, reactionsSaved, provider diagnostics, warnings, and billing counters.

## `runSummary` (type: `string`):

Machine-readable RUN\_SUMMARY record mirroring OUTPUT for integrations that read RUN\_SUMMARY directly.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profileUrls": [
        "https://www.linkedin.com/in/parrsam/"
    ],
    "maxReactionsPerProfile": 10,
    "includeShares": false,
    "enrichPosts": false,
    "maxConcurrency": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/linkedin-profile-reactions-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "profileUrls": ["https://www.linkedin.com/in/parrsam/"],
    "maxReactionsPerProfile": 10,
    "includeShares": False,
    "enrichPosts": False,
    "maxConcurrency": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/linkedin-profile-reactions-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profileUrls": [
    "https://www.linkedin.com/in/parrsam/"
  ],
  "maxReactionsPerProfile": 10,
  "includeShares": false,
  "enrichPosts": false,
  "maxConcurrency": 2
}' |
apify call khadinakbar/linkedin-profile-reactions-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/linkedin-profile-reactions-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VvGrsdDy9QgUSYgxT/builds/QbnXwnUrUBAyc4N2e/openapi.json
