URL base
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 cabeceraAuthorization de cada solicitud:
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.
Comprobar tus credenciales
Llama al endpoint ping para confirmar que una clave o un token funciona:200 OK significa que estás autenticado. organizationId es el ID numérico de tu organización:
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 cabeceraX-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 solicitudesPOST, 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.
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:
Idempotency-Key que identifique cada lote:
- 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
idoriginal 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
idoriginal y no se envía nada. Usa una clave nueva para cada lote que quieras enviar.
- 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-VersionniX-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 cabeceraAPI-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.
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 uncursoropcional. - La respuesta contiene
itemsy, cuando hay más resultados, unnextCursor. - Devuelve
nextCursorcomo parámetrocursorpara obtener la página siguiente. - Cuando
nextCursorfalta o esnull, has llegado al final.
Fecha y hora
Todas las marcas de tiempo son cadenas ISO 8601 en UTC, por ejemplo2025-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 unwhatsappChannelId. 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: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.

