# Comments and Reactions

Coming soon – the postEngagement signal reports new comments and reactions on your LinkedIn posts or any post you choose.

> 🚧 **Coming soon.** Signals are not available yet. This page describes how they will work at launch – the `/signals` endpoints, `signal.*` events and the SDK, CLI and MCP signal commands do not work today.

The `postEngagement` signal watches a post and reports every new comment and reaction on it. Point it at your own posts to answer commenters and connect with the people who engaged, or at any other post – a competitor's launch, an industry discussion – to see who joins in.

## Events

| Event `type` | Webhook event | What happened |
|---|---|---|
| `commentAdded` | `signal.commentAdded` | A new comment or a reply to a comment appeared under the post. |
| `reactionAdded` | `signal.reactionAdded` | A new person or company reacted to the post. |

## Creating

Watch one post by its URL:

```json
{
  "type": "postEngagement",
  "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890123456789",
  "label": "launch-post"
}
```

Or watch the account's own posts:

```json
{
  "type": "postEngagement",
  "myPosts": true
}
```

- `postUrl` – LinkedIn URL of the post to watch.
- `myPosts` – `true` to watch the posts the account itself publishes. The signal covers the account's posts from the last 30 days, and every post the account publishes later joins it automatically. An account has at most one `myPosts` signal.

Use exactly one of the two.

| Checked | Each check spends |
|---|---|
| 4 times a day for the first 7 days after the post was published, then daily until day 30 | nothing from account limits |

Engagement on LinkedIn comes in the first days after publishing, so a post is checked often while it is fresh and rarely after. At day 30 a post is no longer checked: a single-post signal gets the status `stopped` with `watchPeriodEnded`, and a `myPosts` signal simply leaves that post out.

The baseline is the comments and reactions already there at the first check.

## Event fields

### commentAdded

```json
{
  "id": "9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d",
  "signalId": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
  "signalType": "postEngagement",
  "label": "launch-post",
  "type": "commentAdded",
  "detectedAt": "2026-10-12T16:40:00Z",
  "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890123456789",
  "comment": {
    "commentUrn": "urn:li:comment:(urn:li:activity:1234567890123456789,9876543210)",
    "commentUrl": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890123456789/?dashCommentUrn=urn%3Ali%3Afsd_comment%3A(9876543210%2Curn%3Ali%3Aactivity%3A1234567890123456789)",
    "author": {
      "type": "person",
      "name": "John Doe",
      "profileUrl": "https://www.linkedin.com/in/john-doe",
      "headline": "Head of Growth",
      "viewerState": { "connectionDegree": "2nd" }
    },
    "time": "2h",
    "text": "Interested – how does it handle multiple accounts?",
    "image": null,
    "isReply": false
  }
}
```

- `postUrl` – the post the comment belongs to. For a `myPosts` signal, this tells you which of your posts it is.
- `comment` – the new comment, with the same fields as an item of [`st.retrievePostComments`](/docs/action-st-retrieve-post-comments#result-options). `time` is the relative age LinkedIn showed at the check. `isReply` is `true` for a reply to another comment.

Answer a comment by passing its `commentUrl` to [`st.replyToComment`](/docs/action-st-reply-to-comment), or like it with [`st.reactToComment`](/docs/action-st-react-to-comment).

### reactionAdded

```json
{
  "id": "3e4f5a6b-7c8d-4e9f-a0b1-c2d3e4f5a6b7",
  "signalId": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
  "signalType": "postEngagement",
  "label": "launch-post",
  "type": "reactionAdded",
  "detectedAt": "2026-10-12T16:40:00Z",
  "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890123456789",
  "reaction": {
    "actor": {
      "type": "person",
      "name": "Jane Doe",
      "urn": null,
      "profileUrl": "https://www.linkedin.com/in/person1",
      "headline": "Helping companies to use AI",
      "viewerState": { "connectionDegree": "3rd+" }
    },
    "type": "insightful"
  }
}
```

- `reaction` – who reacted and how, with the same fields as an item of [`st.retrievePostReactions`](/docs/action-st-retrieve-post-reactions#result-options).

LinkedIn shows no time for reactions, so `detectedAt` – the check that found it – is the only time you get. One person is reported once per post: changing the reaction type or removing it produces no event.

The common fields – `id`, `signalId`, `signalType`, `label`, `type`, `detectedAt` – are described in [Receiving events](/docs/signal-events#polling).

## Turning engagement into connections

A frequent use: invite everyone who engaged with your post.

1. Create a `myPosts` signal once.
2. For each `commentAdded` or `reactionAdded` event whose author has `connectionDegree` `2nd` or `3rd+`, send an invitation with [`st.sendConnectionRequest`](/docs/action-st-send-connection-request), mentioning the post in the note.
3. Watch for acceptances with the [`network`](/docs/signal-network) signal.

Invitations still count against `stConnectionRequests`. A popular post can produce more engagers in a day than the account should invite, so queue them rather than inviting all at once.
