For AI agents: markdown of this page — /docs-content-en/chats/messages/reactions.md documentation index — /llms.txt
Reactions to a message
GET /v1/chats/messages/:messageId/reactions · POST /v1/chats/messages/:messageId/reactions · DELETE /v1/chats/messages/:messageId/reactions/:reaction
Three endpoints work with the reactions to a message: the list of reactions, adding your own reaction and removing it. They run the v2 messenger methods im.v2.Chat.Message.Reaction.tail, im.v2.Chat.Message.Reaction.add and im.v2.Chat.Message.Reaction.delete. The chat is resolved from the message, so no dialogId is needed.
A reaction is identified by a code in camelCase: like, fire, laugh, faceWithThermometer. The set of codes is defined by Bitrix24 and may grow. In im 26.1300 there are 48 of them: like, faceWithTearsOfJoy, redHeart, neutralFace, fire, cry, slightlySmilingFace, winkingFace, laugh, kiss, wonder, slightlyFrowningFace, loudlyCryingFace, faceWithStuckOutTongue, faceWithStuckOutTongueAndWinkingEye, smilingFaceWithSunglasses, confusedFace, flushedFace, thinkingFace, angry, smilingFaceWithHorns, faceWithThermometer, facepalm, poo, flexedBiceps, clappingHands, raisedHand, dislike, smilingFaceWithHeartEyes, smilingFaceWithHearts, pleadingFace, relievedFace, foldedHands, okHand, signHorns, loveYouGesture, clownFace, partyingFace, questionMark, exclamationMark, lightBulb, bomb, sleepingSymbol, crossMark, whiteHeavyCheckMark, eyes, handshake, hundredPoints.
List reactions
GET /v1/chats/messages/:messageId/reactions
Who reacted to a message and how. The list is paginated, newest first by default.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
messageId (path) |
number | yes | — | Message ID, a positive integer |
reaction (query) |
string | no | — | Only reactions with this code |
lastId (query) |
number | no | — | Cursor: the id of the last reaction on the previous page. The boundary itself is not included |
order (query) |
string | no | desc |
desc — newest first, asc — oldest first |
limit (query) |
number | no | 50 | Reactions per page, from 1 to 200: a value outside the range is clamped and echoed in meta.requestedLimit and meta.appliedLimit |
Any other parameter or a repeated parameter is rejected with 400 INVALID_PARAMS.
Examples
curl — personal key
curl -X GET "https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions?limit=20" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl -X GET "https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions?limit=20" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions?limit=20', {
method: 'GET',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { data } = await res.json()
console.log('Reactions:', data.reactions.map((r) => `${r.userId}: ${r.reaction}`))
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions?limit=20', {
method: 'GET',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { data } = await res.json()
console.log('Reactions:', data.reactions.map((r) => `${r.userId}: ${r.reaction}`))
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data.reactions |
array | Reactions on the page |
data.reactions[].id |
number | Reaction ID, used to page through the list |
data.reactions[].messageId |
number | Message ID |
data.reactions[].userId |
number | ID of the user who added the reaction |
data.reactions[].reaction |
string | Reaction code |
data.reactions[].dateCreate |
string | When the reaction was added (ISO 8601) |
data.users |
array | Users who added the reactions on the page: id, name, firstName, lastName, avatar and other messenger user fields |
data.hasNextPage |
boolean | There are more reactions after the page |
meta.requestedLimit |
number | The limit passed, when it was outside the range from 1 to 200 |
meta.appliedLimit |
number | The limit value applied |
Response example
{
"success": true,
"data": {
"reactions": [
{
"id": 301,
"messageId": 1001,
"userId": 7,
"reaction": "like",
"dateCreate": "2026-09-20T10:05:00+00:00"
},
{
"id": 300,
"messageId": 1001,
"userId": 5,
"reaction": "fire",
"dateCreate": "2026-09-20T10:04:00+00:00"
}
],
"users": [
{ "id": 7, "name": "Anna Smith", "firstName": "Anna", "lastName": "Smith", "avatar": "", "type": "user" },
{ "id": 5, "name": "John Brown", "firstName": "John", "lastName": "Brown", "avatar": "", "type": "user" }
],
"hasNextPage": false
}
}
Add a reaction
POST /v1/chats/messages/:messageId/reactions
Adds the current user's reaction to a message.
Request body fields
| Field | Type | Required | Description |
|---|---|---|---|
reaction |
string | yes | Reaction code in camelCase |
Any other body field and any query parameter are rejected with 400 INVALID_PARAMS.
Examples
curl — personal key
curl -X POST "https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reaction":"like"}'
curl — OAuth application
curl -X POST "https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"reaction":"like"}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({"reaction":"like"}),
})
const { data } = await res.json()
console.log('Result:', data)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({"reaction":"like"}),
})
const { data } = await res.json()
console.log('Result:', data)
Response on success: { "success": true, "data": true }.
Remove a reaction
DELETE /v1/chats/messages/:messageId/reactions/:reaction
Removes the current user's reaction from a message. The reaction code goes in the path.
Examples
curl — personal key
curl -X DELETE "https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions/like" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl -X DELETE "https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions/like" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions/like', {
method: 'DELETE',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { data } = await res.json()
console.log('Result:', data)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/messages/1001/reactions/like', {
method: 'DELETE',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { data } = await res.json()
console.log('Result:', data)
Response on success: { "success": true, "data": true }.
Error response example
422 — this reaction is already on the message:
{
"success": false,
"error": {
"code": "BITRIX_ERROR",
"message": "REACTION_ALREADY_SET",
"b24Code": "REACTION_ALREADY_SET"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_PARAMS |
messageId is not a positive integer; the reaction code is not in camelCase (LIKE, face_with); for the list — a parameter other than reaction, lastId, order, limit, a repeated parameter or an invalid value; for adding — no reaction or an extra body field; for removing — any body field or query parameter. Checked before any call to Bitrix24 |
| 404 | ENTITY_NOT_FOUND |
Bitrix24 reported "not found"; the portal code is in error.b24Code |
| 422 | BITRIX_ERROR |
Bitrix24 returned an error; the code is in error.b24Code: REACTION_ALREADY_SET — the reaction is already there, REACTION_NOT_FOUND — the reaction to remove is not there or the code is unknown to Bitrix24, MESSAGE_NOT_FOUND — there is no such message |
| 403 | SCOPE_DENIED |
The API key does not have the im scope |
| 403 | WRITE_BLOCKED_READONLY_KEY |
A read-only key cannot add or remove reactions; it can read the list — see access rights |
| 401 | TOKEN_MISSING |
The API key has no Bitrix24 tokens configured |
Full list of common API errors — Errors.
Known specifics
The reactions list may make you a member. When the message's chat allows auto-join, reading the list adds the current user as a member, as loading a chat does. A READONLY key may read the list; this operation does not mark messages read.
One reaction per code. Adding the same reaction again is not a silent no-op: it returns 422 with error.b24Code set to REACTION_ALREADY_SET. Different codes on one message are added independently.
An unknown code is not the same as a malformed one. A code that is not in camelCase is rejected immediately with 400. A well-formed code that is not in the Bitrix24 set reaches Bitrix24 and returns 422 with REACTION_NOT_FOUND.
Counters come with the message history. The reaction summary of the page's messages — reactionCounters, ownReactions — comes in the reactions collection of the message history in the v2 mode. This endpoint tells you exactly who reacted.