Перейти к содержимому

sendInteractiveButtons и sendButtons

Обновлено 18 октября 2026

Отправляют посетителю сообщение с кнопками. Кнопка-ответ возвращается уведомлением, когда посетитель её нажал; кнопки-ссылки, звонок и копирование работают сразу в окне. Удобно для быстрых ответов: «Пробное», «Расписание», «Позвонить».

Запрос 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, почта —

Общие правила — в статье Ответы и ошибки.

Что дальше

Была ли статья полезна?