send.devGuides

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

PlanEmails per SecondEmails per DayAPI Requests per Minute
Free110060
Starter1010,000300
Pro50100,0001,000
EnterpriseCustomCustomCustom

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
HeaderDescription
X-RateLimit-LimitMaximum requests allowed per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix 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:

EndpointLimitNotes
POST /v1/emailsPlan limitStandard email sending
POST /v1/emails/batchPlan limit / 10Batch counts as multiple
GET /v1/emails100/minList/search operations
POST /v1/domains/verify10/minDNS 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-Remaining in 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.

PlanBurst Allowance
FreeNone
Starter2x for 10 seconds
Pro3x for 30 seconds
EnterpriseCustom

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:

  1. Go to Settings → Billing
  2. Click Upgrade Plan
  3. Select a plan with higher limits
  4. New limits take effect immediately

Or contact us for enterprise solutions with custom limits.

On this page