> ## Documentation Index
> Fetch the complete documentation index at: https://docs.watx.in/llms.txt
> Use this file to discover all available pages before exploring further.

# List a conversation's messages

> Lists the messages in one conversation, newest first, with cursor
pagination. The conversation is checked against your workspace first —
another workspace's conversation answers `404`, never an empty list.

Requires the `messages:read` scope.




## OpenAPI

````yaml /openapi.yaml get /conversations/{id}/messages
openapi: 3.1.0
info:
  title: Watx API
  version: '1'
  description: |
    The Watx public REST API. Send WhatsApp messages, manage contacts and
    segments, read conversations and messages, launch broadcasts, and register
    webhook endpoints.

    Every request authenticates with a workspace API key sent as a bearer
    token. A key acts on exactly one workspace and can only do what its scopes
    allow. Each operation below names the scope it requires.
  contact:
    name: Watx support
    email: support@watx.in
servers:
  - url: https://api.watx.in/v1
    description: Production
security:
  - apiKey: []
tags:
  - name: Account
    description: Check which workspace a key belongs to and what it can do.
  - name: Messages
    description: Send a WhatsApp message to a phone number.
  - name: Contacts
    description: Create, read, update and list contacts.
  - name: Conversations
    description: Read conversations and their messages.
  - name: Broadcasts
    description: Launch a template broadcast and follow its progress.
  - name: Segments
    description: Named audiences — static lists and saved filters.
  - name: Webhooks
    description: Register endpoints that receive events from your workspace.
paths:
  /conversations/{id}/messages:
    parameters:
      - $ref: '#/components/parameters/conversationId'
    get:
      tags:
        - Conversations
      summary: List a conversation's messages
      description: |
        Lists the messages in one conversation, newest first, with cursor
        pagination. The conversation is checked against your workspace first —
        another workspace's conversation answers `404`, never an empty list.

        Requires the `messages:read` scope.
      operationId: listConversationMessages
      parameters:
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: A page of messages.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Message'
                  meta:
                    $ref: '#/components/schemas/ListMeta'
              example:
                data:
                  - id: 9d1f4b2a-6c3e-4a51-bf2d-0a7c9e114b3f
                    conversation_id: 3c5b1e77-90aa-4c0e-8f71-1d2a3b4c5d6e
                    direction: outbound
                    sender_type: agent
                    content_type: text
                    content_text: Your order has been packed.
                    media_url: null
                    template_name: null
                    whatsapp_message_id: wamid.HBgMOTE5ODc2NTQzMjEwFQIAERgS
                    message_id: wamid.HBgMOTE5ODc2NTQzMjEwFQIAERgS
                    status: delivered
                    reply_to_message_id: null
                    interactive_reply_id: null
                    deleted_at: null
                    created_at: '2026-09-14T10:15:00.000Z'
                meta:
                  next_cursor: null
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    conversationId:
      name: id
      in: path
      required: true
      description: The conversation id.
      schema:
        type: string
        format: uuid
    limit:
      name: limit
      in: query
      description: Page size. Default 50, maximum 100. An unusable value falls back to 50.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 50
    cursor:
      name: cursor
      in: query
      description: |
        The `meta.next_cursor` from the previous page, passed back verbatim. An
        unreadable cursor is ignored and the first page is returned.
      schema:
        type: string
  schemas:
    Message:
      type: object
      properties:
        id:
          type: string
          format: uuid
        conversation_id:
          type: string
          format: uuid
        direction:
          type: string
          enum:
            - inbound
            - outbound
        sender_type:
          type: string
          enum:
            - customer
            - agent
            - bot
        content_type:
          type: string
          enum:
            - text
            - image
            - document
            - audio
            - video
            - location
            - template
            - interactive
            - sticker
            - contacts
            - order
            - system
            - unsupported
        content_text:
          type:
            - string
            - 'null'
        media_url:
          type:
            - string
            - 'null'
        template_name:
          type:
            - string
            - 'null'
        whatsapp_message_id:
          type:
            - string
            - 'null'
          description: |
            Kept for backwards compatibility and identical to `message_id`. On
            an Instagram conversation it carries an Instagram `mid`. Prefer
            `message_id` in new integrations.
        message_id:
          type:
            - string
            - 'null'
          description: The platform's own message id.
        status:
          type: string
          enum:
            - sending
            - sent
            - delivered
            - read
            - failed
          description: |
            WhatsApp reports `sent`, `delivered`, `read`. Instagram has no
            delivery receipt and goes from `sent` to `read`.
        reply_to_message_id:
          type:
            - string
            - 'null'
          format: uuid
        interactive_reply_id:
          type:
            - string
            - 'null'
          description: The payload of the button or list item the customer tapped.
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
          description: Set when the platform reported the message as deleted.
        created_at:
          type: string
          format: date-time
    ListMeta:
      type: object
      description: Pagination metadata on list responses.
      properties:
        next_cursor:
          type:
            - string
            - 'null'
          description: |
            Pass back as `?cursor=` for the next page. `null` means this was the
            last page.
    Error:
      type: object
      description: |
        Every failure uses this shape. Branch on `error.code`, which is stable;
        `error.message` is written for people and may be reworded.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: |
                One of `bad_request`, `invalid_request`, `unauthorized`,
                `forbidden`, `not_found`, `rate_limited`, `internal`, or a
                domain code such as `whatsapp_not_configured`, `meta_error`,
                `template_malformed`, `plan_limit_reached`,
                `subscription_lapsed`.
              example: bad_request
            message:
              type: string
              example: '''phone'' is required'
  responses:
    Unauthorized:
      description: |
        The key is missing, malformed, unknown, revoked or expired. All four
        answer the same way.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: unauthorized
              message: Missing or invalid API key
    Forbidden:
      description: The key is valid but was not granted the scope this operation requires.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: forbidden
              message: This API key is missing the 'messages:send' scope
    NotFound:
      description: |
        No such resource in this workspace. A resource belonging to another
        workspace answers the same way.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: not_found
              message: Contact not found
    RateLimited:
      description: |
        More than 120 requests in a minute for this key. `Retry-After` says how
        many seconds to wait.
      headers:
        Retry-After:
          description: Seconds until the window resets.
          schema:
            type: integer
        X-RateLimit-Limit:
          description: Requests allowed per window.
          schema:
            type: integer
        X-RateLimit-Remaining:
          description: Requests left in this window.
          schema:
            type: integer
        X-RateLimit-Reset:
          description: Unix time in seconds when the window resets.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: rate_limited
              message: Rate limit exceeded for this API key
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: |
        Your workspace API key, created in **Settings → API keys**, sent as
        `Authorization: Bearer <key>`. New keys start with `watx_live_`; keys
        issued before the rename start with `converse360_live_` and still work.

````