## Update chat `client.chats.update(stringchatID, ChatUpdateParamsbody?, RequestOptionsoptions?): Chat` **patch** `/v1/chats/{chatID}` Update supported chat fields. Non-empty draft objects are accepted only when the current draft is empty. Send draft=null to clear the draft before setting new draft text or attachments. ### Parameters - `chatID: string` Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available. - `body: ChatUpdateParams` - `description?: string | null` Group chat description/topic. Support depends on the chat account and chat permissions. - `draft?: Draft | null` Draft object to set or clear. Non-empty drafts are only accepted when the current draft is empty. Send draft=null to clear text and attachments together before setting a new draft. - `text: string` Draft text. Plain text and Markdown are converted to Matrix HTML with the same rules used by send and edit. - `attachments?: Record` Draft attachments keyed by attachment ID. Each attachment must reference an uploadID returned by the upload file endpoint. - `uploadID: string` Upload ID from uploadAsset endpoint. Required to reference uploaded files. - `id?: string` Optional draft attachment identifier. If omitted, a new identifier is generated. - `duration?: number` Duration in seconds (optional override of cached value) - `fileName?: string` Filename (optional override of cached value) - `mimeType?: string` MIME type (optional override of cached value) - `size?: Size` Dimensions (optional override of cached value) - `height: number` - `width: number` - `type?: "image" | "video" | "audio" | 4 more` Attachment type hint (image, video, audio, file, gif, voice-note, sticker). If omitted, auto-detected from mimeType - `"image"` - `"video"` - `"audio"` - `"file"` - `"gif"` - `"voice-note"` - `"sticker"` - `imgURL?: string | null` Local filesystem path to a group chat avatar image. Support depends on the chat account and chat permissions. - `isArchived?: boolean` Archive or unarchive the chat. - `isLowPriority?: boolean` Mark or unmark the chat as low priority when supported by the account. - `isMuted?: boolean` Mute or unmute the chat. - `isPinned?: boolean` Pin or unpin the chat when supported by the account. - `messageExpirySeconds?: number | null` Disappearing-message timer in seconds, or null to clear when supported. - `title?: string | null` Custom chat title. Support depends on the chat account and chat permissions. ### 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.update('!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 } ```