Rate Limits & Quotas
SendAPI applies rate limits and monthly quotas to keep the platform stable and fair for all users.
Rate Limits
Rate limits are enforced per API key using a sliding-window token bucket algorithm.
| Plan | Requests per minute | Requests per hour |
|---|---|---|
| Starter | 60 | 1,000 |
| Growth | 600 | 10,000 |
| Business | 6,000 | 100,000 |
Rate Limit Headers
Every API response includes these headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
429 Response
When you exceed the rate limit, the API returns 429 Too Many Requests:
json
{
"success": false,
"error": {
"type": "rate_limit_exceeded",
"message": "Too many requests. Please retry after 12 seconds.",
"code": 4029,
"retry_after": 12
}
}Best practice: Implement exponential backoff when receiving 429. Start at 1s, double each retry, cap at 60s.
Monthly Quotas
Quotas reset on the first day of each billing period.
| Feature | Starter | Growth | Business |
|---|---|---|---|
| WhatsApp messages | 1,000 | 50,000 | Unlimited |
| WhatsApp sessions | 1 | 5 | 25 |
| SMS messages | Pay-as-you-go | Pay-as-you-go | Pay-as-you-go |
| Monthly emails | 5,000 | 50,000 | 500,000 |
| OTP verifications | 500 | 10,000 | Unlimited |
Quota Exceeded Response
json
{
"success": false,
"error": {
"type": "quota_exceeded",
"message": "Monthly WhatsApp message quota exceeded. Upgrade your plan to continue.",
"code": 4028,
"upgrade_url": "https://sendapi.co/billing"
}
}Per-Endpoint Limits
Some endpoints have additional per-session rate limits independent of your plan:
| Endpoint | Limit |
|---|---|
| WhatsApp messages per session | 30/min, 1,000/day |
| OTP send per phone | 5/hour, 20/day |
| Webhook test triggers | 10/hour |