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

# Rate Limits

> Cuántas peticiones por minuto puedes hacer y cómo reaccionar al límite.

Limitamos peticiones para proteger el servicio y evitar que un bug en tu lado consuma tus créditos accidentalmente.

## Tier actual

| Endpoint    | Límite            | Bucket                  |
| ----------- | ----------------- | ----------------------- |
| `/v1/calls` | 10 peticiones/min | Por API key (no por IP) |

Si tienes varias instancias (n8n + GHL + script propio) usando la misma key, comparten el bucket. Para más throughput, crea API keys separadas.

<Note>
  Si necesitas un límite más alto sostenido (ej. campaña de outbound masivo), escríbenos a [soporte@ryvo.so](mailto:soporte@ryvo.so) — podemos abrir el límite caso por caso.
</Note>

## Respuesta cuando excedes el límite

```http theme={null}
HTTP/1.1 429 Too Many Requests
Retry-After: 32
Content-Type: application/json

{
  "error": "Too many requests"
}
```

El header `Retry-After` te dice cuántos segundos esperar antes de volver a intentar.

## Estrategia recomendada: backoff exponencial con jitter

```javascript theme={null}
async function callWithBackoff(body, attempt = 0) {
  const r = await fetch("https://api.ryvo.so/v1/calls", {
    method: "POST",
    headers: { /* ... */ },
    body: JSON.stringify(body),
  })

  if (r.status === 429) {
    if (attempt >= 5) throw new Error("rate limit, retries agotados")
    const retryAfter = Number(r.headers.get("Retry-After")) || 1
    const jitter = Math.random() * 1000
    const wait = retryAfter * 1000 * Math.pow(2, attempt) + jitter
    await new Promise(res => setTimeout(res, wait))
    return callWithBackoff(body, attempt + 1)
  }

  return r
}
```

## Buenas prácticas

<AccordionGroup>
  <Accordion title="Una key por integración" icon="key">
    Si tu n8n y tu CRM hacen llamadas, dales keys distintas. Así un pico en una no afecta a la otra.
  </Accordion>

  <Accordion title="Cola en tu lado" icon="layer-group">
    Para campañas outbound de cientos/miles de llamadas, mete los leads en una cola y procesa con un worker que respeta rate-limit (ej. 8 peticiones/min para dejar margen).
  </Accordion>

  <Accordion title="Idempotency-Key siempre" icon="repeat">
    Combinado con backoff, garantiza que reintentos por `429` no disparen llamadas duplicadas si el primer intento fue exitoso pero la respuesta se perdió.
  </Accordion>
</AccordionGroup>
