> ## Documentation Index
> Fetch the complete documentation index at: https://docs-attestly.code4source.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Quotas e rate limits

> Como funcionam períodos de billing, tetos mensais e rate limits.

Dois mecanismos distintos controlam o tráfego:

1. **Quota mensal** — teto por Organização, alinhado ao seu período
   de billing contratual.
2. **Rate limit** — limite de burst por chave em janela curta.

Ambos aparecem como `429` em formato RFC 7807, com `type` URIs e
semântica de recuperação diferentes.

## Quota mensal

Contada em **requests bilháveis** desde o início do período de
billing atual. Os limites do período vêm do seu contrato — tipicamente
o dia do mês em que você assinou.

Quando excede:

```http theme={null}
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 1209600
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1715040000

{
  "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"
  }
}
```

O bloco `quota` é uma extension member do RFC 7807. Headers:

* `Retry-After` — segundos até `period_ends_at`.
* `X-RateLimit-Limit` — o teto mensal.
* `X-RateLimit-Remaining` — `0` enquanto sobre o teto.
* `X-RateLimit-Reset` — timestamp Unix igual a `period_ends_at`.

Recuperação: aguarde até `period_ends_at`, ou nos contate para
aumentar o teto.

## Rate limit

Proteção de burst por API key. Janela curta — tipicamente dezenas de
requests por segundo.

```http theme={null}
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 1
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 0

{
  "type":     "https://errors.attestly.io/rate-limit-exceeded",
  "title":    "Rate Limit Exceeded",
  "status":   429,
  "detail":   "Rate limit exceeded.",
  "instance": "/v1/evaluate"
}
```

Recuperação: faça backoff por `Retry-After` segundos e tente de
novo. Use exponential backoff com jitter em 429s persistentes.

## O que conta como request bilhável

| Conta                    | Não conta                     |
| ------------------------ | ----------------------------- |
| `POST /v1/evaluate`      | `GET /v1/sources`             |
| `POST /v1/intersections` | `GET /v1/rulesets` (list/get) |
| `POST /v1/distance`      | `POST /v1/rulesets` (create)  |
| `POST /v1/subjects`      |                               |

Leituras do catálogo e escrita de rulesets não consomem quota.
