Eventos
Configurar Webhook
Crea o actualiza un webhook (hasta 3 habilitados por instancia) con filtrado de eventos, media en base64 y su propia cabecera Authorization
POST
Configurar Webhook
Auth:
Envoltorio:
TokenAccount o TokenInstance • Rate limit: Global (100/min) • Idempotente: sí (upsert por label)
Descripción
Crea o actualiza la fila(instance, label) en webhook_configs. Cada instancia acepta hasta 3 webhooks habilitados simultáneamente, identificados por un label libre. Los webhooks con enabled=false se mantienen en la base de datos pero no cuentan para el límite y no reciben entregas.
Casos de uso:
- Crear un nuevo webhook: envía un
labelaún no utilizado. - Actualizar uno existente: envía el mismo
label, todos los nuevos campos sobrescriben los antiguos. - Soft-disable: envía el mismo
labelcon{"enabled": false}(limpiaurl,authorization,events,mediaBase64, pero preserva la fila). - Migración paralela: ejecuta el webhook viejo mientras validas el nuevo bajo un
labeldiferente; una vez confirmado, desactiva el viejo.
Ejemplos
Mínimo
Habilita el webhookdefault apuntando a https://meuapp.com/webhook. Sin events, recibe los 6 tipos; sin authorization, no envía cabecera de auth.
Con label, filtro y Authorization
Crea un webhook llamadoanalytics-pipeline que solo recibe message.exchange y message.status, envía la cabecera Authorization: Bearer svc-token-xyz en cada entrega y desactiva el respaldo en base64.
byEvents = true (enrutamiento basado en URL)
ActivabyEvents: true para que cada entrega se envíe con el nombre del evento como sufijo en la URL (p. ej., https://meuapp.com/wh/message.exchange), permitiendo enrutamiento del lado servidor por endpoint sin inspeccionar el payload.
Soft-disable preservando el label
Desactiva el webhookanalytics-pipeline enviando solo enabled: false. La fila queda en la base de datos pero url, authorization, events y mediaBase64 se limpian, y la entrada deja de contar para el límite de 3 webhooks activos.
Media en Base64 (respaldo crudo)
Configura un webhook dedicado al respaldo que solo recibemessage.exchange con mediaBase64: true, de modo que cada mensaje con media incluya el contenido binario codificado en base64 dentro del payload.
Respuesta exitosa
La respuesta retorna el objetowebhook con la configuración efectivamente persistida (label, enabled, url, authorization, byEvents, events, mediaBase64), refleja el body de la solicitud después del upsert. Cuando enabled=false, los campos url, authorization, events y mediaBase64 regresan limpios. El dispatcher comienza a usar la nueva configuración inmediatamente (el caché interno de 30s se invalida al guardar).
200 OK
Parámetros de ruta
Nombre de la instancia (p. ej.,
$Instance_Name).Cabeceras
TokenAccount o TokenInstance.application/jsonCuerpo de la solicitud
Identificador local. Máx. 50 caracteres; acepta
[a-zA-Z0-9_-]. Vacío u omitido se convierte en "default". Permite múltiples webhooks por instancia.Activa/desactiva el webhook. Cuando es
false, los campos url, authorization, byEvents, events y mediaBase64 se limpian antes de guardar.URL de destino. Requerida cuando
enabled=true. Pasa por el guard SSRF (ver abajo), bloquea localhost, IPs privadas, link-local, multicast.Contenido literal de la cabecera
Authorization enviada en cada entrega (p. ej., Bearer secret-key-123). Cifrado en reposo con AES-256-GCM cuando ENCRYPTION_KEY está configurado.Si es
true, la URL recibe el sufijo /<event-name> en cada entrega, útil para enrutamiento basado en endpoints sin inspeccionar el payload (https://app/wh/message.exchange).Filtro. Array vacío = recibir los 6 tipos. Cada entrada debe estar en
{message.exchange, message.status, call.update, group.flow, instance.state, label.update}.Cuando es
true, los eventos message.exchange con media incluyen media.base64 (aumenta el payload, puede exceder 100KB).Guard SSRF
Laurl se valida al momento de la configuración y antes de cada entrega. Bloquea destinos que apunten a infraestructura interna:
| Rango | Ejemplo |
|---|---|
| Loopback | localhost, 127.0.0.1, ::1 |
| IPv4 privada | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 |
| Link-local IPv4 | 169.254.0.0/16 |
| Link-local IPv6 | fe80::/10 |
| Multicast / broadcast | 224.0.0.0/4, 255.255.255.255 |
Notas
authorizationvacío vs.null: envíanullu omítelo para saltar la cabecera. Una cadena vacía""resultaría en una cabeceraAuthorization:vacía, que algunos proxies rechazan.enabled=falselimpia los campos: re-habilitar el mismolabeldespués requiere reenviar laurl(y cualquier otro campo que quieras preservar).- No hay
DELETE: para “remover” un webhook, hazPOSTcon{"enabled": false}manteniendo ellabel. Los operadores pueden inspeccionar/limpiar la fila directamente en la base de datos cuando sea necesario. - Cifrado opcional: si
ENCRYPTION_KEYno está configurado,authorizationse almacena en texto plano. En producción, siempre configura la clave. - Caché invalidado: la nueva configuración se vuelve visible para el dispatcher inmediatamente (el TTL interno de 30s se invalida al guardar).
Errores
| HTTP | error.message |
|---|---|
| 400 | Invalid request body |
| 400 | URL is required when enabled is true |
| 400 | URL must not target localhost or private network |
| 400 | invalid event type: <value> |
| 400 | label too long (max 50 chars) |
| 400 | label may only contain letters, digits, underscore or dash |
| 401 | Invalid token |
| 404 | Instance not found |
| 409 | webhook limit reached (max 3 enabled per instance) |
| 429 | Rate limit exceeded. Try again later. |
| 500 | Failed to get instance |
La verificación del límite de 3 webhooks solo se aplica al crear una nueva fila con
enabled=true. Editar una fila existente (mismo label) nunca dispara el límite.Siguiente
Listar webhooks
GET /api/events/getWebhook/:instance, todos o por ?label=.Catálogo de eventos
Qué transporta cada
event en data.