# Get the people who reacted to or reposted a LinkedIn post (/docs/how-to/linkedin-post-reactions-and-reposts)

List who reacted to a LinkedIn post, with each reaction type, and who reposted it, by post URL. 100 credits a page of reactors, 50 a page of reposts.



To see who engaged with a LinkedIn post, call `GET /v1/linkedin/post/reactions` with the post's `url` for the people who reacted, and `GET /v1/linkedin/post/reposts` with the same `url` for the people who reposted it. Reactions return each person's name, headline, profile URL and the reaction they left (like, praise, empathy and so on). Reposts return each reshare with the resharer and any text they added. A page of reactors costs 100 credits; a page of reposts costs 50. For the people who commented, use `GET /v1/linkedin/post/comments` (50 credits a page).

<Callout type="info" title="Cost">
  `post/reactions` is metered at 100–500 credits a page. A plain page costs 100 credits. Adding `include=profile` joins each row to the member's profile, so the call holds up to 500 credits when it starts and you're charged what it used. Send `dry_run=1` for a free quote. `post/reposts` is 50 credits per page of 10. Asking for the same page again within 6 hours is answered from the shared cache for 2 credits. Failed calls and empty results are free.
</Callout>

## How do I find the post URL? [#how-do-i-find-the-post-url]

The `url` has to carry the post's activity ID, in one of two forms:

* `https://www.linkedin.com/feed/update/urn:li:activity:7501466755261820928`
* `https://www.linkedin.com/posts/<slug>-activity-<id>-<code>`

On LinkedIn, open the post's menu and choose "Copy link to post". If you got the post from another endpoint (`profile/posts`, `company/posts`, `search/posts`), copy its `post.url` field. Don't rebuild the URL from `post.id`, which is not always the activity ID.

## Make the request [#make-the-request]

<Tabs items="['cURL', 'Python', 'Node.js']">
  <Tab value="cURL">
    ```bash title="cURL"
    POST_URL="https://www.linkedin.com/feed/update/urn:li:activity:7501466755261820928"

    curl -G "https://api.insightsocial.app/v1/linkedin/post/reactions" \
      --data-urlencode "url=$POST_URL" \
      -H "x-api-key: $INSIGHTSOCIAL_API_KEY"

    curl -G "https://api.insightsocial.app/v1/linkedin/post/reposts" \
      --data-urlencode "url=$POST_URL" \
      -H "x-api-key: $INSIGHTSOCIAL_API_KEY"
    ```
  </Tab>

  <Tab value="Python">
    ```python title="Python"
    import os
    import requests

    BASE = "https://api.insightsocial.app/v1"
    HEADERS = {"x-api-key": os.environ["INSIGHTSOCIAL_API_KEY"]}
    POST_URL = "https://www.linkedin.com/feed/update/urn:li:activity:7501466755261820928"

    reactions = requests.get(f"{BASE}/linkedin/post/reactions", params={"url": POST_URL}, headers=HEADERS, timeout=120).json()
    for item in reactions["data"]["items"]:
        person = item["author"]
        print(person["ext"]["reaction_type"], person["display_name"], person["url"])

    reposts = requests.get(f"{BASE}/linkedin/post/reposts", params={"url": POST_URL}, headers=HEADERS, timeout=120).json()
    print(reposts["data"]["total"], "reposts")
    for item in reposts["data"]["items"]:
        post = item["post"]
        print(post["author"]["display_name"], "added text" if post["ext"]["is_repost_quote"] else "plain repost")
    ```
  </Tab>

  <Tab value="Node.js">
    ```ts title="Node.js"
    const BASE = "https://api.insightsocial.app/v1";
    const headers = { "x-api-key": process.env.INSIGHTSOCIAL_API_KEY! };
    const postUrl = "https://www.linkedin.com/feed/update/urn:li:activity:7501466755261820928";

    const get = async (path: string) => {
      const url = new URL(`${BASE}${path}`);
      url.searchParams.set("url", postUrl);
      return (await fetch(url, { headers })).json();
    };

    const reactions = await get("/linkedin/post/reactions");
    for (const { author } of reactions.data.items) console.log(author.ext.reaction_type, author.display_name, author.url);

    const reposts = await get("/linkedin/post/reposts");
    console.log(`${reposts.data.total} reposts`);
    for (const { post } of reposts.data.items) console.log(post.author.display_name, post.ext.is_repost_quote);
    ```
  </Tab>
</Tabs>

## What comes back [#what-comes-back]

Real responses from 2026-10-14, shortened: one or two rows instead of a full page, long URLs and cursors cut, and private members replaced with placeholders.

```json title="post/reactions response (shortened)"
{
  "success": true,
  "endpoint": "/v1/linkedin/post/reactions",
  "schema_version": "2",
  "data": {
    "items": [
      {
        "author": {
          "id": "ACoAAD7nmw…",
          "username": null,
          "display_name": "Example User",
          "avatar_url": "https://media.licdn.com/dms/image/v2/…",
          "bio": "Data analyst | Business intelligence",
          "verified": null,
          "followers": null,
          "url": "https://www.linkedin.com/in/ACoAAD7nmw…",
          "ext": { "urn": "ACoAAD7nmw…", "reaction_type": "LIKE", "member_id": "1055365895" }
        }
      }
    ],
    "total": null,
    "truncated": null
  },
  "pagination": { "next_cursor": "v2c.BLUP7GMD…", "has_more": true, "page_size": 44 },
  "unavailable": [
    "items[].author.verified",
    "items[].author.followers",
    "items[].author.following",
    "items[].author.joined_at"
  ],
  "credits_used": 100
}
```

```json title="post/reposts response (shortened)"
{
  "success": true,
  "endpoint": "/v1/linkedin/post/reposts",
  "schema_version": "2",
  "data": {
    "items": [
      {
        "post": {
          "id": "7511864524241833985",
          "url": "https://www.linkedin.com/feed/update/urn:li:activity:7511864524241833985",
          "content": { "text": null },
          "author": { "id": "ACoAACZmjG…", "username": "example_user", "display_name": "Example User" },
          "engagement": { "likes": 3758, "comments": 349, "shares": 318 },
          "published_at": null,
          "ext": { "author_type": "user", "is_repost_quote": false }
        }
      },
      {
        "post": {
          "id": "7509225672431562753",
          "url": "https://www.linkedin.com/feed/update/urn:li:activity:7509225672431562753",
          "content": { "text": "This long and invasive pathways belongs to the past. Today, a simple blood test…" },
          "author": { "id": "28438218", "username": "roche-belux", "display_name": "Roche Belgium & Luxembourg" },
          "engagement": { "likes": 5, "comments": 0, "shares": 0 },
          "published_at": null,
          "ext": { "author_followers": 15816, "author_type": "company", "is_repost_quote": true, "published_at_precision": "week" }
        }
      }
    ],
    "total": 318,
    "truncated": null
  },
  "pagination": { "next_cursor": "v2c.6dxQa3CY…", "has_more": true, "page_size": 10 },
  "unavailable": ["items[].post.published_at"],
  "credits_used": 50
}
```

| Field                                 | What it holds                                                                                                                    |
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `reactions: data.items[].author`      | One person or page that reacted, in the shared [author shape](/docs/schema/author): name, headline (`bio`), avatar, profile URL. |
| `reactions: author.ext.reaction_type` | The reaction they left: `LIKE`, `PRAISE`, `EMPATHY`, `APPRECIATION`, `INTEREST` and others.                                      |
| `reactions: author.ext.member_id`     | LinkedIn's numeric member ID. Company pages that react have no `member_id`; their `url` is the company page.                     |
| `reposts: data.items[].post`          | One reshare in the shared [post shape](/docs/schema/post), with the resharer in `post.author`.                                   |
| `reposts: post.ext.is_repost_quote`   | `true` when the resharer added their own text. Then `content.text` is that text and `engagement` counts their reshare.           |
| `reposts: data.total`                 | How many reposts the post has. 318 here, the same as the original post's share count.                                            |
| `reposts: post.ext.author_type`       | `user` for a member, `company` for a company page.                                                                               |

## How do I get every reactor and reposter? [#how-do-i-get-every-reactor-and-reposter]

Both endpoints paginate. Send `pagination.next_cursor` back as `cursor`, with the same `url`, and stop when `pagination.has_more` is `false`. Each reactions page costs 100 credits (more with `include=profile`); each reposts page costs 50.

```python title="Python: walk every reactor, up to 20 pages"
import os
import requests

BASE = "https://api.insightsocial.app/v1"
HEADERS = {"x-api-key": os.environ["INSIGHTSOCIAL_API_KEY"]}

params = {"url": "https://www.linkedin.com/feed/update/urn:li:activity:7501466755261820928"}
people = []
for _ in range(20):
    body = requests.get(f"{BASE}/linkedin/post/reactions", params=params, headers=HEADERS, timeout=120).json()
    people += [item["author"] for item in body["data"]["items"]]
    if not body["pagination"]["has_more"]:
        break
    params["cursor"] = body["pagination"]["next_cursor"]
```

To list only one kind of reaction, add `type` (`like`, `praise`, `empathy`, `appreciation`, `interest`, or `all`). See [Pagination](/docs/pagination) for the full rules.

## What are the limits? [#what-are-the-limits]

* **Reactor handles.** Most reactor rows have `username: null`, and `url` points to the member's ID-based profile link (`/in/ACoAA…`) rather than their vanity handle. The link still opens the profile.
* **Follower counts.** `followers`, `following`, `verified` and `joined_at` are `null` on reactor rows, which means unknown, not zero. Add `include=profile` to fill the exact follower count and connection count from each member's profile, at a higher price.
* **No reactions total.** `data.total` is `null` on `post/reactions`. The post's like, comment and share counts are on `GET /v1/linkedin/post`.
* **Plain reposts carry the original's numbers.** On a repost without added text, `content.text` is `null` and `engagement` repeats the original post's likes, comments and shares. Only quote reposts (`is_repost_quote: true`) have their own text and counts.
* **No repost dates.** `published_at` is `null` on every repost row.
* **Repeat reposters.** The same member can appear more than once if they reshared the post several times. Deduplicate on `post.author.id` if you want people, not reshares.

## What can I build with it? [#what-can-i-build-with-it]

* **Lead lists from engagement.** The people who react to a competitor's or a thought leader's post are an audience already interested in the topic. Their headlines tell you role and company.
* **Campaign reach reports.** For your own post, count reactions by `reaction_type` and list the company pages and members who reshared it with their own commentary.
* **Advocate tracking.** Run the reposts endpoint across a company's recent posts to see which employees and partners reshare most often.

## Related [#related]

* [`GET /v1/linkedin/post/reactions` reference](/docs/api-reference/linkedin/post-reactions): every parameter and field.
* [`GET /v1/linkedin/post/reposts` reference](/docs/api-reference/linkedin/post-reposts): every parameter and field.
* [`GET /v1/linkedin/post/comments`](/docs/api-reference/linkedin/post-comments): the people who commented on the post.
* [LinkedIn endpoints](/docs/platforms/linkedin): everything the API covers on LinkedIn.

