Pular para o conteúdo principal
Erros seguem RFC 7807 e são servidos com 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"
  }
}
Faça match pela URI em type — ela é estável entre releases e dereferenciável para documentação. title e detail são para humanos e podem ser reescritos; não programe em cima deles. Alguns tipos carregam extension members (o bloco quota acima é um deles). Os membros base (type, title, status, detail, instance) sempre vêm; extensions são documentadas por tipo de erro abaixo.

Autenticação & acesso

StatusType URIQuando
401https://errors.attestly.io/authentication-failedAPI key ausente, malformada ou revogada.
402https://errors.attestly.io/subscription-inactiveSubscription não está mais ativa.
429https://errors.attestly.io/quota-exceededTeto mensal atingido para o período de billing atual.
429https://errors.attestly.io/rate-limit-exceededMuitas requests em uma janela curta.
Respostas 429 carregam headers Retry-After e X-RateLimit-*. O tipo quota-exceeded carrega adicionalmente uma extension quota com limit, used, period_started_at, period_ends_at. Veja Quotas.

Validação

StatusType URIQuando
422https://errors.attestly.io/request-validation-failedJSON malformado, tipos errados, campos obrigatórios faltando.
422https://errors.attestly.io/program-validation-failedEstrutura do ruleset inválida (depth, refs, limites).
422https://errors.attestly.io/program-compilation-failedReferências do ruleset não puderam ser compiladas.
422https://errors.attestly.io/unknown-sourceRuleset referencia source que você não pode acessar.
StatusType URIQuando
404https://errors.attestly.io/ruleset-not-foundruleset_id não resolve.
409https://errors.attestly.io/ruleset-already-exists(name, version) já está em uso.

Idempotência

StatusType URIQuando
422https://errors.attestly.io/idempotency-key-invalidHeader Idempotency-Key malformado.
422https://errors.attestly.io/idempotency-key-conflictMesma chave, body diferente.
429https://errors.attestly.io/idempotency-key-exhaustedMuitas requests concorrentes com a mesma chave.
410https://errors.attestly.io/idempotency-replay-expiredA janela de replay para essa chave expirou.

Servidor (5xx)

StatusType URIQuando
500https://errors.attestly.io/internal-errorErro inesperado do servidor.
503https://errors.attestly.io/database-unavailableProblema transiente de infraestrutura.
Respostas 5xx são repetíveis. Use exponential backoff com jitter; se persistir, contate support@attestly.io.

Falhas parciais (200)

Falha de source ou check não derruba a request inteira. A resposta é 200 mas verdict.status = "degraded" e o check afetado carrega status: "failed" com mensagem em error. Veja Verdicts.