Errores

Cada error, en toda la API, usa un único envoltorio, para que puedas gestionar los fallos con una sola ruta de código.

Forma del error

sobre de error
{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "The request was invalid.",
    "details": [
      { "path": "declaredNumber", "message": "must be E.164" }
    ]
  }
}

El estado HTTP coincide con el code. details solo está presente en los errores de validación.

Códigos de error

CódigoHTTPCuándo
UNAUTHORIZED401Clave ausente o inválida.
FORBIDDEN403La clave carece del ámbito requerido.
NOT_FOUND404No existe tal recurso en tu cuenta.
VALIDATION_FAILED400El cuerpo o la consulta de la solicitud eran inválidos.
CONFLICT409La acción entra en conflicto con el estado actual (p. ej. enviar desde un número que no está conectado).
RATE_LIMITED429Demasiadas solicitudes. Reduce el ritmo y reintenta.
OUTBOUND_LIMIT429El tope de contacto en frío: este número inició demasiadas conversaciones NUEVAS esta hora. Las respuestas nunca se cuentan. Espera lo que indique Retry-After y mantén moderado el volumen de primeros contactos.
SLOT_REQUIRED402Conectar un número requiere un slot libre.
ACCOUNT_SUSPENDED402Toda la cuenta está en espera. Todas las rutas responden esto salvo el inicio de sesión y la facturación. La clave es válida y reintentar no ayuda: contacta con nosotros para restablecer el acceso.
TRANSPORT_UNAVAILABLE503El servicio de conexión no está disponible brevemente. Reintenta en breve.
TRANSPORT_BUSY503El servicio de mensajería está ocupado. Espera lo que indique la cabecera Retry-After y vuelve a intentarlo; todo lo ya emitido sigue siendo válido.
BILLING_UNAVAILABLE503Este despliegue no tiene configurado ningún procesador de pagos.
INTERNAL500Un error inesperado de nuestro lado.

Esperar y reintentar

Tres códigos te piden esperar, y significan cosas distintas. RATE_LIMITED significa baja el ritmo. OUTBOUND_LIMIT significa deja de escribir a personas nuevas durante un rato: las respuestas siguen saliendo, y el presupuesto pertenece al número, no a tu clave. TRANSPORT_BUSY significa que el servicio de mensajería nos está limitando: es carga, nunca un defecto de tu solicitud, y todo lo ya emitido sigue siendo válido. Los tres llevan Retry-After en segundos cuando se conoce la espera; espera al menos ese tiempo.

429 Too Many Requests
{
  "error": {
    "code": "OUTBOUND_LIMIT",
    "message": "This number has started too many new conversations in the last hour."
  }
}

Errores de validación

Para un error VALIDATION_FAILED, details lista cada campo infractor por path para que puedas mostrar el problema junto al campo correcto.

gestión de errores
const res = await fetch("https://api.sendveo.com/v1/numbers", options)
if (!res.ok) {
  const { error } = await res.json()
  if (error.code === "VALIDATION_FAILED") {
    for (const d of error.details ?? []) showFieldError(d.path, d.message)
  } else {
    showBanner(error.message)
  }
}
Códigos de error de la API · Docs de Sendveo