Saltar al contenido principal
La API REST de Flowella te permite enviar mensajes de WhatsApp, gestionar contactos y bajas (opt-outs), trabajar con plantillas y Flows y leer analíticas desde tu propio código. Esta página explica lo que necesitas saber antes de llamar a un endpoint. La sección Endpoints de esta referencia de la API documenta las solicitudes individuales. Para ver la lista completa y actualizada, usa el documento OpenAPI en vivo o la documentación interactiva de la API en la aplicación.

URL base

Todos los endpoints están bajo esta base, por ejemplo https://api.flowella.io/v1/messages. Úsala incluso cuando la aplicación muestre una dirección que termina en /api/v1, como API base URL en el Developer hub.
Las solicitudes al host de la aplicación, https://app.flowella.io/api/v1/..., se redirigen de forma permanente (308) a https://api.flowella.io/v1/.... Muchos clientes HTTP descartan la cabecera Authorization cuando siguen una redirección a otro host, así que la solicitud redirigida puede fallar con 401. Llama directamente a https://api.flowella.io/v1.

Autenticación

Envía un token bearer en la cabecera Authorization de cada solicitud:
Flowella acepta dos tipos de token. Ambos actúan sobre una sola organización. Usa una clave de API para tus propios scripts e integraciones. Usa una aplicación OAuth cuando otras organizaciones de Flowella instalen tu integración.
Trata las claves y los tokens como contraseñas. No los incluyas nunca en el control de código fuente ni los pegues en chats o documentos compartidos. Revoca las claves que ya no necesites en Claves de API.

Comprobar tus credenciales

Llama al endpoint ping para confirmar que una clave o un token funciona:
Una respuesta 200 OK significa que estás autenticado. organizationId es el ID numérico de tu organización:
Una respuesta 401 tiene el código UNAUTHORIZED y uno de estos mensajes: Missing bearer token, Invalid or expired API key, Invalid or expired access token o Unsupported bearer token.

Scopes

Cada endpoint necesita un scope. Las claves de API creadas en la aplicación tienen todos los scopes. Los tokens de acceso OAuth solo tienen los scopes concedidos en la autorización. GET /v1/ping y GET /v1/rate-limits no necesitan scope. GET /v1/capabilities (scope account:read) muestra los scopes que tiene tu token. Una solicitud sin el scope que necesita devuelve 403 con el código INSUFFICIENT_SCOPE. details.required muestra los scopes que faltan:

Errores

Los errores usan el mismo envoltorio. requestId identifica la solicitud cuando contactas con soporte, y details contiene información adicional, como problemas de validación, cuando la hay:
El valor de error.code es estable, así que tu código puede basarse en él. El texto de error.message está pensado para personas y puede cambiar.

Límites de velocidad

Cada clave de API y cada token de acceso OAuth tiene su propio límite de solicitudes por minuto. Flowella cuenta las solicitudes en ventanas fijas de un minuto que empiezan en el minuto exacto (UTC). Las respuestas a las solicitudes que superan las comprobaciones de autenticación y de scope incluyen estas cabeceras: Cuando superas el límite, Flowella devuelve 429 con el código RATE_LIMITED y una cabecera Retry-After con el número de segundos que debes esperar. GET /v1/rate-limits devuelve tus valores limit, remaining y reset en JSON. Para envíos grandes, usa POST /v1/templates/send, que admite hasta 50.000 destinatarios en una sola solicitud. La solicitud también acepta un campo opcional throttlePerHour, un número entero de 1 a 100.000, pero por ahora no regula el ritmo de los envíos, así que no te bases en él. Para repartir un envío grande en el tiempo, divide la lista de destinatarios en lotes más pequeños y envía cada lote por separado.

IDs de solicitud

Las respuestas incluyen una cabecera X-Request-Id, y los cuerpos de error la repiten como error.requestId. POST /v1/templates/send es la excepción: consulta Envíos masivos de plantillas. Para usar tu propio ID, envía una cabecera X-Request-Id de hasta 128 caracteres y Flowella la reutiliza. Indica el ID de solicitud cuando contactes con soporte. Para consultar una solicitud tú mismo, llama a GET /v1/requests/{requestId} (scope account:read): devuelve la solicitud registrada con los eventos, trabajos y entregas de webhooks vinculados a ella. El Developer hub muestra tus solicitudes recientes y sus IDs.

Idempotencia

Las claves de idempotencia te permiten reintentar una solicitud de escritura después de un tiempo de espera agotado o un error de red sin hacer el trabajo dos veces. POST /v1/templates/send sigue sus propias reglas, descritas más abajo.

La mayoría de las solicitudes de escritura

Las solicitudes POST, PATCH, PUT y DELETE aceptan una cabecera opcional Idempotency-Key:
  • La clave debe tener entre 8 y 255 caracteres. Otras longitudes devuelven 400.
  • Flowella recuerda cada clave de tu organización durante 24 horas.
  • Una repetición con la misma clave, método, ruta y cuerpo devuelve la respuesta almacenada sin volver a ejecutar la solicitud.
  • Una repetición con la misma clave pero con otro método, ruta o cuerpo devuelve 409 IDEMPOTENCY_KEY_CONFLICT.
  • Una repetición enviada mientras la primera solicitud aún se está ejecutando devuelve 409 IDEMPOTENCY_KEY_IN_FLIGHT. Espera y vuelve a intentarlo.
  • Las respuestas devuelven la clave en una cabecera Idempotency-Key.
Las solicitudes sin la cabecera se ejecutan con normalidad, sin protección contra duplicados.

Envíos masivos de plantillas

Los envíos masivos de plantillas son asíncronos. POST /v1/templates/send valida la solicitud, la pone en cola de forma duradera y devuelve 202 Accepted de inmediato:
Flowella entrega el lote en segundo plano y reintenta automáticamente los errores temporales de WhatsApp. Los destinatarios se procesan de forma individual, así que un número no válido no bloquea el resto del lote. Sigue el progreso de la entrega en la pestaña Statistics de la plantilla en la aplicación. Pasa una cabecera Idempotency-Key que identifique cada lote:
Este endpoint trata las claves de forma distinta a otras solicitudes de escritura:
  • La clave puede tener hasta 200 caracteres. Una clave más larga devuelve 400.
  • Una repetición con la misma clave en un plazo de 7 días devuelve el id original y no envía nada, aunque el cuerpo haya cambiado.
  • Sin la cabecera, Flowella usa un hash del cuerpo de la solicitud como clave. Si vuelves a enviar un cuerpo idéntico byte a byte en un plazo de 7 días, recibes el id original y no se envía nada. Usa una clave nueva para cada lote que quieras enviar.
Otros comportamientos también son distintos en este endpoint:
  • Llámalo con una clave de API. Los tokens de acceso OAuth se rechazan con 401.
  • Sus respuestas no incluyen las cabeceras X-Request-Id, API-Version ni X-RateLimit-*. Sus solicitudes siguen contando para el límite de velocidad de la clave.

Versionado

Puedes fijar la versión de la API con la cabecera API-Version:
2026-08-11 es la única versión compatible y la predeterminada cuando omites la cabecera. Cualquier otro valor, o un valor que no sea una fecha YYYY-MM-DD, devuelve 400 con el mensaje Unsupported API-Version. Las respuestas devuelven la versión en las cabeceras API-Version y X-Flowella-Api-Version. El registro de cambios para desarrolladores recoge todos los cambios en la API, los webhooks, las aplicaciones OAuth y el servidor MCP, con los cambios incompatibles señalados.

Sandbox

El sandbox te permite probar una integración sin enviar nada a WhatsApp. Funciona sobre tu organización real: no hay una cuenta de prueba independiente. Puedes usarlo de dos formas:
  • Una clave de sandbox, que solo afecta a las solicitudes hechas con esa clave. Consulta Claves de sandbox.
  • El API sandbox de toda la organización en el Developer hub, que un Owner o Admin puede activar. Consulta API sandbox.
Mientras el sandbox está activo, POST /v1/messages almacena el mensaje y devuelve "sandbox": true sin contactar con Meta, y el envío de plantillas a revisión devuelve al instante una decisión simulada. Las herramientas de prueba del sandbox en /v1/test/ y /v1/sandbox necesitan el scope sandbox:manage.

Paginación

Los endpoints de listas, como /v1/conversations, /v1/contacts y /v1/templates, usan paginación por cursor:
  • Pasa limit (de 1 a 100, 25 por defecto) y un cursor opcional.
  • La respuesta contiene items y, cuando hay más resultados, un nextCursor.
  • Devuelve nextCursor como parámetro cursor para obtener la página siguiente.
  • Cuando nextCursor falta o es null, has llegado al final.

Fecha y hora

Todas las marcas de tiempo son cadenas ISO 8601 en UTC, por ejemplo 2025-01-15T14:30:00.000Z. Cuando la API acepta fechas, funcionan tanto las fechas sin hora (2025-01-15) como los valores ISO 8601 completos.

Números de teléfono

Pasa los números de teléfono en formato E.164 (+15551234567) siempre que puedas. Flowella normaliza las variaciones habituales, pero E.164 es lo más seguro.

Canales

Muchos endpoints aceptan un whatsappChannelId. Si tu organización tiene un solo canal y lo omites, Flowella usa tu canal predeterminado. Si tienes varios canales, pasa el ID de forma explícita para no enviar desde el número equivocado. Para ver el patrón de URL completo y el cambio de canal, consulta Multicanal.

Especificación OpenAPI

La especificación en vivo, legible por máquinas, es pública:
Impórtala en Postman, Insomnia o un generador de código. Describe tanto la autenticación con clave de API como con OAuth.

Recursos para desarrolladores

La aplicación tiene más material para desarrolladores. Estas páginas son públicas, así que puedes abrirlas sin iniciar sesión: El Developer hub de Settings reúne estos enlaces junto con tus solicitudes recientes a la API y el interruptor del API sandbox.
Combina esta página con la referencia de webhooks para reaccionar a eventos en lugar de consultar periódicamente si hay cambios.
Última modificación el 7 de noviembre de 2026