---
title: "Send an email"
method: POST
path: "/emails"
tags: ["Emails"]
---

# Send an email

`POST /emails`

## Request

- Base URL: `https://api.eusend.dev`
- URL: `https://api.eusend.dev/emails`
- Auth: HTTP bearer

Queues one message for delivery and returns its id immediately. The sending domain must be verified. Pass `scheduled_at` to send later. Set an `Idempotency-Key` header to make a retried request return the original email instead of sending twice.

## Headers

- `Idempotency-Key` string

## Request body

- SendEmailRequest: A single message. At least one of `html`, `text` or `template_id` is required. Unknown properties are rejected.
  - `from` string, required: Sender address, bare (`hello@acme.com`) or with a display name (`Acme <hello@acme.com>`). The domain must be verified on your account.
  - `to` union, required: A single address, or a list of them. Accepts `Name <user@example.com>` form.
    - string, email
    - string[]
  - `cc` union: A single address, or a list of them. Accepts `Name <user@example.com>` form.
    - string, email
    - string[]
  - `bcc` union: A single address, or a list of them. Accepts `Name <user@example.com>` form.
    - string, email
    - string[]
  - `reply_to` union: A single address, or a list of them. Accepts `Name <user@example.com>` form.
    - string, email
    - string[]
  - `subject` string: Line breaks are rejected.
  - `html` string
  - `text` string
  - `template_id` string, uuid: Render a stored template instead of inline `html`/`text`.
  - `variables` object: Values substituted into the template or into `{{placeholders}}` in the body.
  - `headers` object: Extra MIME headers. Line breaks in names or values are rejected.
  - `tags` union: Labels for log filtering and webhook routing. Accepts a flat object or Resend’s `[{ name, value }]` array; responses always use the object form. Up to 10 tags; names and values are ASCII letters, digits, underscores and dashes.
    - object
    - object[]
      - `name` string, required
      - `value` string, required
  - `track_opens` boolean: Overrides the organization default.
  - `track_clicks` boolean: Overrides the organization default.
  - `attachments` Attachment[]
    - `filename` string, required: Name the recipient sees.
    - `content` string, byte: Base64-encoded file bytes.
    - `path` string, uri: Public URL the server fetches at send time.
    - `content_type` string: MIME type; inferred from the filename when omitted.
    - `content_id` string: Content-ID for an inline attachment, referenced from HTML as `cid:<content_id>`.
  - `scheduled_at` string: Send in the future, at most 30 days out. An ISO 8601 timestamp or natural language (`in 1 hour`, `tomorrow at 9am`). Relative phrasings resolve against the server clock in UTC.

## Response `200`

Queued.

- SendEmailResponse
  - `id` string, uuid, required: The queued email id.

## Other responses

- `400`: The request body or query failed validation (`VALIDATION_ERROR`).
- `401`: Missing, malformed, or revoked API key (`UNAUTHORIZED`).
- `403`: Refused before queueing: unverified sending domain (`DOMAIN_NOT_VERIFIED`), every recipient suppressed (`ALL_SUPPRESSED`), no deliverable recipient domain (`RECIPIENT_DOMAIN_UNDELIVERABLE`), sending suspended or on hold (`SENDING_SUSPENDED`, `ACCOUNT_RESTRICTED`, `SERVICE_PAUSED`), an additional workspace with no live subscription (`WORKSPACE_INACTIVE`), a display name claiming a brand the domain has no relationship to (`SENDER_NOT_PERMITTED`), or a list-shaped send held for review (`LIST_SEND_HELD`).
- `429`: Rate limited, or a sending ceiling reached (`RATE_LIMITED`, `DAILY_LIMIT_EXCEEDED`, `MONTHLY_LIMIT_EXCEEDED`).
- `500`: Unexpected server error (`INTERNAL_ERROR`). Carries `request_id`.

---

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