Saltar al contenido principal
Los errores siguen RFC 7807 y se sirven con Content-Type: application/problem+json:
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json

{
  "type":     "https://errors.attestly.io/quota-exceeded",
  "title":    "Quota Exceeded",
  "status":   429,
  "detail":   "Monthly quota of 10000 requests exceeded for this billing period.",
  "instance": "/v1/evaluate",
  "quota": {
    "limit": 10000,
    "used":  10000,
    "period_started_at": "2026-04-15T00:00:00Z",
    "period_ends_at":   "2026-05-15T00:00:00Z"
  }
}
Haz match por la URI en type — es estable entre releases y dereferenciable a documentación. title y detail son para humanos y pueden reescribirse; no programes contra ellos. Algunos tipos llevan extension members (el bloque quota arriba es uno). Los miembros base (type, title, status, detail, instance) siempre están; las extensions se documentan por tipo de error más abajo.

Autenticación & acceso

StatusType URICuándo
401https://errors.attestly.io/authentication-failedAPI key ausente, malformada o revocada.
402https://errors.attestly.io/subscription-inactiveSubscription no está activa.
429https://errors.attestly.io/quota-exceededTope mensual alcanzado para el periodo de billing actual.
429https://errors.attestly.io/rate-limit-exceededDemasiadas requests en una ventana corta.
Las respuestas 429 llevan headers Retry-After y X-RateLimit-*. El tipo quota-exceeded lleva además una extension quota con limit, used, period_started_at, period_ends_at. Ver Quotas.

Validación

StatusType URICuándo
422https://errors.attestly.io/request-validation-failedJSON malformado, tipos incorrectos, campos faltantes.
422https://errors.attestly.io/program-validation-failedEstructura del ruleset inválida (depth, refs, límites).
422https://errors.attestly.io/program-compilation-failedReferencias del ruleset no se pudieron compilar.
422https://errors.attestly.io/unknown-sourceEl ruleset referencia un source al que no tienes acceso.
StatusType URICuándo
404https://errors.attestly.io/ruleset-not-foundruleset_id no resuelve.
409https://errors.attestly.io/ruleset-already-exists(name, version) ya está en uso.

Idempotencia

StatusType URICuándo
422https://errors.attestly.io/idempotency-key-invalidHeader Idempotency-Key malformado.
422https://errors.attestly.io/idempotency-key-conflictMisma clave, body distinto.
429https://errors.attestly.io/idempotency-key-exhaustedDemasiadas requests concurrentes con la misma clave.
410https://errors.attestly.io/idempotency-replay-expiredLa ventana de replay para esa clave ha expirado.

Servidor (5xx)

StatusType URICuándo
500https://errors.attestly.io/internal-errorError inesperado del servidor.
503https://errors.attestly.io/database-unavailableProblema transitorio de infraestructura.
Las respuestas 5xx son reintentables. Usa exponential backoff con jitter; si persiste, contacta support@attestly.io.

Fallas parciales (200)

Una falla de source o check no tira la request entera. La respuesta es 200 pero verdict.status = "degraded" y el check afectado lleva status: "failed" con un mensaje en error. Ver Verdicts.