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
- Check whether a message has been acknowledged (e.g., has a
:eyes: reaction) before taking further action in a workflow.
- Count approval votes on a proposal message to determine if a quorum has been reached.
- Identify which users voted in a reaction-based poll to build a participation report.
- Verify that a required reaction-based workflow trigger is in place before proceeding to the next stage.
- Retrieve the full reaction state of a message for inclusion in a status report or dashboard.
Configuration
Connection
| Field | Required | Description |
botToken | Required | Slack Bot Token starting with xoxb-. Must have the reactions:read OAuth scope. |
Operation Fields
| Field | Required | Description |
channel | Required | Slack channel ID containing the message (e.g. C08ABCDEFGH). |
messageTs | Required | The 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 Code | Cause | Resolution |
message_not_found | No 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_found | The 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_scope | Bot token lacks the reactions:read scope. | Add reactions:read under OAuth & Permissions in your Slack App and reinstall. |
invalid_auth | Bot token is invalid or revoked. | Update the credential with a freshly generated token. |
Output
Success Port
| Field | Type | Description |
reactions | array | Array of reaction objects. Each object contains: emojiName (string without colons), count (total users who reacted), userIds (array of user IDs who added this reaction). |
status | string | "success" on successful retrieval. Returns success with an empty reactions array if no reactions exist. |
errorCode | string | Empty on success. Slack API error code on failure. |
payload | object | Raw 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
| Expression | Result |
{{ $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 Area | Recommendation |
| Empty Reactions | An empty reactions array is a valid successful response. Always handle the zero-reaction case in conditional branches — do not assume reactions exist. |
| Quorum Logic | When 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 Reactions | Bot-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 Limits | Slack's reactions.get is Tier 3. Avoid polling this endpoint in tight loops — use event-driven triggers instead. |
| Timestamp Scoping | Message 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