Set your reaction to a channel message

PUT/v1/channels/{channelId}/messages/{messageId}/reactions

Requires threads:write and active membership in the selected organization. Sets or removes only the authenticated member's reaction; repeated desired states are idempotent. The message must belong to this channel (channel_message_not_found, 404); archived channels return channel_archived (409). Reactions are persisted in thread.message.reactions.updated events, including the message's original author, sequence and timestamp plus metadata.reactions and a monotonic metadata.reactionsVersion. Read them through the canonical timeline/events API and SSE. They do not change unread activity or enqueue agent runs.

How to call this endpoint

Every ACP API request uses bearer authentication. The examples here show the actual request path, auth header, and body shape that the platform expects.

Path, query, and header parameters

These parameters control which ACP object the endpoint acts on and how the request is processed.

Path parameters
NameLocationTypeRequiredDescription
channelIdpathstringYes
messageIdpathstringYes
Query parameters
None.

Body schema

Content type: application/json · Required

FieldTypeRequiredDescription
emojistringYesOne Unicode emoji grapheme (including joined or skin-tone variants).
selectedbooleanYes

What the API returns

Each response code below includes the documented payload shape for the ACP API.

200Current reactions and their retained canonical event (the source message when an empty state is unchanged)application/json
FieldTypeRequiredDescription
eventobjectYes
event.idstringYesUnique identifier.
event.threadIdstringYesThread ID.
event.sequenceintegerYes
event.typestringYes
event.producerTypestringYes
event.producerIdstringYes
event.visibilitystringYes
event.payloadobjectYes
event.occurredAtstringYes
event.createdAtstringYesISO 8601 timestamp.
reactionsobject[]Yes
reactions[].emojistringYes
reactions[].userIdsstring[]Yes
reactions[].countintegerYes
400Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
401Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
403Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
404Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
409Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
500Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
503Invalid input (400), unauthenticated (401), denied (403), unavailable resource (404), stale revision/idempotency conflict/archived channel (409), unavailable PostgreSQL backend (503), or failed operation (500).application/json
FieldTypeRequiredDescription
errorstringYes
codestringNo
messagestringYesMessage text.
Set your reaction to a channel message
Loading...
Response 200
Loading...
See the ACP quickstart and SDK flow