Retrieve an email
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.
01 Path parameters
idstringRequired
The message id returned by a send, batch item, reply, or list.
02 Request
curl https://api.drin.run/v1/emails/msg_01HZX9K3T2QF7P0M4N8B6C5D \
-H "Authorization: Bearer $DRIN_API_KEY"03 Response
200 OK — the message with its events lifecycle.
{
"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
idstringOptional
The message identifier.
fromstringOptional
The sender address.
tostring[]Optional
The recipient addresses.
subjectstring | nullOptional
The subject line.
statusstringOptional
The current status — e.g.
queued, sent, delivered, bounced, complained.directionstringOptional
outbound or inbound.createdAtstringOptional
When the message was created (ISO 8601).
eventsobject[]Optional
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.