Отправляют посетителю сообщение с кнопками. Кнопка-ответ возвращается уведомлением, когда посетитель её нажал; кнопки-ссылки, звонок и копирование работают сразу в окне. Удобно для быстрых ответов: «Пробное», «Расписание», «Позвонить».
| Запрос | POST /v1/instances/{idInstance}/sendInteractiveButtons; только кнопки-ответы — sendInteractiveButtonsReply или sendButtons |
| Ключ | заголовок Authorization: Bearer {apiTokenInstance} |
| Тело | JSON |
| Каналы | чат на сайте |
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
chatId |
string | да | посетитель: "vq3k7m2x4a6b2c4d6e7f2g3h4" |
body |
string | да | текст сообщения; у sendButtons — поле message |
header |
string | нет | заголовок над текстом |
footer |
string | нет | подпись под текстом |
buttons |
array | да | до 10 кнопок — таблица ниже |
author |
object | нет | подпись в окне — см. Автор сообщения |
clientMessageId |
string | нет | ключ от дублей — см. Надёжная отправка без дублей |
Кнопка:
| Поле | Тип | Описание |
|---|---|---|
type |
string | reply — ответ, url — ссылка, call — позвонить, copy — скопировать текст. У sendInteractiveButtonsReply и sendButtons не нужен: там все кнопки — ответы |
buttonId |
string | id кнопки, до 64 знаков, без повторов; вернётся в ответе как есть. У sendButtons без buttonId — номер по порядку |
buttonText |
string | надпись, до 64 знаков |
url |
string | для url: адрес, только https |
phoneNumber |
string | для call: номер цифрами |
copyCode |
string | для copy: что скопировать, до 256 знаков |
Пример запроса
Ассистент предлагает три действия:
curl
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendInteractiveButtons" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"header": "Школа робототехники",
"body": "Что подсказать?",
"footer": "или напишите вопрос",
"buttons": [
{
"type": "reply",
"buttonId": "trial",
"buttonText": "Пробное занятие"
},
{
"type": "url",
"buttonId": "schedule",
"buttonText": "Расписание",
"url": "https://school.ru/schedule"
},
{
"type": "call",
"buttonId": "call",
"buttonText": "Позвонить",
"phoneNumber": "79990000001"
}
],
"author": {
"kind": "assistant",
"name": "Алина"
},
"clientMessageId": "buttons-1"
}'
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}/sendInteractiveButtons"
payload = {
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"header": "Школа робототехники",
"body": "Что подсказать?",
"footer": "или напишите вопрос",
"buttons": [
{
"type": "reply",
"buttonId": "trial",
"buttonText": "Пробное занятие",
},
{
"type": "url",
"buttonId": "schedule",
"buttonText": "Расписание",
"url": "https://school.ru/schedule",
},
{
"type": "call",
"buttonId": "call",
"buttonText": "Позвонить",
"phoneNumber": "79990000001",
},
],
"author": {"kind": "assistant", "name": "Алина"},
"clientMessageId": "buttons-1",
}
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}/sendInteractiveButtons`;
const payload = {
chatId: "vq3k7m2x4a6b2c4d6e7f2g3h4",
header: "Школа робототехники",
body: "Что подсказать?",
footer: "или напишите вопрос",
buttons: [
{ type: "reply", buttonId: "trial", buttonText: "Пробное занятие" },
{
type: "url",
buttonId: "schedule",
buttonText: "Расписание",
url: "https://school.ru/schedule",
},
{
type: "call",
buttonId: "call",
buttonText: "Позвонить",
phoneNumber: "79990000001",
},
],
author: { kind: "assistant", name: "Алина" },
clientMessageId: "buttons-1",
};
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 . '/sendInteractiveButtons';
$payload = [
'chatId' => 'vq3k7m2x4a6b2c4d6e7f2g3h4',
'header' => 'Школа робототехники',
'body' => 'Что подсказать?',
'footer' => 'или напишите вопрос',
'buttons' => [
[
'type' => 'reply',
'buttonId' => 'trial',
'buttonText' => 'Пробное занятие',
],
[
'type' => 'url',
'buttonId' => 'schedule',
'buttonText' => 'Расписание',
'url' => 'https://school.ru/schedule',
],
[
'type' => 'call',
'buttonId' => 'call',
'buttonText' => 'Позвонить',
'phoneNumber' => '79990000001',
],
],
'author' => ['kind' => 'assistant', 'name' => 'Алина'],
'clientMessageId' => 'buttons-1',
];
$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:
{"idMessage": "o2b7e41c09d8f3a6b5c4d2e1f0a9b8c"}
Посетитель нажал «Пробное занятие» — придёт уведомление Ответ кнопкой с selectedButtonId: "trial".
Ещё примеры
Только ответы — sendButtons
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendButtons" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"message": "Когда удобнее прийти?",
"buttons": [
{
"buttonId": "sat",
"buttonText": "Суббота"
},
{
"buttonId": "sun",
"buttonText": "Воскресенье"
}
]
}'
Скопировать промокод
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendInteractiveButtons" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "vq3k7m2x4a6b2c4d6e7f2g3h4",
"body": "Ваш промокод на первое занятие:",
"buttons": [
{
"type": "copy",
"buttonId": "promo",
"buttonText": "Скопировать",
"copyCode": "ROBOT10"
}
]
}'
Как ведут себя кнопки
- Кнопки-ответы исчезают после выбора и при новом сообщении компании. Второй раз нажать нельзя.
- Свободный ввод открыт всегда: посетитель может не нажимать, а написать.
- Текст нажатой кнопки в уведомлении берётся из вашего сообщения, а не из браузера.
- В ленте и истории ваше сообщение с кнопками —
typeMessage: "interactiveButtons", см. Свои сообщения.
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
нет body или кнопок; кнопок больше 10; buttonId повторяется; надпись длиннее 64; url не https |
исправить запрос |
400 |
not_found |
посетителя нет в этом канале | проверить chatId |
400 |
chat_closed |
посетитель завершил чат или не заходил 90 дней | — |
400 |
not_authorized |
чат снят с сайта | вернуть его на сайт |
501 |
not_supported |
MAX, Telegram, WhatsApp, почта | — |
Общие правила — в статье Ответы и ошибки.
Что дальше
- Ответ кнопкой — уведомление о нажатии.
- sendForm — когда нужны поля, а не кнопки.
- Автор сообщения — подпись в окне.
