# Входящий Webhook

Блок принимает запрос от стороннего сервиса и выполняет ваш код на JavaScript. Так сценарий можно продолжить по событию снаружи: пришла оплата, изменился статус заказа, сработал датчик.

![Панель настроек блока «Входящий Webhook»](https://support.watbot.ru/_media/ru/01-chatbots/03-blocks/06-developer/_images/incoming-webhook.webp?v=1791781230)

В этот блок не ведут связи из других блоков: он запускается только запросом.

## Настройки

- **«URL для запросов»** — адрес, который нужно вызвать. Он выдаётся блоку при создании и выглядит так: `https://api.<домен платформы>/hook/<ID блока>:<секретный ключ>`. Подходит любой метод — `GET`, `POST` и другие.
- **«Код JavaScript для обработки запроса»** — код, который выполняется на каждый запрос, до 16 384 символов.

> [!WARNING]
> Адрес содержит секретный ключ. Любой, кто знает адрес, может запустить ваш код — не публикуйте его.

## Что приходит в код

Запрос лежит в объекте `request`:

| Поле | Что в нём |
|---|---|
| `request.query` | Параметры из строки запроса |
| `request.headers` | Заголовки запроса, имена — строчными буквами |
| `request.body` | Тело запроса строкой, как оно пришло |
| `request.data` | Все параметры запроса вместе: из строки запроса, формы и тела в формате JSON |

Подробнее о полях и о том, как проверить подпись запроса, — в разделе [«Встроенные переменные»](https://support.watbot.ru/api/javascript/builtins#входящий-запрос).

Запрос приходит не от человека, поэтому код сам должен указать, для какого контакта он выполняется. Для этого есть функции:

| Функция | Как ищет контакта |
|---|---|
| `setContactById(id)` | По ID контакта на платформе |
| `setContactByTelegramId(id)` | По ID человека в Telegram |
| `setContactByMaxId(id)` | По ID человека в MAX |
| `setContactByVkId(id)` | По ID человека во ВКонтакте |
| `setContactByViberId(id)` | По ID человека в Viber |

Подробнее о каждой функции — на странице [«Выбор контакта»](https://support.watbot.ru/api/javascript/contact).

Функция возвращает `true`, если контакт найден среди контактов этого бота, и `false`, если нет. Вызвать такую функцию можно один раз за запрос. Хотя бы одна из них обязана быть в коде — иначе блок ответит ошибкой и код не запустится.

После того как контакт найден, коду доступны его данные (`id`, `name`, `phone` и остальные) и все функции блока «Интерпретатор JavaScript»: переменные, теги, `sendMessage`, `goToBlock`, `disableContinue`.

```js
var contactId = request.query.contact_id;

if (setContactById(contactId)) {
    setContactVariable('статус_заказа', request.data.status);
    sendMessage('Статус вашего заказа изменился.');
}
```

Чтобы внешний сервис знал ID контакта, передайте его заранее — например, блоком «HTTP-запрос» с [автоподстановкой](https://support.watbot.ru/chatbots/templates) `{{ id }}`.

> [!IMPORTANT]
> Если контакт не найден, код выполнится, но ничего не сохранит: переменные, теги и глобальные переменные не запишутся, сообщения не уйдут, связь «Продолжить» не сработает.

## Выходы

- «Продолжить» — срабатывает после выполнения кода, если контакт найден и код не вызвал `disableContinue()`.

## Что блок отвечает

Ответ — JSON с полями `status` (`ok` или `error`), `message` и `return_value` — значением последнего выражения в коде.

| Код ответа | Когда |
|---|---|
| `200` | Код выполнен. Если контакт не найден, в `message` будет `Code executed without setting contact` |
| `404` | Неправильный адрес: нет такого блока или не подходит ключ |
| `422` | Ошибка в коде, поле кода пустое, в коде нет функции поиска контакта или у владельца бота нет Pro |
| `429` | Слишком много запросов |

Каждый запрос и ответ на него записываются в «Лог выполнения» блока.

![«Лог выполнения» входящего webhook: метод, параметры и тело запроса, значение кода и ответ блока](https://support.watbot.ru/_media/ru/01-chatbots/03-blocks/06-developer/_images/incoming-webhook-log.webp?v=1791781230)

## Ограничения

- Блок работает, только пока у владельца бота действует Pro. Подробнее — [что доступно без Pro](https://support.watbot.ru/billing/without-pro).
- Не более 30 запросов за 10 секунд на одного бота — на все его блоки «Входящий Webhook» вместе — и не более 180 запросов в минуту с одного IP-адреса.
- На код действуют те же ограничения, что в блоке «Интерпретатор JavaScript»: ES5 и 5 секунд на выполнение.

## Запросы от Telegram и MAX

Блок может получать всё, что мессенджер присылает вашему боту. В окне подключения [Telegram](https://support.watbot.ru/chatbots/channels/telegram) или [MAX](https://support.watbot.ru/chatbots/channels/max) включите переключатель «Ретранслировать запросы на блок "Входящий Webhook"» и в поле «Блок» выберите блок по ID или имени.

После этого каждое событие мессенджера сначала обрабатывает бот — как обычно, по сценарию, — а затем оно передаётся в код блока. Событие в том виде, в каком его прислал мессенджер, лежит в `request.data`.

Так можно реагировать на то, что сценарий сам не обрабатывает: сообщения в группах и каналах, добавление бота в чат. Запросы встроенного режима Telegram в блок не передаются.

```js
var message = request.data.message;

if (message && message.from && setContactByTelegramId(message.from.id)) {
    setContactTag('писал_в_группе');
    disableContinue();
}
```

Такие события идут в счёт того же ограничения по числу запросов в минуту.
