Rate limits
kirim.dev paces your traffic just under Meta's ceilings, so a burst is turned into a short, well-signalled wait here rather than a hard rejection from Meta mid-campaign. The limits are the ones Meta enforces — kirim.dev does not add a stricter cap of its own.
Sending messages
Sends are limited per connected phone number, at that number's messaging throughput tier. Each number has its own budget, so one busy number never slows another.
| Tier | Throughput | Notes |
|---|---|---|
| Standard | 80 messages/sec | Meta's default for a connected number. |
| Low | 20 messages/sec | Numbers on a reduced tier. |
| High | 1,000 messages/sec | Numbers Meta has raised to the top tier. |
A number's tier is Meta's, visible in the dashboard. Newly connected numbers start on the standard tier; Meta raises it automatically as your quality and volume grow.
Reads (template listings)
Listing templates and other read calls do not consume a number's messaging throughput, but they draw on the WhatsApp Business Account's shared request budget — Meta allows 5,000 requests per hour per WABA(about 1.4 per second sustained). A short burst at startup is fine; only sustained traffic is held near that rate.
What a throttle looks like
When you exceed a limit, kirim.dev returns 429 with the headers that tell you how long to wait. Read them and pace yourself rather than retrying blindly into another 429:
HTTP/1.1 429 Too Many Requests
Retry-After: 7
RateLimit-Remaining: 0
RateLimit-Reset: 7
Content-Type: application/json
{
"error": {
"message": "Sending too fast for this phone number. Retry in 7s.",
"type": "KirimThrottleException",
"code": 429
}
}Retry-After— seconds to wait before the next request will be accepted.RateLimit-Remaining— requests left in the current window (0at a refusal).RateLimit-Reset— seconds until the budget refills.
RateLimit-Remaining is sent on successful responses too, so you can slow down before you hit the limit rather than only learning of it at the 429.
If the limiter is unavailable
Rate limiting fails open: if the limiter cannot be reached, your request is forwarded rather than refused. Meta's own ceiling still applies, so you are never left unprotected — you may briefly see Meta's 429instead of kirim.dev's.