Sending

One endpoint, one decision that matters: give every send an idempotency key, and the rest — queueing, retries, events — happens on our side.

The request

POST /v1/emails with from, to, subject, and html or text. Authenticate with a Bearer key; test keys simulate the pipeline without delivering.

The response

202 Accepted
{
  "id": "em_9f2k41xq",
  "status": "queued",
  "message": "Email queued for delivery"
}

202, not 200: accepted for delivery, not yet delivered. The id tracks the email through logs, timelines, and webhook payloads forever.

What happens next

Validate → persist → enqueue → worker → provider → events. Transient failures retry with backoff; permanent ones record a diagnosable error; exhausted jobs wait in a replayable dead-letter state. Read the lifecycle for the full state machine.

Always send an Idempotency-Key. Timeouts are normal; double-sends shouldn’t be. How it works.