Skip to content
Docs

Troubleshooting

Why do I get 429 Rate limit exceeded?

Handle 429 responses from the Emailit API. Learn the per-second and daily sending limits, the rate-limit headers and how to request higher limits.

Updated Oct 1, 2026

This article explains why POST /v2/emails returns 429 and how to pace your sending so it doesn’t happen. The same limits apply to SMTP, where they show up as 452 replies.

Symptoms

The API responds with 429 and one of these bodies:

JSON
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Maximum 2 messages per second allowed.",
  "limit": 2,
  "current": 2,
  "retry_after": 1
}
JSON
{
  "error": "Daily limit exceeded",
  "message": "Daily sending limit of 5000 messages has been reached.",
  "limit": 5000,
  "current": 5000,
  "retry_after": 41200
}

Over SMTP, the MAIL FROM command fails with 452 4.4.5 Messages per second limit exceeded or 452 4.5.3 Daily message limit exceeded.

Cause

Each workspace has two sending limits, shared by every API key and by SMTP:

  • Per second. New workspaces start at 2 emails per second.
  • Per day. New workspaces start at 5,000 emails per day. The counter resets at midnight UTC.

The API counts every recipient as one email, so a request with three addresses in to, cc and bcc uses three. Bursts from parallel workers, retry loops without backoff, and batch jobs that start at the same time are the usual triggers.

Every send response includes headers that tell you where you stand:

Header Meaning
ratelimit-limit / ratelimit-remaining Per-second limit and what’s left in the current second
ratelimit-daily-limit / ratelimit-daily-remaining Daily limit and what’s left today
ratelimit-daily-reset Seconds until midnight UTC
retry-after Seconds to wait before retrying (on 429 only)

Fix

  1. Wait and retry. Honor retry-after (or retry_after in the body) before you send again. A 429 request isn’t sent and isn’t charged, so retrying is safe. Add an Idempotency-Key to guard against network-level retries.

  2. Pace your sender. Use a queue with a concurrency limit that matches ratelimit-limit, and back off exponentially after a 429 instead of retrying in a tight loop.

  3. Spread large sends. If you hit the daily limit, schedule the rest with scheduled_at for after midnight UTC, or use a campaign for marketing mail.

  4. Check your current limits. The Sending Limits card on the Dashboard shows your per-second and per-day limits and today’s usage.

  5. Request higher limits. Select Request Increase on the Sending Limits card, enter the limits you need, where your recipients come from and why. The team usually replies within 24 hours. On Pro and Business, limits also rise automatically as your sending health stays good.

See Rate limits for the full reference and Limits for every plan quota.

Still stuck?

Contact support or ask in Discord. Include your expected volume per day and per second and a sample 429 response.

Was this page helpful?

Thanks for the feedback.

Thanks, we read every message.