## Mark a chat as unread `client.chats.markUnread(stringchatID, ChatMarkUnreadParamsbody?, RequestOptionsoptions?): Chat` **post** `/v1/chats/{chatID}/unread` Mark a chat as unread, optionally from a specific message ID. ### Parameters - `chatID: string` Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available. - `body: ChatMarkUnreadParams` - `messageID?: string` Optional message ID to mark unread from. ### Returns - `Chat` - `id: string` Unique identifier of the chat across Beeper. - `accountID: string` Account ID this chat belongs to. - `network: string` Display-only human-readable account/network name. - `participants: Participants` Chat participants information. - `hasMore: boolean` True if there are more participants than included in items. - `items: Array` Participants returned for this chat (limited by the request; may be a subset). - `isAdmin?: boolean` True if this participant has admin privileges in the chat. - `isNetworkBot?: boolean` True if this participant represents a network or bridge bot. - `isPending?: boolean` True if this participant has been invited but has not joined yet. - `total: number` Total number of participants in the chat. - `title: string` Display title of the chat as computed by the client/server. - `type: "single" | "group"` Chat type: 'single' for direct messages, 'group' for group chats. - `"single"` - `"group"` - `unreadCount: number` Number of unread messages. - `capabilities?: Capabilities` Chat capabilities reported by the platform. - `allowedReactions?: Array` Allowed Unicode reactions. Omitted means all emoji reactions are allowed. - `archive?: boolean` True if archive/unarchive is supported. - `attachments?: Record` Supported attachment message types and their per-type constraints, keyed by Matrix msgtype or pseudo-msgtype (for example m.image, m.video, org.matrix.msc3245.voice). Missing message types should be treated as rejected. - `mimeTypes: Record` Supported MIME types or MIME patterns for this file message type. Missing MIME types should be treated as rejected. - `-2` - `-1` - `0` - `1` - `2` - `caption?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `maxCaptionLength?: number` Maximum caption length when captions are supported. - `maxDuration?: number` Maximum audio or video duration in seconds. - `maxHeight?: number` Maximum image or video height in pixels. - `maxSize?: number` Maximum file size in bytes. - `maxWidth?: number` Maximum image or video width in pixels. - `viewOnce?: boolean` True if this file type can be sent as view-once media. - `customEmojiReactions?: boolean` True if custom emoji reactions are supported. - `delete?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `deleteChat?: boolean` True if deleting chats for the authenticated user is supported. - `deleteChatForEveryone?: boolean` True if deleting chats for everyone is supported. - `deleteForMe?: boolean` True if deleting messages only for the authenticated user is supported. - `deleteMaxAge?: number` Maximum message age for delete-for-everyone, in seconds. - `disappearingTimer?: DisappearingTimer` Disappearing-message timer capabilities. - `omitEmptyTimer?: boolean` True if empty timer objects should be omitted from message content. - `timers?: Array` Allowed disappearing timer values in milliseconds. Omitted means any timer is allowed. - `types?: Array<"afterRead" | "afterSend">` Supported disappearing timer types. - `"afterRead"` - `"afterSend"` - `edit?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `editMaxAge?: number` Maximum message age for edits, in seconds. - `editMaxCount?: number` Maximum number of edits allowed for one message. - `formatting?: Record` Supported rich-text formatting features keyed by feature name (for example bold, inline_code, code_block.syntax_highlighting). Omitted means no formatting support is advertised. - `-2` - `-1` - `0` - `1` - `2` - `locationMessage?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `markAsUnread?: boolean` True if marking chats unread is supported. - `maxTextLength?: number` Maximum length of normal text messages. - `messageRequest?: MessageRequest` Message request capabilities. - `acceptWithButton?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `acceptWithMessage?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `participantActions?: ParticipantActions` Participant management capabilities. - `ban?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `invite?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `kick?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `leave?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `revokeInvite?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `poll?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `reaction?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `reactionCount?: number` Maximum number of reactions allowed on a single message. - `readReceipts?: boolean` True if read receipts are supported. - `reply?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `state?: State` Chat state update capabilities. - `avatar?: Avatar` Chat avatar state capability. - `level: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `description?: Description` Chat description/topic state capability. - `level: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `disappearingTimer?: DisappearingTimer` Disappearing-message timer state capability. - `level: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `title?: Title` Chat title state capability. - `level: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `thread?: -2 | -1 | 0 | 2 more` -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported. - `-2` - `-1` - `0` - `1` - `2` - `typingNotifications?: boolean` True if typing notifications are supported. - `description?: string | null` Group chat description/topic when available. - `draft?: Draft | null` Current draft object for this chat, or null when no draft is set. - `text: string` Matrix HTML draft body. - `attachments?: Record` Draft attachments keyed by attachment ID. - `id: string` Draft attachment identifier. - `type: "file" | "gif" | "recorded_audio"` Draft attachment type. GIF and recorded audio are mutually exclusive types. - `"file"` - `"gif"` - `"recorded_audio"` - `audioDurationSeconds?: number` Audio duration in seconds if known. - `fileName?: string` Original filename if available. - `filePath?: string` Local filesystem path for the draft attachment. - `fileSize?: number` File size in bytes if known. - `mimeType?: string` MIME type if known. - `size?: Size` Pixel dimensions of the attachment. - `height?: number` - `width?: number` - `stickerID?: string` Sticker identifier if the draft attachment is a sticker. - `imgURL?: string | null` Local filesystem path to the chat avatar image when available. - `isArchived?: boolean` True if chat is archived. - `isLowPriority?: boolean` True if chat is marked low priority. - `isMarkedUnread?: boolean` True if the chat was explicitly marked unread by the authenticated user. - `isMuted?: boolean` True if chat notifications are muted. - `isPinned?: boolean` True if chat is pinned. - `isReadOnly?: boolean` True if messages cannot be sent in this chat. - `lastActivity?: string` Timestamp of last activity. - `lastReadMessageSortKey?: string` Last read message sortKey. - `localChatID?: string | null` Local chat ID specific to this Beeper Desktop installation. - `messageExpirySeconds?: number | null` Disappearing-message timer in seconds when available. - `reminder?: Reminder | null` Current reminder for this chat, or null when no reminder is set. - `dismissOnIncomingMessage?: boolean` Cancel reminder if someone messages in the chat. - `remindAt?: string` Timestamp when the reminder should trigger. - `snooze?: Snooze | null` Current snooze state for this chat, or null when no snooze is set. - `snoozeUntil?: string` Timestamp when the snooze expires. - `userSnoozedAt?: string` Timestamp when the user set the snooze. - `unreadMentionsCount?: number` Number of unread messages that mention the authenticated user or @room. ### 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 chat = await client.chats.markUnread('!NCdzlIaMjZUmvmvyHU:beeper.com'); console.log(chat.id); ``` #### Response ```json { "id": "!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost", "accountID": "local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc", "network": "WhatsApp", "participants": { "hasMore": false, "items": [ { "id": "@15550101002:local-whatsapp.localhost", "cannotMessage": false, "email": "email", "fullName": "Kishan Bagaria", "imgURL": "imgURL", "isSelf": false, "phoneNumber": "+15550101002", "username": "username", "isAdmin": true, "isNetworkBot": true, "isPending": true }, { "id": "@ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc:local-whatsapp.localhost", "cannotMessage": false, "email": "email", "fullName": "Batuhan İçöz", "imgURL": "imgURL", "isSelf": true, "phoneNumber": "phoneNumber", "username": "username", "isAdmin": true, "isNetworkBot": true, "isPending": true } ], "total": 2 }, "title": "Kishan Bagaria", "type": "single", "unreadCount": 0, "capabilities": { "allowedReactions": [ "string" ], "archive": true, "attachments": { "foo": { "mimeTypes": { "foo": -2 }, "caption": -2, "maxCaptionLength": 0, "maxDuration": 0, "maxHeight": 0, "maxSize": 0, "maxWidth": 0, "viewOnce": true } }, "customEmojiReactions": true, "delete": -2, "deleteChat": true, "deleteChatForEveryone": true, "deleteForMe": true, "deleteMaxAge": 0, "disappearingTimer": { "omitEmptyTimer": true, "timers": [ 0 ], "types": [ "afterRead" ] }, "edit": -2, "editMaxAge": 0, "editMaxCount": 0, "formatting": { "foo": -2 }, "locationMessage": -2, "markAsUnread": true, "maxTextLength": 0, "messageRequest": { "acceptWithButton": -2, "acceptWithMessage": -2 }, "participantActions": { "ban": -2, "invite": -2, "kick": -2, "leave": -2, "revokeInvite": -2 }, "poll": -2, "reaction": -2, "reactionCount": 0, "readReceipts": true, "reply": -2, "state": { "avatar": { "level": -2 }, "description": { "level": -2 }, "disappearingTimer": { "level": -2 }, "title": { "level": -2 } }, "thread": -2, "typingNotifications": true }, "description": "description", "draft": { "text": "text", "attachments": { "foo": { "id": "id", "type": "file", "audioDurationSeconds": 0, "fileName": "fileName", "filePath": "filePath", "fileSize": 0, "mimeType": "mimeType", "size": { "height": 0, "width": 0 }, "stickerID": "stickerID" } } }, "imgURL": "imgURL", "isArchived": false, "isLowPriority": true, "isMarkedUnread": true, "isMuted": false, "isPinned": false, "isReadOnly": true, "lastActivity": "2026-05-05T20:11:54.000Z", "lastReadMessageSortKey": "455171049984", "localChatID": "5639", "messageExpirySeconds": 0, "reminder": { "dismissOnIncomingMessage": true, "remindAt": "2025-08-31T23:30:12.520Z" }, "snooze": { "snoozeUntil": "2025-08-31T23:30:12.520Z", "userSnoozedAt": "2025-08-31T23:30:12.520Z" }, "unreadMentionsCount": 0 } ```