Documentación

Cuotas y errores

Cada key puede tener una cuota diaria que se reinicia a medianoche en America/Santiago. Además, la política de uso limita el tráfico por IP a 10 requests por segundo, con ráfagas de hasta 20.

Headers de cuota

HeaderSignificado
X-RateLimit-LimitCuota diaria asignada a la key.
X-RateLimit-RemainingRequests disponibles después de la llamada.
X-RateLimit-ResetTimestamp Unix del próximo reinicio.
Retry-AfterSegundos a esperar antes de reintentar. Aparece en 429 y en algunos 503.

Los cuatro headers están expuestos vía CORS, así que también son legibles desde el navegador.

Códigos de estado del middleware

  • 401 Unauthorized: falta la key, es inválida o fue revocada. Incluye WWW-Authenticate: Bearer.
  • 403 Forbidden: no forma parte del flujo de API key en los endpoints de datos. Hoy solo aparece en las rutas de cuenta cuando el origen no es confiable. No lo interpretes como cuota agotada.
  • 429 Too Many Requests: cuota diaria agotada o exceso de tasa. Cuando se agota la cuota, incluye los cuatro headers anteriores.
  • 5xx: falla transitoria o datos en actualización. La validación de keys y algunos resúmenes pueden responder 503 con Retry-After: 5.

Retry con backoff y jitter

TypeScript
async function requestWithRetry(url: string, apiKey: string) {
for (let attempt = 0; attempt < 4; attempt += 1) {
  const response = await fetch(url, {
    headers: { "X-Api-Key": apiKey },
  });

  if (response.ok || ![429, 500, 502, 503, 504].includes(response.status)) {
    return response;
  }

  const retryAfterHeader = response.headers.get("Retry-After");
  const retryAfterSeconds =
    retryAfterHeader === null || retryAfterHeader.trim() === ""
      ? Number.NaN
      : Number(retryAfterHeader);
  const fallbackMs = 500 * 2 ** attempt + Math.random() * 250;
  const waitMs = Number.isFinite(retryAfterSeconds) && retryAfterSeconds >= 0
    ? retryAfterSeconds * 1000
    : fallbackMs;

  await new Promise((resolve) => setTimeout(resolve, waitMs));
}

throw new Error("BuscaFondos no respondió después de 4 intentos");
}

No reintentes 401 ni 403: corrige la autenticación primero. Antes de automatizar cargas grandes, lee la política de uso.