Отвечает, кто какой реакцией сейчас отмечает сообщения. Два вида запроса: по списку сообщений одного чата или на сообщения, отправленные за период, — например, чтобы собрать реакции на объявления за неделю.
| Запрос | POST /v1/instances/{idInstance}/getReactions |
| Ключ | заголовок Authorization: Bearer {apiTokenInstance} |
| Тело | JSON |
| Каналы | MAX, Telegram, WhatsApp, чат на сайте; у почты реакций нет |
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
chatId |
string | с idMessages — да, иначе нет |
чат — адрес из уведомления или истории. За период без chatId — по всем чатам канала |
idMessages |
array | нет | до 500 idMessage одного чата; можно строкой через запятую. Есть — ответ по этим сообщениям, период не учитывается |
since |
number или string | нет | начало периода, включительно: метка времени Unix или дата ГГГГ-ММ-ДД, можно со временем 2026-10-19T09:00 |
before |
number или string | нет | конец периода, не включительно, в том же виде |
count |
number | нет | сколько сообщений за раз при запросе за период, от 1 до 1000; по умолчанию 100 |
Период — по времени отправки сообщения. Дата без часового пояса — по поясу канала, который задан в кабинете, по умолчанию Москва: since: "2026-10-19", before: "2026-10-20" — сутки 19 октября по времени филиала.
Пример запроса
Реакции на сообщения группы за два дня:
curl
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/getReactions" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "-80040066617372",
"since": "2026-10-19",
"before": "2026-10-21"
}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/v1/instances/{os.environ['GRATIO_ID']}"
HEADERS = {"Authorization": f"Bearer {os.environ['GRATIO_TOKEN']}"}
url = f"{BASE}/getReactions"
payload = {
"chatId": "-80040066617372",
"since": "2026-10-19",
"before": "2026-10-21",
}
response = requests.post(url, json=payload, headers=HEADERS, timeout=60)
print(response.status_code, response.json())
Node.js
const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/v1/instances/${GRATIO_ID}`;
const auth = { Authorization: `Bearer ${GRATIO_TOKEN}` };
const url = `${base}/getReactions`;
const payload = { chatId: "-80040066617372", since: "2026-10-19", before: "2026-10-21" };
const response = await fetch(url, {
method: "POST",
headers: { ...auth, "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
console.log(response.status, await response.json());
PHP
<?php
$base = getenv('GRATIO_URL') . '/v1/instances/' . getenv('GRATIO_ID');
$auth = 'Authorization: Bearer ' . getenv('GRATIO_TOKEN');
$url = $base . '/getReactions';
$payload = [
'chatId' => '-80040066617372',
'since' => '2026-10-19',
'before' => '2026-10-21',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [$auth, 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);
Пример ответа
Ответ 200 OK — массив, новые сообщения первыми. За период приходят только сообщения, у которых есть реакции; удалённые — нет:
[
{
"chatId": "-80040066617372",
"idMessage": "117428956522361912",
"type": "outgoing",
"timestamp": 1791823671,
"senderId": "457747484",
"senderName": "",
"typeMessage": "textMessage",
"textMessage": "В субботу занятие переносится на 12:00",
"reactions": [{"sender": "1111111", "reaction": "👍"}, {"sender": "8695836", "reaction": "👍"}],
"counts": {"👍": 2}
}
]
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
chatId, idMessage |
string | сообщение |
type |
string или null | incoming или outgoing; null — сообщения нет в журнале канала |
timestamp |
number или null | время сообщения; null — сообщения нет в журнале |
senderId, senderName, typeMessage, textMessage |
string | как в статье Элемент журнала; нет, если сообщения нет в журнале |
reactions |
array | по одной на участника: sender — id участника, reaction — эмодзи. Имя участника — getContactInfo |
counts |
object | сколько участников какой реакцией |
Снятая реакция в ответ не попадает. Если площадка разрешает несколько реакций одного человека — Telegram Premium, — в ответе последняя.
Ещё примеры
По списку сообщений
Ответ — в порядке запроса, по элементу на каждый idMessage, даже без реакций:
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/getReactions" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "-80040066617372",
"idMessages": [
"117428956522361912",
"117428955282341903"
]
}'
[
{
"chatId": "-80040066617372", "idMessage": "117428956522361912", "type": "outgoing", "timestamp": 1791823671,
"senderId": "457747484", "senderName": "", "typeMessage": "textMessage",
"textMessage": "В субботу занятие переносится на 12:00",
"reactions": [{"sender": "1111111", "reaction": "👍"}, {"sender": "8695836", "reaction": "👍"}],
"counts": {"👍": 2}
},
{
"chatId": "-80040066617372", "idMessage": "117428955282341903", "type": "incoming", "timestamp": 1791823658,
"senderId": "8695836", "senderName": "Мария", "typeMessage": "textMessage", "textMessage": "Спасибо!",
"reactions": [], "counts": {}
}
]
Все реакции канала за неделю, страницами
Без chatId. Следующая страница — тот же запрос с before, равным timestamp последнего элемента; пустой массив — сообщений с реакциями за период больше нет. Страница бывает короче count: сообщения последней секунды целиком переходят на следующую, поэтому на границе страниц ничего не теряется и не повторяется.
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/getReactions" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"since": 1791244800, "before": 1791849600, "count": 1000}'
Адреса чата и участников — в виде WhatsApp:
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/getReactions" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "79991234567@c.us",
"idMessages": [
"3EB0C767D26A1D5A6F0B"
]
}'
[
{
"chatId": "79991234567@c.us", "idMessage": "3EB0C767D26A1D5A6F0B", "type": "outgoing", "timestamp": 1791823671,
"senderId": "79990000001@c.us", "senderName": "", "typeMessage": "textMessage", "textMessage": "Ждём вас в субботу",
"reactions": [{"sender": "79991234567@c.us", "reaction": "🙏"}], "counts": {"🙏": 1}
}
]
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
idMessages пуст или длиннее 500; idMessages без chatId; since не раньше before; дата не в формате ГГГГ-ММ-ДД и не метка Unix; count вне 1–1000 |
исправить запрос |
401 |
— | неверный ключ канала | проверить idInstance и ключ |
Общие правила — в статье Ответы и ошибки.
Особенности
- Метод отвечает из журнала реакций канала: в нём реакции, о которых площадка сообщила после подключения канала к Gratio, — уведомление Реакция, и загруженные refreshReactions. Реакции, поставленные до подключения, попадают в журнал только через
refreshReactions. - Запрос не обращается к площадке: лимиты номера не тратятся, метод работает и когда канал на паузе.
- MAX. Реакции на чужие сообщения в группах приходят, пока сообщению не больше 48 часов, — см. Реакция. Более поздние реакции на старые чужие сообщения попадают в ответ после
refreshReactions. - Telegram. В больших группах и каналах площадка не сообщает, кто поставил реакцию, только число. Такие реакции в ответе есть только в личных чатах и свои.
- Почта — реакций нет: по списку у каждого сообщения пустые
reactions, за период — пустой массив.
Что дальше
- refreshReactions — загрузить реакции с площадки, в том числе до подключения канала.
- sendReaction — поставить реакцию.
- Реакция — как приходят реакции собеседника.
- getChatHistory — сообщения чата.
