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.