## Retrieve a message

**get** `/v1/chats/{chatID}/messages/{messageID}`

Retrieve a message by final message ID, pendingMessageID, or Matrix event ID. chatID may be a Beeper chat ID or a local chat ID.

### Path Parameters

- `chatID: string`

  Chat ID. Input routes also accept the local chat ID from this installation when available.

- `messageID: string`

  Message ID.

### Returns

- `Message object { id, accountID, chatID, 18 more }`

  - `id: string`

    Message ID.

  - `accountID: string`

    Beeper account ID the message belongs to.

  - `chatID: string`

    Chat ID. Input routes also accept the local chat ID from this installation when available.

  - `senderID: string`

    Fully qualified sender user ID. Network-backed IDs usually include the network prefix and homeserver.

  - `sortKey: string`

    A unique, sortable key used to sort messages.

  - `timestamp: string`

    Message timestamp.

  - `attachments: optional array of Attachment`

    Attachments included with this message, if any.

    - `type: "unknown" or "img" or "video" or "audio"`

      Attachment type.

      - `"unknown"`

      - `"img"`

      - `"video"`

      - `"audio"`

    - `id: optional string`

      Attachment identifier, typically an mxc:// URL. Use the download file endpoint to get a local file path.

    - `duration: optional number`

      Duration in seconds (audio/video).

    - `fileName: optional string`

      Original filename if available.

    - `fileSize: optional number`

      File size in bytes if known.

    - `isGif: optional boolean`

      True if the attachment is a GIF.

    - `isSticker: optional boolean`

      True if the attachment is a sticker.

    - `isVoiceNote: optional boolean`

      True if the attachment is a voice note.

    - `mimeType: optional string`

      MIME type if known (e.g., 'image/png').

    - `posterImg: optional string`

      Preview image URL for video attachments (poster frame). May be temporary or available only on this device; download promptly if durable access is needed.

    - `size: optional object { height, width }`

      Pixel dimensions of the attachment: width/height in px.

      - `height: optional number`

      - `width: optional number`

    - `srcURL: optional string`

      Public URL or local file path to fetch the file. May be temporary or available only on this device; download promptly if durable access is needed.

    - `transcription: optional object { engine, transcription, language }`

      Attachment transcription if available.

      - `engine: string`

        Transcription engine.

      - `transcription: string`

        Transcribed text.

      - `language: optional string`

        Detected or selected language.

  - `editedTimestamp: optional string`

    Timestamp when the message was edited, if known.

  - `isDeleted: optional boolean`

    True if the message has been deleted.

  - `isHidden: optional boolean`

    True if the message is hidden from normal display.

  - `isSender: optional boolean`

    True if the authenticated user sent the message.

  - `isUnread: optional boolean`

    True if the message is unread for the authenticated user. May be omitted.

  - `linkedMessageID: optional string`

    ID of the message this is a reply to, if any.

  - `links: optional array of LinkPreview`

    Link previews included with this message, if any.

    - `title: string`

      Link preview title.

    - `url: string`

      Resolved link URL.

    - `favicon: optional string`

      Favicon URL if available. May be temporary or available only on this device; download promptly if durable access is needed.

    - `img: optional string`

      Preview image URL if available. May be temporary or available only on this device; download promptly if durable access is needed.

    - `imgSize: optional object { height, width }`

      Preview image dimensions.

      - `height: optional number`

      - `width: optional number`

    - `originalURL: optional string`

      Original URL when the displayed URL is shortened or redirected.

    - `summary: optional string`

      Link preview summary.

  - `mentions: optional array of string`

    Mentioned user IDs, @room, or null for legacy messages that require text scanning.

  - `reactions: optional array of Reaction`

    Reactions to the message, if any.

    - `id: string`

      Reaction ID. When a participant can react more than once, the ID is the participant ID concatenated with the reaction key; otherwise it equals the participant ID.

    - `participantID: string`

      User ID of the participant who reacted.

    - `reactionKey: string`

      The reaction key: an emoji (😄), a network-specific key, or a shortcode like "smiling-face".

    - `emoji: optional boolean`

      True if the reactionKey is an emoji.

    - `imgURL: optional string`

      URL to the reaction's image. May be temporary or available only on this device; download promptly if durable access is needed.

  - `seen: optional boolean or string or map[boolean or string]`

    Read receipt state for this message, when available.

    - `Boolean = boolean`

    - `Timestamp = string`

      ISO 8601 timestamp.

    - `ByParticipant = map[boolean or string]`

      Group read receipt state keyed by participant ID.

      - `Boolean = boolean`

      - `Timestamp = string`

        ISO 8601 timestamp.

  - `senderName: optional string`

    Resolved sender display name.

  - `sendStatus: optional SendStatus`

    Message send status for this message, when reported by the bridge.

    - `status: "SUCCESS" or "PENDING" or "FAIL_RETRIABLE" or "FAIL_PERMANENT"`

      Current status of the message send attempt.

      - `"SUCCESS"`

      - `"PENDING"`

      - `"FAIL_RETRIABLE"`

      - `"FAIL_PERMANENT"`

    - `timestamp: string`

      Timestamp for the send status event.

    - `deliveredToUsers: optional array of string`

      User IDs the message was delivered to, when reported by the network.

    - `internalError: optional string`

      Diagnostic error detail from the messaging network adapter. Do not show directly to users.

    - `message: optional string`

      Human-readable send status or failure message.

    - `reason: optional string`

      Machine-readable failure reason. Present when the send status is a failure.

  - `text: optional string`

    Rich-text message body if present.

  - `type: optional "TEXT" or "NOTICE" or "IMAGE" or 7 more`

    Message content type. Useful for distinguishing reactions, media messages, and state events from regular text messages.

    - `"TEXT"`

    - `"NOTICE"`

    - `"IMAGE"`

    - `"VIDEO"`

    - `"VOICE"`

    - `"AUDIO"`

    - `"FILE"`

    - `"STICKER"`

    - `"LOCATION"`

    - `"REACTION"`

### Example

```http
curl http://localhost:23373/v1/chats/$CHAT_ID/messages/$MESSAGE_ID \
    -H "Authorization: Bearer $BEEPER_ACCESS_TOKEN"
```

#### Response

```json
{
  "id": "241392",
  "accountID": "discordgo",
  "chatID": "!discord_109876543210987654:beeper.com",
  "senderID": "@discord_221590782384013314:beeper.com",
  "sortKey": "455171049984",
  "timestamp": "2026-05-05T20:20:12.497Z",
  "attachments": [
    {
      "type": "unknown",
      "id": "id",
      "duration": 0,
      "fileName": "fileName",
      "fileSize": 0,
      "isGif": true,
      "isSticker": true,
      "isVoiceNote": true,
      "mimeType": "mimeType",
      "posterImg": "posterImg",
      "size": {
        "height": 0,
        "width": 0
      },
      "srcURL": "srcURL",
      "transcription": {
        "engine": "engine",
        "transcription": "transcription",
        "language": "language"
      }
    }
  ],
  "editedTimestamp": "2025-08-31T23:30:12.520Z",
  "isDeleted": false,
  "isHidden": true,
  "isSender": false,
  "isUnread": false,
  "linkedMessageID": "1343993",
  "links": [
    {
      "title": "title",
      "url": "url",
      "favicon": "favicon",
      "img": "img",
      "imgSize": {
        "height": 0,
        "width": 0
      },
      "originalURL": "originalURL",
      "summary": "summary"
    }
  ],
  "mentions": [
    "@discord_337451892017545216:beeper.com"
  ],
  "reactions": [
    {
      "id": "id",
      "participantID": "participantID",
      "reactionKey": "reactionKey",
      "emoji": true,
      "imgURL": "imgURL"
    }
  ],
  "seen": true,
  "senderName": "Kishan Bagaria",
  "sendStatus": {
    "status": "SUCCESS",
    "timestamp": "2025-08-31T23:30:12.520Z",
    "deliveredToUsers": [
      "string"
    ],
    "internalError": "internalError",
    "message": "message",
    "reason": "reason"
  },
  "text": "The OAuth fix is deployed. Can you verify the desktop flow?",
  "type": "TEXT"
}
```
