Documentación de la API
Primeros pasos 6 min

Errores, cuotas, rate limits e idempotencia

Los errores de la API siempre traen un error.code estable. Ramificá por ese código, nunca por el texto del mensaje: el mensaje está en español, es para humanos y puede cambiar.

Forma del error

Respuesta · 422
{
  "success": false,
  "message": "Fuera de la ventana de 24 horas de WhatsApp: el cliente debe escribir primero, o enviá una plantilla aprobada con type \"template\".",
  "error": { "code": "WHATSAPP_24H_WINDOW_EXPIRED" }
}

Códigos de error

Autenticación y plan

HTTPerror.codeCuándo
401MISSING_API_KEYNo mandaste el header Authorization ni X-API-Key.
401INVALID_API_KEYLa key no existe o fue revocada.
403COMPANY_SUSPENDEDLa empresa está suspendida o cancelada.
402SUBSCRIPTION_LOCKEDTrial vencido o pago pendiente. Regularizá para volver a usar la API.
403API_ACCESS_NOT_INCLUDEDEl plan no incluye API pública.
403INSUFFICIENT_SCOPELa key no tiene el permiso que exige ese endpoint.

Validación

HTTPerror.codeCuándo
400INVALID_PHONEEl número no está en formato internacional (+51987654321).
400INVALID_STATUSstatus distinto de IN_PROGRESS o CLOSED.
400INVALID_CURSOREl cursor no existe (o ya se borró ese registro).
400INVALID_PARAMETERUn parámetro tiene un valor no soportado.
400INVALID_MESSAGE_TYPEtype distinto de "text" o "template".
400MISSING_FIELDFalta un campo obligatorio del body.
400TEXT_TOO_LONGEl texto pasa los 4096 caracteres que admite WhatsApp.
400EMPTY_UPDATEUn PATCH sin ningún campo para actualizar.

Recursos y reglas de WhatsApp

HTTPerror.codeCuándo
404CONVERSATION_NOT_FOUNDNo existe o es de otra empresa.
404TEMPLATE_NOT_FOUNDLa plantilla no existe o es de otra empresa.
404CUSTOM_FIELD_NOT_FOUNDEl campo personalizado no es de tu empresa.
422WHATSAPP_24H_WINDOW_EXPIREDTexto libre fuera de la ventana de 24 h: usá una plantilla.
422TEMPLATE_NOT_APPROVEDMeta todavía no aprobó esa plantilla.
502PROVIDER_ERRORMeta rechazó el envío. El mensaje queda como fallido.

Límites e idempotencia

HTTPerror.codeCuándo
429RATE_LIMITEDSuperaste los requests por minuto de tu plan.
429MONTHLY_QUOTA_EXCEEDEDAgotaste la cuota del mes.
409IDEMPOTENCY_KEY_REUSEDMisma Idempotency-Key con un body distinto.
409IDEMPOTENCY_IN_PROGRESSYa hay un request en curso con esa key. Reintentá en unos segundos.
500INTERNAL_ERRORError nuestro. Reintentable con backoff.

Cuotas y rate limits

El acceso a la API y sus límites vienen del plan:

HTTPerror.codeCuándo
0FREE / BASICSin acceso a la API pública.
0PRO10 000 requests al mes · 60 por minuto por key · hasta 3 keys.
0ENTERPRISE100 000 requests al mes · 120 por minuto por key · hasta 10 keys.

Cada respuesta te dice cómo vas, así no tenés que llevar la cuenta:

  • RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset — el minuto en curso.
  • X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining — el mes en curso.

Y con GET /usage lo consultás cuando quieras. Las entregas de webhook no consumen esta cuota: no son requests tuyos.

Idempotencia

Mandá Idempotency-Key en todos los envíos

Es la diferencia entre «el cliente recibió un aviso» y «el cliente recibió cuatro avisos porque tu cola reintentó». Usá un valor único por acción de negocio, como el id del pedido.
curl -X POST https://www.flujoschat.foo/api/public/v1/messages \
  -H "Authorization: Bearer fjc_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-4512-enviado" \
  -d '{"to":"+51987654321","type":"text","text":"Tu pedido #4512 va en camino"}'
  • Un reintento con la misma key y el mismo body devuelve la respuesta original, con el header Idempotency-Replayed: true.
  • La misma key con un body distinto responde 409 IDEMPOTENCY_KEY_REUSED: es una señal de bug en tu lado.
  • Dos requests en paralelo con la misma key: el segundo recibe 409 IDEMPOTENCY_IN_PROGRESS. Reintentá y vas a obtener el replay.
  • La key vale 24 horas.

Cómo reintentar

  • Reintentá en 429, 500, 502 y errores de red, con backoff exponencial (1 s, 2 s, 4 s, 8 s…) y algo de aleatoriedad.
  • No reintentes en 400, 401, 403, 404 ni 422: el resultado va a ser el mismo. Arreglá el request.
  • En 429, esperá lo que diga RateLimit-Reset antes de volver a intentar.

Preguntas frecuentes

¿Cuántos requests por minuto permite la API de FlujosChat?

Depende del plan: 60 requests por minuto por API key en el plan PRO y 120 en ENTERPRISE, con 10 000 y 100 000 requests al mes respectivamente. Cada respuesta incluye headers RateLimit-* y X-Monthly-Quota-Remaining con tu estado real.

¿Cómo evito enviar el mismo mensaje de WhatsApp dos veces?

Enviá el header Idempotency-Key con un valor único por acción de negocio (por ejemplo el id del pedido). Si reintentás con la misma key, la API devuelve la respuesta original con el header Idempotency-Replayed: true en vez de volver a enviar. Vale 24 horas.

¿Un error 403 por falta de permisos me consume cuota?

No. El permiso se valida antes de contar el request, así que un 403 INSUFFICIENT_SCOPE no gasta tu cuota mensual. Los requests que sí llegan al endpoint cuentan, incluso si terminan en error de validación.

Monta tu primer flujo en una tarde

Conecta tu número de WhatsApp, arma el flujo con botones y listas, y publícalo. Sin código y sin depender de nadie.

  • 7 días gratis, sin tarjeta
  • Cancela desde tu panel
  • Credenciales cifradas