Sincronización del catálogo
La tablaevent debe reflejar el catálogo generado antes de que los
suscriptores puedan elegir eventos. Dos mecanismos lo garantizan:
Verifica con:
missing_internals lista eventos presentes en código pero aún no en la base
de datos; stale_internals lista filas de la base de datos que ninguna ruta
produce ya (siguen siendo suscribibles hasta que un operador las desactive).
Entrega de prueba
POST /api/v3/webhook/webhook/{id}/test encola una entrega sintética
webhook.test hacia ese suscriptor y devuelve el dispatch_id. Síguela en
GET /api/v3/webhook/dispatch/{dispatch_id} o en la pantalla de detalle de
Horizon Enterprise. El webhook no necesita estar suscrito a
webhook.test para que la acción funcione; suscribirse solo permite
filtrar esas entregas después.
Sink de desarrollo
POST /api/v3/webhook/sink es un endpoint suscriptor integrado que solo se
monta cuando APP_ENV es development o certification y
WEBHOOK_SINK_SECRET está definido. Verifica la firma con ese secreto,
registra Webhook sink delivery accepted con las cabeceras del sobre y
responde 200, de modo que una fila de dispatch pasa a success sin ningún
sistema externo.
1
Crea un webhook apuntando al sink
url = https://<host de la api>/api/v3/webhook/sink, is_global = true.
Copia el secreto whsec_… devuelto.2
Comparte el secreto con la API
Define
WEBHOOK_SINK_SECRET con ese valor en el entorno del tier y
redespliega (o reinicia en local).3
Envía una prueba
POST /api/v3/webhook/webhook/{id}/test, luego revisa la fila de
dispatch y los logs de la API.404 allí sin importar la
variable.
Dashboard y salud
Variables de entorno
La tolerancia de firma (300 s), el calendario de backoff, el tope de
intentos (5) y el umbral de desactivación automática (20) son constantes de
código en
lib/webhook/outbound/webhook-out.constants.ts y
webhook-signature.ts, no variables de entorno — forman parte del contrato
público y solo cambian con un release.
Permisos
Todos los permisos de webhook se conceden únicamente al roladministrator
en este release. Los tokens de automatización deben portar los internals
concretos:
Límites conocidos
- Sin IP de egreso fija. Las entregas salen del runtime serverless de la API; filtra por firma, no por dirección.
- Cuerpo fino. El payload nunca incluye el recurso; hace falta una segunda llamada a la API para leerlo.
- Al menos una vez. Reintentos y replays pueden repetir una entrega;
deduplica por
id. - Sin garantía de orden entre eventos, incluso del mismo recurso.
- La rotación de secreto no tiene ventana de solape.
- Los eventos de purga llevan
data.account = nully solo llegan a suscriptores globales.
Relacionado
- Runbook interno del primer despliegue (pasos por tier, rollback, señales
de día 2):
docs/initiatives/webhook/outbound/11-rollout-and-operations.mden el monorepo. - Referencia API: Webhook, Webhook Event, Webhook Dispatch, Event.