Skip to main content
Fetch a single message by id, including its full delivery lifecycle — the ordered list of events from queued through delivery, bounce, open, or click. GET /v1/emails/{id} Works for both directions. For outbound messages the events trace the send lifecycle; for inbound messages it reflects receipt. To read the rendered body, use GET /v1/emails/{id}/body.

Path parameters

id
string
required
The message id returned by a send, batch item, reply, or list.

Request

curl https://api.drin.run/v1/emails/msg_01HZX9K3T2QF7P0M4N8B6C5D \
  -H "Authorization: Bearer $DRIN_API_KEY"

Response

200 OK — the message with its events lifecycle.
200 OK
{
  "id": "msg_01HZX9K3T2QF7P0M4N8B6C5D",
  "from": "onboarding@yourdomain.com",
  "to": ["you@example.com"],
  "subject": "Hello from Drin",
  "status": "delivered",
  "direction": "outbound",
  "createdAt": "2026-06-02T17:04:00Z",
  "events": [
    { "type": "queued",    "at": "2026-06-02T17:04:00Z" },
    { "type": "sent",      "at": "2026-06-02T17:04:01Z" },
    { "type": "delivery",  "at": "2026-06-02T17:04:03Z" }
  ]
}

Fields

id
string
The message identifier.
from
string
The sender address.
to
string[]
The recipient addresses.
subject
string | null
The subject line.
status
string
The current status — e.g. queued, sent, delivered, bounced, complained.
direction
string
outbound or inbound.
createdAt
string
When the message was created (ISO 8601).
events
object[]
The ordered lifecycle — each event has a type and a timestamp; engagement events may carry extra detail.
404. not_found if no message with that id exists for this account. Ids are scoped to your account — you can never read another tenant’s message.