Согласования
Интерактивные подтверждения через Telegram/Max-бота: вопрос с кнопками, follow-up по клику, маршруты уведомлений и webhook — без своего бэкенда на обработку кнопок.
Как это устроено
Сначала создаётся шаблон (сценарий) — вопрос с {{vars}}, набор кнопок, тексты follow-up и маршруты по исходу. Затем по этому шаблону запускается конкретное согласование для подписчика — сразу или к назначенному времени. Бот присылает вопрос с кнопками, а по клику отправляет свой follow-up текст, применяет маршруты уведомлений и шлёт webhook. Своего бэкенда на обработку кнопок не нужно.
Эндпоинты
POST /v1/approval-templates — создать шаблон (сценарий)POST /v1/approval-templates/{id}/routes — маршрут уведомления по исходуPOST /v1/approvals — запустить согласованиеGET /v1/approvals/{id} — статус и исходPOST /v1/approvals/{id}/cancel — отменить (пока не отвечено)1. Создание шаблона
Шаблон задаёт вопрос prompt (text, опционально format и media) с плейсхолдерами {{vars}}, кнопки и тексты follow-up для каждого исхода. Обязательна только кнопка approve; decline и reschedule — опциональны. default_ttl_minutes — срок жизни по умолчанию, если не переопределён при запуске.
Кнопки и исходы
approve object обязательныйКнопка подтверждения — исход approved. { label }
decline object Кнопка отклонения — исход declined. Необязательна
reschedule object Кнопка переноса — исход reschedule. Необязательна
expired — Исход по истечении TTL без ответа (кнопки нет, только follow-up и маршрут)
2. Маршруты по исходу
Как в формах: маршрут связывает исход (trigger_outcome: approved | declined | reschedule | expired) с получателем (recipient_type: email | messenger | subscriber | team). Например — при declined уведомить ресепшн на email.
3. Запуск согласования
Запуск создаёт конкретное согласование по шаблону. Укажите подписчика через subscriber_id или external_id (ваш идентификатор пользователя). scheduled_at — отправить не сразу, а в назначенное время. vars подставляются в {{плейсхолдеры}} вопроса и follow-up.
Параметры запуска
template_id string обязательныйID шаблона согласования
subscriber_id string ID подписчика (либо external_id)
external_id string Ваш идентификатор пользователя (либо subscriber_id)
scheduled_at string ISO-8601 — время отправки. Без него — сразу
ttl_minutes integer Срок жизни, переопределяет default_ttl_minutes шаблона
vars object Значения для {{плейсхолдеров}} вопроса и follow-up
metadata object Произвольные данные — возвращаются в webhook и статусе
Ответ
4. Статус и исход
Опрашивайте статус согласования по его ID. status проходит sent → answered (или expired / cancelled). outcome появляется после ответа: approved, declined или reschedule.
5. Webhook-события
Zapnoty шлёт webhook на каждый шаг: approval.sent (вопрос отправлен), approval.approved, approval.declined, approval.reschedule (ответ подписчика) и approval.expired (истёк TTL). Подпись — X-Zapnoty-Signature (HMAC-SHA256), как у остальных событий.