Send emails
Everything routes through one send path: REST and the SMTP relay share the same quota,
suppression checks, and tracking pipeline. POST /emails requires from and to; everything
else is optional:
{ "from": "Acme <hi@acme.com>", "to": ["user@example.com"], "cc": [], "bcc": [], "reply_to": "support@acme.com", "subject": "Hello", "html": "<p>Hi {{name}}</p>", "text": "Hi", "headers": { "X-Entity-Ref": "order-123" }, "tags": { "campaign": "onboarding" }, "data": { "name": "Sam" }, "scheduled_at": "2026-09-01T09:00:00Z", "template": "welcome-email", "stream_id": null, "attachments": [ { "filename": "invoice.pdf", "content_type": "application/pdf", "content": "<base64>" } ]}to,cc,bcc, andreply_toeach accept a single address string or an array.dataholds structured template variables;tagsare flat string metadata.- Reference a template by
template(its stable alias) ortemplate_id(UUID). stream_idpicks the message stream; omitted, it defaults to your transactional stream.scheduled_atqueues the send for the future; see Schedule & cancel.- For
attachmentsand inline images, see Attachments.
The API responds immediately with the email object (status: "queued", or "scheduled" for
future sends); delivery happens asynchronously and every state change becomes an event you can
receive by webhook or the live event stream.
Retrieving what you sent
Section titled “Retrieving what you sent”GET /emails/{id}: one email, including status and provider message id.GET /emails: cursor-paginated list, filterable bystatus,to,from,subject,tag,stream_id, and anafter/beforetime range (RFC 3339). See Pagination.GET /emails/{id}/events: the delivery event timeline for one email.
Email status moves through: queued or scheduled → sending → sent → delivered, or
ends in bounced, complained, failed, canceled, or suppressed.