Content-Type: application/problem+json:
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
| Status | Type URI | Cuándo |
|---|---|---|
| 401 | https://errors.attestly.io/authentication-failed | API key ausente, malformada o revocada. |
| 402 | https://errors.attestly.io/subscription-inactive | Subscription no está activa. |
| 429 | https://errors.attestly.io/quota-exceeded | Tope mensual alcanzado para el periodo de billing actual. |
| 429 | https://errors.attestly.io/rate-limit-exceeded | Demasiadas requests en una ventana corta. |
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
| Status | Type URI | Cuándo |
|---|---|---|
| 422 | https://errors.attestly.io/request-validation-failed | JSON malformado, tipos incorrectos, campos faltantes. |
| 422 | https://errors.attestly.io/program-validation-failed | Estructura del ruleset inválida (depth, refs, límites). |
| 422 | https://errors.attestly.io/program-compilation-failed | Referencias del ruleset no se pudieron compilar. |
| 422 | https://errors.attestly.io/unknown-source | El ruleset referencia un source al que no tienes acceso. |
Catálogo
| Status | Type URI | Cuándo |
|---|---|---|
| 404 | https://errors.attestly.io/ruleset-not-found | ruleset_id no resuelve. |
| 409 | https://errors.attestly.io/ruleset-already-exists | (name, version) ya está en uso. |
Idempotencia
| Status | Type URI | Cuándo |
|---|---|---|
| 422 | https://errors.attestly.io/idempotency-key-invalid | Header Idempotency-Key malformado. |
| 422 | https://errors.attestly.io/idempotency-key-conflict | Misma clave, body distinto. |
| 429 | https://errors.attestly.io/idempotency-key-exhausted | Demasiadas requests concurrentes con la misma clave. |
| 410 | https://errors.attestly.io/idempotency-replay-expired | La ventana de replay para esa clave ha expirado. |
Servidor (5xx)
| Status | Type URI | Cuándo |
|---|---|---|
| 500 | https://errors.attestly.io/internal-error | Error inesperado del servidor. |
| 503 | https://errors.attestly.io/database-unavailable | Problema transitorio de infraestructura. |
support@attestly.io.
Fallas parciales (200)
Una falla de source o check no tira la request entera. La respuesta es200 pero verdict.status = "degraded" y el check afectado
lleva status: "failed" con un mensaje en error. Ver
Verdicts.