Skip to main content

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.

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

Tier actual

EndpointLímiteBucket
/v1/calls10 peticiones/minPor 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.
Si necesitas un límite más alto sostenido (ej. campaña de outbound masivo), escríbenos a soporte@ryvo.so — podemos abrir el límite caso por caso.

Respuesta cuando excedes el límite

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

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

Si tu n8n y tu CRM hacen llamadas, dales keys distintas. Así un pico en una no afecta a la otra.
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).
Combinado con backoff, garantiza que reintentos por 429 no disparen llamadas duplicadas si el primer intento fue exitoso pero la respuesta se perdió.