---
title: Límites de tasa
description: Shape del 429, dónde viene el tiempo de espera y el patrón de backoff que también cubre los errores transitorios del SII.
url: https://notta.cl/docs/rate-limits
related:
  - https://notta.cl/docs/errors
  - https://notta.cl/docs/pagination
  - https://notta.cl/docs/api/dtes
---

> Documentación de Notta en markdown. Índice completo: https://notta.cl/llms.txt — corpus entero: https://notta.cl/llms-full.txt

# Límites de tasa

La API de Notta protege su estabilidad con límites de tasa (rate limiting). Cuando superas el límite, la API responde **`429`** con el código `rate_limit` y el tiempo de espera en `detail.retryAfterSec`:

```json
{
  "code": "rate_limit",
  "message": "RateLimitError",
  "detail": { "retryAfterSec": 30 },
  "request_id": "9f3b2c61-7d4a-4e0b-9c2d-1a5e8f3b7c90"
}
```

## Cómo manejarlo

- Respeta `detail.retryAfterSec`: espera esa cantidad de segundos antes de reintentar.
- Para reintentos sucesivos usa **backoff exponencial** con jitter.
- El mismo patrón cubre los errores transitorios del SII: `sii_unavailable` (`503`), `boleta.rest.unavailable` y `bhe.rest.unavailable` (`502`) traen el mismo `detail.retryAfterSec`.

```ts
async function withBackoff(fn: () => Promise<Response>, max = 5): Promise<Response> {
  for (let i = 0; i < max; i++) {
    const res = await fn();
    if (res.status !== 429 && res.status !== 502 && res.status !== 503) return res;
    const body = await res.clone().json();
    const waitMs = (body.detail?.retryAfterSec ?? 2 ** i) * 1000;
    await new Promise((r) => setTimeout(r, waitMs));
  }
  throw new Error("rate limit: máximo de reintentos alcanzado");
}
```

No reintentes los demás `4xx`: un `400`/`422` va a fallar igual hasta que corrijas el payload (ver [Catálogo de errores](/docs/errors)).

> **Estado actual:**
El contrato `429` / `rate_limit` / `detail.retryAfterSec` ya está mapeado y es estable, así que puedes programar tu manejo de reintentos contra él desde ahora. El enforcement de cuotas por plan se está habilitando.

## Próximos pasos

- **[Catálogo de errores](/docs/errors)** — el shape completo de error y qué códigos se reintentan.
- [Paginación](/docs/pagination) — cómo iterar listados sin gatillar el límite con requests gigantes.
- [Referencia API de DTEs](/docs/api/dtes) — los endpoints sujetos a estos límites.
