## Retrieve a message `client.messages.retrieve(stringmessageID, MessageRetrieveParamsparams, RequestOptionsoptions?): Message` **get** `/v1/chats/{chatID}/messages/{messageID}` Retrieve a message by final message ID, pendingMessageID, or Matrix event ID. Chat ID may be a Beeper chat ID or local chat ID. ### Parameters - `messageID: string` Message ID. - `params: MessageRetrieveParams` - `chatID: string` Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available. ### Returns - `Message` - `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 Beeper Desktop installation when available. - `senderID: string` Matrix-style fully-qualified sender user ID, usually including a bridge prefix and homeserver. - `sortKey: string` A unique, sortable key used to sort messages. - `timestamp: string` Message timestamp. - `attachments?: Array` Attachments included with this message, if any. - `type: "unknown" | "img" | "video" | "audio"` Attachment type. - `"unknown"` - `"img"` - `"video"` - `"audio"` - `id?: string` Attachment identifier (typically an mxc:// URL). Use the download file endpoint to get a local file path. - `duration?: number` Duration in seconds (audio/video). - `fileName?: string` Original filename if available. - `fileSize?: number` File size in bytes if known. - `isGif?: boolean` True if the attachment is a GIF. - `isSticker?: boolean` True if the attachment is a sticker. - `isVoiceNote?: boolean` True if the attachment is a voice note. - `mimeType?: string` MIME type if known (e.g., 'image/png'). - `posterImg?: string` Preview image URL for video attachments (poster frame). May be temporary or local-only to this device; download promptly if durable access is needed. - `size?: Size` Pixel dimensions of the attachment: width/height in px. - `height?: number` - `width?: number` - `srcURL?: string` Public URL or local file path to fetch the file. May be temporary or local-only to this device; download promptly if durable access is needed. - `transcription?: Transcription` Attachment transcription if available. - `engine: string` Transcription engine. - `transcription: string` Transcribed text. - `language?: string` Detected or selected language. - `editedTimestamp?: string` Timestamp when the message was edited, if known. - `isDeleted?: boolean` True if the message has been deleted. - `isHidden?: boolean` True if the message is hidden from normal display. - `isSender?: boolean` True if the authenticated user sent the message. - `isUnread?: boolean` True if the message is unread for the authenticated user. May be omitted. - `linkedMessageID?: string` ID of the message this is a reply to, if any. - `links?: Array` Link previews included with this message, if any. - `title: string` Link preview title. - `url: string` Resolved link URL. - `favicon?: string` Favicon URL if available. May be temporary or local-only to this device; download promptly if durable access is needed. - `img?: string` Preview image URL if available. May be temporary or local-only to this device; download promptly if durable access is needed. - `imgSize?: ImgSize` Preview image dimensions. - `height?: number` - `width?: number` - `originalURL?: string` Original URL when the displayed URL is shortened or redirected. - `summary?: string` Link preview summary. - `mentions?: Array | null` Mentioned user IDs, @room, or null for legacy messages that require text scanning. - `reactions?: Array` 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?: boolean` True if the reactionKey is an emoji. - `imgURL?: string` URL to the reaction's image. May be temporary or local-only to this device; download promptly if durable access is needed. - `seen?: boolean | string | Record` Read receipt state for this message, when available. - `boolean` - `string` - `Record` - `boolean` - `string` - `senderName?: string` Resolved sender display name (impersonator/full name/username/participant name). - `sendStatus?: SendStatus` Message send status for this message, when reported by the bridge. - `status: "SUCCESS" | "PENDING" | "FAIL_RETRIABLE" | "FAIL_PERMANENT"` Current status of the message send attempt. - `"SUCCESS"` - `"PENDING"` - `"FAIL_RETRIABLE"` - `"FAIL_PERMANENT"` - `timestamp: string` Timestamp for the send status event. - `deliveredToUsers?: Array` User IDs the message was delivered to, when reported by the network. - `internalError?: string` Internal bridge error detail. Intended for diagnostics, not end-user display. - `message?: string` Human-readable send status or failure message. - `reason?: string` Machine-readable failure reason. Present when the send status is a failure. - `text?: string` Matrix HTML body if present. - `type?: "TEXT" | "NOTICE" | "IMAGE" | 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 ```typescript import BeeperDesktop from '@beeper/desktop-api'; const client = new BeeperDesktop({ accessToken: process.env['BEEPER_ACCESS_TOKEN'], // This is the default and can be omitted }); const message = await client.messages.retrieve('1343993', { chatID: '!NCdzlIaMjZUmvmvyHU:beeper.com', }); console.log(message.id); ``` #### 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" } ```