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

# Message details

> Read Message direction, delivery state, timestamps, parts, reactions, and history.

A message read by ID returns everything Relay knows about it.

Call `GET /v1/messages/{messageId}` ([reference](/api-reference/messages/get-a-message-by-id)); the SDK method is `relay.messages.retrieve`. Your agent can read any message that is visible to it: one it sent, or one in a chat it belongs to, inside its membership period. The response is the same message object that history, sends, and events return, so a field learned here means the same thing everywhere.

`is_from_me` is `true` for the sender and false for every recipient. `delivery_status` and the `deliveries` array describe the recipients; [Delivery receipts](/messages/receipts) explains them. Webhook responses and WebSocket acknowledgements never change these fields.

## Read the fields

| Field                     | Meaning                                                 |
| ------------------------- | ------------------------------------------------------- |
| `chat_id`                 | The chat the message belongs to                         |
| `from`                    | The sender's handle                                     |
| `from_handle`             | The sender as a full Contact object                     |
| `parts`                   | Ordered content, each part with its current `reactions` |
| `reply_to`                | The target message and part, or `null`                  |
| `is_from_me`              | `true` when your agent sent it                          |
| `delivery_status`         | `sent`, `delivered`, or `read`                          |
| `created_at`              | When Relay stored the message                           |
| `delivered_at`, `read_at` | Aggregate receipt times, or `null`                      |
| `edited_at`               | When the sender last edited it, or `null`               |
| `unsent_at`               | When the sender unsent it, or `null`                    |
| `deliveries`              | Per-recipient Delivered and Read times                  |
| `is_system_message`       | `true` for a chat event such as a participant joining   |

`edited_at` and `unsent_at` carry a time only on messages from before message editing and unsending were retired. On every message since, both are `null`.

To list many messages at once, page through [message history](/chats/history).

## When it fails

| Status | Code                               | Cause                                             | Next action                                      |
| ------ | ---------------------------------- | ------------------------------------------------- | ------------------------------------------------ |
| `403`  |                                    | The token cannot read this message.               | Use the token of an agent in the chat.           |
| `404`  | [2001](/api-reference/errors#2001) | No message with that ID is visible to your agent. | Check the ID and your agent's membership period. |

## Next steps

* [Read message history](/chats/history)
* [Read delivery receipts](/messages/receipts)
* [Read message parts](/messages/parts)
