Send an email
Validate and accept a transactional email, returning 202 Accepted with the message id once the message row is persisted and (unless every recipient is suppressed) a send job is enqueued. 202 means acceptance, not delivery — the outcome arrives later via the message's last_event and events timeline. In live mode the from address domain must be a verified sending domain. Requires the send scope. Honors the optional Idempotency-Key header.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Header Parameters
Opt-in idempotency key, 1–256 characters (no charset restriction). A repeated key with the same body within 24 hours replays the original `2xx` response verbatim; the same key with a different body returns `409`.
>= 1, <= 256Body
fromstringrequiredSender address. In live mode the domain must be a verified sending domain owned by the organization.
toanyrequiredA single address or an array of addresses.
ccanyA single address or an array of addresses.
bccanyA single address or an array of addresses.
reply_toanyA single address or an array of addresses.
subjectstringhtmlstringHTML body. At least one of `html`, `text`, or `template` is required.
textstringPlain-text body.
headersobjectArbitrary additional headers as a string map.
attachmentsarray<any>Opaque attachment objects (passthrough; not validated).
tagsarray<object>Up to 75 message tags.
<= 75 elementstags.namestringrequiredTag name; must match `[A-Za-z0-9_-]+`.
tags.valuestringrequiredTag value; must match `[A-Za-z0-9_-]+`.
scheduled_atstring<date-time>ISO 8601 send time, up to 90 days ahead. A past or omitted value sends immediately.
templateobjecttemplate.idstringrequiredThe template id (`tmpl_…`) to render at accept time.
template.variablesobjectFlat key/value variables substituted into `{{name}}` placeholders.
Response
The email was accepted.
idstringrequiredThe accepted message id (a bare ULID, no prefix).