Notta Docs

Límites de tasa

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.

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:

{
  "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.
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).

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

Última actualización

En esta página