---
title: "Message history"
method: GET
path: "/v1/conversations/{id}/messages"
tags: ["Conversations"]
---

# Message history

`GET /v1/conversations/{id}/messages`

## Request

- Base URL: `https://api.cadencercs.com`
- URL: `https://api.cadencercs.com/v1/conversations/{id}/messages`
- Auth: HTTP bearer

Per-message `channel`, so an RCS→SMS fallback is visible without subscribing to events.

**Use `deliveredText`, not `body`.** `body` is the composed RCS text and stays that way on a message that went out over SMS, where the numbered fallback is what was actually read.

## Path parameters

- `id` string, required

## Response `200`

Transcript.

- object
  - `conversationId` string, required
  - `messages` Message[], required
    - `seq` number, required: Monotonic within the conversation.
    - `direction` 'in' | 'out', required
    - `channel` 'rcs' | 'sms': Per message, so an RCS→SMS fallback is visible in the transcript.
    - `media` object: Present on a row that carried a file: inbound (Google-hosted URL, may be time-limited; `deliveredText` is a placeholder such as `[photo]`) or outbound (the file you sent, on the RCS row and on the SMS row where it went as a link).
      - `url` string
      - `mimeType` string
      - `sizeBytes` number
      - `fileName` string
      - `thumbnailUrl` string
      - `altText` string
    - `body` string, nullable: The text as composed. On a message delivered over SMS this is the RCS text, which is **not** what the recipient read.
    - `smsFallbackText` string, nullable
    - `deliveredText` string, nullable: What the recipient actually received on this message's channel. **Build transcripts from this, not from `body`** — the two differ on the SMS leg, and a transcript built from `body` shows a human operator messages that were never sent.
    - `optionLabel` string: On an inbound chip tap: the chip's label, resolved server-side. Branch on this, never on `body`. Absent when the reply was free text or a suggestion we did not send.
    - `optionIndex` number: 1-based among the REPLY chips of the message this answers. Absent on an action chip, which has no number a recipient could have typed.
    - `chipAction` 'open_url' | 'dial' | 'calendar' | 'view_location' | 'share_location': Present when an action chip was tapped rather than a reply chip.
    - `answersSeq` number: The `seq` of the outbound message whose chips this reply answers — **not necessarily the message before it**. Someone can read the morning message and tap its chip after the next one has landed, and the reply text alone cannot tell you that. Assuming the previous message is how a late tap gets filed against the wrong question.
    - `providerMsgId` string, nullable
    - `createdAt` string
  - `note` string

## Other responses

- `401`: Missing, unknown or revoked API key.
- `403`: Key suspended, or scoped to a different brand than the one addressed.
- `404`: No conversation with that id on this key or account.
- `500`: Unexpected server error. The body is always JSON.

---

[API](https://skmtc.dev/cadencercs/apis/cadence-api.md) · [All operations](https://skmtc.dev/cadencercs/apis/cadence-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cadencercs/apis/cadence-api/revisions/9438443c2081?raw)
