Rate Limits
Understand your request limits and how to handle throttling.
Limits by Plan
| Plan | Requests / second | Emails / month |
|---|---|---|
| Free | 10 | 3,000 |
| Starter | 50 | 10,000 |
| Growth | 100 | 50,000 |
| Scale | 500 | 200,000 |
Rate Limit Headers
Every API response includes these headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests allowed per second for your plan |
| X-RateLimit-Remaining | Number of requests remaining in the current window |
| X-RateLimit-Reset | Unix timestamp when the rate limit window resets |
HTTP/1.1 200 OK X-RateLimit-Limit: 100 X-RateLimit-Remaining: 97 X-RateLimit-Reset: 1712345678 Content-Type: application/json
Handling 429 Responses
When you exceed the rate limit, the API returns a 429 Too Many Requests response with a Retry-After header indicating how many seconds to wait.
HTTP/1.1 429 Too Many Requests
Retry-After: 1
Content-Type: application/json
{
"error": "Rate limit exceeded",
"status": 429,
"retry_after": 1
}async function sendWithRetry(payload, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch("https://smtpfa.st/api/v1/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
if (res.status !== 429) return res.json();
const retryAfter = parseInt(res.headers.get("Retry-After") || "1");
await new Promise((r) => setTimeout(r, retryAfter * 1000));
}
throw new Error("Max retries exceeded");
}Best Practices
Use batch sending
The POST /v1/emails/batch endpoint lets you send up to 100 emails in a single request. This counts as one request toward your rate limit.
Monitor headers proactively
Check X-RateLimit-Remaining in your responses and slow down before hitting the limit instead of waiting for 429 errors.
Implement exponential backoff
When retrying after a 429, use exponential backoff with jitter to avoid thundering herd problems when multiple clients retry simultaneously.
Queue on your side
For high-volume sending, queue emails in your application and drain the queue at a steady rate below your limit. This prevents bursts from triggering throttling.