Меню и кнопки ответа без шаблона
Через POST /v1/messages/send можно отправить клиенту интерактивное сообщение: меню-список или кнопки ответа. Шаблон и одобрение Meta для этого не нужны. Подходит для чат-ботов: клиент написал «Старт», ваш бот в ответ показывает меню.
Два вида
| type | Как выглядит у клиента | Вариантов |
|---|---|---|
list | Под сообщением одна кнопка, например «Открыть меню». По нажатию открывается список, клиент выбирает один пункт | до 10 |
buttons | Кнопки прямо под текстом сообщения | до 3 |
Как это выглядит у клиента
Сообщение с меню: заголовок, текст, подпись и кнопка «Открыть меню».

По нажатию открывается список пунктов. Слева телефон, справа WhatsApp на компьютере.
Клиент нажимает пункт, и его выбор приходит Вам на вебхук с id пункта.
Когда можно отправлять
- Только на линиях WhatsApp Business API (
whatsapp_waba). Для других линий API вернёт 400. - Только в течение 24 часов после последнего сообщения клиента. Это правило WhatsApp: вне окна можно писать только шаблоном. Если окно закрыто, WhatsApp не примет сообщение, и в вебхуке статуса придёт ошибка.
- В шаблон и в рассылку меню-список добавить нельзя, это тоже правило WhatsApp. В шаблоне можно сделать до 10 кнопок быстрого ответа: раздел «Шаблоны» в кабинете.
URL
POST https://api.wazzabee.com/api-gateway/v1/messages/send
Заголовки
Authorization: Bearer ВАШ_API_КЛЮЧ
Content-Type: application/json
Параметры поля interactive
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
type | string | ✅ | list или buttons |
body | string | ✅ | Текст сообщения: до 4096 символов в меню, до 1024 у кнопок |
header | string | Нет | Заголовок над текстом, до 60 символов |
footer | string | Нет | Подпись под текстом мелким шрифтом, до 60 символов |
button | string | ✅ для list | Надпись на кнопке, которая открывает меню, до 20 символов |
rows | array | ✅ для list* | Пункты меню: id до 200 символов, title до 24, description до 72 (необязательно). Всего до 10 пунктов |
sections | array | ✅ для list* | Пункты по разделам: { "title": "...", "rows": [...] }. До 10 разделов, название до 24 символов, обязательно, если разделов больше одного. Пунктов всего до 10 |
buttons | array | ✅ для buttons | От 1 до 3 кнопок: id до 256 символов, title до 20 |
* Для меню передайте rows или sections.
Поле interactive не совмещается с text, mediaUrl и templateName: текст сообщения передаётся в interactive.body. id пунктов и кнопок, а также надписи кнопок не должны повторяться. Остальные поля запроса (channelId, chatId, campaignId, senderName, automated) работают как обычно, см. Отправка сообщений.
Пример: меню из шести пунктов
curl -X POST "https://api.wazzabee.com/api-gateway/v1/messages/send" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"channelId": "uuid-вашей-линии",
"chatId": "77071234567",
"interactive": {
"type": "list",
"header": "Главное меню",
"body": "Здравствуйте! Выберите, что вас интересует",
"footer": "Работаем с 9:00 до 19:00",
"button": "Открыть меню",
"rows": [
{ "id": "prices", "title": "Цены", "description": "Тарифы и стоимость" },
{ "id": "catalog", "title": "Каталог" },
{ "id": "delivery", "title": "Доставка и оплата" },
{ "id": "order_status", "title": "Статус заказа" },
{ "id": "address", "title": "Адрес и график" },
{ "id": "manager", "title": "Связаться с менеджером" }
]
}
}'
Пример: меню с разделами
"interactive": {
"type": "list",
"body": "Выберите услугу",
"button": "Услуги",
"sections": [
{ "title": "Стрижки", "rows": [
{ "id": "cut_men", "title": "Мужская" },
{ "id": "cut_women", "title": "Женская" }
]},
{ "title": "Окрашивание", "rows": [
{ "id": "color_full", "title": "Полное" }
]}
]
}
Пример: кнопки ответа
"interactive": {
"type": "buttons",
"body": "Подтверждаете запись на завтра в 10:00?",
"buttons": [
{ "id": "confirm", "title": "Да, приду" },
{ "id": "reschedule", "title": "Перенести" },
{ "id": "cancel", "title": "Отменить" }
]
}
Ответ (202)
{
"success": true,
"queued": true,
"queueId": "uuid",
"campaignId": null,
"message": "Сообщение поставлено в очередь на отправку"
}
Ошибки (400)
Лимиты проверяются сразу, до отправки. Если что-то не так, API ответит 400 и напишет, какое поле исправить, например:
{ "error": "В меню не больше 10 пунктов всего, сейчас 11" }
{ "error": "interactive.rows[2].title: не длиннее 24 символов" }
{ "error": "interactive доступен только для линий WhatsApp Business API (whatsapp_waba)" }
Как узнать, что выбрал клиент
Включите подписку messages_button (см. Webhooks). Когда клиент выберет пункт меню или нажмёт кнопку, придёт событие:
{
"buttons": [{
"messageId": "uuid",
"channelId": "uuid",
"chatId": "77071234567",
"contactId": "uuid",
"conversationId": "uuid",
"button": {
"type": "list_reply",
"id": "prices",
"title": "Цены",
"description": "Тарифы и стоимость"
},
"replyTo": {
"messageId": "uuid",
"queueId": "uuid",
"campaignId": null,
"broadcastId": null
},
"timestamp": "2026-10-03T12:00:00Z"
}]
}
Для пункта меню button.type равен list_reply, для кнопки ответа button_reply. В button.id приходит ваш id, по нему удобно вести сценарий бота дальше. В replyTo.queueId указана отправка, на которую ответил клиент.
Что видит оператор
В чате кабинета сообщение отображается текстом с пунктами меню или кнопками под ним, как их увидел клиент. Выбор клиента приходит в чат обычным входящим сообщением с названием пункта.
