---
title: "Send up to 100 emails in one request"
method: POST
path: "/emails/batch"
tags: ["Emails"]
---

# Send up to 100 emails in one request

`POST /emails/batch`

## Request

- Base URL: `https://sending.dev/api/v1`
- URL: `https://sending.dev/api/v1/emails/batch`
- Auth: HTTP bearer

Queues several transactional sends in a single request. The outcome is PARTIAL: the 207 response carries one result per item, aligned by index, and an invalid item does not block the others. Idempotency applies per item (`idempotencyKey`), so a retried batch does not produce duplicate sends. It counts as a single request for the rate limit. Required scope: `email:send`.

## Request body

- SendEmailBatchInput
  - `emails` object[], required: From 1 to 100 sends. Each item is a complete SendEmailInput.
    - `to` union, required: Email recipients (To header). One or more recipients: 'a@b.com', 'Name <a@b.com>', several comma-separated addresses, or an array.
      - string
      - string[]
    - `from` string, required
    - `subject` string
    - `html` string
    - `text` string: Plain-text body. With html it is the multipart alternative; alone (no html, no templateId) it sends a text-only email: no open tracking, links left as written.
    - `replyTo` union: Reply-To: one or more addresses ('a@b.com', 'Name <a@b.com>', comma-separated or an array, at most 10). A plain "Reply" goes to all of them.
      - string
      - string[]
    - `cc` union: Visible copies (Cc header). One or more recipients: 'a@b.com', 'Name <a@b.com>', several comma-separated addresses, or an array.
      - string
      - string[]
    - `bcc` union: Hidden copies, in no header. One or more recipients: 'a@b.com', 'Name <a@b.com>', several comma-separated addresses, or an array.
      - string
      - string[]
    - `templateId` string
    - `variables` object
    - `attachments` object[]: Email attachments (max 20, 10 MB each, 25 MB in total). For each item provide exactly one source: `id`, `content` (base64) or `url`.
      - `id` string, uuid: Id of an attachment already uploaded with POST /v1/attachments.
      - `filename` string: File name shown to the recipient. Required with `content` or `url`.
      - `content` string: File content in base64, without the `data:` prefix.
      - `url` string, uri: Public https URL to download the file from (private hosts are blocked).
      - `contentType` string: Content-Type override; when absent, it is inferred from the file name.
      - `contentId` string: Content-ID for inline images referenced in the HTML as `cid:<value>`: the attachment becomes `inline` instead of appearing at the end of the message.
    - `idempotencyKey` string, required
    - `disableTracking` boolean
    - `disableUtm` boolean

## Response `207`

Per-item outcomes (accepted and failed together).

- SendEmailBatchResult
  - `accepted` integer, required
  - `failed` integer, required
  - `results` BatchItemResult[], required
    - `index` integer, required: Position in the request's `emails` array.
    - `status` 'accepted' | 'failed', required
    - `id` string
    - `duplicate` boolean: Already accepted with this idempotencyKey: not an error.
    - `droppedRecipients` object[]: Copies excluded because they are suppressed.
      - `address` string, required
      - `reason` string, required
    - `error` object
      - `code` string, required
      - `message` string

## Other responses

- `401`: Missing or invalid token.
- `403`: Insufficient scope.
- `422`: Invalid input.

---

[API](https://skmtc.dev/sending/apis/sending-dev-api.md) · [All operations](https://skmtc.dev/sending/apis/sending-dev-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sending/apis/sending-dev-api/revisions/9fe78d2918a1?raw)
