# GET /v1/messages/{id}

Read a message

The message as the log holds it, its attachments described but not returned, and every event on its timeline. Bodies are never returned.

Takes a server key (`sk_…`, or `sk_test_…` on a test server) as a bearer token. TypeScript: `sendora.messages.get(messageId)`. Python: `sendora.messages.get(message_id)`.

## Parameters

- `id` (path, required, string (uuid)): The message id.

## Responses

### 200 The message with its attachments described and its timeline.

- `messageId` (string (uuid), required)
- `streamId` (string (uuid), required): The stream the message went on.
- `broadcastId` (string (uuid) or null, required): The broadcast the message belongs to; null for a message sent on its own.
- `status` ("accepted" | "injected" | "failed", required): `accepted` until handed to the mail server, `injected` after; `failed` if that never worked.
- `from` (string, required)
- `subject` (string, required)
- `tag` (string or null, required)
- `metadata` (map of string to string, required)
- `submittedAt` (string (date-time), required)
- `test` (boolean, required): True when the message went through a test server: its events were simulated and nobody received it.
- `recipients` (array of object, required)
  - `address` (string, required)
  - `kind` ("to" | "cc" | "bcc", required)
  - `status` ("queued" | "delivered" | "deferred" | "bounced" | "expired", required): queued until the receiver answers; deferred while it keeps saying try later.
- `attachments` (array of object, required)
  - `name` (string, required)
  - `contentType` (string, required)
  - `contentId` (string or null, required)
  - `size` (integer, required): Bytes before encoding.
- `events` (array of object, required): Oldest first.
  - `recipient` (string or null, required): The recipient the event is about; null when it concerns the message as a whole.
  - `type` ("Reception" | "Delivery" | "Bounce" | "TransientFailure" | "Expiration" | "AdminBounce" | "OOB" | "Feedback" | "AdminRebind" | "DeferredInjectionRebind" | "Rejection" | "Delayed", required): Reception when the mail server took it, Delivery, TransientFailure, Bounce, OOB for a bounce report received by mail, Feedback for a spam complaint.
  - `at` (string (date-time), required)
  - `code` (integer or null, required): The SMTP status code the receiver answered.
  - `details` (string or null, required): The receiver’s response text.
  - `classification` (string or null, required): How a bounce was classified, such as InvalidRecipient.

Example:

```json
{
  "messageId": "5f432ffd-c005-499b-aa3a-5b8a088ea20e",
  "streamId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "broadcastId": null,
  "status": "injected",
  "from": "no-reply@example.se",
  "subject": "Your invoice for September",
  "tag": "invoice",
  "metadata": {
    "invoiceId": "2026-0912"
  },
  "submittedAt": "2026-09-15T12:00:00.000Z",
  "test": false,
  "recipients": [
    {
      "address": "anna@example.com",
      "kind": "to",
      "status": "delivered"
    }
  ],
  "attachments": [
    {
      "name": "invoice.pdf",
      "contentType": "application/pdf",
      "contentId": null,
      "size": 48213
    }
  ],
  "events": [
    {
      "recipient": "anna@example.com",
      "type": "Reception",
      "at": "2026-09-15T12:00:00.000Z",
      "code": 250,
      "details": null,
      "classification": null
    },
    {
      "recipient": "anna@example.com",
      "type": "Delivery",
      "at": "2026-09-15T12:00:02.000Z",
      "code": 250,
      "details": "2.0.0 OK",
      "classification": null
    }
  ]
}
```

## Errors

Every error answers `error`, the code, and `message`, a sentence for a person. A code that adds fields is shown in full below the table.

| Code | Status | Meaning |
| --- | --- | --- |
| `unauthorized` | 401 | The key is missing, malformed or revoked. |
| `wrong_token_kind` | 403 | The key is of the other kind: a server key (sk_) where an account key (ak_) is needed, or the reverse. The message names the kind the operation takes. |
| `not_found` | 404 | No such message of this server. |
