Portal Community

reaction/get

Retrieve all emoji reactions on a specific Slack message, including the emoji name, total count, and the list of user IDs who reacted with each emoji.

When to Use

Configuration

Connection

FieldRequiredDescription
botTokenRequiredSlack Bot Token starting with xoxb-. Must have the reactions:read OAuth scope.

Operation Fields

FieldRequiredDescription
channelRequiredSlack channel ID containing the message (e.g. C08ABCDEFGH).
messageTsRequiredThe timestamp of the target message (e.g. 1748221200.000100). Acts as the unique message identifier within the channel.

Sample Configuration

{
  "operation": "reaction/get",
  "connection": {
    "botToken": "{{ $credentials.slackBot.token }}"
  },
  "channel": "C08PROPOSALS",
  "messageTs": "{{ $input.proposalMessageTs }}"
}

Validation Errors

Error CodeCauseResolution
message_not_foundNo message exists at the given timestamp in the specified channel.Verify both the channel ID and the message timestamp. Timestamps are scoped to the channel they originated in.
channel_not_foundThe channel ID is invalid or the bot is not a member of that channel.Confirm the channel exists and the bot has been invited.
missing_scopeBot token lacks the reactions:read scope.Add reactions:read under OAuth & Permissions in your Slack App and reinstall.
invalid_authBot token is invalid or revoked.Update the credential with a freshly generated token.

Output

Success Port

FieldTypeDescription
reactionsarrayArray of reaction objects. Each object contains: emojiName (string without colons), count (total users who reacted), userIds (array of user IDs who added this reaction).
statusstring"success" on successful retrieval. Returns success with an empty reactions array if no reactions exist.
errorCodestringEmpty on success. Slack API error code on failure.
payloadobjectRaw Slack API response for full message context access.

Error Port

Activated when the message or channel cannot be found, or the token lacks read permissions. An empty reactions array is not an error — it means no reactions exist on the message.

Sample Output

{
  "reactions": [
    {
      "emojiName": "thumbsup",
      "count": 5,
      "userIds": ["U01ALICE", "U01BOB", "U01CAROL", "U01DAVE", "U01EVE"]
    },
    {
      "emojiName": "eyes",
      "count": 1,
      "userIds": ["UBOT12345"]
    },
    {
      "emojiName": "white_check_mark",
      "count": 2,
      "userIds": ["U01ALICE", "U01BOB"]
    }
  ],
  "status": "success",
  "errorCode": "",
  "payload": {
    "ok": true,
    "type": "message",
    "channel": "C08PROPOSALS",
    "message": {
      "reactions": [
        { "name": "thumbsup", "count": 5, "users": ["U01ALICE", "U01BOB", "U01CAROL", "U01DAVE", "U01EVE"] },
        { "name": "eyes", "count": 1, "users": ["UBOT12345"] },
        { "name": "white_check_mark", "count": 2, "users": ["U01ALICE", "U01BOB"] }
      ]
    }
  }
}

Expression Reference

ExpressionResult
{{ $output.getReaction.reactions }}Full reactions array for iteration in a loop node.
{{ $output.getReaction.reactions[0].emojiName }}Name of the first emoji reaction on the message.
{{ $output.getReaction.reactions[0].count }}Vote count for the first reaction — use to check quorum.
{{ $output.getReaction.reactions[0].userIds }}Array of user IDs who added the first reaction — use for participant lookup.
{{ $output.getReaction.status }}Status string — "success" even when reactions array is empty.

Node Policies & GuardRails

Policy AreaRecommendation
Empty ReactionsAn empty reactions array is a valid successful response. Always handle the zero-reaction case in conditional branches — do not assume reactions exist.
Quorum LogicWhen using reactions for approval workflows, check both the emojiName and count fields. Do not rely on count alone — verify the specific emoji matches the expected approval signal.
Bot ReactionsBot-added reactions (from this node or other bots) appear in the userIds array. Filter them out if you need human-only vote counts by cross-referencing with user/get and checking isBot.
Rate LimitsSlack's reactions.get is Tier 3. Avoid polling this endpoint in tight loops — use event-driven triggers instead.
Timestamp ScopingMessage timestamps are unique within a channel but not globally. Always pass both channel and messageTs together.

Examples

Check if Proposal Has Enough Approval Votes

Retrieve reactions on a proposal message and branch based on whether at least 3 thumbsup reactions exist.

{
  "operation": "reaction/get",
  "channel": "C08PROPOSALS",
  "messageTs": "{{ $input.proposalTs }}"
}
// Branch condition: reactions.find(r => r.emojiName === 'thumbsup')?.count >= 3

Check Acknowledgement Before Escalation

Before escalating an alert, confirm no one has already acknowledged it with :eyes:.

{
  "operation": "reaction/get",
  "channel": "C08ALERTS01",
  "messageTs": "{{ $trigger.alert.messageTs }}"
}
// Branch: if reactions contains 'eyes', skip escalation

Build Reaction Poll Results Report

Retrieve all reactions on a poll message and iterate over them to build a structured results report.

{
  "operation": "reaction/get",
  "channel": "C08TEAMCHAT",
  "messageTs": "{{ $input.pollMessageTs }}"
}
// Loop over $output.getReaction.reactions to build vote tally