# LinkedIn User Reactions Scraper \[NO COOKIES] ✅ (`unseenuser/linkedin-user-reactions`) Actor

Scrape every reaction (like, celebrate, support) a LinkedIn user has given, with the full post, author and engagement. Optional interest profile shows their topics, favourite authors and active hours at a glance. Paste a list of people. No login, no cookies.

- **URL**: https://apify.com/unseenuser/linkedin-user-reactions.md
- **Developed by:** [Unseen User](https://apify.com/unseenuser) (community)
- **Categories:** Lead generation, Social media, Automation
- **Features:** Limited permissions
- **Stats:** 33 total users, 5 monthly users, 100.0% runs succeeded, 5 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ❤️ LinkedIn User Reactions Scraper - The LinkedIn Reactions API for Every Like, Celebrate and Support (No Login)

> **No cookies. No login. No account-ban risk.** Unlike PhantomBuster, Dux-Soup, Linked Helper, or browser-extension scrapers, this Actor never touches your LinkedIn session. Your account stays clean.

Pull every reaction (LIKE, EMPATHY, PRAISE, INTEREST, APPRECIATION, ENTERTAINMENT) that a LinkedIn profile has given to other people's content. Lightweight breadth signal for prospect mapping, lead scoring, and topic-affinity research.

Treat it as the LinkedIn reactions API that LinkedIn itself does not publish: a list of people goes in, every post each of them reacted to comes out, with no login, no cookies and no API key of your own to manage.

> **Looking for comment text?** This Actor returns reactions, not comments the person wrote. You still get the exact reaction timestamp, the full post text, the post author, and engagement counts on every row. If you need the person's own written comments, use the [LinkedIn User Comments & Reactions Scraper](https://apify.com/unseenuser/LinkedIn-user-comments-reactions). Reactions are far broader. Use this Actor for breadth, the Comments Actor for depth.

### Free plan limit

Free Apify users get up to **5 results per run** - a sample, not a full result set. Paying users are not affected and receive results normally.

This limit was set by the Actor developer, not by Apify. To remove it and receive unlimited results, upgrade to any paid Apify plan: https://apify.com/pricing

When a free plan run hits the cap, the Actor finishes successfully (status `SUCCEEDED`) and the run's status message explains what happened. No error is raised, so the results you do get are fully usable as normal.

### This Actor vs. cookie-based scrapers

| | This Actor | PhantomBuster / Dux-Soup / Linked Helper |
| --- | --- | --- |
| **Account safety** | Zero risk - never touches your LinkedIn session | High risk - LinkedIn detects automation on logged-in sessions and bans accounts |
| **Setup time** | ~30 seconds - paste a profile URL and click Run | 10-30 minutes - install extension, paste session cookies, configure throttles |
| **Bulk scale** | Run thousands of profiles via Apify API or schedule | Throttled per session; risk grows with volume |
| **Cookie maintenance** | None | Re-paste session cookies whenever LinkedIn logs you out |
| **Multi-account orchestration** | Just one Actor run | One scraper instance per LinkedIn cookie |
| **CI/automation friendly** | Yes - clean HTTP, Apify scheduling, webhooks | No - browser sessions break in headless CI |

### 🎯 Use cases

- **Prospect mapping** - breadth view of what topics a target engages with
- **Lead scoring** - count and categorize reactions (PRAISE > LIKE)
- **Topic affinity** - identify creators or topic-experts a prospect consistently engages with
- **Warm-outreach hooks** - reference a recent reaction (lighter touch than referencing a comment)
- **Competitive monitoring** - see whose content competitor executives consistently endorse
- **Influencer audit** - verify reaction patterns of paid influencers vs. their posting topics
- **Recruiter sourcing** - find candidates whose engagement signals align with role topics
- **Content marketing research** - identify which content gets reactions from your ICP profiles

### Doing this by hand, and where it stops working

You do not need this Actor to look at one person once. LinkedIn shows reactions for free:

1. Open the person's LinkedIn profile
2. Find **Activity**
3. Click **Show all activity**
4. Select the **Reactions** tab

That works, and for a single casual lookup it is the right tool. Here is where it stops:

- **No exact dates.** LinkedIn shows "2w" or "1mo", not the timestamp. You cannot tell whether they reacted before or after your last email.
- **One person at a time.** There is no way to do this for a list of 40 prospects.
- **No export.** You get an endless scroll in a browser, not a file you can filter, sort or push into a CRM.
- **No filtering.** You cannot ask for only the last 30 days, or only the posts they celebrated rather than liked.
- **It ends.** The scroll stops well before the person's full history.

This Actor gives you the same public information as dated rows you can download. Every reaction carries an exact ISO timestamp, the full post text, the author and the engagement counts.

### 🚀 Quick start

1. Click **Try for free** on this Actor's page
2. Paste one or many LinkedIn people into the `profiles` list - links, usernames or IDs, mixed freely
3. Optionally pick a time window (default Anytime) and a max-results cap
4. Run the Actor
5. Download as JSON, CSV, or XLSX, or pull via Apify API

### ⚙️ Inputs (all in one place)

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `profiles` | array of strings | required | Bulk input. One person per line, in any of four formats, mixed freely: full link (`https://www.linkedin.com/in/satyanadella`), short link (`linkedin.com/in/satyanadella`), bare username (`satyanadella`, with or without a leading `@`), or internal ID (`ACoAAAEkwwAB9KEc...`) |
| `time_window` | string | `anytime` | How far back to fetch. Options: `anytime`, `24_hours`, `7_days`, `30_days`, `3_months`, `6_months`, `1_year`, `2_years`, `5_years` |
| `max_results` | integer | `0` (no limit) | Hard cap on total reactions emitted in the run, across all profiles. `0` or blank means no user limit. Free Apify users are still capped at 5 regardless |
| `max_results_per_profile` | integer | `0` (no limit) | Per-person ceiling. With `50`, every person in the list gives you their 50 most recent reactions and then the Actor moves on. Works alongside `max_results`; whichever limit is reached first applies |
| `include_interest_profile` | boolean | `false` | Adds one extra summary row per person describing what they engage with and when. Uses no extra upstream requests |
| `include_raw` | boolean | `true` | Keeps the `_raw` field on every reaction row. Set it to `false` for much smaller rows. The default is planned to flip to `false` in a future version, announced in advance |

**Paste profiles however you have them.** All four formats above resolve to the same person, so you can paste a column straight out of a CRM export without cleaning it first. A leading `@` is stripped automatically.

**How `time_window` works:** the Actor uses the real `createdAt` timestamp on every reaction (the upstream data source returns one per row). Since LinkedIn returns reactions newest-first, the Actor stops paginating as soon as it sees a reaction older than the window - no wasted API calls. Pick `anytime` to fetch everything; pick `24_hours` / `7_days` / `30_days` / `3_months` / `6_months` / `1_year` / `2_years` / `5_years` for an exact date cutoff from "now".

#### Bulk example input

```json
{
  "profiles": [
    "https://www.linkedin.com/in/satyanadella",
    "williamhgates",
    "linkedin.com/in/reidhoffman",
    "ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ"
  ],
  "time_window": "6_months",
  "max_results": 500
}
```

Each profile produces its own stream of reaction rows plus one summary row at the end of that profile's iteration.

### 📤 Sample output (every field returned)

Each reaction is streamed as a separate flat dataset row, ready for spreadsheets, CRMs, and BI tools. We surface everything the upstream data source returns - the reaction itself, the full post, the post author, the engagement totals - all flattened to top-level fields:

```json
{
  "reaction_type": "LIKE",
  "reacted_at": "2026-05-26T21:04:22.729Z",
  "reacted_at_timestamp": 1779829462729,

  "post_id": "7465145834842718209",
  "post_url": "https://www.linkedin.com/feed/update/urn:li:activity:7465145834842718209",
  "post_share_url": "https://www.linkedin.com/posts/ugcPost-7465113159285014529-SiJj",
  "post_content": "Introducing MAI-Image-2.5 - ranked third on the Arena.AI text-to-image leaderboard...",
  "post_image_urls": [
    "https://media.licdn.com/dms/image/.../feedshare-image-high-res/...",
    "https://media.licdn.com/dms/image/.../feedshare-image-high-res/..."
  ],
  "post_total_likes": 939,
  "post_total_comments": 66,
  "post_total_shares": 101,
  "post_total_reactions": 939,
  "post_reaction_breakdown": { "LIKE": 781, "PRAISE": 75, "EMPATHY": 74, "INTEREST": 8, "APPRECIATION": 1 },
  "post_posted_at": "2026-05-26T21:04:22.729Z",
  "post_posted_ago": "1 day ago",

  "post_author_name": "Mustafa Suleyman",
  "post_author_position": "CEO, Microsoft AI",
  "post_author_url": "https://www.linkedin.com/in/mustafa-suleyman",
  "post_author_id": "ACoAAA9eyYUBh9JQIB19tmDanxKjRK9p8Nw4FrY",
  "post_author_picture_url": "https://media.licdn.com/dms/image/...",
  "post_author_type": "profile",
  "post_author_website": "https://microsoft.ai",

  "post_mentions": [
    { "kind": "company", "name": "Essent", "url": "https://www.linkedin.com/company/essent", "id": "2854" },
    { "kind": "person", "name": "Roel de Krom", "url": "https://www.linkedin.com/in/roeldekrom", "id": "ACoAAADWaA0B..." }
  ],
  "post_job": null,
  "post_article": null,
  "post_video": null,
  "post_document": null,
  "post_repost_of": null,

  "reactor_name": "Satya Nadella",
  "reactor_position": null,
  "reactor_url": "https://www.linkedin.com/in/satyanadella",
  "reactor_id": "ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ",
  "reactor_picture_url": "https://media.licdn.com/dms/image/...",

  "reaction_urn": null,

  "page": 1,
  "position_on_page": 1,
  "fetched_at": "2026-05-27T21:07:59.353Z",
  "profile_identifier": "satyanadella",
  "time_window": "anytime",

  "_raw": { "/* full untouched upstream element for debugging */": "..." }
}
```

Field notes:

- **`reaction_type`** - resolved from the API's `reactionType`/`type` field when present, otherwise parsed from the human-readable `action` string ("X likes this" -> `LIKE`, "X celebrates this" -> `PRAISE`, etc.). `null` only if both signals are missing.
- **`reacted_at` / `reacted_at_timestamp`** - real reaction time from the upstream data source. Used internally to apply the `time_window` cutoff with exact precision.
- **`post_url`** - taken from the API's per-row `linkedinUrl`, then `post.linkedinUrl`, falling back to a derived `https://www.linkedin.com/feed/update/urn:li:activity:{post_id}` URL. Tracking params stripped. **The activity ID inside this URL is normally not the same as `post_id`** - see below.
- **`post_share_url`** - the shareable `ugcPost-...` URL when the API provides one.
- **`post_content`** through **`post_image_urls`** - the post body and any attached image URLs (no extra API call needed).
- **`post_total_*` / `post_reaction_breakdown`** - engagement metrics on the parent post.
- **`post_author_*`** - author of the post being reacted to.
- **`reactor_*`** - the queried profile (the person who gave the reaction). `reactor_name` falls back to the name parsed from the action string when the upstream data source omits the name field.
- **`_raw`** - the original upstream element, untouched, in case you need a field we did not surface.

#### What was in the post

These describe the post that was reacted to, so you can tell *what kind of thing* someone engaged with, not just that they engaged. Each is `null` when the post has no such element, so a plain text post leaves them all empty.

- **`post_author_type`** - `"profile"` when a person wrote the post, `"company"` when a company page did. Use it to separate people from brand accounts.
- **`post_author_website`** - the author's own site, when their profile lists one. No extra lookup required.
- **`post_mentions`** - every company and person tagged inside the post text, each with a name, a LinkedIn URL and an ID. This is the closest thing to a map of who and what is in a person's orbit, and no other Actor in this category returns it.
- **`post_job`** - `{ title, url, location }` when the post is a job listing. A reaction to a job post is a hiring signal.
- **`post_article`** - `{ title, url, source }` when the post shares an external link. Shows which outside content they engage with.
- **`post_video`** - `{ url, thumbnail_url }` when the post carries video.
- **`post_document`** - `{ title, pages, url }` when the post is a slide carousel or PDF.
- **`post_repost_of`** - `{ author_name, author_url, post_url, content }` when the post is a repost. Tells you whether they engaged with the original author or with whoever shared it.

#### `post_url` and `post_id` identify different things

Worth knowing before you dedupe or join on either one. For the same row you will typically see three different identifiers:

| Field | Example | What it identifies |
| --- | --- | --- |
| `post_id` | `7510361762404311040` | The post itself |
| `post_url` | `.../urn:li:activity:7510461067815469058` | The reaction entity, not the post |
| `post_share_url` | `.../posts/...ugcPost-7510361762404311040-MXMB` | The post itself |

`post_url` opens the right post in a browser, because LinkedIn resolves that activity URN - so links are not broken. But the ID embedded in it will not match `post_id`, and on a typical run it will differ on every row.

**So: deduplicate on `post_id`, not on `post_url`.** If you need a URL whose ID agrees with `post_id`, use `post_share_url`, or build one as `https://www.linkedin.com/feed/update/urn:li:activity:{post_id}`.

`post_url` has carried this value since launch and is deliberately left alone, so existing integrations keep working.

#### What this Actor does not return

This Actor returns public professional activity only. It does not return email addresses, phone numbers, private profile data, follower lists, or anything behind a login, and it does not infer, score or categorise the people in its results.

#### Two fields that are always empty

Being straight about this so you do not build around them:

- **`reactor_position`** is `null` on every row. The upstream response does not include the reacting person's headline, and the only way to fill it would be a second paid lookup per profile.
- **`reaction_urn`** is `null` on every row. The upstream response returns a post ID where a reaction URN would be.

Both are kept in the output so existing integrations do not break.

At the end of each profile's iteration, a summary row is emitted **always** (even when a result cap was reached mid-run):

```json
{
  "_summary": true,
  "profile_identifier": "satyanadella",
  "profile_input": "https://www.linkedin.com/in/satyanadella",
  "time_window": "6_months",
  "total_reactions": 142,
  "reaction_type_breakdown": {
    "LIKE": 89,
    "PRAISE": 23,
    "EMPATHY": 12,
    "APPRECIATION": 10,
    "INTEREST": 6,
    "ENTERTAINMENT": 2
  },
  "pages_fetched": 5,
  "stopped_reason": "time_window"
}
```

`stopped_reason` is one of:

| Value | Meaning |
| --- | --- |
| `time_window` | Reached a reaction older than your chosen window. Normal for a bounded window |
| `token_exhausted` | LinkedIn ran out of pages. You have everything available |
| `empty_page` | The profile has no visible reactions |
| `invalid_profile` | Bad URL, private profile, or no valid source. This profile is skipped and the run continues |
| `error` | An unexpected failure on this profile only. The run continues |
| `page_cap` | Hit the internal safety ceiling |
| `cap_reached` | Hit `max_results` or the free-plan limit part-way through this profile |
| `profile_cap` | Hit `max_results_per_profile` for this profile. The run continues with the next person |
| `blocked` | This profile is excluded from this Actor's results. No request was made and no data was collected for it |
| `not_run` | A limit stopped the run before this profile started. Nothing was fetched for it |

#### Interest profile (one row per person, optional)

Set `include_interest_profile` to `true` and each person also gets one row summarising
everything that was already collected for them. It uses no extra requests - it is
computed from the rows you already have - and it is emitted only when that person actually
returned reactions, so a person with nothing visible never produces one.

```json
{
  "_interest_profile": true,
  "profile_identifier": "satyanadella",
  "profile_input": "https://www.linkedin.com/in/satyanadella",
  "time_window": "6_months",
  "reactions_analysed": 142,
  "reaction_mix": { "LIKE": 62.68, "PRAISE": 16.2, "EMPATHY": 8.45, "APPRECIATION": 7.04, "INTEREST": 4.23, "ENTERTAINMENT": 1.4 },
  "high_intent_share": 31.69,
  "content_type_mix": { "text": 48.59, "image": 30.99, "video": 12.68, "article": 5.63, "document": 2.11 },
  "job_post_reactions": 4,
  "top_authors": [
    { "name": "Alice Author", "url": "https://www.linkedin.com/in/alice", "type": "user", "reactions": 11 }
  ],
  "top_mentions": [
    { "name": "Acme BV", "url": "https://www.linkedin.com/company/acme", "mentions": 7 }
  ],
  "top_terms": [
    { "term": "kubernetes", "posts": 12, "occurrences": 18, "sample_post_url": "https://www.linkedin.com/posts/..." }
  ],
  "first_reaction_at": "2026-03-14T08:21:00.000Z",
  "last_reaction_at": "2026-09-27T16:04:00.000Z",
  "reactions_per_week": 5.21,
  "most_active_hour_utc": 9,
  "most_active_weekday": "Tuesday"
}
```

| Field | What it tells you |
| --- | --- |
| `reactions_analysed` | How many reactions this summary is based on |
| `reaction_mix` | Share of each reaction type, as a percentage |
| `high_intent_share` | Percentage of reactions that took more than one tap: Celebrate, Support, and Love |
| `content_type_mix` | Share of text, image, video, article, and document posts. One bucket per reaction, richest media wins, so it sums to 100 |
| `job_post_reactions` | How many of the posts were job postings |
| `top_authors` | The people and pages they engage with most, ranked |
| `top_mentions` | Companies and people tagged in the posts they react to, ranked by how often they appear |
| `top_terms` | The topics those posts are about, ranked by `posts` (how many of their posts contain the word), with `occurrences` as the tiebreak and one example post each. Ranking by posts rather than raw word count stops a single long post from dominating. English and Dutch filler words are filtered out, and an English plural is folded into its singular when both appear, so you get one `model` row rather than `model` and `models` side by side. Names of people who wrote or were tagged in those posts are excluded, since they are already reported in `top_authors` and `top_mentions` - company names are kept, because a company is a legitimate topic |
| `reactions_per_week` | Activity rate across the span actually observed. `null` when there is only one reaction, since there is no span to divide by |
| `most_active_hour_utc` | The UTC hour they react in most often. Ties resolve to the earlier hour |
| `most_active_weekday` | The weekday they react on most often. Ties resolve to the earlier day, counting Sunday first |
| `first_reaction_at` / `last_reaction_at` | The oldest and newest reaction in the set |

These two timing fields tie often at low reaction counts - ten reactions can easily give three Thursdays and three Mondays - so treat them as indicative until a person has a few dozen reactions in the window.

Everything here is a plain count over public post content. No inference about the person, no
scoring of them, and no automated decision - see the Addendum for why that boundary exists.

Filter these rows out with `!r._interest_profile` if you only want reaction rows.

#### Bad profiles never stop a bulk run

If one profile in your list is a broken URL, a deleted account, or a private profile, that
profile alone is skipped. It gets an error row plus a summary row with
`stopped_reason: "invalid_profile"`, and the Actor moves straight on to the next profile.
A 500-profile run with 30 bad URLs still returns the other 470. Both the error row and the
summary row carry `profile_input` with the exact string you supplied, so failures are easy
to filter and re-submit.

#### Nothing is silently dropped when a limit is hit

If a result limit stops the run early, the profiles that never got their turn are
not just missing. The Actor adds one extra row listing every one of them:

```json
{
  "_summary": true,
  "_not_run": true,
  "stopped_reason": "not_run",
  "profiles_not_run": 95,
  "profile_inputs_not_run": ["linkedin.com/in/someone", "another-handle", "..."],
  "note": "This Actor returns up to 5 results for free Apify users. Upgrade to a paid Apify plan to receive unlimited results. This limit was set by the Actor developer, not by Apify."
}
```

So a free run over 100 people returns results for the first few, a summary for each of
those, and one row naming the other 95 with the reason. You always know exactly what you
got and what you did not.

It is deliberately **one** row rather than one per skipped profile. No request
is sent upstream for any profile in that list.

#### Two preset dataset views

The Actor ships with two prebuilt views in the Apify dataset UI:

- **Reactions** - reaction-by-reaction table with reaction type, timestamp, clickable post URL, post text, post author, and engagement counts
- **Run summary** - one row per profile with totals, per-type breakdown, and why that profile stopped

Switch between them in the dataset tab without writing any transforms.

### 🎚️ Reaction type is the signal

Every row carries `reaction_type`, and the six types are not equal in weight. PRAISE, EMPATHY and APPRECIATION carry far more intent than a plain LIKE, so score them accordingly in your own pipeline:

| Reaction | LinkedIn calls it | Reads as |
| --- | --- | --- |
| `PRAISE` | Celebrate | Strong public endorsement |
| `EMPATHY` | Support | Personal solidarity |
| `APPRECIATION` | Love | Gratitude, usually a close tie |
| `INTEREST` | Insightful | Topical interest |
| `ENTERTAINMENT` | Funny | Low signal |
| `LIKE` | Like | Neutral acknowledgment |

Sort or filter on `reaction_type` after the run, in your spreadsheet or CRM, to isolate the high-intent ones.

### 🛠️ Pipeline guide

This Actor is the broadest interest signal. Use it at the top of a multi-step pipeline, then enrich the shortlist with more detailed Actors:

```
                +--------------------------------------------------+
   Step 1  -->  | THIS ACTOR  -  Profile Reactions Scraper         |
                | Map breadth of topic interest at scale           |
                +-----------------------+--------------------------+
                                        |
                                        v
                +--------------------------------------------------+
   Step 2  -->  | LinkedIn Profile Comments Scraper                |
                | Pull comment text for the top N reactors         |
                +-----------------------+--------------------------+
                                        |
                                        v
                +--------------------------------------------------+
   Step 3  -->  | LinkedIn Profile Scraper + Email Enrichment      |
                | Verified emails for the shortlist                |
                +-----------------------+--------------------------+
                                        |
                                        v
                +--------------------------------------------------+
   Step 4  -->  | LinkedIn Jobs Scraper                            |
                | Intent: are they hiring? Which roles?            |
                +--------------------------------------------------+
```

The point: don't run deep enrichment on 10,000 cold profiles. Run this Actor first to score interest, then enrich only the top few hundred.

### 🔌 Integrations

Plug the dataset into your stack with a few lines of code.

#### HubSpot - upsert reactions as engagement signals

```js
import fetch from 'node-fetch';

const reactions = await fetch(
  `https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=${process.env.APIFY_TOKEN}`,
).then((r) => r.json());

for (const r of reactions.filter((x) => !x._summary)) {
  await fetch('https://api.hubapi.com/crm/v3/objects/contacts/search', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.HUBSPOT_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      filterGroups: [{ filters: [{ propertyName: 'linkedin_url', operator: 'EQ', value: r.reactor_url }] }],
    }),
  });
}
```

#### Salesforce - log reactions as Lead notes

```js
import jsforce from 'jsforce';

const conn = new jsforce.Connection({ loginUrl: 'https://login.salesforce.com' });
await conn.login(process.env.SF_USER, process.env.SF_TOKEN);

await conn.sobject('Lead').create(
  reactions.filter((r) => !r._summary).map((r) => ({
    LinkedIn_URL__c: r.reactor_url,
    Last_Reaction_Type__c: r.reaction_type,
    Last_Reaction_Post_Url__c: r.post_url,
  })),
);
```

#### Clay - call as an HTTP enrichment

```
URL:     https://api.apify.com/v2/acts/unseenuser~LinkedIn-user-reactions/run-sync-get-dataset-items
Method:  POST
Header:  Authorization: Bearer {{APIFY_TOKEN}}
Body:    { "profiles": ["{{ row.linkedin_url }}"], "time_window": "6_months", "max_results": 30 }
```

#### Airtable - pipe reactions into a table

```js
import Airtable from 'airtable';
const base = new Airtable({ apiKey: process.env.AIRTABLE_KEY }).base(process.env.AIRTABLE_BASE);

await base('Reactions').create(
  reactions.filter((x) => !x._summary).map((r) => ({
    fields: {
      Name: r.reactor_name,
      LinkedIn: r.reactor_url,
      Reaction: r.reaction_type,
      PostUrl: r.post_url,
      PostAuthor: r.post_author_name,
      ReactedAt: r.reacted_at,
    },
  })),
);
```

#### n8n

Add an **Apify** node, choose Actor `unseenuser/LinkedIn-user-reactions`, set input to:
`{ "profiles": ["{{ $json.linkedin_url }}"] }`, then chain a HubSpot / Postgres / Slack node.

#### Make (Integromat)

Use the **Apify > Run an Actor** module, pick this Actor, map `profiles` from the previous module's output, then attach a **Get dataset items** module downstream.

#### Zapier

Search for **Apify** -> action **Run Actor** -> pick this Actor -> map profile URL from the trigger step -> follow with **Filter by Zapier** on `reaction_type = PRAISE` to fan out only high-intent signals.

### 📺 Demo videos

New to Apify? Schedule this actor to run automatically:

https://www.youtube.com/watch?v=GRFW_Loo2dk

Connect this actor to your stack (Zapier, Make, Airtable, and more):

https://www.youtube.com/watch?v=bNACk1_S_6w

### ❓ FAQ

**Is this legal?**
This Actor wraps a third-party data provider's endpoint that handles the underlying data collection. Reactions on a LinkedIn profile's public activity feed are publicly visible. Relevant precedent: *hiQ Labs v. LinkedIn* (9th Circuit, 2019/2022) held scraping publicly available data is not a CFAA violation in the US. *Meta v. Bright Data* (2024) reached a similar conclusion for public data. None of this is legal advice - your downstream use is your responsibility under your jurisdiction's law and LinkedIn's User Agreement. See the Terms of Service and Actor-Specific Addendum.

**What about GDPR / CCPA / Israeli Privacy Law?**
Reaction data is personal data when tied to a named individual. You are the data controller for any downstream processing. You must establish a lawful basis (legitimate interest with balancing test, or consent), provide transparency, and honor access/deletion/objection requests. See Addendum Sections F, G, L for specifics.

**Will this get my LinkedIn account banned?**
No. This Actor never logs into LinkedIn and never uses your session. It calls a third-party API server-side. Your account is not involved.

**What data fields are NOT returned?**

- No comment text written by the reactor (use the Comments Actor)
- No reactor email or phone (use the Profile + Email Enrichment Actor)
- No reactor headline in most rows (the API usually omits it; `reactor_name` is recovered from the action string)
- No "is connection" flag
- No first/second/third-degree relationship

**What IS returned that people often assume is missing?**
Quite a lot. Every row carries the exact reaction timestamp (`reacted_at`), the full post body
(`post_content`), the post's images, the post author's name/headline/URL, and the post's
engagement totals with a per-type reaction breakdown. You do not need a second Get Post call
for any of that.

**How is this different from the Profile Comments Scraper?**
Both return timestamps and post context. The difference is the signal: this Actor captures
one-click reactions, which cover far more posts, while Comments captures what the
person actually wrote. Use this for breadth (which topics a person engages with). Use
Comments for depth (their own words for personalized outreach).

**Why are reactions a weaker signal than comments?**
Reactions take one click. Comments take thought. A comment carries more outreach weight, but reactions reveal the broader topic universe a person cares about.

**What's the simplest way to find topic interest?**
This Actor. Plain reactions are the broadest signal LinkedIn exposes publicly.

**Should I pass profile URLs or profile IDs?**
Both go in the same `profiles` list and can be mixed freely. Profile IDs are slightly faster, so prefer them if you have IDs cached from a prior Profile lookup. Otherwise just paste usernames or links.

**What happens if one profile in my list is bad?**
Only that profile is skipped. It gets an error row and a summary row with `stopped_reason: "invalid_profile"`, and the run continues. A bad URL, deleted account, or private profile can never abort a bulk run.

**How do I get a `profileId`?**
Run the Profile Actor (`unseenuser/LinkedIn-Profile`). The profile object's `id` field is the profileId.

**Do I need an account with any data provider?**
No. UnseenUser holds the credentials. You only need an Apify account.

**What if LinkedIn sends a cease-and-desist?**
Notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease use immediately.

**Can I view another person's liked posts on LinkedIn?**
Yes, when their activity is public, which is the default. Their reactions appear under Activity on their profile and anyone can read them without being connected. You will sometimes read that LinkedIn does not allow this; what LinkedIn does not offer is a way to *export* or *bulk* it, which is the gap this Actor fills.

**Can I see when someone liked a specific post?**
LinkedIn only shows you a relative time such as "2w". Every row this Actor returns carries the exact moment, as an ISO timestamp in `reacted_at`, so you can sort by it, filter to a period, or check whether someone engaged before or after you contacted them.

**Can other people see which posts I have liked?**
Yes. Reactions are public by default and show under the Activity section of your own profile. That is precisely why this data is available to research at all, and it cuts both ways: anyone can do this to you.

**Is there a LinkedIn API for reactions?**
Not a public one. LinkedIn's official Marketing and Community Management APIs report reactions on *your own* organization's posts, and only to approved partners. There is no official endpoint that answers "what has this person reacted to", which is exactly the gap this Actor fills. You get a LinkedIn reactions API without an application process, without OAuth, and without a rate limit tied to your own account.

**How do I see what someone liked on LinkedIn?**
Their reactions are visible on their profile under Activity, but LinkedIn shows them as an endless scroll with no dates, no export and no way to do it for more than one person at a time. Paste their profile link into the `profiles` field and you get the same information as dated rows you can filter and download.

**What posts has someone liked on LinkedIn?**
Every post they reacted to that is still publicly visible, one row each, with the reaction type, the exact timestamp, the full post text, the author and the engagement counts. Set `time_window` to bound it to a period, or leave it on `anytime` for their whole visible history.

**How do I find what topics a LinkedIn user cares about?**
Turn on `include_interest_profile`. Alongside the reaction rows you get one summary row per person listing the topics those posts are about, the authors they engage with most, the companies tagged in them, the content formats they prefer and the hours they are usually active. It is computed from the rows already collected, so it uses no extra requests.

### Example tasks

Ready-made presets. Open one, press Run, and change the profile list to your own.

- [See every post a LinkedIn user has liked or celebrated](https://apify.com/unseenuser/LinkedIn-user-reactions/examples/lpr-full-reaction-history) - one person's whole visible reaction history, newest first.
- [Map LinkedIn topic interests for a list of people](https://apify.com/unseenuser/LinkedIn-user-reactions/examples/lpr-interest-profile-per-person) - one summary row per person instead of raw rows, showing their topics and the authors they engage with.
- [Map LinkedIn interests across a target account list](https://apify.com/unseenuser/LinkedIn-user-reactions/examples/lpr-abm-topic-interest-mapping) - every contact at one account, profiled for ABM research.
- [Audit what a LinkedIn influencer actually engages with](https://apify.com/unseenuser/LinkedIn-user-reactions/examples/lpr-influencer-engagement-audit) - what they react to, not what they publish.
- [LinkedIn reactions from the past 7 days](https://apify.com/unseenuser/LinkedIn-user-reactions/examples/lpr-single-profile-last-7-days) - a weekly check on a prospect before you message them.
- [Bulk LinkedIn reactions export for lead scoring](https://apify.com/unseenuser/LinkedIn-user-reactions/examples/lpr-bulk-lead-scoring-export) - hundreds of prospects in one run, with per-person limits to keep run sizes predictable.

### Related scrapers

Build a complete LinkedIn intelligence stack:

- [LinkedIn Profile Scraper + Email Enrichment](https://apify.com/unseenuser/LinkedIn-Profile) - enrich the people you find here with verified emails
- [LinkedIn Jobs Scraper](https://apify.com/unseenuser/LinkedIn-Jobs-Scraper) - see who they're hiring (intent signal)
- [LinkedIn Post Search Scraper](https://apify.com/unseenuser/LinkedIn-Post-Seach-Scraper) - find their thought leaders
- [LinkedIn User Activity Scraper (combined)](https://apify.com/unseenuser/LinkedIn-user-comments-reactions) - comments + reactions in one run
- [LinkedIn User Comments Scraper](https://apify.com/unseenuser/LinkedIn-user-comments) - the same idea for comments they wrote, when you need their words rather than their reactions

[See all 16 scrapers by unseenuser ->](https://apify.com/unseenuser)

### If you appear in this Actor's results

This Actor stores nothing. It fetches public LinkedIn activity at the moment a run happens and writes it to the account of whoever ran it, so there is no copy here to remove. What we can do is add you to a block list, after which this Actor will not return your activity in any future run.

Open an issue at [apify.com/unseenuser/LinkedIn-user-reactions/issues](https://apify.com/unseenuser/LinkedIn-user-reactions/issues) with **your LinkedIn profile URL and nothing else** - that issue is public, so please do not post anything further there. We respond within 30 days.

To have the underlying activity itself removed, change it or your privacy settings on LinkedIn, which is where it lives.

### Pricing

$5.00 per 1,000 results ($0.005 per result).

Every row the Actor returns counts as one result. That includes the summary row at the end of each person, and, when you switch it on, the interest profile row for each person.

### 🛡️ Terms of Service (summary)

Running this Actor constitutes binding acceptance of UnseenUser's Terms of Service V4.0 and the Actor-Specific Addendum.

- **Architecture:** This Actor is a software wrapper. It calls the HarvestAPI `/linkedin/profile-reactions` endpoint and returns the response. UnseenUser does not store the data. Because requests are made under the Publisher's provider accounts, copies of results may remain in those accounts as described in the Data Retention section of the Addendum. The Publisher does not access these copies except where needed to troubleshoot a run at the User's request.
- **You are the data controller** under GDPR, CCPA, and Israel's Privacy Protection Law for any personal data you process downstream.
- **Prohibited uses:** harassment, discrimination, spam, source-platform-terms circumvention, sensitive-attribute profiling, AI training without authorization, building "reaction tracker" surveillance tools, reselling raw outputs as a data product.
- **Lead scoring with this data:** if reactions feed an automated decision (GDPR Article 22), you must offer human review.
- **Source platform compliance:** LinkedIn's User Agreement governs your downstream use; you bear that responsibility.
- **Cease-and-desist:** notify UnseenUser within 48 hours via apify.com/UnseenUser and stop use.
- **Governing law:** Israel. Exclusive jurisdiction: Tel Aviv-Jaffa civil courts. Aggregate liability cap: greater of US $100 or amounts paid in the prior 3 months.

Full Terms (V4.0) and Actor-Specific Addendum are below.

***

## Apify Actor - Terms of Service

**Version:** 4.0
**Effective Date:** May 5, 2026

### 0. ACCEPTANCE BY USE - IMPORTANT

Read this section first.

These Terms of Service ("Terms") form a binding legal agreement between you ("User," "you," "your") and UnseenUser, the Publisher of this Apify actor ("UnseenUser," "the Publisher," "we," "us," "our").

#### 0.1 How You Accept These Terms

You accept these Terms by any of the following actions, each of which constitutes a clear, affirmative act of acceptance:

(a) Running the Actor - Initiating any execution of the Actor on the Apify platform
(b) Using any output returned by the Actor for any purpose
(c) Continuing to access the Actor's listing or documentation after these Terms are visible

#### 0.2 Continuing Acceptance

Each time you run the Actor or use its outputs, you reaffirm your acceptance of the then-current Terms. If you do not agree to these Terms or any subsequent update, you must stop using the Actor immediately.

#### 0.3 No Anonymous Acceptance

You cannot disclaim acceptance by:

- Failing to read these Terms before running the Actor
- Running the Actor through automated systems
- Sharing your Apify account with others who may not have read these Terms

By the act of running the Actor on Apify, you bind yourself, your organization (if applicable), and any individuals or systems acting on your behalf or under your authority.

#### 0.4 If You Do Not Accept

If you do not agree to these Terms, you must not run the Actor. No use is authorized without acceptance.

### PREAMBLE - UNDERSTANDING THE ARCHITECTURE

Before using the Actor, please understand the technical architecture of the service:

#### The Data Flow

```
You (User) -> Apify Platform -> Actor (software) -> Third-Party API -> Source Platform
                                                        |
You (User) <- Apify Platform <- Actor (software) <- Third-Party API
```

#### What Each Party Does

- **You (the User):** Run the Actor on the Apify platform with input parameters you choose
- **Apify:** Operates the cloud infrastructure that hosts and executes Actors. Apify is a Czech-incorporated company (Apify Technologies s.r.o.) governed by its own Terms of Service.
- **The Publisher (us):** Publishes software code (the Actor) on Apify's platform. The Actor is a thin wrapper that translates your input into requests to a third-party API and returns the API's responses to you. The Publisher does not operate scraping infrastructure. The Publisher does not store or retain data returned by the Actor. Because requests are made under the Publisher's provider accounts, copies of results may remain in those accounts as described in the Data Retention section of the Addendum. The Publisher does not access these copies except where needed to troubleshoot a run at the User's request. The Publisher does not see, log, or process the personal data of any individuals returned in the Actor's outputs beyond what is incidental to passing the data through.
- **Third-Party API Provider:** HarvestAPI (https://harvest-api.com) or Scrape Creators (https://scrapecreators.com). These are independent third-party companies that operate scraping infrastructure and return data from source platforms.
- **Source Platform:** LinkedIn, TikTok, YouTube, Reddit, Linktree, etc. These are the platforms whose publicly visible data is accessed by the Third-Party API Providers.

#### Why This Matters

Your relationship with the Publisher is that of a software user to a software vendor. The Publisher has the responsibilities of a software vendor (functional code, accurate documentation) and the limits of one (the Publisher is not responsible for how you use the data you obtain).

These Terms operate alongside but do not replace:

- Apify's Terms of Service and Acceptable Use Policy (governing your relationship with Apify)
- HarvestAPI Terms of Service and Scrape Creators Terms of Service (governing the underlying data infrastructure)
- Source Platform terms (LinkedIn, TikTok, etc.) governing the public data accessed
- Applicable law in your jurisdiction and the jurisdictions of data subjects

These Terms incorporate the actor-specific addendum published in each Actor's individual listing ("Addendum"). In the event of a conflict, the more restrictive provision applies.

### 1. NATURE OF THE SERVICE

#### 1.1 What the Actor Is

The Actor is a software program published on the Apify platform. Each Actor:

(a) Accepts structured input from you on the Apify platform
(b) Translates that input into HTTP requests to a third-party API operated by HarvestAPI or Scrape Creators
(c) Receives HTTP responses from that third-party API
(d) Returns the response data to you in a structured format on the Apify platform

The Actor's source code is hosted on Apify's infrastructure. The Actor runs in Apify's cloud, not on the Publisher's servers. The Publisher operates no servers running the Actor.

#### 1.2 What the Actor Is Not

The Actor is not:

(a) A scraping tool - the Publisher does not operate scraping infrastructure, proxies, headless browsers, or fake accounts
(b) A direct connection to any source platform - connections to source platforms are made by HarvestAPI / Scrape Creators
(c) A data storage or data retention service - the Publisher does not maintain a database of any data the Actor returns. Because requests are made under the Publisher's provider accounts, copies of results may remain in those accounts as described in the Data Retention section of the Addendum. The Publisher does not access these copies except where needed to troubleshoot a run at the User's request.
(d) A licensed access channel to LinkedIn, TikTok, YouTube, Reddit, X (Twitter), Meta, Linktree, or any other source platform
(e) Affiliated with, endorsed by, sponsored by, or authorized by any source platform

#### 1.3 The Publisher's Limited Role

The Publisher's role is limited to:

(a) Designing and writing the Actor's source code
(b) Publishing the Actor on the Apify Store
(c) Maintaining the Actor (updating it when API providers change schemas)
(d) Providing documentation and customer support via Apify's contact mechanism

The Publisher is a software vendor, similar to a developer who publishes an app on the Apple App Store or Google Play Store. The Publisher is not a data provider, data broker, data processor, or data controller for purposes of GDPR, CCPA, Israel's Privacy Protection Law, or equivalent.

#### 1.4 The Third-Party API Providers' Role

HarvestAPI (https://harvest-api.com) and Scrape Creators (https://scrapecreators.com) are independent third-party companies. They:

(a) Operate the actual data scraping infrastructure
(b) Maintain relationships with source platforms (or accept the operational risk of accessing public data without such relationships)
(c) Are themselves Apify publishers (HarvestAPI publishes 9+ actors directly; Scrape Creators publishes 10+)
(d) Provide their own Terms of Service governing their operations
(e) Are responsible for compliance obligations relating to the data collection itself

The Publisher is a customer of these providers. The Publisher is not their agent, partner, or representative.

### 2. WHO MAY USE THE ACTOR

#### 2.1 Eligibility

You may use the Actor only if:

(a) You are at least 18 years old or the age of majority in your jurisdiction
(b) You have legal capacity to enter into binding contracts
(c) You are not located in or resident of a country subject to comprehensive sanctions by the United States, European Union, United Kingdom, or Israel
(d) You are not on any prohibited persons list

#### 2.2 User Representations

By using any Actor, you represent and warrant that:

(a) **Truthful identity:** Information you provide about your identity and intended use is accurate
(b) **Lawful intent:** Your intended use complies with applicable law in your jurisdiction
(c) **Source platform compliance:** You will independently comply with the Terms of Service of any source platform whose data you obtain through the Actor
(d) **Data subject rights:** Where Actor outputs include personal data, you will respect data subject rights under applicable law
(e) **No prohibited use:** You will not use the Actor for any of the purposes prohibited in Section 4

These representations are continuous - they must remain true throughout your use.

### 3. PERMITTED USES

The Actor may be used for any lawful purpose, including:

- Market research and competitive analysis
- Academic research
- Journalism and investigative reporting
- Internal business intelligence
- Brand monitoring
- Recruitment research where consistent with applicable employment law
- Building products that further process publicly available information lawfully

Specific permitted uses for each Actor are described in that Actor's individual listing and Addendum.

### 4. PROHIBITED USES

You may not use the Actor for any of the following:

#### 4.1 Illegal Activity

Activity illegal under the law of your jurisdiction, the User's jurisdiction, or the jurisdiction of any data subjects.

#### 4.2 Harassment, Stalking, and Personal Targeting

- Compiling profiles for harassment, stalking, or doxxing
- Tracking individuals' movements or activities without their knowledge
- Building profiles of journalists, activists, dissidents, or vulnerable populations for retaliatory purposes

#### 4.3 Discrimination

- Using outputs for discriminatory employment, lending, housing, or insurance decisions based on protected characteristics
- Building lists for discriminatory purposes

#### 4.4 Spam and Unsolicited Commercial Communication

- Sending unsolicited marketing in violation of CAN-SPAM, CASL, GDPR, PECR, Israeli Anti-Spam Law, or equivalent laws
- Building "lead lists" from scraped contacts without proper consent infrastructure
- Reselling contact data for spam purposes

#### 4.5 Fraud and Deception

- Identity theft or impersonation
- Generation of fake reviews, testimonials, or coordinated inauthentic behavior
- Election interference or political disinformation
- Securities fraud

#### 4.6 Source Platform Abuse

- Using outputs to circumvent technical protection measures of source platforms
- Creating fake accounts on source platforms based on Actor outputs
- Vote manipulation, engagement manipulation, or platform algorithm gaming
- Building services that competitively substitute for source platforms

#### 4.7 Reselling the Actor's Service

- Reselling raw Actor outputs as your own data product or scraping-as-a-service
- Sharing your Apify credentials to provide third parties indirect access
- Building competing API services using Actor outputs

#### 4.8 AI Training Without Authorization

Using Actor outputs as training data for commercial AI/ML models without separate licensing authority from the source platform.

#### 4.9 Sensitive Targeting

- Specifically targeting or profiling based on health conditions, sexual orientation, religious beliefs, political opinions, or other sensitive characteristics
- Targeting children under 16 (or local age of consent for data processing)

#### 4.10 Privacy Law Violations

- Processing personal data of EU/UK/California/Israeli residents without complying with applicable privacy law
- Failing to honor data subject access, deletion, or objection requests
- Processing data for purposes incompatible with its publication context

### 5. SOURCE PLATFORM TERMS - YOUR RESPONSIBILITY

#### 5.1 Acknowledgment

The Actor accesses publicly visible data on third-party platforms ("Source Platforms") through the Third-Party API Providers (HarvestAPI / Scrape Creators). Source Platforms include LinkedIn, TikTok, YouTube, Reddit, X (Twitter), Meta/Facebook, Linktree, Komi, Pillar, Linkbio, Linkme, and Amazon.

#### 5.2 Your Sole Responsibility

You acknowledge:

(a) You are solely responsible for ensuring your downstream use of data obtained through the Actor complies with the Source Platform's Terms of Service
(b) The Publisher makes no representation that any specific use is permitted under any Source Platform's terms
(c) The Third-Party API Providers, not the Publisher, bear responsibility for the lawfulness of the data collection itself
(d) You should review Source Platform terms before commercial use:

- LinkedIn: https://www.linkedin.com/legal/user-agreement
- TikTok: https://www.tiktok.com/legal/page/global/terms-of-service/en
- YouTube: https://www.youtube.com/static?template=terms
- X: https://twitter.com/en/tos
- Reddit: https://www.redditinc.com/policies/user-agreement
- Meta: https://www.facebook.com/legal/terms
- Linktree: https://linktr.ee/s/terms/

#### 5.3 Cease-and-Desist Compliance

If you receive a cease-and-desist letter or other legal demand from a Source Platform regarding your use of Actor outputs, you must:

(a) Cease the contested use immediately
(b) Notify UnseenUser within 48 hours via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser)
(c) Cooperate with the Publisher as needed to mitigate
(d) Not assert against the Publisher any claim arising from your inability to use the Actor for that Source Platform

### 6. DATA PROTECTION - REFLECTING ACTUAL ARCHITECTURE

#### 6.1 Roles Under Privacy Law

For purposes of GDPR, UK GDPR, CCPA, Israel's Privacy Protection Law (PPL) including Amendment 13, and equivalents:

- **You (the User)** are the Data Controller of any personal data you obtain through the Actor and subsequently process for your own purposes
- **HarvestAPI and Scrape Creators** are the entities that collect data from source platforms - they bear the responsibilities of data processors or controllers (depending on context) for the collection itself
- **The Publisher** acts solely as a software vendor, not as a data controller or processor, because the Publisher does not store, retain, or substantively process personal data - the Actor merely passes API responses through. Because requests are made under the Publisher's provider accounts, copies of results may remain in those accounts as described in the Data Retention section of the Addendum. The Publisher does not access these copies except where needed to troubleshoot a run at the User's request.

#### 6.2 No Data Retention by the Publisher

The Publisher confirms:

(a) The Publisher does not maintain a database of personal data obtained through the Actor
(b) The Actor passes data from the Third-Party API directly to you on the Apify platform - data does not flow through the Publisher's infrastructure
(c) Apify's standard execution and operational logging may include limited information about Actor runs (input parameters, run duration, data volume) - this is governed by Apify's own privacy practices
(d) The Publisher does not access, view, or analyze your Actor outputs except as needed for technical support if you specifically share them with the Publisher

Because requests are made under the Publisher's provider accounts, copies of results may remain in those accounts as described in the Data Retention section of the Addendum. The Publisher does not access these copies except where needed to troubleshoot a run at the User's request.

#### 6.3 Your Obligations as Data Controller

Where your use of the Actor involves processing personal data, you are responsible for:

(a) Establishing a lawful basis for your processing (consent, legitimate interest with documented balancing test, contract, etc.)
(b) Providing transparent notice to data subjects as required by applicable law
(c) Honoring data subject access, rectification, erasure, restriction, and portability requests
(d) Implementing appropriate security measures
(e) Conducting Data Protection Impact Assessments where required
(f) Appointing a Data Protection Officer if your operations require one
(g) Registering databases with applicable supervisory authorities
(h) Honoring opt-out requests for direct marketing
(i) Cross-border transfer safeguards where data crosses borders

#### 6.4 Israel's Amendment 13 - User Compliance

If your use of the Actor involves Israeli residents' personal data, you must comply with the Privacy Protection Law as amended (Amendment 13, effective August 14, 2025). These obligations are yours as the data controller, not the Publisher's as the software vendor.

#### 6.5 Sensitive Data Targeting Restrictions

You will not use the Actor to specifically target, profile, or build datasets focused on:

- Health or medical conditions
- Religious beliefs
- Political opinions
- Sexual orientation or gender identity
- Genetic or biometric data
- Criminal history
- Children under 16

### 7. INTELLECTUAL PROPERTY

#### 7.1 Actor Code

The Actor's source code, schemas, documentation, and branding are owned by the Publisher. You receive a limited, non-exclusive, non-transferable, revocable license to use the Actor for permitted purposes during your active subscription/run with Apify.

#### 7.2 Output Data

The Publisher claims no ownership over the public data the Actor returns. Source Platforms may have copyright, database rights, or other rights in their data; data subjects may have copyright in user-generated content. Your use of output data must respect these rights independently.

#### 7.3 Restrictions

You may not reverse engineer, decompile, or reuse the Actor's code in a competing actor.

#### 7.4 Feedback

Feedback you provide may be used by the Publisher to improve products without compensation to you.

### 8. PRICING AND PAYMENT

#### 8.1 Apify Platform Billing

Pricing is administered through Apify's pricing models. Apify processes all payments. Apify's payment terms govern refunds and disputes.

#### 8.2 Pricing Changes

The Publisher may change Actor pricing with at least 14 days' notice via the Actor's Apify listing.

#### 8.3 No Refunds for Misuse

If your access is suspended or terminated for breach of these Terms, you forfeit any unused balance and are not entitled to refunds.

### 9. SERVICE AVAILABILITY AND CHANGES

#### 9.1 No Uptime Guarantee

The Actor depends on:

(a) The Apify platform
(b) Underlying API providers (HarvestAPI, Scrape Creators)
(c) Source Platforms' continued public accessibility

Any of these may change behavior, restrict access, or become unavailable without notice. The Publisher makes no uptime guarantees.

#### 9.2 Service Discontinuation

The Publisher may discontinue any Actor at any time. Reasonable notice will be provided when feasible.

### 10. DISCLAIMERS

#### 10.1 "AS IS" Service

THE ACTOR IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTIES OF ANY KIND, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR PURPOSE, NON-INFRINGEMENT, OR ACCURACY OF DATA.

#### 10.2 No Representation of Lawfulness

The Publisher makes no representation that your specific use of the Actor or the data it returns is lawful in your jurisdiction or under any Source Platform's terms. The burden of determining lawfulness for your use case is yours.

#### 10.3 No Endorsement of Source Content

Content returned by the Actor was created by third parties. The Publisher does not endorse, verify, or take responsibility for it.

### 11. LIMITATION OF LIABILITY

#### 11.1 Aggregate Liability Cap

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE AGGREGATE LIABILITY OF THE PUBLISHER FOR ALL CLAIMS RELATING TO THE ACTOR EXCEED THE GREATER OF:

(a) ONE HUNDRED U.S. DOLLARS (US $100), OR
(b) THE AMOUNTS YOU PAID THROUGH APIFY FOR USE OF THE ACTOR IN THE THREE (3) MONTHS IMMEDIATELY PRECEDING THE EVENT

#### 11.2 Excluded Damages

THE PUBLISHER IS NOT LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR LOSS OF PROFITS, REVENUE, OR DATA, EVEN IF ADVISED OF THE POSSIBILITY.

#### 11.3 Time Limit

Any claim must be brought within one (1) year of the event.

### 12. INDEMNIFICATION

#### 12.1 Your Indemnification of the Publisher

You agree to defend, indemnify, and hold harmless the Publisher from any:

- Claims arising from your use of the Actor
- Claims arising from your violation of these Terms
- Claims arising from your violation of any law (including privacy law)
- Claims arising from your violation of any Source Platform's Terms of Service
- Claims arising from your processing of personal data obtained through the Actor
- Reasonable attorneys' fees and costs of defending such claims

#### 12.2 Defense

The Publisher may assume defense at your expense. You will cooperate with the Publisher's defense.

#### 12.3 Scope

The indemnification covers reasonable, foreseeable third-party claims arising from your use. It does not extend to:

- Claims arising from the Publisher's gross negligence or willful misconduct
- Claims regarding the Actor's source code itself (those are the Publisher's responsibility)
- Claims regarding the Third-Party API Provider's data collection (those are their responsibility)

### 13. SUSPENSION AND TERMINATION

#### 13.1 Termination by the Publisher

The Publisher may terminate your access for material breach, illegal use, breach of warranty, or upon credible legal demand.

#### 13.2 Effects of Termination

Your license ends, you must cease use, and applicable provisions survive.

#### 13.3 Termination by You

You may stop using the Actor at any time on Apify.

### 14. DISPUTE RESOLUTION

#### 14.1 Informal Resolution First

Send a detailed written description of the dispute via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) and wait 60 days for resolution attempt before any formal claim.

#### 14.2 Governing Law

These Terms are governed by the substantive laws of the State of Israel, without regard to conflict of law principles.

#### 14.3 Exclusive Jurisdiction

Any dispute shall be brought exclusively in the competent civil courts of Tel Aviv-Jaffa, Israel.

#### 14.4 No Class Actions

You agree to bring claims only in your individual capacity.

#### 14.5 Attorneys' Fees

The prevailing party recovers reasonable attorneys' fees.

### 15. MISCELLANEOUS

#### 15.1 Entire Agreement

These Terms (with Addendum and incorporated documents) are the entire agreement.

#### 15.2 Severability

Unenforceable provisions are reformed to the minimum extent or severed.

#### 15.3 Assignment

You may not assign without the Publisher's consent. The Publisher may assign to affiliates, successors, or acquirers.

#### 15.4 Force Majeure

Neither party is liable for failure due to events beyond reasonable control, including changes by Source Platforms or Third-Party API Providers, or actions by Apify.

#### 15.5 Third-Party Beneficiaries

Apify, HarvestAPI, and Scrape Creators are intended third-party beneficiaries of Sections 4 (Prohibited Uses), 5 (Source Platform Compliance), and 12 (Indemnification).

#### 15.6 Survival

Sections 0 (Acceptance), 4, 5, 6, 7, 10, 11, 12, 14, and 15 survive termination.

#### 15.7 Language

English controls. Translations are for convenience only.

#### 15.8 Publisher Identification for Legal Process

The Publisher operates on the Apify platform under the username UnseenUser (apify.com/UnseenUser). The Publisher is a registered legal entity. Upon receipt of valid legal process (subpoena, court order, or equivalent) directed through Apify's official channels, the Publisher's full legal identity may be disclosed as required by law.

### 16. ACKNOWLEDGMENT

By using any Actor, you acknowledge that:

(a) You have read these Terms
(b) You understand the architecture: you are using software (the Actor) on Apify's platform that calls third-party APIs
(c) You accept responsibility for your use, including for compliance with Source Platform terms
(d) Your indemnification obligations cover third-party claims arising from your use
(e) Disputes are resolved in Israeli courts
(f) The Publisher's identity, while not publicly disclosed in this listing, can be obtained through valid legal process via Apify

For questions, use UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) before running the Actor.

***

## 🛡️ Actor-Specific ToS Addendum - LinkedIn Profile Reactions Scraper

This addendum supplements the Master Terms of Service V4.0. By running this Actor, you accept both the Master ToS and this addendum.

#### A. Architectural Disclosure

This Actor is a software wrapper. It accepts your input parameters, calls the HarvestAPI `/linkedin/profile-reactions` endpoint, and returns the response data to you on the Apify platform. UnseenUser does not store, log, or substantively process the data returned. Because requests are made under the Publisher's provider accounts, copies of results may remain in those accounts as described in the Data Retention section of the Addendum. The Publisher does not access these copies except where needed to troubleshoot a run at the User's request. The data flows from HarvestAPI through Apify's runtime directly to you.

#### Data Retention

HarvestAPI: Requests are made through the Publisher's HarvestAPI account. HarvestAPI has not published a specific retention period for results linked to that account, so copies may remain in that account under HarvestAPI's own policies. Where technically available, the Publisher can ask HarvestAPI to delete records linked to its account, and will pass on a User's reasonable deletion request relating to that User's runs.

#### B. Nature of Data Returned

This Actor returns: All reactions a target LinkedIn profile has given to other people's content. Each reaction includes: reaction type (LIKE, EMPATHY, PRAISE, INTEREST, APPRECIATION, ENTERTAINMENT), the exact reaction timestamp, the parent post's ID and URL, the parent post's full text and image URLs, the parent post's engagement counts, the identity of the person who authored that post (name, headline, profile URL, profile picture), and the identity of the reacting profile (name, profile URL, profile picture).

Note that this is broader than reaction metadata alone: because the parent post's text and its author's identity are included, a single run can reveal what a named individual engaged with and what that content said. Treat the output accordingly. It does not include comments the reacting profile wrote; that is the Profile Comments endpoint.

Where the Actor's output includes individual people's names, photos, professional headlines, or content authored by them, that data constitutes personal data subject to GDPR, CCPA, Israeli Privacy Protection Law (including Amendment 13), and equivalent privacy laws in your downstream processing - but only in your hands as the data controller, not in UnseenUser's hands as the software vendor.

#### C. Permitted Use Cases

You may use this Actor for the following purposes (non-exhaustive list):

- **Prospect mapping** - get a breadth view of what topics a target engages with
- **Lead scoring** - count and categorize reactions to score engagement quality (e.g. PRAISE > LIKE)
- **Topic affinity** - identify creators or topic-experts a prospect consistently engages with
- **Warm-outreach hooks** - reference a recent reaction (lighter touch than referencing a comment)
- **Competitive monitoring** - see whose content competitor executives consistently endorse
- **Influencer audit** - verify reaction patterns of paid influencers vs. their posting topics
- **Recruiter sourcing** - find candidates whose engagement signals align with role topics
- **Content marketing research** - identify which content gets reactions from your ICP profiles

#### D. Specifically Prohibited Uses

In addition to Master ToS Section 4 prohibitions, you may NOT:

- Build cold-DM tools that auto-message profiles based on which posts they reacted to - even personalized, this is spam under most anti-spam regimes without prior consent
- Use reaction patterns to identify and target individuals based on inferred political, religious, or health beliefs
- Build lead-scoring systems that combine reaction data with other personal data to make automated decisions about individuals (hiring, lending, insurance) - GDPR Article 22 applies
- Sell or share 'reaction history' databases of named individuals - this is data broker activity targeted by California Delete Act, GDPR Article 14, and Israeli Privacy Law Amendment 13
- Aggregate reactions across many profiles to map social networks and influence patterns of named individuals
- Use reactions to sensitive content (illness, bereavement, political, religious) to make commercial inferences about individuals
- Use reaction data to train commercial AI/LLM models without proper licensing - LinkedIn's Terms explicitly restrict this
- Build 'public reaction tracker' tools that surveil specific individuals' engagement over time without their consent

#### E. Platform Terms of Service Considerations

LinkedIn restricts engagement-data extraction more aggressively than profile data - comments and reactions are 'real-time pulse' data LinkedIn considers strategic. LinkedIn has actively litigated against scrapers (LinkedIn v. Proxycurl 2025 settled, LinkedIn v. ProAPIs 2025-2026 settled, hiQ Labs v. LinkedIn ongoing). This Actor accesses publicly visible LinkedIn engagement data via HarvestAPI - HarvestAPI bears responsibility for the lawfulness of the data collection. Your downstream use must independently comply with LinkedIn's User Agreement. If LinkedIn issues a cease-and-desist regarding data obtained via this Actor, notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease your use immediately.

#### F. Reaction Data - Personal Data with Inference Risk

Reaction data can look like harmless metadata. It is not. It is personal data tied to expressed opinions and interests, and because this Actor also returns the parent post's full text, the inference risk is higher than a bare list of post IDs would carry:

- A profile that consistently REACTS with PRAISE on layoff posts may be inferred as anti-management
- A profile that reacts with EMPATHY to illness disclosures may be inferred to share that condition
- A profile that reacts with INTEREST on competitor posts may be inferred as a prospect for that competitor
- A profile reacting to specific religious/political content reveals protected-category views

This is HIGH-SENSITIVITY data under GDPR Article 6 and may touch GDPR Article 9 (special categories) when the inference reveals protected attributes. Recent EU DPA guidance treats automated inference from engagement data as itself processing of personal data.

#### G. Reaction-Type Semantic Sensitivity

LinkedIn reaction types each carry meaning beyond a binary like:

- LIKE - neutral acknowledgment
- EMPATHY - emotional solidarity (often used on bereavement, illness, layoff posts)
- PRAISE - strong professional endorsement
- INTEREST - topical interest signal
- APPRECIATION - gratitude / personal connection
- ENTERTAINMENT - humor reaction (can be inappropriate on serious posts)

The REACTION TYPE itself is meaningful behavioral data. Aggregating reaction-type patterns to label individuals (e.g., "rarely shows EMPATHY -> flagged as cold") is high-sensitivity automated decision-making under GDPR Article 22, requiring specific lawful basis and the right to human review.

#### H. Lead Scoring - Special Provisions

Many users of this Actor will combine reaction data with other signals (job titles, company size, intent data) to score leads. This combination:

- Triggers GDPR Article 22 if the score drives an AUTOMATED decision (e.g., "score > 80 -> add to high-priority outreach list")
- Must offer data subjects the right to human review, the right to express their view, and the right to contest the decision
- Should disclose to data subjects (on request) that they were scored and what factors contributed

Build these rights into your CRM workflow from day one - retrofitting is significantly more painful.

#### I. Aggregation Boundary - The Critical Line

The line between permitted "prospect research" and prohibited "people search database" is drawn around aggregation:

| Use | Status |
| --- | --- |
| Pulling reactions for ONE prospect before outreach | Permitted |
| Pulling reactions for a list of 50 target accounts | Generally permitted with proper lawful basis |
| Building a database of reactions across THOUSANDS of profiles for resale | Data broker activity - likely prohibited under California Delete Act, GDPR Article 14, Israeli Privacy Law Amendment 13 |
| Tracking reactions of ONE specific individual over time without their knowledge | Surveillance - prohibited |

#### J. AI Training - Special Notice

LinkedIn's Terms of Service explicitly prohibit using LinkedIn data to train AI/ML models without LinkedIn's authorization. Engagement data (reactions) is no exception. The Publisher (UnseenUser) does NOT authorize, and has no ability to authorize, AI training use. Your AI training use is your own legal exposure.

Recent litigation (NYT v. OpenAI, Reddit v. Perplexity, multiple class actions) demonstrates AI training on platform data is contested. Get proper licensing or do not train on this data.

#### K. Cross-Endpoint Aggregation

This Actor returns reactions. The Profile Comments Actor returns comments. The Profile Actor returns the profile itself. Combining ALL THREE for the same individual produces a comprehensive "engagement personality profile" that:

- Is more sensitive than any single endpoint alone
- Resembles the profile-building that LinkedIn lawsuits specifically target
- Triggers heightened GDPR scrutiny (combination of data is itself processing under Article 4(2))
- May require explicit consent in some EU jurisdictions for downstream commercial use

Use the combined data thoughtfully and with documented lawful basis.

#### L. Data Subject Rights - Operational Requirements

Individuals whose reactions you collect have rights under GDPR / CCPA / Israeli Privacy Law:

- **Right to access** - they can demand to know what you have about them
- **Right to deletion** - they can demand removal from your databases
- **Right to object** - they can object to processing for direct marketing (NOT optional under GDPR)
- **Right to human review of automated decisions** - if you use this data for lead scoring (Article 22)

Build operational processes from day one to honor these rights with a typical 30-day SLA.

***

**Keywords:** linkedin profile reactions scraper, linkedin user reactions, scrape linkedin reactions by user, linkedin reactions history, topic interest mapping, b2b prospect scoring, linkedin likes scraper, lightweight prospect research, linkedin activity api, no cookies linkedin scraper, no login linkedin scraper, account-safe linkedin scraping, phantombuster alternative, dux-soup alternative, linkedin engagement signals, lead scoring api

# Actor input Schema

## `profiles` (type: `array`):

One person per line. Paste them however you have them - all four of these work and you can mix them in the same list:

1. Full link: https://www.linkedin.com/in/satyanadella
2. Short link: linkedin.com/in/satyanadella
3. Just the username: satyanadella
4. LinkedIn internal ID: ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ

To find someone's username, open their LinkedIn profile and look at the address bar: the part after /in/ is what you need. Internal IDs are slightly faster, but usernames and links are easier and work just as well.

## `time_window` (type: `string`):

Every reaction carries the real date it happened, so this cutoff is exact rather than an estimate. Example: choose 'Last 7 days' for a weekly check on a prospect before you message them, or leave it on 'Anytime' to pull someone's whole visible history. Choosing a shorter period also makes the run finish sooner, because the Actor stops as soon as it reaches a reaction older than your cutoff.

## `max_results` (type: `integer`):

Leave this at 0 to get everything found - 0 means no limit. Set a number to put a fixed ceiling on the run: for example, 200 stops the run once 200 results have been returned, while 0 pulls full histories.

Free Apify users receive at most 5 results per run whatever you enter here.

## `max_results_per_profile` (type: `integer`):

Leave this at 0 for no per-person limit. Use it when your list mixes quiet people with very active ones and you do not want one heavy poster to eat the whole run: set 50, and every person gives you their 50 most recent reactions before the Actor moves on to the next.

This works alongside the overall results limit above. Whichever limit is reached first applies.

## `include_interest_profile` (type: `boolean`):

Adds one extra summary row per person on top of their reactions. That row tells you, at a glance: which reactions they use most, how often they react, the day and hour they are usually active, the authors they engage with most, the companies that come up most in the posts they react to, the topics those posts are about, and what kind of content they prefer (text, image, video, article, document).

Use it when you have a long list of people and want to see who is worth reading in full before you open anything.

## `include_raw` (type: `boolean`):

On by default, so nothing changes for existing runs. Each reaction row carries a `_raw` field holding the complete untouched record this Actor received, including fields it does not surface as columns.

Turn it off if you do not need it. The rows get much smaller, and the output stops repeating personal data that the named columns already select from.

Planned change: this will default to off in a future version, announced in advance. Set it to true explicitly if your integration reads `_raw` and you want it to keep arriving.

## Actor input object example

```json
{
  "profiles": [
    "https://www.linkedin.com/in/satyanadella",
    "williamhgates",
    "ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ"
  ],
  "time_window": "anytime",
  "max_results": 0,
  "max_results_per_profile": 0,
  "include_interest_profile": false,
  "include_raw": true
}
```

# Actor output Schema

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

No description

# 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 = {
    "profiles": [
        "https://www.linkedin.com/in/satyanadella"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("unseenuser/linkedin-user-reactions").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 = { "profiles": ["https://www.linkedin.com/in/satyanadella"] }

# Run the Actor and wait for it to finish
run = client.actor("unseenuser/linkedin-user-reactions").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 '{
  "profiles": [
    "https://www.linkedin.com/in/satyanadella"
  ]
}' |
apify call unseenuser/linkedin-user-reactions --silent --output-dataset

```

## MCP server setup

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

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/Cx0G1WAmtJVGCIah4/builds/2bb57AytMrOIEBgyq/openapi.json
