developers
EN Crear cuenta

Guías

Errores y límites

Todos los errores tienen la misma forma, los límites son predecibles y las escrituras se pueden reintentar sin duplicar nada.

Formato de error#

Cualquier respuesta 4xx o 5xx trae un objeto error con un code estable (para tu código) y un message legible (para tus logs). Algunos errores agregan details:

400 Bad Request
{
  "error": {
    "code": "validation_error",
    "message": "Request validation failed",
    "details": {
      "formErrors": [],
      "fieldErrors": { "channel": ["Invalid enum value"] }
    }
  }
}

Códigos de estado#

StatusCuándoQué hacer
400JSON inválido (invalid_json) o validación fallida (validation_error, con el detalle por campo).Corrige la solicitud. No reintentes igual.
401Falta la API key, es inválida o fue revocada (unauthorized).Revisa el header y la key.
401La key venció (api_key_expired, con details.expired_at). Una key puede tener fecha de vencimiento; 7 días antes avisamos por correo a los owners y admins.Crea una key nueva o rota esta antes de la fecha.
402Se alcanzó un límite del plan (plan_limit_exceeded).Revisa details.upgrade_url>.
402Se agotaron los mensajes del período en Developer Free (message_quota_exceeded). Los mensajes que llegan se siguen guardando.Lee fix: espera el período siguiente o sube a Developer. Ver Precios
403Falta el scope, la IP no está permitida o el workspace está deshabilitado.Agrega el scope a la key o revisa sus IPs.
404El recurso no existe en este workspace.Revisa el id.
409Conflicto, por ejemplo una Idempotency-Key todavía en proceso.Reintenta en unos segundos.
422La solicitud es válida pero no se puede procesar (por ejemplo, no_channel_connection, o invalid_sms_message y sms_sender_mismatch al mandar un SMS).Lee message: casi siempre falta configurar algo en el workspace.
429Superaste el límite de solicitudes (rate_limited).Espera y reintenta con backoff.
5xxError de heysteff.Reintenta con backoff y la misma Idempotency-Key.

Límite de solicitudes#

Cada API key tiene un tope de solicitudes por ventana de 60 segundos que depende del plan del workspace:

PlanSolicitudes por minuto, por key
Developer Free100
Developer2.000
Developer Platform4.000

Cada respuesta trae el estado del límite en tres cabeceras:

Al pasarte, la API responde 429 rate_limited con Retry-After (segundos) hasta que empieza la ventana siguiente. Reintenta después de ese tiempo, con backoff exponencial y algo de azar (por ejemplo 1, 2, 4 y 8 segundos).

Aparte están los límites del plan del workspace, como los mensajes al mes. Esos responden 402 plan_limit_exceeded y no se resuelven reintentando.

Idempotencia#

Las operaciones que crean algo aceptan el header Idempotency-Key. Si repites una solicitud con la misma clave, recibes exactamente la misma respuesta que la primera vez (mismo status, mismo cuerpo) y no se crea nada nuevo.

EndpointClave
POST /v1/messages, POST /v1/campaigns, POST /v1/automation-flows/{id}/triggerHeader Idempotency-Key, opcional.
POST /v1/charges, POST /v1/refundsHeader Idempotency-Key, obligatorio.
POST /v1/eventsCampo idempotency_key del cuerpo.
POST /v1/conversionsCampo external_ref del cuerpo.

Paginación#

Los listados devuelven páginas. limit va de 1 a 200 (50 por defecto).

EndpointCómo avanzar
GET /v1/conversations, GET /v1/conversations/{id}/messages, GET /v1/contactsPasa cursor=<cursor.next> mientras cursor.has_more sea true.
GET /v1/eventsPasa after_seq=<cursor.next_after_seq>.
GET /v1/reviewsUsa limit y offset.

Montos y fechas#