# Вхідний Webhook

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

![Панель налаштувань блоку «Вхідний Webhook»](https://support.watbot.org/_media/uk/01-chatbots/03-blocks/06-developer/_images/incoming-webhook.webp?v=1791781231)

У цей блок не ведуть зв'язки з інших блоків: він запускається лише запитом.

## Налаштування

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

> [!WARNING]
> Адреса містить секретний ключ. Будь-хто, хто знає адресу, може запустити ваш код — не публікуйте її.

## Що надходить у код

Запит лежить в об'єкті `request`:

| Поле | Що в ньому |
|---|---|
| `request.query` | Параметри з рядка запиту |
| `request.headers` | Заголовки запиту, імена — малими літерами |
| `request.body` | Тіло запиту рядком, як воно надійшло |
| `request.data` | Усі параметри запиту разом: із рядка запиту, форми й тіла у форматі JSON |

Докладніше про поля і про те, як перевірити підпис запиту, — у розділі [«Вбудовані змінні»](https://support.watbot.org/uk/api/javascript/builtins#вхідний-запит).

Запит надходить не від людини, тому код сам має вказати, для якого контакту він виконується. Для цього є функції:

| Функція | Як шукає контакт |
|---|---|
| `setContactById(id)` | За ID контакту на платформі |
| `setContactByTelegramId(id)` | За ID людини в Telegram |
| `setContactByMaxId(id)` | За ID людини в MAX |
| `setContactByVkId(id)` | За ID людини у ВКонтакте |
| `setContactByViberId(id)` | За ID людини у Viber |

Докладніше про кожну функцію — на сторінці [«Вибір контакту»](https://support.watbot.org/uk/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.org/uk/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.org/_media/uk/01-chatbots/03-blocks/06-developer/_images/incoming-webhook-log.webp?v=1791781231)

## Обмеження

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

## Запити від Telegram і MAX

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

Після цього кожну подію месенджера спочатку обробляє бот — як зазвичай, за сценарієм, — а потім вона передається в код блоку. Подія в тому вигляді, у якому її надіслав месенджер, лежить у `request.data`.

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

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

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

Такі події йдуть у рахунок того самого обмеження за кількістю запитів на хвилину.
