Send.dev implements rate limits to ensure fair usage and maintain service quality for all users. This page explains our rate limits and how to handle them.
Rate Limit Overview
| Plan | Emails per Second | Emails per Day | API Requests per Minute |
|---|---|---|---|
| Free | 1 | 100 | 60 |
| Starter | 10 | 10,000 | 300 |
| Pro | 50 | 100,000 | 1,000 |
| Enterprise | Custom | Custom | Custom |
Need Higher Limits?
Contact us for custom rate limits tailored to your needs.
Rate Limit Headers
Every API response includes headers showing your current rate limit status:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 299
X-RateLimit-Reset: 1705142460| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per window |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Rate Limit Response
When you exceed the rate limit, the API returns a 429 Too Many Requests response:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Please retry after 60 seconds.",
"retry_after": 60
}
}The Retry-After header indicates how many seconds to wait before retrying.
Handling Rate Limits
Exponential Backoff
Implement exponential backoff when rate limited:
async function sendWithRetry(email: EmailRequest, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await send.emails.send(email);
} catch (error) {
if (error.code === 'rate_limited' && attempt < maxRetries - 1) {
const delay = Math.pow(2, attempt) * 1000 + Math.random() * 1000;
await sleep(delay);
continue;
}
throw error;
}
}
}Queue-Based Sending
For high-volume sending, implement a queue:
import { Queue } from 'your-queue-library';
const emailQueue = new Queue('emails', {
rateLimiter: {
max: 10, // Max emails
duration: 1000 // Per second
}
});
emailQueue.process(async (job) => {
await send.emails.send(job.data);
});
// Add emails to queue
await emailQueue.add({ to: 'user@example.com', ... });Per-Endpoint Limits
Some endpoints have specific rate limits:
| Endpoint | Limit | Notes |
|---|---|---|
POST /v1/emails | Plan limit | Standard email sending |
POST /v1/emails/batch | Plan limit / 10 | Batch counts as multiple |
GET /v1/emails | 100/min | List/search operations |
POST /v1/domains/verify | 10/min | DNS verification |
Best Practices
1. Use Batch Sending
Instead of many individual requests, use batch sending:
# Instead of 100 individual requests
curl -X POST /v1/emails -d '{"to": "user1@..."}'
curl -X POST /v1/emails -d '{"to": "user2@..."}'
# ... 98 more
# Use one batch request
curl -X POST /v1/emails/batch -d '{
"emails": [
{"to": "user1@...", ...},
{"to": "user2@...", ...},
// ... up to 100 emails
]
}'2. Cache API Responses
Cache responses that don't change frequently:
// Cache domain list for 5 minutes
const domains = await cache.getOrSet('domains', async () => {
return await send.domains.list();
}, { ttl: 300 });3. Monitor Your Usage
Check your rate limit headers and dashboard:
- Track
X-RateLimit-Remainingin your logs - Set up alerts when approaching limits
- Review usage patterns in the dashboard
4. Spread Load Over Time
Instead of sending all emails at once, spread them out:
// Bad: Send all at once
for (const user of users) {
await send.emails.send({ to: user.email, ... });
}
// Good: Spread over time
for (const user of users) {
await send.emails.send({ to: user.email, ... });
await sleep(100); // 100ms between sends
}Burst Handling
Send.dev allows short bursts above your rate limit for sudden spikes. However, sustained traffic above your limit will trigger rate limiting.
| Plan | Burst Allowance |
|---|---|
| Free | None |
| Starter | 2x for 10 seconds |
| Pro | 3x for 30 seconds |
| Enterprise | Custom |
Daily Limits
Daily email limits reset at midnight UTC. Monitor your usage to avoid hitting daily caps:
curl https://api.send.dev/v1/usage \
-H "Authorization: Bearer sk_live_your_api_key"{
"period": "2025-01-13",
"emails": {
"sent": 5420,
"limit": 10000,
"remaining": 4580
},
"api_requests": {
"count": 1250,
"limit": null
}
}Upgrading Your Plan
If you're consistently hitting rate limits, consider upgrading:
- Go to Settings → Billing
- Click Upgrade Plan
- Select a plan with higher limits
- New limits take effect immediately
Or contact us for enterprise solutions with custom limits.