Rate limits
Limits apply per workspace across all its keys. Every response reports where you stand:
RateLimit-Limit: 600RateLimit-Remaining: 587RateLimit-Reset: 41| Bucket | Limit |
|---|---|
| All requests | 600 / minute |
POST /messages, POST /conversations/{id}/messages |
50 / second |
POST /contacts/import |
10 / minute |
POST /broadcasts |
10 / hour |
| Analytics | 60 / minute |
When you exceed a limit you get 429 rate_limited with a Retry-After header in seconds. Back off for at least that long, with jitter.
async function withRetry(fn, attempts = 5) { for (let i = 0; ; i++) { const res = await fn(); if (res.status !== 429 && res.status < 500 || i === attempts - 1) return res; const wait = Number(res.headers.get("retry-after") ?? 2 ** i); await new Promise((r) => setTimeout(r, wait * 1000 + Math.random() * 250)); }}WhatsApp’s own limits apply too. Meta caps how many new customers each number may message per 24 hours by messaging tier (1K → 10K → 100K → unlimited). Waasl paces broadcasts to stay inside your tier. Need more API throughput? Talk to us.