Comments and Reactions

🚧 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 typeWebhook eventWhat happened
commentAddedsignal.commentAddedA new comment or a reply to a comment appeared under the post.
reactionAddedsignal.reactionAddedA 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.

CheckedEach check spends
4 times a day for the first 7 days after the post was published, then daily until day 30nothing 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. 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, or like it with st.reactToComment.

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"
  }
}

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.

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, mentioning the post in the note.
  3. Watch for acceptances with the 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.