Validate the complete array
The body must contain 1–100 valid entries. A schema error returns 422 before any item is processed and includes the item index when available.
Queue up to 100 transactional emails in one POST. Each entry keeps its own content, recipients, email record, and index-aligned result.
Batch entries queue immediately. Use the same Idempotency-Key to retry safely. Use the single-send path for attachments or scheduling.
em_01errorem_03Request-wide authorization and capacity gates run before the per-item loop. After that boundary clears, each entry receives its own durable delivery record.
The body must contain 1–100 valid entries. A schema error returns 422 before any item is processed and includes the item index when available.
The key, project, and sender-domain scope are checked for the request. Every production sender in the batch must resolve to the same allowed project.
NoticeAPI stores the batch record, each delivery record, and every outbox job before provider dispatch begins.
data[0] describes request item 0. Every item returns an email ID and status. Poll the ID for provider and delivery updates.
Each object accepts the normal transactional fields, including templates, variables, custom headers, and tracking overrides.
curlcurl -X POST https://www.noticeapi.com/api/v1/email/batch \
-H "Authorization: Bearer $NOTICEAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: receipts-2026-08-13" \
-d '[
{
"from": "Acme <billing@acme.com>",
"to": "first@example.com",
"subject": "Receipt #1042",
"html": "<p>Your receipt is ready.</p>"
},
{
"from": "Acme <billing@acme.com>",
"to": "second@example.com",
"subject": "Receipt #1043",
"html": "<p>Your receipt is ready.</p>"
}
]'TypeScriptimport NoticeAPI from "noticeapi";
const notice = new NoticeAPI(process.env.NOTICEAPI_API_KEY);
const result = await notice.emails.batch([
{
from: "Acme <billing@acme.com>",
to: "first@example.com",
subject: "Receipt #1042",
html: "<p>Your receipt is ready.</p>",
},
{
from: "Acme <billing@acme.com>",
to: "second@example.com",
subject: "Receipt #1043",
html: "<p>Your receipt is ready.</p>",
},
], { idempotencyKey: "receipts-2026-08-13" });A 202 response means NoticeAPI stored the eligible work before provider dispatch. Match each entry to the request index, then poll its email ID for the final state.
JSON{
"ok": true,
"id": "batch_01",
"data": [
{ "id": "em_01", "status": "queued", "messageId": null },
{
"id": "em_02",
"status": "failed",
"messageId": null,
"error": "Suppressed recipient(s): second@example.com",
"code": "recipient_suppressed"
}
]
}“Partial success” starts after the batch clears its shared project, key, quota, warm-up, and health checks.
Payload schema, API-key capability, project and domain scope, monthly quota, daily warm-up capacity, and deliverability autopilot.
Template resolution, simulator classification, sender readiness, recipient suppressions, queued provider work, and stored email records.
The request body is a JSON array with at least one and at most one hundred entries.
Each entry can address up to ten recipients total across to, cc, and bcc.
Batch entries do not accept attachments. Use the single-send endpoint when files are required.
Batch entries are queued immediately. sendAt is not accepted. Scheduled work belongs on the single-send endpoint.
One batch belongs to one project, including batches that use more than one sender domain.
Simulator recipients work per item, but one item cannot mix simulator and real recipient addresses.
Use delivered, bounced, complained, and suppressed simulator recipients to exercise your index-matching and retry logic before production traffic.