Sending

Batch sending

Send up to 100 emails in one request with POST /emails/batch, with all-or-nothing validation and one rate-limit token.

POST /emails/batch sends up to 100 different emails in one request. It is the efficient way to send many messages, because the whole batch uses a single request against your rate limit.

This endpoint works with a sending_access key.

Request

The body is a JSON array. Each element accepts the same fields as POST /emails, with the exceptions listed below.

Shell
curl -X POST https://api.sooner.dev/emails/batch \
  -H "Authorization: Bearer $SOONER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: digest-2026-11-14" \
  -d '[
    {
      "from": "Acme <hello@mail.yourcompany.com>",
      "to": ["ada@example.com"],
      "subject": "Your weekly digest",
      "html": "<p>Hi Ada, here is your digest.</p>"
    },
    {
      "from": "Acme <hello@mail.yourcompany.com>",
      "to": ["grace@example.com"],
      "subject": "Your weekly digest",
      "html": "<p>Hi Grace, here is your digest.</p>"
    }
  ]'
JSON
{
  "data": [
    { "id": "01jcz8w3f2x9k4m7n6p5q2r1s0" },
    { "id": "01jcz8w3f2z1h6c8d4e2f9g7t3" }
  ]
}

The IDs are in the same order as the emails in your request.

With the Node SDK:

TypeScript
const { data, error } = await resend.batch.send([
  {
    from: "Acme <hello@mail.yourcompany.com>",
    to: ["ada@example.com"],
    subject: "Your weekly digest",
    html: "<p>Hi Ada, here is your digest.</p>",
  },
  {
    from: "Acme <hello@mail.yourcompany.com>",
    to: ["grace@example.com"],
    subject: "Your weekly digest",
    html: "<p>Hi Grace, here is your digest.</p>",
  },
]);

Rules

RuleDetail
Size1 to 100 emails per request.
AttachmentsNot allowed. A batch with any attachments is rejected.
SchedulingNot allowed. A batch with any scheduled_at is rejected.
TemplatesAllowed. Each email can use its own template.
ValidationAll or nothing. If one email is invalid, nothing is queued and no quota is used. The error message names the position, for example (email 3), counting from 0.
QuotaA batch of N emails counts as N against your monthly quota, and against the daily cap on Free. If the batch would cross a cap, the whole request is rejected.
IdempotencyThe Idempotency-Key header covers the whole batch. A retry returns the same list of IDs.
RecipientsEach email has its own limit of 50 recipients across to, cc and bcc.

Each email in a batch is processed independently after it is accepted. One recipient bouncing does not affect the others, and each email has its own ID, status and events.

Errors

A batch can fail with any of the errors in Send an email. The most common for batches:

JSON
{
  "statusCode": 422,
  "message": "Batch emails can't have attachments or scheduled_at.",
  "name": "validation_error"
}

Use a batch when you have many emails to send at once, such as a digest or a notification fan-out. For a message to a large audience from a segment, with unsubscribe handling, use broadcasts.