# Webhook entrante

El bloque recibe una solicitud de un servicio externo y ejecuta tu código JavaScript. Así el flujo puede continuar a partir de un evento externo: llegó un pago, cambió el estado de un pedido, se activó un sensor.

![Panel de configuración del bloque «Webhook entrante»](https://support.jetbot24.ru/_media/es/01-chatbots/03-blocks/06-developer/_images/incoming-webhook.webp?v=1792562451)

Ninguna conexión de otros bloques lleva a este bloque: solo lo inicia una solicitud.

## Configuración

- **«URL de la solicitud»**: la dirección a la que llamar. Se asigna al bloque al crearlo y tiene este aspecto: `https://api.<dominio de la plataforma>/hook/<ID del bloque>:<clave secreta>`. Sirve cualquier método: `GET`, `POST` y otros.
- **«Código JavaScript para procesar la solicitud»**: el código que se ejecuta con cada solicitud, hasta 16 384 caracteres.

> [!WARNING]
> La dirección contiene una clave secreta. Cualquiera que la conozca puede ejecutar tu código: no la publiques.

## Qué recibe el código

La solicitud está en el objeto `request`:

| Campo | Qué contiene |
|---|---|
| `request.query` | Los parámetros de la cadena de consulta |
| `request.headers` | Los encabezados de la solicitud, con los nombres en minúsculas |
| `request.body` | El cuerpo de la solicitud como cadena, tal como llegó |
| `request.data` | Todos los parámetros de la solicitud juntos: de la cadena de consulta, del formulario y de un cuerpo JSON |

Más sobre los campos y sobre cómo verificar la firma de una solicitud en [Variables integradas](https://support.jetbot24.ru/es/api/javascript/builtins#solicitud-entrante).

La solicitud no viene de una persona, así que el propio código debe indicar para qué contacto se ejecuta. Para eso hay funciones:

| Función | Cómo encuentra al contacto |
|---|---|
| `setContactById(id)` | Por el ID del contacto en la plataforma |
| `setContactByTelegramId(id)` | Por el ID de la persona en Telegram |
| `setContactByMaxId(id)` | Por el ID de la persona en MAX |
| `setContactByVkId(id)` | Por el ID de la persona en VK |
| `setContactByViberId(id)` | Por el ID de la persona en Viber |

Cada función se describe en detalle en la página [Elegir el contacto](https://support.jetbot24.ru/es/api/javascript/contact).

La función devuelve `true` si el contacto se encuentra entre los contactos de este bot y `false` si no. Se puede llamar a una de estas funciones una vez por solicitud. Al menos una debe estar en el código; si no, el bloque responde con un error y el código no se ejecuta.

Una vez encontrado el contacto, el código puede usar sus datos (`id`, `name`, `phone` y los demás) y todas las funciones del bloque «Intérprete de JavaScript»: variables, etiquetas, `sendMessage`, `goToBlock`, `disableContinue`.

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

if (setContactById(contactId)) {
    setContactVariable('order_status', request.data.status);
    sendMessage('El estado de tu pedido ha cambiado.');
}
```

Para que el servicio externo conozca el ID del contacto, pásaselo antes, por ejemplo con un bloque «Solicitud HTTP» y la [plantilla](https://support.jetbot24.ru/es/chatbots/templates) `{{ id }}`.

> [!IMPORTANT]
> Si no se encuentra el contacto, el código se ejecuta pero no guarda nada: no se escriben variables, etiquetas ni variables globales, no se envían mensajes y la conexión «Continuar» no se activa.

## Salidas

- «Continuar»: se activa cuando el código se ha ejecutado, si se encontró el contacto y el código no llamó a `disableContinue()`.

## Qué responde el bloque

La respuesta es un JSON con los campos `status` (`ok` o `error`), `message` y `return_value`, que es el valor de la última expresión del código.

| Código de respuesta | Cuándo |
|---|---|
| `200` | El código se ha ejecutado. Si no se encontró el contacto, `message` contiene `Code executed without setting contact` |
| `404` | Dirección incorrecta: no existe ese bloque o la clave no coincide |
| `422` | Un error en el código, el campo de código está vacío, el código no tiene ninguna función para elegir el contacto o el propietario del bot no tiene Pro |
| `429` | Demasiadas solicitudes |

Cada solicitud y su respuesta quedan en el «Registro de ejecución» del bloque.

![«Registro de ejecución» del webhook entrante: método, parámetros y cuerpo de la solicitud, valor devuelto y respuesta del bloque](https://support.jetbot24.ru/_media/es/01-chatbots/03-blocks/06-developer/_images/incoming-webhook-log.webp?v=1792562451)

## Límites

- El bloque solo funciona mientras el Pro del propietario del bot está activo. Los detalles están en [Qué está disponible sin Pro](https://support.jetbot24.ru/es/billing/without-pro).
- No más de 30 solicitudes cada 10 segundos por bot (sumando todos sus bloques «Webhook entrante») y no más de 180 solicitudes por minuto desde una misma dirección IP.
- El código tiene los mismos límites que en el bloque «Intérprete de JavaScript»: ES5 y 5 segundos de ejecución.

## Solicitudes de Telegram y MAX

El bloque puede recibir todo lo que la app de mensajería envía a tu bot. En la ventana de conexión de [Telegram](https://support.jetbot24.ru/es/chatbots/channels/telegram) o [MAX](https://support.jetbot24.ru/es/chatbots/channels/max), activa el interruptor «Reenviar solicitudes al bloque «Webhook entrante»» y elige el bloque por ID o por nombre en el campo «Bloque».

A partir de ahí, cada evento del canal lo procesa primero el bot, como siempre, según el flujo, y después pasa al código del bloque. El evento, tal como lo envió la app de mensajería, está en `request.data`.

Así puedes reaccionar a lo que el flujo por sí solo no procesa: mensajes en grupos y canales, que añadan el bot a un chat. Las solicitudes del modo inline de Telegram no se pasan al bloque.

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

if (message && message.from && setContactByTelegramId(message.from.id)) {
    setContactTag('wrote_in_group');
    disableContinue();
}
```

Estos eventos cuentan para el mismo límite de solicitudes por minuto.
