Rate Limits
The Loopwave API limits each key to a fixed number of requests per minute so a single integration can’t overwhelm your deployment.
The limit
| Limit | Value |
|---|---|
| Requests per key | 120 per minute |
| Window | Fixed 60-second window |
| Scope | Per API key (not per IP) |
Each key has its own budget, so issuing separate keys for separate integrations keeps their limits independent.
Response headers
Every response includes how much budget is left, and a 429 tells you when to retry:
| Header | On | Meaning |
|---|---|---|
X-RateLimit-Remaining | Every response | Requests left in the current window. |
Retry-After | 429 only | Seconds to wait before retrying. |
Handling 429
When you exceed the limit you receive:
429 Too Many Requests
{ "error": "rate_limited", "message": "Too many requests for this key." }Respect the Retry-After header and back off before retrying.
Example: respect Retry-After
async function callWithRetry(url, opts) {
const res = await fetch(url, opts);
if (res.status === 429) {
const wait = Number(res.headers.get('Retry-After') || 1) * 1000;
await new Promise((r) => setTimeout(r, wait));
return callWithRetry(url, opts);
}
return res;
}For bulk outreach, don’t loop POST /messages at the limit — use a
broadcast instead. Broadcasts are paced server-side with
randomized delays and a daily cap, which both stays within limits and protects your
number from bans.
Review how keys and scopes work.