Skip to main content
POST
Configurar Webhook
Auth: TokenAccount o TokenInstanceRate 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 label aún no utilizado.
  • Actualizar uno existente: envía el mismo label, todos los nuevos campos sobrescriben los antiguos.
  • Soft-disable: envía el mismo label con {"enabled": false} (limpia url, authorization, events, mediaBase64, pero preserva la fila).
  • Migración paralela: ejecuta el webhook viejo mientras validas el nuevo bajo un label diferente; una vez confirmado, desactiva el viejo.

Ejemplos

Mínimo

Habilita el webhook default 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 llamado analytics-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)

Activa byEvents: 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 webhook analytics-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 recibe message.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 objeto webhook 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

string
requerido
Nombre de la instancia (p. ej., $Instance_Name).

Cabeceras

string
requerido
TokenAccount o TokenInstance.
string
requerido
application/json

Cuerpo de la solicitud

string
predeterminado:"default"
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.
boolean
requerido
Activa/desactiva el webhook. Cuando es false, los campos url, authorization, byEvents, events y mediaBase64 se limpian antes de guardar.
string
URL de destino. Requerida cuando enabled=true. Pasa por el guard SSRF (ver abajo), bloquea localhost, IPs privadas, link-local, multicast.
string | null
predeterminado:"null"
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.
boolean
predeterminado:"false"
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).
string[]
predeterminado:"[]"
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}.
boolean
predeterminado:"false"
Cuando es true, los eventos message.exchange con media incluyen media.base64 (aumenta el payload, puede exceder 100KB).

Guard SSRF

La url se valida al momento de la configuración y antes de cada entrega. Bloquea destinos que apunten a infraestructura interna:
Si necesitas probar contra un servidor local en desarrollo, expónlo a través de un túnel público (ngrok, cloudflared, localhost.run), el guard SSRF está activo en todos los entornos.

Notas

  • authorization vacío vs. null: envía null u omítelo para saltar la cabecera. Una cadena vacía "" resultaría en una cabecera Authorization: vacía, que algunos proxies rechazan.
  • enabled=false limpia los campos: re-habilitar el mismo label después requiere reenviar la url (y cualquier otro campo que quieras preservar).
  • No hay DELETE: para “remover” un webhook, haz POST con {"enabled": false} manteniendo el label. Los operadores pueden inspeccionar/limpiar la fila directamente en la base de datos cuando sea necesario.
  • Cifrado opcional: si ENCRYPTION_KEY no está configurado, authorization se 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

Envoltorio:
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.