---
title: "Full transcript with lifecycle events"
method: GET
path: "/v1/conversations/{id}/detail"
tags: ["Conversations"]
---

# Full transcript with lifecycle events

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

## Request

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

Messages and lifecycle events on one timeline. Session-authed, for the dashboard.

## Path parameters

- `id` string, required

## Response `200`

Conversation, messages and events.

- object
  - `conversation` Conversation: Conversation fields are camelCase, in and out — unlike brand fields.
    - `id` string, required
    - `agentId` string, required
    - `brandId` string, required
    - `to` string, required: Recipient, E.164.
    - `channel` 'rcs' | 'sms' | 'queued'
    - `channelConfidence` 'provisional' | 'committed': `provisional` means we chose a channel and have no confirmation yet. It becomes `committed` when the channel is proven: on the first delivery receipt from the handset on RCS, or on an SMS fallback **caused by the recipient** — no RCS on their device, or your agent not launched on their carrier. A fallback caused by *us* — a rejected payload, a bad credential, a timeout — leaves this `provisional`, because it says nothing about the recipient. Committing there would mark a perfectly reachable handset SMS-only for the rest of the conversation on the strength of our own bug, and report it as a fact about their phone. See `fellBack.ourFault` on the send response.
    - `trustLevel` 'verified_rcs' | 'branded_sms' | 'unbranded_sms'
    - `state` 'OPENING' | 'OPEN' | 'USER_REPLIED' | 'CHANNEL_FLIP_TO_SMS' | 'CLOSING' | 'CLOSED' | 'CLOSED_OPTOUT', required
    - `useCase` 'transactional' | 'promo' | 'conversational' | 'leadgen'
    - `turnCount` number
    - `turnCeiling` number
    - `rcsOnly` boolean: SMS is disabled for this conversation.
    - `createdAt` string
    - `closedAt` string, nullable
  - `messages` Message[]
    - `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
  - `events` object[]
    - `type` string, required
    - `channel` string, nullable
    - `payload` object, nullable
    - `created_at` string

## Other responses

- `401`: Not signed in, and no account-linked API key was sent.
- `404`: No such conversation on this 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)
