API Reference
Rate limits
Per-key send rate, burst, and how to back off cleanly.
The Send API is rate-limited per API key. The defaults are generous enough that you'll only notice during traffic spikes, but every integration should handle a 429 gracefully.
Defaults
| Plan | Sends / second | Burst | Bulk per request |
|---|---|---|---|
| Free | 5 | 25 | 100 |
| Pro | 50 | 250 | 1,000 |
| Scale | 500 | 2,500 | 10,000 |
| Enterprise | Contact us | n/a | n/a |
Need higher? Email hello@messagepipe.dev.
What you get back
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1735776000
Retry-After: 2
Content-Type: application/json
{ "error": { "code": "rate_limit_exceeded", ... } }X-RateLimit-Limit: your per-second budget.X-RateLimit-Remaining: how many you can still spend this window.X-RateLimit-Reset: Unix epoch seconds when the window resets.Retry-After: the number of seconds to wait before retrying. Always present on a 429rate_limit_exceededresponse.
Backoff
Implement exponential backoff with full jitter, capped by
Retry-After. Pseudocode:
const base = 100; // ms
const cap = 30_000; // ms
let attempt = 0;
while (true) {
const res = await fetch(url, opts);
if (res.status !== 429) return res;
const retry = Number(res.headers.get("Retry-After") ?? 0) * 1000;
const expo = Math.min(cap, base * 2 ** attempt++);
const delay = Math.max(retry, Math.random() * expo);
await new Promise((r) => setTimeout(r, delay));
}The official SDKs do this for you.