> ## 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 y rate limits

> Cómo funcionan los periodos de billing, topes mensuales y rate limits.

Dos mecanismos distintos controlan el tráfico:

1. **Quota mensual** — tope por Organización, alineado a tu periodo
   de billing contractual.
2. **Rate limit** — límite de burst por clave en ventana corta.

Ambos aparecen como `429` en formato RFC 7807, con `type` URIs y
semántica de recuperación distintos.

## Quota mensual

Contada en **requests facturables** desde el inicio del periodo de
billing actual. Los límites del periodo vienen de tu contrato —
típicamente el día del mes en que firmaste.

Cuando se 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"
  }
}
```

El bloque `quota` es una extension member de RFC 7807. Headers:

* `Retry-After` — segundos hasta `period_ends_at`.
* `X-RateLimit-Limit` — el tope mensual.
* `X-RateLimit-Remaining` — `0` mientras estés sobre el tope.
* `X-RateLimit-Reset` — timestamp Unix igual a `period_ends_at`.

Recuperación: espera hasta `period_ends_at`, o contáctanos para
subir el tope.

## Rate limit

Protección de burst por API key. Ventana corta — típicamente
decenas 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"
}
```

Recuperación: haz backoff por `Retry-After` segundos y reintenta.
Usa exponential backoff con jitter en 429s persistentes.

## Qué cuenta como request facturable

| Cuenta                   | No cuenta                     |
| ------------------------ | ----------------------------- |
| `POST /v1/evaluate`      | `GET /v1/sources`             |
| `POST /v1/intersections` | `GET /v1/rulesets` (list/get) |
| `POST /v1/distance`      | `POST /v1/rulesets` (create)  |
| `POST /v1/subjects`      |                               |

Las lecturas del catálogo y la escritura de rulesets no consumen
quota.
