WhatsApp banea cuentas que envían demasiados mensajes en poco tiempo. El rate limiter integrado del provider Baileys protege tu bot automáticamente — está activo por defecto y se sitúa dentro del pipeline de envío saliente del provider, así que cada ctx.reply(), bot.send(), bot.broadcast() y envío de media pasa por él.
Pacing propio de cada transporteLa política de pacing vive en el provider, no en el core: cada
transporte puede aplicar sus propios límites (429s de Telegram, buckets de
Discord, tiers de la Cloud API — expuestos como RateLimitedError tipados).
Esta página cubre el limiter de token bucket de WhatsApp (Baileys) que
configuras al construir BaileysProvider.
El limiter usa un algoritmo de token bucket con dos buckets independientes:
Por chat — limita qué tan rápido puedes enviar a una sola conversación.
Global — limita tu throughput saliente total entre todos los chats.
Cuando un bucket se vacía, los mensajes se encolan (no se descartan) y se liberan conforme los tokens se recargan; un chat frenado no retiene a los demás. Un envío que espera en la cola más de maxWait (30 s por defecto) rechaza con RateLimiterTimeout, un RateLimitedError, así que quien envía nunca se queda colgado. Un jitter opcional agrega un delay aleatorio tipo humano entre envíos.
Las cuentas nuevas son más sensiblesUn número de WhatsApp recién registrado se banea más rápido que uno con antigüedad. Empieza conservador (3 / 10s por chat, 20 / 60s global) y aumenta gradualmente.
Sea cual sea el transporte, un envío de ctx (reply, say, media, en
handlers, flujos y conversaciones) que el provider rechaza con un
RateLimitedError que pide una espera corta se reintenta en el sitio, para que
un paso de conversación no termine por un 429 pasajero: por defecto una vez,
cuando retryAfterMs es de 5 s como mucho. BotConfig.rateLimitRetry lo ajusta
(retries cuenta los intentos después del primero):
new Bot({ provider, rateLimitRetry: { retries: 2, maxWaitMs: '10s' } })new Bot({ provider, rateLimitRetry: false }) // nunca reintentar en el sitio
Una espera más larga, otros errores y bot.send() no se reintentan en el
sitio: rechazan con el error del provider. bot.broadcast() (su opción retries) y el outbox durable tienen su propio
back-off.
El rate limiter corre después de los hooks before('send') pero antes del envío real al provider. Si un hook aborta el envío, el rate limiter nunca se consulta — los envíos abortados no consumen tokens.
Assistant
Responses are generated using AI and may contain mistakes.