Resend API error · 429

Resend daily_quota_exceeded: the 100-a-day limit and how to get past it

Resend returns 429 daily_quota_exceeded when an account on the Free plan has used its 100 emails for the day. Received emails count toward it as well as sent ones, and every To, Cc and Bcc recipient counts as one. The quota resets at 00:00 UTC and retrying before then fails the same way; to lift it for good, move to a paid plan, which has no daily quota.

The error

Status429
Namedaily_quota_exceeded
MessageYou have exceeded your daily email sending quota.

Name, status and message as Resend documents them, last verified 28 September 2026.

Why it happens

  • The Free plan allows 100 emails a day and 3,000 a month. Paid plans have no daily quota, only the monthly one.
  • Inbound counts. Each email received on the account uses one email of the daily and monthly quota, so a busy support address can use up the day's sending.
  • Recipients count separately. One email to three people in To and Cc is three emails.
  • The day is a UTC calendar day, not a rolling 24 hours. A burst at 23:00 UTC and another at 01:00 UTC land on different days.
  • It is a 429, the same status as the rate limit, so a retry loop written for rate_limit_exceeded retries it every few seconds for the rest of the day.

How to fix it

  1. Stop retrying it

    Treat daily_quota_exceeded as final for the day. Queue what did not send and try again after 00:00 UTC, or tell a person. Check error.name, not the status, because both this and the rate limit are 429.

    const { data, error } = await resend.emails.send(email);
    if (error?.name === "daily_quota_exceeded" || error?.name === "monthly_quota_exceeded") {
      await queue.deferUntil(nextUtcMidnight(), email); // or alert a person
    } else if (error) {
      throw new Error(`${error.name}: ${error.message}`);
    }
  2. Watch the quota before you reach it

    On the Free plan every response carries x-resend-daily-quota, the emails used today, and x-resend-monthly-quota, the emails used this month. Alert at 80 rather than learning about it from the 101st send.

  3. Account for received mail

    If the account also receives email, the day's sending allowance is 100 minus what arrived. A day with a lot of inbound leaves less room to send.

  4. Move to a paid plan

    Paid plans have no daily quota. Overage past the monthly quota is capped at five times the plan's quota by default, so a very large month can still stop.

If you would rather not count received mail against a daily allowance, SendRaven's Free plan has no daily cap and does not meter inbound replies; see SendRaven vs Resend or migrate from Resend.

Questions

What is Resend's daily sending limit?

100 emails a day on the Free plan, alongside 3,000 a month. Paid plans have no daily quota, only a monthly one.

When does Resend's daily quota reset?

At 00:00 UTC. It is a UTC calendar day, not a rolling 24 hours from the first send.

Do received emails count against Resend's quota?

Yes. Each email received counts as one email against the daily and monthly quotas, the same as a sent one.

What is monthly_quota_exceeded?

The same refusal for the month: a 429 once the plan's monthly emails are used. On the Free plan that is 3,000; it clears when the month resets or the plan changes.

What SendRaven does here

SendRaven's Free plan is 3,000 emails a month with no daily cap, and received mail is not counted.

Inbound replies are never metered on any plan, so a busy support address cannot use up the sending allowance. The one meter is outbound emails sent.

When Free is spent the refusal is 402 plan_limit_reached, not a 429: nothing clears it in seconds, and a status that says so keeps retry loops off it. Paid sending does not stop at a volume unless you set a spend budget; past the monthly minimum it is metered on one price curve. A daily limit exists only if you put one on an API key yourself.

Free still needs a payment method before the first send. Nothing is charged, and nothing moves you to a paid plan without you pressing the button.

Every error type, its status and whether to retry it is on the errors reference. The whole comparison is SendRaven vs Resend, and moving over is migrate from Resend.

The longer story is on the blog: Resend has three 429s. Only one of them should be retried.

HTTP/1.1 402 Payment Required

{ "error": { "type": "plan_limit_reached",
             "message": "The Free plan includes 3,000 emails a month and 3,000 have been sent. Activate paid sending to continue, …" } }

Email infrastructure for AI agents.

SendRaven sends and receives email through one API, joins replies to their threads, and lets you put a daily limit, a recipient allowlist or an approval hold on the key an agent holds.