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

# Límites de tasa

> Límites por clave y aplicación Upstash en producción

Cada clave API tiene límites configurables (`rate_limit_per_minute`, `rate_limit_per_day`). Al excederlos, Clausum devuelve **429 Too Many Requests** con código `RATE_LIMIT_EXCEEDED`.

## Valores por defecto (claves secret nuevas)

| Ventana | Default típico |
| - | - |
| Por minuto | 120 solicitudes |
| Por día | 10,000 solicitudes |

Las claves publishable e ingest pueden usar defaults más bajos. Ajusta por clave en **Conexiones → Claves API** al crear o editar una clave secret.

<Note>
  Los límites son **por clave API**. Usa claves separadas para checkout vs jobs batch para que picos no se throttleen entre sí.
</Note>

## Aplicación en producción

En producción, los límites de tasa usan **Upstash Redis** (`UPSTASH_REDIS_REST_URL` + `UPSTASH_REDIS_REST_TOKEN`) para conteo distribuido entre instancias Vercel. Sin Upstash en producción, Clausum falla cerrado en checks de rate limit — asegura Redis configurado antes del go-live.

Sandbox / desarrollo puede usar fallback en memoria cuando Upstash no está definido.

## Headers de respuesta

| Header | Descripción |
| - | - |
| `X-RateLimit-Remaining` | Solicitudes restantes en la ventana actual |
| `X-RateLimit-Reset` | Cuándo se reinicia la ventana (timestamp Unix) |

## Manejo de 429

```ts theme={null}
async function requestWithRetry(
  url: string,
  options: RequestInit,
  attempt = 0
): Promise<Response> {
  const res = await fetch(url, options)
  if (res.status !== 429 || attempt >= 5) return res

  const reset = Number(res.headers.get("x-ratelimit-reset")) || 0
  const waitMs = reset ? Math.max(0, reset * 1000 - Date.now()) : 2 ** attempt * 250
  await new Promise((r) => setTimeout(r, waitMs + Math.random() * 250))
  return requestWithRetry(url, options, attempt + 1)
}
```

## Consejos

<AccordionGroup>
  <Accordion title="Assess una vez por decisión" icon="gauge-high">
    Llama assess al enviar checkout o autorizar payout — no en cada tecla. Usa el [SDK para navegador](/es/guides/browser-sdk) solo para señales de dispositivo.
  </Accordion>

  <Accordion title="Reintentos idempotentes" icon="rotate">
    Los reintentos tras timeout deben reutilizar el mismo `order_id` o `Idempotency-Key` — no cuentan doble contra velocidad como lo harían órdenes duplicadas.
  </Accordion>

  <Accordion title="Solicitar límites más altos" icon="arrow-up-right-dots">
    ¿Alto volumen en producción? Contacta [api@clausum.ai](mailto:api@clausum.ai) antes del lanzamiento.
  </Accordion>
</AccordionGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.