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 7 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
by the post's age: about every 4 hours in its first 24 hours, once a day until it is 3 days old, once every 2 days until it is 7 days old, then very rarelynothing from account limits

Almost all comments and reactions on LinkedIn arrive in the first three days after a post is published, so a post is checked often while it is fresh and less often as it ages. A post older than 7 days is still checked, but very rarely, so a late comment on it can be reported days after it was written. The same applies when you create a signal on a post that is already older than 7 days.

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,
    "parentCommentUrn": null
  }
}
  • 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, plus parentCommentUrn. time is the relative age LinkedIn showed at the check.
    • isReply – true for a reply to another comment.
    • parentCommentUrn – for a reply, the commentUrn of the comment it answers; null for a top-level 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.