Emails

Send, schedule, list, and inspect emails.

Send an email

POST /emails

FieldTypeDescription
fromrequiredstringSender, as Name <addr@domain> or a bare address. The domain must be verified.
torequiredstring | string[]Recipient address(es).
subjectstringSubject line. Required unless a template supplies it.
htmlstringHTML body. At least one of html / text / template_id is required.
textstringPlain-text body.
cc / bcc / reply_tostring | string[]Additional recipients and reply address.
headersobjectExtra headers to set on the message.
attachmentsobject[]{"filename", "content"} with base64 content.
template_idstringUse a template for subject/body.
template_dataobjectValues for the template's {{variables}}.
scheduled_atdatetimeISO 8601 future time — see scheduled sending.
tagsobject[]Arbitrary metadata stored with the email.
Response
{"id": "eml_..."}

Supports the Idempotency-Key header — details. Sends are asynchronous; the returned email starts as queued (or scheduled).

Send a batch

POST /emails/batch

Body is an array of up to 100 email objects (same shape as above). Returns {"data": [{"id": "eml_..."}, ...]}. Quota is checked for the whole batch up front.

List emails

GET /emails

FieldTypeDescription
statusqueryFilter by status.
qqueryCase-insensitive subject search.
limit / offsetqueryPagination (limit ≤ 100).
Response
{"total": 1204, "data": [{"id", "from", "to", "subject", "status",
  "open_count", "click_count", "broadcast_id", "scheduled_at",
  "created_at", "last_event_at"}, ...]}

The log shows emails inside your plan's retention window — 7 days on Free, 30 on Pro, 90 on Scale. Older entries age out of the API and dashboard and are deleted afterwards.

Export as CSV

GET /emails/export

Streams every email in your retention window as CSV (same status / q filters as the list). Also available as the Export CSVbutton on the dashboard's Emails page — handy for archiving before entries age out.

Retrieve an email

GET /emails/:id

Everything from the list view plus cc, bcc, reply_to, html, text, headers, tags, error, and the full events timeline.

Reschedule or cancel

PATCH /emails/:id

POST /emails/:id/cancel

Both apply only while status is scheduled. PATCH takes {"scheduled_at": "..."} (must be in the future).

These endpoints accept API keys — they're the runtime surface your apps use.