Core concepts
Traces
One unified pipeline record per logical send. Public-shareable UUID. Survives a provider swap.
What's a trace
A trace is the unified record of one logical send. Identified by a UUIDv4 trace_id that is public-shareable. Open the trace and you see the routing decision, the provider attempt, the SMTP response code, and every webhook event afterwards, in order, with timestamps.
Status state machine
pending → queued → sent → delivered (terminal)
→ bounced (terminal)
→ complained (terminal)
→ failed → queued ... (retry)
pending → validation_failed (terminal)
pending → suppressed (terminal)Trace timelines may also receive late-arriving annotations. The most common is auto_suppressed: the recipient landed on the suppression list after this send completed. The original trace's terminal status stays whatever it was at delivery time; the annotation is purely informational.
Trace event types (the canonical enum)
request_receivedvalidation_failedsuppressedrouting_decisionprovider_attemptprovider_responsefailover_triggeredprovider_event_deliveryprovider_event_bounceprovider_event_complaintprovider_event_openprovider_event_clickinbound_receivedmanual_resend
Sharing a trace URL
Two views per trace:
GET /v1/traces/{trace_id}: the full record, auth required.GET /share/traces/{trace_id}: the public read-only view, redacted of PII. Safe to hand to a customer or an AI assistant.
The trace ID survives a provider swap. If you re-route a destination from SES to Postmark, the trace history of past sends through SES still resolves; the ID is owned by mailnix, not the provider.