## Search

**get** `/v1/search`

Return matching chats, participant matches in group chats, and the first page of message results in one call. Use the dedicated chat and message search endpoints for pagination.

### Query Parameters

- `query: string`

  User-typed search text. Uses literal word matching.

### Returns

- `results: object { chats, in_groups, messages }`

  - `chats: array of Chat`

    Top chat results.

    - `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: object { hasMore, items, total }`

      Chat participants information.

      - `hasMore: boolean`

        True if there are more participants than included in items.

      - `items: array of User`

        Participants returned for this chat (limited by the request; may be a subset).

        - `isAdmin: optional boolean`

          True if this participant has admin privileges in the chat.

        - `isNetworkBot: optional boolean`

          True if this participant represents an automated network account.

        - `isPending: optional 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" or "group"`

      Chat type: 'single' for direct messages, 'group' for group chats.

      - `"single"`

      - `"group"`

    - `unreadCount: number`

      Number of unread messages.

    - `capabilities: optional ChatCapabilities`

      Chat capabilities reported by the platform.

      - `allowedReactions: optional array of string`

        Allowed Unicode reactions. Omitted means all emoji reactions are allowed.

      - `archive: optional boolean`

        True if archive/unarchive is supported.

      - `attachments: optional map[AttachmentCapabilities]`

        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: map[-2 or -1 or 0 or 2 more]`

          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: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

        - `maxCaptionLength: optional number`

          Maximum caption length when captions are supported.

        - `maxDuration: optional number`

          Maximum audio or video duration in seconds.

        - `maxHeight: optional number`

          Maximum image or video height in pixels.

        - `maxSize: optional number`

          Maximum file size in bytes.

        - `maxWidth: optional number`

          Maximum image or video width in pixels.

        - `viewOnce: optional boolean`

          True if this file type can be sent as view-once media.

      - `customEmojiReactions: optional boolean`

        True if custom emoji reactions are supported.

      - `delete: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `deleteChat: optional boolean`

        True if deleting chats for the authenticated user is supported.

      - `deleteChatForEveryone: optional boolean`

        True if deleting chats for everyone is supported.

      - `deleteForMe: optional boolean`

        True if deleting messages only for the authenticated user is supported.

      - `deleteMaxAge: optional number`

        Maximum message age for delete-for-everyone, in seconds.

      - `disappearingTimer: optional object { omitEmptyTimer, timers, types }`

        Disappearing-message timer capabilities.

        - `omitEmptyTimer: optional boolean`

          True if empty timer objects should be omitted from message content.

        - `timers: optional array of number`

          Allowed disappearing timer values in milliseconds. Omitted means any timer is allowed.

        - `types: optional array of "afterRead" or "afterReadByRecipient" or "afterSend"`

          Supported disappearing timer types.

          - `"afterRead"`

          - `"afterReadByRecipient"`

          - `"afterSend"`

      - `edit: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `editMaxAge: optional number`

        Maximum message age for edits, in seconds.

      - `editMaxCount: optional number`

        Maximum number of edits allowed for one message.

      - `formatting: optional map[-2 or -1 or 0 or 2 more]`

        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: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `markAsUnread: optional boolean`

        True if marking chats unread is supported.

      - `maxTextLength: optional number`

        Maximum length of normal text messages.

      - `messageRequest: optional object { acceptWithButton, acceptWithMessage }`

        Message request capabilities.

        - `acceptWithButton: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

        - `acceptWithMessage: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

      - `participantActions: optional object { ban, invite, kick, 2 more }`

        Participant management capabilities.

        - `ban: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

        - `invite: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

        - `kick: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

        - `leave: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

        - `revokeInvite: optional -2 or -1 or 0 or 2 more`

          -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

          - `-2`

          - `-1`

          - `0`

          - `1`

          - `2`

      - `poll: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `reaction: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `reactionCount: optional number`

        Maximum number of reactions allowed on a single message.

      - `readReceipts: optional boolean`

        True if read receipts are supported.

      - `reply: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `state: optional ChatStateCapabilities`

        Chat state update capabilities.

        - `avatar: optional object { level }`

          Chat avatar state capability.

          - `level: -2 or -1 or 0 or 2 more`

            -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

            - `-2`

            - `-1`

            - `0`

            - `1`

            - `2`

        - `description: optional object { level }`

          Chat description/topic state capability.

          - `level: -2 or -1 or 0 or 2 more`

            -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

            - `-2`

            - `-1`

            - `0`

            - `1`

            - `2`

        - `disappearingTimer: optional object { level }`

          Disappearing-message timer state capability.

          - `level: -2 or -1 or 0 or 2 more`

            -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

            - `-2`

            - `-1`

            - `0`

            - `1`

            - `2`

        - `title: optional object { level }`

          Chat title state capability.

          - `level: -2 or -1 or 0 or 2 more`

            -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

            - `-2`

            - `-1`

            - `0`

            - `1`

            - `2`

      - `thread: optional -2 or -1 or 0 or 2 more`

        -2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

        - `-2`

        - `-1`

        - `0`

        - `1`

        - `2`

      - `typingNotifications: optional boolean`

        True if typing notifications are supported.

    - `description: optional string`

      Group chat description/topic when available.

    - `draft: optional ChatDraft`

      Current draft object for this chat, or null when no draft is set.

      - `text: string`

        Rich-text draft body as returned by Beeper.

      - `attachments: optional map[DraftAttachment]`

        Draft attachments keyed by attachment ID.

        - `id: string`

          Draft attachment identifier.

        - `type: "file" or "gif" or "recorded_audio"`

          Draft attachment type. GIF and recorded audio are mutually exclusive types.

          - `"file"`

          - `"gif"`

          - `"recorded_audio"`

        - `audioDurationSeconds: optional number`

          Audio duration in seconds if known.

        - `fileName: optional string`

          Original filename if available.

        - `filePath: optional string`

          Local filesystem path for the draft attachment.

        - `fileSize: optional number`

          File size in bytes if known.

        - `mimeType: optional string`

          MIME type if known.

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

          Pixel dimensions of the attachment.

          - `height: optional number`

          - `width: optional number`

        - `stickerID: optional string`

          Sticker identifier if the draft attachment is a sticker.

    - `imgURL: optional string`

      Local filesystem path to the chat avatar image when available.

    - `isArchived: optional boolean`

      True if chat is archived.

    - `isLowPriority: optional boolean`

      True if chat is marked low priority.

    - `isMarkedUnread: optional boolean`

      True if the chat was explicitly marked unread by the authenticated user.

    - `isMuted: optional boolean`

      True if chat notifications are muted.

    - `isPinned: optional boolean`

      True if chat is pinned.

    - `isReadOnly: optional boolean`

      True if messages cannot be sent in this chat.

    - `labels: optional array of Label`

      Labels applied to this chat. Absent when the chat has none, or when labels are not enabled for this user.

      - `id: string`

        Unique identifier of the label.

      - `name: string`

        Display name of the label.

    - `lastActivity: optional string`

      Timestamp of last activity.

    - `lastReadMessageSortKey: optional string`

      Last read message sortKey.

    - `localChatID: optional string`

      Local chat ID specific to this installation.

    - `merge: optional object { chatIDs, defaultChatID }`

      Present when this chat is a merged chat: one person whose conversations across networks (or across accounts on the same network) are grouped into a single chat. A merged chat holds no messages of its own - read messages from the member chats, and send either to a member directly or to the merged chat ID to route automatically.

      - `chatIDs: array of string`

        Chat IDs of the member chats grouped by this merged chat.

      - `defaultChatID: optional string`

        Member chat that receives messages sent to the merged chat, when the user has picked one. This preference is per-device; when absent, sends route to the most recently active member.

    - `mergedIntoChatID: optional string`

      When this chat is a member of a merged chat, the ID of that merged chat. Clients that render merged chats as one conversation should list the merged chat and hide chats carrying this field.

    - `messageExpirySeconds: optional number`

      Disappearing-message timer in seconds when available.

    - `reminder: optional object { dismissOnIncomingMessage, remindAt }`

      Current reminder for this chat, or null when no reminder is set.

      - `dismissOnIncomingMessage: optional boolean`

        Cancel reminder if someone messages in the chat.

      - `remindAt: optional string`

        Timestamp when the reminder should trigger.

    - `snooze: optional object { snoozeUntil, userSnoozedAt }`

      Current snooze state for this chat, or null when no snooze is set.

      - `snoozeUntil: optional string`

        Timestamp when the snooze expires.

      - `userSnoozedAt: optional string`

        Timestamp when the user set the snooze.

    - `unreadMentionsCount: optional number`

      Number of unread messages that mention the authenticated user or @room.

  - `in_groups: array of Chat`

    Top group results by participant matches.

    - `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: object { hasMore, items, total }`

      Chat participants information.

    - `title: string`

      Display title of the chat as computed by the client/server.

    - `type: "single" or "group"`

      Chat type: 'single' for direct messages, 'group' for group chats.

    - `unreadCount: number`

      Number of unread messages.

    - `capabilities: optional ChatCapabilities`

      Chat capabilities reported by the platform.

    - `description: optional string`

      Group chat description/topic when available.

    - `draft: optional ChatDraft`

      Current draft object for this chat, or null when no draft is set.

    - `imgURL: optional string`

      Local filesystem path to the chat avatar image when available.

    - `isArchived: optional boolean`

      True if chat is archived.

    - `isLowPriority: optional boolean`

      True if chat is marked low priority.

    - `isMarkedUnread: optional boolean`

      True if the chat was explicitly marked unread by the authenticated user.

    - `isMuted: optional boolean`

      True if chat notifications are muted.

    - `isPinned: optional boolean`

      True if chat is pinned.

    - `isReadOnly: optional boolean`

      True if messages cannot be sent in this chat.

    - `labels: optional array of Label`

      Labels applied to this chat. Absent when the chat has none, or when labels are not enabled for this user.

    - `lastActivity: optional string`

      Timestamp of last activity.

    - `lastReadMessageSortKey: optional string`

      Last read message sortKey.

    - `localChatID: optional string`

      Local chat ID specific to this installation.

    - `merge: optional object { chatIDs, defaultChatID }`

      Present when this chat is a merged chat: one person whose conversations across networks (or across accounts on the same network) are grouped into a single chat. A merged chat holds no messages of its own - read messages from the member chats, and send either to a member directly or to the merged chat ID to route automatically.

    - `mergedIntoChatID: optional string`

      When this chat is a member of a merged chat, the ID of that merged chat. Clients that render merged chats as one conversation should list the merged chat and hide chats carrying this field.

    - `messageExpirySeconds: optional number`

      Disappearing-message timer in seconds when available.

    - `reminder: optional object { dismissOnIncomingMessage, remindAt }`

      Current reminder for this chat, or null when no reminder is set.

    - `snooze: optional object { snoozeUntil, userSnoozedAt }`

      Current snooze state for this chat, or null when no snooze is set.

    - `unreadMentionsCount: optional number`

      Number of unread messages that mention the authenticated user or @room.

  - `messages: object { chats, hasMore, items, 2 more }`

    - `chats: map[Chat]`

      Map of chatID -> chat details for chats referenced in items.

      - `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: object { hasMore, items, total }`

        Chat participants information.

      - `title: string`

        Display title of the chat as computed by the client/server.

      - `type: "single" or "group"`

        Chat type: 'single' for direct messages, 'group' for group chats.

      - `unreadCount: number`

        Number of unread messages.

      - `capabilities: optional ChatCapabilities`

        Chat capabilities reported by the platform.

      - `description: optional string`

        Group chat description/topic when available.

      - `draft: optional ChatDraft`

        Current draft object for this chat, or null when no draft is set.

      - `imgURL: optional string`

        Local filesystem path to the chat avatar image when available.

      - `isArchived: optional boolean`

        True if chat is archived.

      - `isLowPriority: optional boolean`

        True if chat is marked low priority.

      - `isMarkedUnread: optional boolean`

        True if the chat was explicitly marked unread by the authenticated user.

      - `isMuted: optional boolean`

        True if chat notifications are muted.

      - `isPinned: optional boolean`

        True if chat is pinned.

      - `isReadOnly: optional boolean`

        True if messages cannot be sent in this chat.

      - `labels: optional array of Label`

        Labels applied to this chat. Absent when the chat has none, or when labels are not enabled for this user.

      - `lastActivity: optional string`

        Timestamp of last activity.

      - `lastReadMessageSortKey: optional string`

        Last read message sortKey.

      - `localChatID: optional string`

        Local chat ID specific to this installation.

      - `merge: optional object { chatIDs, defaultChatID }`

        Present when this chat is a merged chat: one person whose conversations across networks (or across accounts on the same network) are grouped into a single chat. A merged chat holds no messages of its own - read messages from the member chats, and send either to a member directly or to the merged chat ID to route automatically.

      - `mergedIntoChatID: optional string`

        When this chat is a member of a merged chat, the ID of that merged chat. Clients that render merged chats as one conversation should list the merged chat and hide chats carrying this field.

      - `messageExpirySeconds: optional number`

        Disappearing-message timer in seconds when available.

      - `reminder: optional object { dismissOnIncomingMessage, remindAt }`

        Current reminder for this chat, or null when no reminder is set.

      - `snooze: optional object { snoozeUntil, userSnoozedAt }`

        Current snooze state for this chat, or null when no snooze is set.

      - `unreadMentionsCount: optional number`

        Number of unread messages that mention the authenticated user or @room.

    - `hasMore: boolean`

      True if additional results can be fetched using the provided cursors.

    - `items: array of Message`

      Messages matching the query and filters.

      - `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"`

    - `newestCursor: string`

      Cursor for fetching newer results (use with direction='after'). Opaque string; do not inspect.

    - `oldestCursor: string`

      Cursor for fetching older results (use with direction='before'). Opaque string; do not inspect.

### Example

```http
curl http://localhost:23373/v1/search \
    -H "Authorization: Bearer $BEEPER_ACCESS_TOKEN"
```

#### Response

```json
{
  "results": {
    "chats": [
      {
        "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,
        "labels": [
          {
            "id": "id",
            "name": "name"
          }
        ],
        "lastActivity": "2026-05-05T20:11:54.000Z",
        "lastReadMessageSortKey": "455171049984",
        "localChatID": "5639",
        "merge": {
          "chatIDs": [
            "!NCdzlIaMjZUmvmvyHU:beeper.com"
          ],
          "defaultChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com"
        },
        "mergedIntoChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com",
        "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
      }
    ],
    "in_groups": [
      {
        "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,
        "labels": [
          {
            "id": "id",
            "name": "name"
          }
        ],
        "lastActivity": "2026-05-05T20:11:54.000Z",
        "lastReadMessageSortKey": "455171049984",
        "localChatID": "5639",
        "merge": {
          "chatIDs": [
            "!NCdzlIaMjZUmvmvyHU:beeper.com"
          ],
          "defaultChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com"
        },
        "mergedIntoChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com",
        "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
      }
    ],
    "messages": {
      "chats": {
        "!discord_109876543210987654:beeper.com": {
          "id": "!discord_109876543210987654:beeper.com",
          "accountID": "discordgo",
          "network": "Discord",
          "participants": {
            "hasMore": true,
            "items": [
              {
                "id": "@discord_221590782384013314:beeper.com",
                "cannotMessage": false,
                "email": "email",
                "fullName": "Kishan Bagaria",
                "imgURL": "imgURL",
                "isSelf": false,
                "phoneNumber": "phoneNumber",
                "username": "kishan",
                "isAdmin": true,
                "isNetworkBot": true,
                "isPending": true
              },
              {
                "id": "@discord_337451892017545216:beeper.com",
                "cannotMessage": false,
                "email": "email",
                "fullName": "Batuhan İçöz",
                "imgURL": "imgURL",
                "isSelf": true,
                "phoneNumber": "phoneNumber",
                "username": "batuhanicoz",
                "isAdmin": true,
                "isNetworkBot": true,
                "isPending": true
              }
            ],
            "total": 6
          },
          "title": "Beeper Client API",
          "type": "group",
          "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": true,
          "isReadOnly": true,
          "labels": [
            {
              "id": "id",
              "name": "name"
            }
          ],
          "lastActivity": "2025-08-31T17:38:20.393Z",
          "lastReadMessageSortKey": "455171049984",
          "localChatID": "1229720",
          "merge": {
            "chatIDs": [
              "!NCdzlIaMjZUmvmvyHU:beeper.com"
            ],
            "defaultChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com"
          },
          "mergedIntoChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com",
          "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
        },
        "!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost": {
          "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": "Adam Van Ymeren",
                "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": "Adam Van Ymeren",
          "type": "single",
          "unreadCount": 2,
          "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": true,
          "isPinned": false,
          "isReadOnly": true,
          "labels": [
            {
              "id": "id",
              "name": "name"
            }
          ],
          "lastActivity": "2025-08-31T16:45:10.123Z",
          "lastReadMessageSortKey": "455171049984",
          "localChatID": "1229721",
          "merge": {
            "chatIDs": [
              "!NCdzlIaMjZUmvmvyHU:beeper.com"
            ],
            "defaultChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com"
          },
          "mergedIntoChatID": "!NCdzlIaMjZUmvmvyHU:beeper.com",
          "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
        }
      },
      "hasMore": true,
      "items": [
        {
          "id": "241392",
          "accountID": "discordgo",
          "chatID": "!discord_109876543210987654:beeper.com",
          "senderID": "@discord_221590782384013314:beeper.com",
          "sortKey": "455171049984",
          "timestamp": "2025-08-28T11:04:29.621Z",
          "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"
        },
        {
          "id": "241393",
          "accountID": "local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc",
          "chatID": "!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost",
          "senderID": "@15550101002:local-whatsapp.localhost",
          "sortKey": "455171050240",
          "timestamp": "2025-08-28T14:22:15.432Z",
          "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": true,
          "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": "Adam Van Ymeren",
          "sendStatus": {
            "status": "SUCCESS",
            "timestamp": "2025-08-31T23:30:12.520Z",
            "deliveredToUsers": [
              "string"
            ],
            "internalError": "internalError",
            "message": "message",
            "reason": "reason"
          },
          "text": "Dinner at 7 still works for me.",
          "type": "TEXT"
        }
      ],
      "newestCursor": null,
      "oldestCursor": "1756379069621"
    }
  }
}
```
