Saltar al contenido principal
Los webhooks salientes permiten que tus sistemas reaccionen a eventos de Flowella sin consultar la API periódicamente. Cada webhook tiene una URL, un secreto de firma y una lista de tipos de eventos. Cuando ocurre uno de esos eventos, Flowella envía un 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 en events 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.
Problema conocido: optout.created no se dispara con la primera baja de un contacto en un número de WhatsApp, tanto si el contacto envía una palabra clave como si llamas a POST /v1/opt-outs. Por ahora solo se dispara cuando un contacto que había vuelto a dar su consentimiento se da de baja otra vez. No te bases en él para detectar todas las bajas: consulta la lista de bajas con GET /v1/opt-outs (scope contacts:read).
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 un POST 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 como payloadVersion. 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 calcula X-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=.
Para verificarla, calcula el mismo HMAC sobre el cuerpo sin procesar y compáralo con la cabecera en tiempo constante. Durante las 24 horas siguientes a una rotación con la API, la solicitud incluye ambas cabeceras: acéptala si cualquiera de ellas coincide con un secreto que tengas.
Calcula la firma sobre el cuerpo sin procesar antes de que cualquier middleware lo analice o le cambie el formato. Si tu framework analiza el JSON y vuelves a serializarlo, los bytes cambian y la firma no coincide.

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 el id de nivel superior:
  1. Guarda el id de cada evento que proceses.
  2. Si el id de un evento entrante ya está guardado, responde 200 y no hagas nada más.
  3. Conserva los IDs guardados al menos durante el tiempo en que puedas reenviar entregas.
No deduplices usando 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 scope webhooks: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/webhooks genera uno que empieza por whsec_ y lo devuelve una sola vez, como signingSecret.
  • 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.
Cambiar el secreto en la aplicación con New signing secret no tiene periodo de solapamiento: el secreto anterior deja de funcionar de inmediato.

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 URL localhost 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.
Última modificación el 30 de octubre de 2026