Módulo 3: Loops e Iteraciones
Rate Limiting con Wait Node
Descripción de la cápsula
Cuando llamas APIs externas en bucle, rate limits son la realidad: casi todas las APIs profesionales te limitan a X requests por minuto, hora, o día. Excederlos significa rejection con error 429, ban temporal, o incluso permanente. Wait node es la herramienta para regular la velocidad de tus loops.
En esta cápsula vas a aprender a calcular cuánto Wait según el rate limit del servicio, los 3 patrones principales (Wait fijo, Wait variable según respuesta, Wait exponencial para retry), cómo detectar rate limits dinámicamente desde la respuesta del servidor, y los matices de plan rate vs burst rate que las APIs usan.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Calcular Wait time según rate limit del servicio
- ✅ Configurar Wait node en diferentes modos
- ✅ Aplicar 3 patrones: fijo, dinámico, exponencial
- ✅ Detectar rate limits desde headers de respuesta
- ✅ Manejar burst vs plan rate
- ✅ Implementar backoff exponencial para retries
Conceptos clave: tipos de rate limits
Plan rate
"X requests por unidad de tiempo, total".
- Stripe: 100 read / 100 write por segundo
- OpenAI: tokens por minuto + RPM (requests por minuto)
- Slack: ~1 message per second por canal
Burst rate
A veces permite picos cortos. Ejemplo: "100 RPM con burst de 10/segundo en cortos periods".
Diaria/mensual
Algunas APIs tienen quotas diarias o mensuales (no rate por segundo, sino quota total).
- OpenAI free tier: 200 requests/day
- Gmail API: 1B quota/day
Por endpoint vs global
Algunas APIs separan rate por endpoint:
/api/users: 1000/min/api/exports: 10/min
Otras tienen pool compartido.
Calcular Wait time
Si la API permite X requests por segundo:
wait_seconds = 1 / X
Si API permite 10 RPS → Wait 100ms entre requests.
Si batch = N items por batch, considera que cada batch consume N requests:
wait_per_batch = N / X_per_second
Batch de 10, API permite 10/segundo → Wait 1 segundo entre batches.
Ejemplo: OpenAI Tier 1
- 500 RPM = ~8 RPS
- Batch de 5 → 5/8 = ~0.6 segundos entre batches
- Conservador: Wait 1 segundo (margen)
Ejemplo: SendGrid Free
- 100 emails/day (1 por minuto promedio)
- Batch de 1 → Wait 60 segundos entre batches
- Si necesitas mandar 500/día → no alcanza el free tier, upgrade
Wait node: configuración
Modo 1: Wait amount (espera fija)
- Wait Amount: valor numérico
- Wait Unit: seconds, minutes, hours
Simple y suficiente para la mayoría de rate limits.
Modo 2: Wait until (espera hasta cierta fecha/hora)
- Wait Until: timestamp ISO 8601
- Útil cuando necesitas esperar hasta cierto reset (ej. "API resetea quota a medianoche UTC")
Modo 3: Wait for webhook
- Espera hasta que llegue una request HTTP específica
- Para flows asíncronos (cubierto en M07)
Patrón 1: Wait fijo
[SplitInBatches batch=10]
│
[HTTP API call]
│
[Wait: 1 second]
│
└─→ loop back
Cuándo:
- API tiene rate limit conocido y constante
- Quieres simplicidad
Cuándo no alcanza:
- Rate limit cambia dinámicamente
- API te devuelve
Retry-Afterheader con tiempo específico
Patrón 2: Wait dinámico desde headers
Algunas APIs devuelven headers como:
X-RateLimit-Remaining: 5(cuántos quedan)X-RateLimit-Reset: 1654000000(timestamp del reset)Retry-After: 30(en error 429, cuánto esperar)
Implementación
[HTTP API call con Continue on Fail]
│
[IF: response status === 429]
├─ TRUE → [Set: wait_seconds = response.headers['retry-after']]
│ → [Wait: dinámico según wait_seconds]
│ → retry
└─ FALSE → continuar normal
Wait node con expression
n8n permite Wait Amount como expression:
{{ Number($json.headers['retry-after']) || 5 }}
Espera lo que el servidor dice, o 5 segundos si no está el header.
Patrón 3: Exponential backoff
Para retry de errores transitorios: espera creciente entre reintentos.
intento 1: wait 1s
intento 2: wait 2s
intento 3: wait 4s
intento 4: wait 8s
intento 5: wait 16s
Por qué exponencial
- Si el servicio está saturado, darle tiempo de recuperarse
- Más respetuoso con el provider
- Stripe, AWS, Google APIs lo recomiendan
Implementación
Set node calcula el wait basado en intento actual:
[Set:]
wait_seconds: {{ Math.pow(2, $json.retry_count) }}
// 1, 2, 4, 8, 16...
Y aumentas retry_count en cada loop iteration.
Cap (límite máximo)
Sin cap, después de 10 retries esperarías 1024 segundos (~17 min). Cap al máximo razonable:
wait_seconds: {{ Math.min(Math.pow(2, $json.retry_count), 60) }}
// Capped at 60s
Detectar rate limits proactivamente
En lugar de esperar a recibir 429, monitorear X-RateLimit-Remaining:
[HTTP API call]
│
[Set: extraer header remaining]
│
[IF: remaining < 10]
├─ TRUE → [Wait: tiempo hasta reset (calculado del header)]
└─ FALSE → continuar normal
Ventaja: evitas el 429 entirely, ralentizando proactivamente.
Ejemplo: workflow con rate limit completo
Procesar 500 leads con OpenAI (categorizar cada uno).
Plan: OpenAI Tier 1 = 500 RPM = ~8 RPS.
Diseño:
[Sheet: 500 leads]
│
[SplitInBatches batch=5]
│
▼
[5 paralelos a OpenAI] (5 RPS, dentro del limit)
│
[Set: capturar response]
│
[IF: status === 429]
├─ TRUE → [Wait: response.headers.retry-after]
│ → retry desde el OpenAI call
└─ FALSE → continuar
│
[Wait: 1 segundo fijo entre batches (margen)]
│
└─→ loop back
[Done]
│
[Slack: "500 leads categorizados"]
Cálculo:
- 500 / 5 = 100 batches
- Cada batch: ~1-2s para 5 paralelas + 1s wait
- Total ~3 min, sin rate limits
Calcular tiempo total
Para presentar a stakeholders o decidir si vale la pena:
total_time = (N_items / batch_size) × (batch_processing + wait_between_batches)
Ejemplo:
- 500 items
- Batch 10
- Procesamiento batch: 2s
- Wait entre batches: 3s
Total: (500/10) × (2+3) = 50 × 5 = 250 segundos ≈ 4 min
Si es para un Schedule diario, OK. Si es real-time response, demasiado.
Trampas comunes
Trampa 1: Wait too short
Qué pasa: Wait 100ms creyendo que es suficiente. API devuelve 429.
Cómo evitar: Empezar conservador. Si rate limit es 10 RPS, Wait 200ms en lugar de 100ms — margen para latencia.
Trampa 2: Wait too long
Qué pasa: Wait 10 segundos "por seguridad". 1000 items × 10s = 3 horas.
Cómo evitar: Calcular con margen razonable (20% más que el mínimo).
Trampa 3: No respetar Retry-After
Qué pasa: Recibes 429 con Retry-After: 60. Tu workflow hace retry inmediato. La API te bloquea por abuso.
Cómo evitar: Siempre respetar Retry-After si está. Lo cubrí arriba.
Trampa 4: Wait fuera del loop
Qué pasa: Wait después de SplitInBatches Done, no dentro del loop. Wait solo se ejecuta una vez al final.
Cómo evitar: Wait dentro del loop, entre llamadas API.
Trampa 5: No diferenciar rate limit transient vs daily quota
Qué pasa: Recibes 429. Wait 1 minuto. Vuelve a fallar. Wait 1 min. Falla. Es daily quota exceeded, no rate per second — esperar no ayuda hasta el día siguiente.
Cómo evitar: Leer el error completo. Si menciona "daily" o "monthly quota", detener el workflow y notificar — no retry inútil.
Ejercicio: calcular Wait
Objetivo: practicar el cálculo.
Casos
Para cada API, calcula el Wait correcto:
-
API permite 60 RPM. Batch=10. ¿Wait entre batches?
-
API permite 1000 RPS pero con burst de 50/sec. Batch=20. ¿Wait?
-
API tiene 500 calls/day. Quieres procesar 100 items hoy. ¿Wait?
-
Tu workflow falla con 429 +
Retry-After: 30. ¿Qué Wait usar?
Respuestas
- 60 RPM = 1 RPS. Batch=10 → 10 calls. Wait = 10 segundos entre batches.
- Within burst (50/sec), batch=20 está OK. Wait corto (1s) entre batches. Si haces muchos batches seguidos, considera Wait más largo cada 5 batches para no agotar burst.
- 500/day = ~5 per minute on average. Para 100 items, podrías hacerlos en ~20 min con Wait 12s entre cada uno. Pero si solo necesitas 100, podrías hacer en batch denso y dejar quota para resto del día.
- Wait 30 segundos según el header. Después, retry desde el punto fallido.
Resumen y siguiente paso
- Wait node regula velocidad de loops para respetar rate limits de APIs
- 3 patrones: fijo (simple), dinámico desde headers (preciso), exponencial (retry)
- Calcular Wait: considerar rate del servicio + tamaño del batch
- Respetar Retry-After cuando aparezca
- Detectar rate limits proactivamente monitoreando
X-RateLimit-Remaining - Daily quota ≠ rate limit — daily quotas no se resuelven con Wait
- 5 trampas: wait too short/long, no respect Retry-After, wait fuera del loop, no distinguir transient vs daily
Antes de avanzar deberías poder:
- Calcular Wait según rate limit
- Implementar Wait dinámico desde headers
- Implementar exponential backoff con cap
Lo que sigue (cápsula 06):
Después de procesar todos los items en lotes, a veces necesitas juntar todos los resultados en una sola pieza para reporte/notificación/storage. Aggregate node es la herramienta: colapsar N items en 1 con array adentro.
Recursos adicionales
- Wait Node Documentation - Referencia.
- Exponential Backoff (Google Cloud) - Concepto general.
- Rate Limiting Strategies (Stripe) - Estrategias profesionales.
Creado: Mayo 11, 2026 Versión: 1.0