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

# List a conversation's messages

> The thread, oldest first, paginated — so a client appends pages instead of reversing them. Each message carries `referral`: null unless it came from a Click-to-WhatsApp, Click-to-Messenger or Click-to-Instagram ad (or an m.me / ig.me ref link), and then the same keys on every channel: `source` (ad, post or link), `ad_id`, `ad_title`, `body`, `photo_url`, `video_url`, `thumbnail_url`, `source_url`, `post_id`, `product_id` (the catalog product the ad showed, for a catalog ad), `ref` and `ctwa_clid` (WhatsApp only). A key Meta did not send is null; media URLs are Meta CDN links and expire. When somebody who already has a Messenger or Instagram thread taps an ad, Meta sends no message, so an inbound line reading `Opened the chat from an ad` is recorded carrying the referral. Ad details are captured while click-to-message ad triggers are enabled for the workspace.

**Required permission:** `salesbot:conversations:read`



## OpenAPI

````yaml /api-reference/messaging.openapi.json get /conversations/{contact}/messages
openapi: 3.1.0
info:
  title: Messaging API
  version: 1.0.0
  description: >-
    Contacts, conversations, messages, broadcasts, automations and media for one
    workspace. The workspace is selected by the API key, so no workspace ID
    appears in any URL.
servers:
  - url: https://{domain}/api/v1
    description: Your platform domain
    variables:
      domain:
        default: app.example.com
        description: The domain you sign in to, without https://
security:
  - bearerAuth: []
  - apiKeyHeader: []
tags:
  - name: Account
    description: >-
      The workspace is selected by the API key, so no workspace id appears in
      any /api/v1 URL.
  - name: Automations
    description: >-
      Read + activate/pause only. Authoring a node graph stays in the builder,
      which owns its own validation.
  - name: Broadcasts
    description: >-
      The send pipeline is never invoked directly: marking a broadcast scheduled
      is what lets the sweep's single Scheduled→Sending claim keep it
      un-double-sendable.
  - name: Channels
    description: >-
      Read-only: connecting a channel is an OAuth flow that must happen in the
      dashboard.
  - name: Contacts
    description: >-
      custom_fields is a flat {key: value} map. An empty map is returned as {}
      so client-side property access is always safe.
  - name: Conversations & Messages
    description: >-
      There is no Conversation model: a conversation is a Contact with messages,
      and the rollup fields are denormalised columns on it.
  - name: Media
    description: >-
      Upload requests are multipart, not JSON — do not set Content-Type:
      application/json on media.store.
  - name: Segments
    description: Segments are the audience type broadcasts target.
  - name: Tags
    description: >-
      Contacts are tagged by NAME (see contacts.tags.add), so tag names stay
      unique.
paths:
  /conversations/{contact}/messages:
    get:
      tags:
        - Conversations & Messages
      summary: List a conversation's messages
      description: >-
        The thread, oldest first, paginated — so a client appends pages instead
        of reversing them. Each message carries `referral`: null unless it came
        from a Click-to-WhatsApp, Click-to-Messenger or Click-to-Instagram ad
        (or an m.me / ig.me ref link), and then the same keys on every channel:
        `source` (ad, post or link), `ad_id`, `ad_title`, `body`, `photo_url`,
        `video_url`, `thumbnail_url`, `source_url`, `post_id`, `product_id` (the
        catalog product the ad showed, for a catalog ad), `ref` and `ctwa_clid`
        (WhatsApp only). A key Meta did not send is null; media URLs are Meta
        CDN links and expire. When somebody who already has a Messenger or
        Instagram thread taps an ad, Meta sends no message, so an inbound line
        reading `Opened the chat from an ad` is recorded carrying the referral.
        Ad details are captured while click-to-message ad triggers are enabled
        for the workspace.


        **Required permission:** `salesbot:conversations:read`
      operationId: conversations.messages
      parameters:
        - name: contact
          in: path
          required: true
          schema:
            type: string
          description: The contact ID.
        - name: per_page
          in: query
          required: false
          schema:
            type: string
            example: '25'
          description: Items per page (max 100)
      responses:
        '200':
          description: Success
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'A workspace API key: `Authorization: Bearer osk_...`'
    apiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: The same workspace API key in the `x-api-key` header.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.