Данные подписчика — на ваш сервер прямо из сценария
Шаг сценария отправляет событие на ваш адрес — свой сервер, n8n, Make, Zapier или CRM: id подписчика в мессенджере, имя, телефон, email и переменные. Ответ сервера бот сохранит в переменную и поведёт подписчика дальше.
Что умеет действие «HTTP-запрос»
Одно действие — и данные из бота попадают в систему, где вы работаете, без выгрузок и ручного переноса.
Событие из нужного шага
Поставьте действие «HTTP-запрос» в рубрику — после анкеты, записи или оплаты. Бот отправит событие ровно тогда, когда подписчик дошёл до этого шага, а не раз в час по расписанию.
id подписчика в мессенджере
В событии есть platformId — id человека в Telegram, MAX или ВКонтакте — и chatId — id чата с ботом (у MAX это другое число). По ним ваша система найдёт подписчика без ручной сверки.
Контакты и переменные
Имя, username, телефон и email, если подписчик ими поделился, и все его заполненные переменные — ответы анкеты, город, выбранный тариф. Ключи — те же, что в шаблонах {{$Variable->ключ}}.
POST или GET
POST отправляет JSON со всеми данными. GET уходит без тела: нужные значения вставляются в адрес — https://example.com/hook?id={{$SystemVar->userid}}. Значения экранируются сами, а хост переменной быть не может.
Ответ — в переменную
Ответ сервера можно сохранить в переменную подписчика целиком или взять одно поле по пути: data.link, items[0].url. Дальше его можно показать в сообщении или проверить условием.
Ветки успеха и ошибки
Ответ 2xx ведёт по ветке «при успехе». Отказ, сервер, который так и не ответил, или ответ без нужного поля — по ветке «при ошибке»: там можно извиниться и позвать оператора. Если эта ветка не выбрана, подписчик пойдёт к следующему действию.
Повторы без дублей
Бот ждёт ответа до 10 секунд. При сбое сети, таймауте или ответе 408, 429, 5xx — ещё две попытки, через 10 и 60 секунд. Заголовок X-Webhook-Delivery одинаков во всех попытках: повтор легко отличить от нового события.
Подпись секретом
Каждый запрос несёт время отправки в X-Webhook-Timestamp. Задайте секрет — и к нему добавится подпись HMAC-SHA256 в X-Webhook-Signature: ваш сервер проверит, что событие пришло от вашего бота и не устарело.
Telegram, MAX и ВКонтакте
Действие одинаково работает на трёх платформах. Создаётся в панели или через нейросеть по MCP — там только ключом с полным доступом: действие решает, куда уходят данные подписчиков.
Что придёт на ваш адрес
POST-запрос несёт JSON такого вида — здесь подписчик бота MAX:
{
"event": "step",
"deliveryId": "9f1c…",
"time": "2026-10-27T18:00:00+03:00",
"bot": {"id": 7, "platform": "max", "username": "shopbot"},
"step": {"id": 11, "category": 5, "name": "В CRM"},
"user": {
"id": 42,
"platform": "max",
"platformId": "5550001",
"chatId": "-70001234",
"firstName": "Анна",
"username": "anna",
"phone": "+79990001122",
"email": "a@b.ru"
},
"variables": {"city": "Казань"}
} Поле user.id — id подписчика в BotBrother, platformId — его id в мессенджере, chatId — id чата с ботом (у MAX он отличается от id пользователя). В variables — заполненные переменные подписчика по их ключам. Телефона, почты или переменных нет — поля придут пустыми.
Вместе с телом приходят заголовки:
POST /hook HTTP/1.1
Content-Type: application/json
User-Agent: Bot-Webhook/1
X-Webhook-Event: step
X-Webhook-Delivery: 9f1c…
X-Webhook-Timestamp: 1793113200
X-Webhook-Signature: sha256=5d41… GET-запрос уходит без тела: в нём только то, что вы вставили в адрес, например https://example.com/hook?id={{$SystemVar->userid}}&city={{$Variable->city}}.
Как проверить подпись
Если в действии задан секрет, заголовок X-Webhook-Signature содержит sha256= и HMAC-SHA256 от строки «время + точка + данные запроса», где время — значение X-Webhook-Timestamp (секунды Unix, у каждой попытки своё). Данные — сырое тело для POST и путь с параметрами для GET. Пример на Python:
import hashlib
import hmac
import time
SECRET = b"ваш-секрет"
def verify_signature(headers, payload: bytes) -> bool:
# payload — сырое тело POST-запроса, как пришло,
# или путь с параметрами для GET-запроса
ts = headers.get("X-Webhook-Timestamp", "")
sig = headers.get("X-Webhook-Signature", "")
# старше 5 минут — отклоняем: у каждой попытки своё время, дубли отсекайте по X-Webhook-Delivery
if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
return False
msg = ts.encode() + b"." + payload
digest = hmac.new(SECRET, msg, hashlib.sha256).hexdigest()
return hmac.compare_digest("sha256=" + digest, sig) Считайте подпись по телу в том виде, в каком оно пришло, — до разбора JSON: после разбора и обратной сборки байты могут отличаться. Сравнивайте через hmac.compare_digest, а не обычным равенством.
Как вернуть ответ
Любой ответ 2xx — успех. Если в действии выбрана переменная, бот сохранит в неё ответ целиком или одно поле по пути. Для ответа ниже путь data.link запишет в переменную ссылку, и следующее «Сообщение» покажет её подписчику:
HTTP/1.1 200 OK
Content-Type: application/json
{"data": {"link": "https://example.com/pay/42"}} Пошаговая настройка — в инструкции в блоге.
Для чего подключают «HTTP-запрос»
Лид в CRM
Подписчик заполнил анкету — шаг отправляет имя, телефон, ответы и id в мессенджере в вашу CRM. Менеджер видит заявку сразу, а не после выгрузки.
n8n, Make, Zapier
Вставьте адрес вебхука сценария n8n или Make — дальше событие разойдётся куда нужно: в таблицу, мессенджер команды, почту, сервис рассылок.
Свой сервер
Обработчик на любом языке принимает JSON, проверяет подпись и делает своё: заводит заказ, начисляет доступ, пишет в базу.
Лид из MAX с id чата
У подписчика MAX событие несёт и id пользователя, и id чата с ботом. Ваша система сохраняет их вместе с заявкой — и знает, кому именно в MAX она принадлежит.
Персональная ссылка от сервера
Сервер создаёт ссылку на оплату, личный кабинет или промокод и возвращает её в ответе. Бот сохраняет поле data.link в переменную и тут же показывает подписчику.
Проверка по вашей базе
GET-запрос с id подписчика в адресе спрашивает ваш сервер: есть ли такой клиент, какой у него статус. Ответ — в переменную, дальше — условие.
Как настроить: 3 шага
Адрес, подпись и ветки — без кода на стороне бота.
Добавьте действие
В рубрике нажмите «новое действие» → «HTTP-запрос». Укажите адрес (https://…) и метод: POST — с данными подписчика, GET — только адрес.
Войти в панельНастройте подпись и ответ
По желанию задайте секрет для подписи, переменную для ответа и путь к полю в JSON-ответе — например data.link. Пустой путь сохранит ответ целиком.
Попробовать бесплатноЗадайте ветки и проверьте
Выберите, куда перейти «при успехе» и «при ошибке». Пройдите сценарий сами — событие придёт на ваш адрес с вашими же данными.
Начать сейчасПределы и правила
| Ожидание ответа | до 10 секунд на попытку; успех — любой ответ 2xx |
| Повторы | при сбое сети, таймауте, ответе 408, 429 и 5xx — ещё две попытки, через 10 и 60 секунд; другие коды 4xx не повторяются |
| Старые события | событие, ждавшее отправки дольше суток (бот был остановлен или не оплачен), не отправляется — ветка «при ошибке» |
| Перенаправления | бот по ним не ходит — укажите конечный адрес |
| Адрес | http:// или https://, до 2000 символов, домены на кириллице (.рф) тоже; переменные — только в пути и параметрах; пустая переменная в пути — запрос не отправляется, ветка «при ошибке» |
| Закрытые адреса | localhost, внутренние и частные сети, служебные порты (SSH, почта, базы данных) заблокированы |
| Ответ в переменную | до 64 КБ, не длиннее лимита переменной; длиннее 64 КБ, не JSON при заданном пути или нет нужного поля — ветка «при ошибке»; путь — до 200 символов |
| Переменные в событии | до 200 переменных, значение — до 4000 символов |
| Секрет | до 128 символов; после сохранения не показывается — его можно только заменить или убрать |
| Кто настраивает | сотрудники с доступом к разделу «Пользователи» или полным доступом; остальные видят только адрес сервера без пути |
Вопросы о «HTTP-запросе»
Чем «HTTP-запрос» отличается от API?
Направлением. Через API ваша система сама обращается к боту: читает подписчиков, запускает рассылки. «HTTP-запрос» — наоборот: бот обращается к вашей системе в нужной точке сценария и передаёт данные конкретного подписчика. Часто их используют вместе: событие пришло — ваш сервер через API запустил подписчику нужную рубрику.
Что такое platformId и chatId?
platformId — id подписчика в самом мессенджере: в Telegram это chat id личной переписки, в MAX и ВКонтакте — id пользователя. chatId — id чата с ботом; у MAX это другое число, чем id пользователя, поэтому в событии всегда передаются оба. Поле user.id — внутренний id подписчика в BotBrother, его же даёт {{$SystemVar->userid}}.
Что будет, если мой сервер не ответил?
Бот ждёт ответа до 10 секунд. Если ответа нет или сервер вернул 408, 429 или 5xx, будут ещё две попытки — через 10 и 60 секунд. Не помогло — подписчик пойдёт по ветке «при ошибке» (а если она не выбрана — к следующему действию). На ответ 4xx и перенаправление повторов нет: такую ошибку повтор не исправит.
Как не обработать одно событие дважды?
Запоминайте deliveryId — он же приходит в заголовке X-Webhook-Delivery и одинаков во всех повторах одного события. Если такой id уже обработан, просто ответьте 200 и ничего не делайте.
Обязательно ли задавать секрет?
Нет, но мы советуем. Без секрета ваш адрес примет запрос от кого угодно, кто его узнал. С секретом каждый запрос подписан: сервер проверяет X-Webhook-Signature и время из X-Webhook-Timestamp и отклоняет чужое и устаревшее.
Можно ли отправить запрос на localhost или во внутреннюю сеть?
Нет. Запросы на локальные, внутренние и частные адреса заблокированы. Адрес должен быть доступен из интернета — например, ваш сервер, облачная функция или вебхук n8n и Make.
Работает ли это в MAX и ВКонтакте?
Да, действие одинаково работает в Telegram, MAX и ВКонтакте. Отличается только содержимое: platformId у каждой платформы свой, а chatId у MAX отличается от id пользователя.
Можно ли настроить действие через нейросеть?
Да, через MCP ассистент создаст и поправит «HTTP-запрос», как любое другое действие. Но только ключом с полным доступом: действие решает, куда уходят данные подписчиков, поэтому ключу с ограниченными правами оно недоступно. Сохранённый секрет ассистент не видит — только маску.
Подключите бота к своей системе
Создайте бота, добавьте «HTTP-запрос» и посмотрите, как событие приходит на ваш адрес, — 200 ₽ на баланс для старта.