Límites de Tasa
Para asegurar un uso justo y estabilidad del sistema, la API de ZenFlow aplica límites de tasa en todas las solicitudes.
Límites por Defecto
Ventana de Tiempo Límite Por Minuto 60 solicitudes Por Hora 1,000 solicitudes Por Día 10,000 solicitudes
Los límites de tasa son por API key. Puedes solicitar límites más altos contactando a soporte.
Cada respuesta de la API incluye información sobre límites de tasa:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705312260
Header Descripción X-RateLimit-LimitSolicitudes máximas en la ventana actual X-RateLimit-RemainingSolicitudes restantes X-RateLimit-ResetTimestamp Unix cuando el límite se reinicia
Límite de Tasa Excedido
Cuando excedes el límite de tasa, la API retorna:
HTTP/ 1.1 429 Too Many Requests
Retry-After: 30
{
"success" : false ,
"error" : {
"code" : "rate_limit_exceeded" ,
"message" : "Límite de tasa excedido. Intenta de nuevo en 30 segundos."
}
}
El header Retry-After indica los segundos a esperar antes de reintentar.
Manejando Límites de Tasa
Backoff Exponencial
Implementa backoff exponencial para errores de límite de tasa:
async function fetchWithRetry ( url , options , maxRetries = 3 ) {
for ( let attempt = 0 ; attempt <= maxRetries ; attempt ++ ) {
const response = await fetch ( url , options );
if ( response . status !== 429 ) {
return response ;
}
const retryAfter = parseInt ( response . headers . get ( 'Retry-After' ) || '1' );
const delay = Math . min ( retryAfter * 1000 , Math . pow ( 2 , attempt ) * 1000 );
console . log ( `Límite de tasa alcanzado. Reintentando en ${ delay } ms...` );
await new Promise ( resolve => setTimeout ( resolve , delay ));
}
throw new Error ( 'Máximo de reintentos excedido' );
}
Verificar Solicitudes Restantes
Antes de hacer solicitudes, verifica la cuota restante:
async function makeRequest ( url ) {
const response = await fetch ( url , { headers });
const remaining = parseInt ( response . headers . get ( 'X-RateLimit-Remaining' ));
if ( remaining < 10 ) {
console . warn ( 'Pocas solicitudes restantes:' , remaining );
// Opcionalmente reduce la velocidad de solicitudes
}
return response ;
}
Agrupamiento de Solicitudes
Para operaciones masivas, usa endpoints batch en lugar de llamadas individuales:
// Malo: Solicitudes individuales (usa 100 llamadas API)
for ( const product of products ) {
await updateStock ( product . id , product . quantity );
}
// Bueno: Solicitud batch (usa 1 llamada API)
await bulkUpdateStock ( products . map ( p => ({
product_id: p . id ,
quantity: p . quantity
})));
Mejores Prácticas
Usa Endpoints Batch Combina múltiples operaciones en solicitudes únicas
Cachea Respuestas Cachea datos que no cambian frecuentemente
Implementa Backoff Usa backoff exponencial para reintentos
Monitorea Uso Rastrea tus patrones de uso de API
Ejemplo de Caché
const cache = new Map ();
const CACHE_TTL = 60000 ; // 1 minuto
async function getProduct ( id ) {
const cacheKey = `product: ${ id } ` ;
const cached = cache . get ( cacheKey );
if ( cached && Date . now () - cached . timestamp < CACHE_TTL ) {
return cached . data ;
}
const response = await fetch ( `/api/v1/products/ ${ id } ` , { headers });
const data = await response . json ();
cache . set ( cacheKey , { data: data . data , timestamp: Date . now () });
return data . data ;
}
Límites Personalizados
¿Necesitas límites de tasa más altos? Contacta a [email protected] con:
Tu caso de uso
Volumen de solicitudes esperado
Patrones de uso pico
Los planes Enterprise incluyen:
Límites por defecto más altos
Configuración de límites personalizada
Soporte dedicado