Beeper Messages API

Messages inside a Chat: list, search, send, retrieve, edit, delete, and react.

Operations 8

GET /v1/messages/search Search messages #
GET /v1/chats/{chatID}/messages List messages #
POST /v1/chats/{chatID}/messages Send a message #
GET /v1/chats/{chatID}/messages/{messageID} Retrieve a message #
PUT /v1/chats/{chatID}/messages/{messageID} Edit a message #
DELETE /v1/chats/{chatID}/messages/{messageID} Delete a message #
POST /v1/chats/{chatID}/messages/{messageID}/reactions Add a reaction #
DELETE /v1/chats/{chatID}/messages/{messageID}/reactions/{reactionKey} Remove a reaction #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/beeper-messages-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

beeper-messages-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Beeper Desktop Accounts Messages API
  version: 5.0.0
  description: 'Beeper Desktop''s local HTTP and WebSocket API. One auth flow and one chat shape work across WhatsApp, iMessage, Telegram, Slack, Matrix, Discord, Twitter/X, Signal, and more.


    Beeper is built on the Matrix standard. Identifiers and rich text use Matrix conventions: `mxc://` and `localmxc://` URLs reference media on the Matrix homeserver and on this device''s local bridge respectively; message text is Matrix HTML on the wire; `@room` is a group-mention sentinel.


    ## Quickstart

    1. Discover the server with `GET /v1/info`. The Desktop API is local-only unless the user has enabled remote access.

    2. Authenticate with an access token from Beeper Desktop, or run OAuth2 Authorization Code with PKCE under the OAuth tag.

    3. Call `GET /v1/accounts` to see connected Chat Accounts, then `GET /v1/chats` for the unified inbox.


    ## WebSocket

    Connect to `/v1/ws` with the same Bearer token in the upgrade request. Browser `new WebSocket()` clients are not supported yet because browsers cannot set the Authorization header. After the server sends `ready`, send `{"type":"subscriptions.set","chatIDs":["*"]}` to receive every chat update, or pass specific chat IDs. The server replies with `subscriptions.updated`, then streams `chat.upserted`, `chat.deleted`, `message.upserted`, and `message.deleted`.


    Delivery is at-most-once. There is no replay on reconnect, and `seq` is per connection. Refetch via HTTP after a disconnect to reconcile drift. Initial subscription state is empty; `subscriptions.set` replaces previous state; `["*"]` cannot be combined with specific chat IDs.


    ## Conventions

    - IDs and cursors are opaque strings.

    - Timestamps are ISO 8601 with timezone, except OAuth fields that use Unix seconds per RFC.

    - Pagination is `cursor` plus `direction=before|after`.

    - Sends return a `pendingMessageID`; resolve it with `GET /v1/chats/{chatID}/messages/{messageID}` or wait for `message.upserted` over the WebSocket.

    - Optional fields may be omitted when unknown. Nullable write fields use `null` as an explicit clear operation.

    - Every response carries `X-Beeper-Desktop-Version` so clients can tell which app version produced it.'
  termsOfService: https://www.beeper.com/terms
  contact:
    name: Beeper
    email: help@beeper.com
    url: https://www.beeper.com
  license:
    name: Proprietary
    url: https://www.beeper.com/terms
servers:
- url: http://localhost:23373
  description: Beeper Desktop API server
security:
- bearerAuth: []
tags:
- name: Messages
  description: 'Messages inside a Chat: list, search, send, retrieve, edit, delete, and react.'
paths:
  /v1/messages/search:
    get:
      summary: Search messages
      description: Search messages across chats.
      tags:
      - Messages
      operationId: searchMessages
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          minLength: 0
          description: 'Literal word search (non-semantic). Finds messages containing these EXACT words in any order. Use single words users actually type, not concepts or phrases. Example: use "dinner" not "dinner plans", use "sick" not "health issues". If omitted, returns results filtered only by other parameters.'
          example: dinner
        required: false
        description: 'Literal word search (non-semantic). Finds messages containing these EXACT words in any order. Use single words users actually type, not concepts or phrases. Example: use "dinner" not "dinner plans", use "sick" not "health issues". If omitted, returns results filtered only by other parameters.'
        name: query
        in: query
      - schema:
          type: string
          description: Opaque pagination cursor; do not inspect. Use together with 'direction'.
          example: 1725489123456|c29tZUltc2dQYWdl
          x-stainless-pagination-property:
            purpose: next_cursor_param
        required: false
        description: Opaque pagination cursor; do not inspect. Use together with 'direction'.
        name: cursor
        in: query
      - schema:
          type: string
          enum:
          - after
          - before
          description: 'Pagination direction used with ''cursor'': ''before'' fetches older results, ''after'' fetches newer results. Defaults to ''before'' when only ''cursor'' is provided.'
          example: before
        required: false
        description: 'Pagination direction used with ''cursor'': ''before'' fetches older results, ''after'' fetches newer results. Defaults to ''before'' when only ''cursor'' is provided.'
        name: direction
        in: query
      - schema:
          type: array
          items:
            type: string
          description: Limit search to specific chat IDs.
          example:
          - '!NCdzlIaMjZUmvmvyHU:beeper.com'
          - '1231073'
        required: false
        description: Limit search to specific chat IDs.
        name: chatIDs
        in: query
      - schema:
          type: array
          items:
            type: string
            description: Account ID this resource belongs to.
          description: Limit search to specific account IDs.
          example:
          - matrix
          - discordgo
          - local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc
        required: false
        description: Limit search to specific account IDs.
        name: accountIDs
        in: query
      - schema:
          type: string
          enum:
          - group
          - single
          description: 'Filter by chat type: ''group'' for group chats, ''single'' for 1:1 chats.'
        required: false
        description: 'Filter by chat type: ''group'' for group chats, ''single'' for 1:1 chats.'
        name: chatType
        in: query
      - schema:
          type: array
          items:
            type: string
            enum:
            - any
            - video
            - image
            - link
            - file
          description: Filter messages by media types. Use ['any'] for any media type, or specify exact types like ['video', 'image']. Omit for no media filtering.
        required: false
        description: Filter messages by media types. Use ['any'] for any media type, or specify exact types like ['video', 'image']. Omit for no media filtering.
        name: mediaTypes
        in: query
      - schema:
          type: string
          description: 'Filter by sender: ''me'' (messages sent by the authenticated user), ''others'' (messages sent by others), or a specific user ID string (user.id).'
        required: false
        description: 'Filter by sender: ''me'' (messages sent by the authenticated user), ''others'' (messages sent by others), or a specific user ID string (user.id).'
        name: sender
        in: query
      - schema:
          type: string
          format: date-time
          description: Only include messages with timestamp strictly after this ISO 8601 datetime (e.g., '2024-07-01T00:00:00Z' or '2024-07-01T00:00:00+02:00').
          example: '2025-08-01T00:00:00Z'
        required: false
        description: Only include messages with timestamp strictly after this ISO 8601 datetime (e.g., '2024-07-01T00:00:00Z' or '2024-07-01T00:00:00+02:00').
        name: dateAfter
        in: query
      - schema:
          type: string
          format: date-time
          description: Only include messages with timestamp strictly before this ISO 8601 datetime (e.g., '2024-07-31T23:59:59Z' or '2024-07-31T23:59:59+02:00').
          example: '2025-08-31T23:59:59Z'
        required: false
        description: Only include messages with timestamp strictly before this ISO 8601 datetime (e.g., '2024-07-31T23:59:59Z' or '2024-07-31T23:59:59+02:00').
        name: dateBefore
        in: query
      - schema:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          maximum: 20
          default: 20
          description: Maximum number of messages to return.
          example: 20
        required: false
        description: Maximum number of messages to return.
        name: limit
        in: query
      - schema:
          type: boolean
          nullable: true
          default: true
          description: 'Exclude messages marked Low Priority by the user. Default: true. Set to false to include all.'
        required: false
        description: 'Exclude messages marked Low Priority by the user. Default: true. Set to false to include all.'
        name: excludeLowPriority
        in: query
      - schema:
          type: boolean
          nullable: true
          default: true
          description: 'Include messages in chats marked as Muted by the user, which are usually less important. Default: true. Set to false if the user wants a more refined search.'
        required: false
        description: 'Include messages in chats marked as Muted by the user, which are usually less important. Default: true. Set to false if the user wants a more refined search.'
        name: includeMuted
        in: query
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchMessagesOutput'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /v1/chats/{chatID}/messages:
    get:
      summary: List messages
      description: List all messages in a chat with cursor-based pagination. Sorted by timestamp.
      tags:
      - Messages
      operationId: listMessages
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      - schema:
          type: string
          description: Opaque pagination cursor; do not inspect. Use together with 'direction'.
          example: 1725489123456|c29tZUltc2dQYWdl
          x-stainless-pagination-property:
            purpose: next_cursor_param
        required: false
        description: Opaque pagination cursor; do not inspect. Use together with 'direction'.
        name: cursor
        in: query
      - schema:
          type: string
          enum:
          - after
          - before
          description: 'Pagination direction used with ''cursor'': ''before'' fetches older results, ''after'' fetches newer results. Defaults to ''before'' when only ''cursor'' is provided.'
          example: before
        required: false
        description: 'Pagination direction used with ''cursor'': ''before'' fetches older results, ''after'' fetches newer results. Defaults to ''before'' when only ''cursor'' is provided.'
        name: direction
        in: query
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListMessagesOutput'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      summary: Send a message
      description: Send a text message to a specific chat. Supports replying to existing messages. Returns a pending message ID.
      tags:
      - Messages
      operationId: sendMessage
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                text:
                  allOf:
                  - $ref: '#/components/schemas/MessageTextInput'
                  - description: Text input. Markdown is converted to Matrix HTML. To provide Matrix HTML verbatim, pass a JSON-stringified HTML string.
                replyToMessageID:
                  type: string
                  description: Provide a message ID to send this as a reply to an existing message
                attachment:
                  allOf:
                  - $ref: '#/components/schemas/MessageAttachmentInput'
                  - description: Single attachment to send with the message
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SendMessageOutput'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /v1/chats/{chatID}/messages/{messageID}:
    get:
      summary: Retrieve a message
      description: Retrieve a message by final message ID, pendingMessageID, or Matrix event ID. Chat ID may be a Beeper chat ID or local chat ID.
      tags:
      - Messages
      operationId: getMessage
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      - schema:
          type: string
          description: Message ID.
          example: '1343993'
        required: true
        description: Message ID.
        name: messageID
        in: path
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Message'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    put:
      summary: Edit a message
      description: Edit the text content of an existing message. Messages with attachments cannot be edited.
      tags:
      - Messages
      operationId: editMessage
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      - schema:
          type: string
          description: Message ID.
          example: '1343993'
        required: true
        description: Message ID.
        name: messageID
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                text:
                  type: string
                  minLength: 1
                  description: New text content for the message
              required:
              - text
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EditMessageOutput'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      summary: Delete a message
      description: Delete a message by final message ID. Pending message IDs are not accepted because messages cannot be deleted while sending.
      tags:
      - Messages
      operationId: deleteMessage
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      - schema:
          type: string
          description: Message ID.
          example: '1343993'
        required: true
        description: Message ID.
        name: messageID
        in: path
      - schema:
          type: boolean
          nullable: true
          default: true
          description: True to request deletion for everyone when the network supports it; false to delete only for the authenticated user when supported.
        required: false
        description: True to request deletion for everyone when the network supports it; false to delete only for the authenticated user when supported.
        name: forEveryone
        in: query
      responses:
        '204':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /v1/chats/{chatID}/messages/{messageID}/reactions:
    post:
      summary: Add a reaction
      description: Add a reaction to an existing message.
      tags:
      - Messages
      operationId: addReaction
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      - schema:
          type: string
          description: Message ID.
          example: '1343993'
        required: true
        description: Message ID.
        name: messageID
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                reactionKey:
                  type: string
                  minLength: 1
                  description: Reaction key to add (emoji, shortcode, or custom emoji key)
                transactionID:
                  type: string
                  description: Optional transaction ID for deduplication and send tracking
              required:
              - reactionKey
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddReactionOutput'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /v1/chats/{chatID}/messages/{messageID}/reactions/{reactionKey}:
    delete:
      summary: Remove a reaction
      description: Remove the reaction added by the authenticated user from an existing message.
      tags:
      - Messages
      operationId: removeReaction
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          description: Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.
          example: '!NCdzlIaMjZUmvmvyHU:beeper.com'
        required: true
        description: Chat ID or local chat ID.
        name: chatID
        in: path
      - schema:
          type: string
          description: Message ID.
          example: '1343993'
        required: true
        description: Message ID.
        name: messageID
        in: path
      - schema:
          type: string
          minLength: 1
          description: Reaction key to remove (emoji, shortcode, or custom emoji key)
        required: true
        description: Reaction key to remove (emoji, shortcode, or custom emoji key)
        name: reactionKey
        in: path
      responses:
        '200':
          description: Request executed successfully
          headers:
            X-Beeper-Desktop-Version:
              $ref: '#/components/headers/X-Beeper-Desktop-Version'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RemoveReactionOutput'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    MessageSeen:
      anyOf:
      - type: boolean
        x-stainless-variantName: boolean
      - type: string
        format: date-time
        description: ISO 8601 timestamp.
        example: '2025-08-31T23:30:12.520Z'
        x-stainless-variantName: timestamp
      - $ref: '#/components/schemas/MessageSeenByParticipant'
      description: Read receipt state for this message, when available.
    MessageAttachmentType:
      type: string
      enum:
      - image
      - video
      - audio
      - file
      - gif
      - voice-note
      - sticker
      description: Attachment type hint (image, video, audio, file, gif, voice-note, sticker). If omitted, auto-detected from mimeType
    MessageTextInput:
      type: string
      description: Draft text. Plain text and Markdown are converted to Matrix HTML with the same rules used by send and edit.
    Participant:
      allOf:
      - $ref: '#/components/schemas/User'
      - type: object
        properties:
          isAdmin:
            type: boolean
            description: True if this participant has admin privileges in the chat.
          isPending:
            type: boolean
            description: True if this participant has been invited but has not joined yet.
          isNetworkBot:
            type: boolean
            description: True if this participant represents a network or bridge bot.
      description: A chat participant. Extends User with chat membership metadata.
    SearchMessagesOutput:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Message'
          description: Messages matching the query and filters.
          x-stainless-pagination-property:
            purpose: items
        hasMore:
          type: boolean
          description: True if additional results can be fetched using the provided cursors.
          x-stainless-pagination-property:
            purpose: has_next_page
        oldestCursor:
          type: string
          nullable: true
          description: Cursor for fetching older results (use with direction='before'). Opaque string; do not inspect.
          example: 1725489123456|c29tZUltc2dQYWdl
          x-stainless-pagination-property:
            purpose: next_cursor_field
        newestCursor:
          type: string
          nullable: true
          description: Cursor for fetching newer results (use with direction='after'). Opaque string; do not inspect.
          example: 1725489123456|c29tZUltc2dQYWdl
        chats:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/Chat'
          description: Map of chatID -> chat details for chats referenced in items.
      required:
      - items
      - hasMore
      - oldestCursor
      - newestCursor
      - chats
      example:
        items:
        - id: '241392'
          chatID: '!discord_109876543210987654:beeper.com'
          accountID: discordgo
          senderID: '@discord_221590782384013314:beeper.com'
          senderName: Kishan Bagaria
          timestamp: '2025-08-28T11:04:29.621Z'
          sortKey: '455171049984'
          text: The OAuth fix is deployed. Can you verify the desktop flow?
          isSender: false
          isUnread: false
        - id: '241393'
          chatID: '!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost'
          accountID: local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc
          senderID: '@15550101002:local-whatsapp.localhost'
          senderName: Adam Van Ymeren
          timestamp: '2025-08-28T14:22:15.432Z'
          sortKey: '455171050240'
          text: Dinner at 7 still works for me.
          isSender: false
          isUnread: true
        chats:
          '!discord_109876543210987654:beeper.com':
            id: '!discord_109876543210987654:beeper.com'
            localChatID: '1229720'
            accountID: discordgo
            network: Discord
            title: Desktop API
            type: group
            participants:
              items:
              - id: '@discord_221590782384013314:beeper.com'
                username: kishan
                fullName: Kishan Bagaria
                cannotMessage: false
                isSelf: false
              - id: '@discord_337451892017545216:beeper.com'
                username: batuhanicoz
                fullName: Batuhan İçöz
                cannotMessage: false
                isSelf: true
              hasMore: true
              total: 6
            lastActivity: '2025-08-31T17:38:20.393Z'
            unreadCount: 0
            isArchived: false
            isMuted: false
            isPinned: true
          '!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost':
            id: '!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost'
            localChatID: '1229721'
            accountID: local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc
            network: WhatsApp
            title: Adam Van Ymeren
            type: single
            participants:
              items:
              - id: '@15550101002:local-whatsapp.localhost'
                phoneNumber: '+15550101002'
                fullName: Adam Van Ymeren
                cannotMessage: false
                isSelf: false
              - id: '@ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc:local-whatsapp.localhost'
                fullName: Batuhan İçöz
                cannotMessage: false
                isSelf: true
              hasMore: false
              total: 2
            lastActivity: '2025-08-31T16:45:10.123Z'
            unreadCount: 2
            isArchived: false
            isMuted: true
            isPinned: false
        hasMore: true
        oldestCursor: '1756379069621'
        newestCursor: null
    ChatDraft:
      type: object
      nullable: true
      properties:
        text:
          type: string
          description: Matrix HTML draft body.
        attachments:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/DraftAttachment'
          description: Draft attachments keyed by attachment ID.
      required:
      - text
      description: Current draft object for this chat, or null when no draft is set.
    EditMessageOutput:
      allOf:
      - $ref: '#/components/schemas/Message'
      - type: object
        properties:
          success:
            type: boolean
            enum:
            - true
            description: DEPRECATED - compatibility field. Successful responses are already represented by the 200 status code.
            deprecated: true
          messageID:
            type: string
            description: DEPRECATED - use id instead. Compatibility alias for older clients.
            example: '1343993'
            deprecated: true
        required:
        - success
        - messageID
      example:
        id: '1343993'
        messageID: '1343993'
        success: true
        sortKey: aaaa1
        chatID: '!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost'
        accountID: local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc
        senderID: '@ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc:local-whatsapp.localhost'
        senderName: Adam Van Ymeren
        timestamp: '2025-08-28T11:04:29.621Z'
        text: Updated message text
        isSender: true
        isUnread: false
    User:
      type: object
      properties:
        id:
          type: string
          description: Stable Beeper user ID. Use as the primary key when referencing a person.
        username:
          type: string
          description: Human-readable handle if available (e.g., '@alice'). May be network-specific and not globally unique.
        phoneNumber:
          type: string
          description: User's phone number in E.164 format (e.g., '+14155552671'). Omit if unknown.
        email:
          type: string
          description: Email address if known. Not guaranteed verified.
        fullName:
          type: string
          description: Display name as shown in clients (e.g., 'Alice Example'). May include emoj

# --- truncated at 32 KB (65 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/beeper/refs/heads/main/openapi/beeper-messages-api-openapi.yml