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.
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>"
}
]'{
"data": [
{ "id": "01jcz8w3f2x9k4m7n6p5q2r1s0" },
{ "id": "01jcz8w3f2z1h6c8d4e2f9g7t3" }
]
}The IDs are in the same order as the emails in your request.
With the Node SDK:
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
| Rule | Detail |
|---|---|
| Size | 1 to 100 emails per request. |
| Attachments | Not allowed. A batch with any attachments is rejected. |
| Scheduling | Not allowed. A batch with any scheduled_at is rejected. |
| Templates | Allowed. Each email can use its own template. |
| Validation | All 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. |
| Quota | A 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. |
| Idempotency | The Idempotency-Key header covers the whole batch. A retry returns the same list of IDs. |
| Recipients | Each 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:
{
"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.