Welcome
Send transactional email over a simple, predictable HTTP API
rray is a transactional email platform: you POST a message, we hand it to our
sending fleet and stream delivery outcomes back into the API, where you can query
them at any time.
Base URL
All endpoints are versioned under /v1. Requests and responses are JSON;
errors are RFC 9457 problem details.
The 60-second tour
- Create an API key on the Keys page of the
dashboard — keys look like
rray_live_...and are shown exactly once. - Send your first message — one
POST /v1/messages, optionally with an idempotency key. - Track it —
GET /v1/messages/{id}returns the live status plus the per-recipient delivery timeline, andGET /v1/messagesgives you a cursor-paginated, filterable feed.
Head to the Quickstart to run all three now, or browse the API Reference — every endpoint there is annotated with the exact errors it can return.
The three things to know first
- A message is one send; a delivery is one recipient’s copy of it. Every address
across
to,ccandbccbecomes its own delivery, with its own status and its own place in the timeline. Message lifecycle has the whole state machine. - Every message belongs to one workspace. A workspace key carries its workspace; a platform key names one per request. See Credentials and Workspaces.
- Every number the API enforces is on one page. Batch size, attachment budget, rate limits, retention, id formats: Limits & facts.
Design principles you can rely on
- Machine-readable everything: every error carries a stable dotted
code(message.not_found), acategoryto switch on, and atypeURL that resolves to the public error catalog. - Safe retries: sending is idempotent when you pass
Idempotency-Key; reads are always safe. - No surprises at scale: list endpoints paginate by cursor and never slow down as your history grows.