API y desarrolladores

Manejo de Errores

Entiende las respuestas de error de la API y cómo manejarlas

Cuando una petición falla, la API devuelve un objeto JSON con una estructura consistente.

Formato de Error

{
  "type": "ErrorType",
  "detail": "Descripción legible de lo que salió mal"
}
Campo Descripción
type Identificador de error legible por máquina
detail Explicación legible por humanos

Códigos de Error

Status Tipo Cuándo Ocurre
400 ValueError Parámetros de consulta inválidos (ej. limit > 100)
401 UnauthorizedError API key faltante, inválida, expirada o revocada
402 InsufficientFundsError La cuenta no puede pagar el mensaje — sólo en POST /v1/template-messages. Ver Carrito Abandonado
403 ForbiddenError La key no tiene el alcance que el endpoint requiere — ver Autenticación
404 NotFoundError El recurso solicitado no existe
422 ValidationError El body del request tiene campos inválidos o faltantes
429 RateLimitExceededError Límite de peticiones excedido — ver Rate Limiting
500 InternalServerError Error inesperado del servidor
502 UpstreamError Un servicio interno falló. Reintenta más tarde

Ejemplos

400 Bad Request
{
  "type": "ValueError",
  "detail": "limit must not exceed 100"
}

Solución: Verifica tus parámetros de consulta. limit debe estar entre 1 y 100, y page debe ser 1 o mayor.

401 Unauthorized
{
  "type": "UnauthorizedError",
  "detail": "Invalid or missing API key"
}

Solución: Verifica que el header X-API-Key esté presente y contenga una key válida y activa.

403 Forbidden
{
  "type": "ForbiddenError",
  "detail": "Missing required scope: orders:read"
}

Solución: Tu key es válida pero le falta el alcance que ese endpoint requiere. Hoy las keys se crean con acceso completo, así que este error no debería aparecer; si lo ves, contacta a soporte. Ver Autenticación.

404 Not Found
{
  "type": "NotFoundError",
  "detail": "Order 99999 not found"
}

Solución: Verifica que el ID del recurso existe y pertenece a tu cuenta de merchant.

429 Too Many Requests
{
  "type": "RateLimitExceededError",
  "detail": "Rate limit exceeded"
}

Solución: Espera el tiempo indicado en el header Retry-After antes de reintentar. Ver Rate Limiting para buenas prácticas.

422 Validation Error

Los errores 422 usan un formato diferente al resto: detail es un array de objetos (formato Pydantic/FastAPI), no un string.

{
  "detail": [
    {
      "loc": ["body", "option_values"],
      "msg": "List should have at least 1 item",
      "type": "too_short"
    }
  ]
}
Campo Descripción
loc Ubicación del campo que falló (ej. ["body", "name"])
msg Descripción del error de validación
type Tipo de error de Pydantic (no es el mismo type del formato estándar)

Solución: Revisa el body de tu request. Consulta el API Reference para ver los campos requeridos.

502 Bad Gateway
{
  "type": "UpstreamError",
  "detail": "An internal service error occurred. Please try again later."
}

Solución: Un servicio interno falló. Tu request es válido — reintenta después de unos segundos. Si persiste, contacta a soporte.

500 Internal Server Error
{
  "type": "InternalServerError",
  "detail": "Internal server error"
}

Solución: Este es un problema del servidor. Reintenta después de un breve delay. Si el problema persiste, contacta a soporte.

Manejar Errores en Código

import httpx

response = httpx.get(
    "https://api.ya.onl/v1/orders",
    headers={"X-API-Key": "yv_live_v1_tu_api_key"},
)

if response.status_code == 200:
    orders = response.json()["data"]
elif response.status_code == 429:
    retry_after = int(response.headers["Retry-After"])
    print(f"Rate limited. Retry in {retry_after}s")
else:
    error = response.json()
    print(f"Error [{response.status_code}]: {error['type']} - {error['detail']}")
¿Necesitas ayuda?