POST JSON firmado a la URL.
Puedes gestionar los webhooks en la aplicación en Settings → Webhooks (consulta Añadir y gestionar webhooks salientes) o con la API de webhooks. Esta página es la referencia de lo que envía Flowella.
Tipos de eventos
Marca estos eventos cuando añadas un webhook, o pásalos enevents cuando crees uno con la API.
Los eventos de contactos solo se disparan con estas llamadas a la API de un solo contacto. No se disparan con
POST /v1/contacts/bulk-upsert, con los contactos creados por mensajes entrantes ni con los cambios hechos en la aplicación o sincronizados desde HubSpot.
Flowella también envía webhook.test cuando seleccionas Send test event en la aplicación o llamas a POST /v1/webhooks/{id}/test. No puedes suscribirte a él. Su data es { "test": true, "sentAt": "<ISO 8601 time>" }.
Un mensaje saliente puede generar dos eventos
message.sent: uno cuando Flowella lo entrega a Meta y otro cuando Meta informa de que se ha enviado. Los dos tienen valores id de nivel superior distintos. Usa data.messageId para vincularlos al mismo mensaje.Formato de la solicitud
Flowella envía cada evento como unPOST HTTP con estas cabeceras:
Flowella no envía ninguna otra cabecera personalizada. El tipo y el ID del evento están en el cuerpo.
Cuerpo
Cada webhook tiene una versión de payload, que la API de webhooks devuelve comopayloadVersion. La versión 1 es la predeterminada para todos los webhooks, y no hay ningún ajuste en la aplicación ni en la API para cambiarla. Las dos versiones usan estos envoltorios:
Flowella no envía ningún evento cuyo
data supere los 256 KB.
Verificar firmas
Comprueba la firma de cada solicitud antes de confiar en ella. Flowella calculaX-Flowella-Signature así:
- Algoritmo: HMAC con SHA-256.
- Clave: el secreto de firma como texto UTF-8, exactamente tal como se guardó. Un secreto generado por la API incluye su prefijo
whsec_. - Mensaje: el cuerpo sin procesar de la solicitud, byte a byte, tal como lo envió Flowella. No se firma nada más: la firma no incluye ninguna marca de tiempo ni URL.
- Salida: hexadecimal en minúsculas, 64 caracteres, sin prefijo
sha256=.
Respuestas, reintentos y tiempos de espera
Flowella entrega varios eventos a la vez, así que pueden llegar desordenados. Usa
created_at u occurred_at si el orden importa. Responde con un estado 2xx en cuanto la firma sea correcta y procesa el evento en segundo plano. Para ver cómo aparecen los reintentos en la aplicación, consulta Reintentos y espera progresiva.
Deduplicar eventos
Tu endpoint puede recibir el mismo evento más de una vez: un reintento después de que tu endpoint agotara el tiempo de espera pero procesara igualmente la solicitud, o un reenvío a través de la API. Deduplica usando elid de nivel superior:
- Guarda el
idde cada evento que proceses. - Si el
idde un evento entrante ya está guardado, responde200y no hagas nada más. - Conserva los IDs guardados al menos durante el tiempo en que puedas reenviar entregas.
data.messageId. Distintos eventos sobre el mismo mensaje, como message.sent y message.delivered, lo comparten.
Feed de eventos
El feed de eventos es una alternativa a los webhooks basada en consultas.GET /v1/events devuelve los eventos de los últimos 7 días, incluidos los eventos a los que no está suscrito ningún webhook. Necesita el scope events:read. Filtra con type (un tipo o una lista separada por comas), occurredAfter y occurredBefore, y pagina con limit y cursor.
Cada elemento tiene id, type, occurredAt, version, correlationId y data. El id coincide con el id del cuerpo del webhook, así que puedes usar el feed para cubrir los huecos después de que tu endpoint haya estado caído.
Gestionar webhooks con la API
Todos los endpoints de webhooks necesitan una clave de API o un token de acceso OAuth con el scopewebhooks:manage. Las claves creadas en la aplicación lo tienen. Consulta la introducción a la API para la autenticación.
Los objetos webhook contienen
id, name, url, events, isActive, consecutiveFailures, signingSecretPrefix (los 8 primeros caracteres del secreto actual), payloadVersion, lastTriggeredAt, disabledAt, createdAt y updatedAt.
Algunas reglas se aplican a los webhooks gestionados a través de la API:
- No puedes elegir el secreto de firma a través de la API.
POST /v1/webhooksgenera uno que empieza porwhsec_y lo devuelve una sola vez, comosigningSecret. - Los reenvíos no cuentan para el recuento de fallos ni lo ponen a cero. Flowella solo entrega un reenvío mientras el webhook está activo y sigue suscrito a ese tipo de evento.
- La URL debe cumplir las mismas reglas de URL que en la aplicación.
Rotar un secreto de firma
Rota un secreto cuando creas que se ha filtrado o de forma periódica. La rotación funciona con cualquier webhook que tenga un secreto, incluidos los webhooks cuyo secreto escribiste en la aplicación.1
Solicita un secreto nuevo
Llama al endpoint de rotación y guarda el
signingSecret de la respuesta. Flowella solo lo devuelve una vez.2
Acepta ambos secretos durante 24 horas
Las nuevas entregas se firman con el secreto nuevo en
X-Flowella-Signature y con el secreto anterior en X-Flowella-Signature-Previous. Un controlador que siga usando el secreto anterior seguirá funcionando si comprueba ambas cabeceras, como en el ejemplo de Verificar firmas.3
Cambia al secreto nuevo
Actualiza tu controlador con el secreto nuevo en un plazo de 24 horas. Después, Flowella deja de enviar
X-Flowella-Signature-Previous.Probar en local
Para recibir webhooks en tu propio ordenador, expón tu servidor local a través de un túnel público, como ngrok o Cloudflare Tunnel. Usa la URL pública del túnel como endpoint. Después, usa Send test event para enviar solicitudes siempre que las necesites. Flowella rechaza las direcciones locales y privadas, así que una URLlocalhost no funciona.
Relacionado
Gestionar webhooks en la aplicación
Añade endpoints, envía eventos de prueba y consulta el registro de entregas.
Introducción a la API
Autenticación, scopes, límites de velocidad y errores.
Claves de API
Crea la clave que necesitas para la API de webhooks.
Developer hub
Solicitudes recientes a la API, guías de inicio rápido y el API sandbox.

