Rate limiting
Límites de uso de la API de Karrito por endpoint, headers de respuesta y buenas practicas.
#¿Cuál es el límite de la API?
La API REST autenticada permite 60 peticiones por minuto por llave de API. La cuota se comparte entre las peticiones hechas con esa llave; no es una cuota independiente por endpoint. Existe además una protección previa de autenticación por IP.
El listado público de catálogos tiene su propio límite por IP. Otros endpoints públicos, como checkout y reseñas, aplican sus propias protecciones: no extrapoles la cuota de la API de administración a esos flujos.
#¿Qué significa HTTP 429?
429 Too Many Requests indica que se alcanzó un límite. La API v1 incluye Retry-After en esa respuesta; actualmente solicita esperar 60 segundos. No se prometen encabezados X-RateLimit-Limit o X-RateLimit-Remaining en todas las respuestas.
#Reintentar una consulta de lectura
Ejemplo para Node.js con reintentos acotados. Comprueba también errores distintos de 429:
async function readWithRetry(url, apiKey, maxAttempts = 3) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
const response = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` }
});
if (response.status !== 429) {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
}
if (attempt === maxAttempts - 1) break;
const seconds = Number(response.headers.get('Retry-After'));
const wait = Number.isFinite(seconds) && seconds > 0 ? seconds : 60;
await new Promise(resolve => setTimeout(resolve, wait * 1000));
}
throw new Error('Se alcanzó el máximo de intentos');
}No apliques reintentos automáticos de escritura sin comprobar cómo evita duplicados esa operación. Una respuesta perdida no demuestra que el cambio no se haya guardado.
#Reducir peticiones
Pagina los listados con limit y offset, reutiliza consultas recientes cuando sea adecuado y evita bucles sin final. Comprueba data y total antes de pedir otra página; un error no debe interpretarse como un listado vacío.
Consulta Productos, Categorías y Errores.