> ## Documentation Index
> Fetch the complete documentation index at: https://docs.drin.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Retrieve an email

> GET /v1/emails/{id} — fetch a single message with its full lifecycle.

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`](/api-reference/emails/body).

## Path parameters

<ParamField body="id" type="string" required>
  The message id returned by a send, batch item, reply, or list.
</ParamField>

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.drin.run/v1/emails/msg_01HZX9K3T2QF7P0M4N8B6C5D \
    -H "Authorization: Bearer $DRIN_API_KEY"
  ```

  ```typescript Node.js theme={null}
  import { DrinClient } from "@drin00/sdk";

  const drin = new DrinClient({ apiKey: process.env.DRIN_API_KEY });

  const message = await drin.emails.get("msg_01HZX9K3T2QF7P0M4N8B6C5D");
  console.log(message.status, message.events);
  ```
</CodeGroup>

## Response

`200 OK` — the message with its `events` lifecycle.

```json 200 OK theme={null}
{
  "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

<ResponseField name="id" type="string">
  The message identifier.
</ResponseField>

<ResponseField name="from" type="string">
  The sender address.
</ResponseField>

<ResponseField name="to" type="string[]">
  The recipient addresses.
</ResponseField>

<ResponseField name="subject" type="string | null">
  The subject line.
</ResponseField>

<ResponseField name="status" type="string">
  The current status — e.g. `queued`, `sent`, `delivered`, `bounced`, `complained`.
</ResponseField>

<ResponseField name="direction" type="string">
  `outbound` or `inbound`.
</ResponseField>

<ResponseField name="createdAt" type="string">
  When the message was created (ISO 8601).
</ResponseField>

<ResponseField name="events" type="object[]">
  The ordered lifecycle — each event has a `type` and a timestamp; engagement events may carry extra detail.
</ResponseField>

<Warning>
  **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.
</Warning>
