---
title: "Get the customer-readable trace for a v2 conversation, nested Session→Turn→node→step"
method: GET
path: "/v1/conversations/{conversation_id}/trace/grouped"
tags: ["conversations"]
---

# Get the customer-readable trace for a v2 conversation, nested Session→Turn→node→step

`GET /v1/conversations/{conversation_id}/trace/grouped`

The nested tree variant of the session trace (Phase D), paginated by TURN. Same auth
(TRACE_READ) + org scoping + terminal-session cache as the flat read. The full tree is built +
cached once, then a window of ``limit`` turns from ``cursor`` is returned with a ``next_cursor``
for the next block (``None`` on the last page). ``header`` + session lane ride every page.

## Path parameters

- `conversation_id` string, uuid, required

## Query parameters

- `turn_id` string, uuid, nullable
- `cursor` string, nullable — Turn-pagination cursor: pass the previous page's ``next_cursor`` to load the next block of turns. Omit for the first page.
- `limit` integer — Max TURNS per page (the grouped tree paginates by turn, not by raw step).
- `category` 'product' | 'engineering' | 'all'

## Response `200`

Successful Response

- SessionTraceGroupedResponse — Nested envelope (Phase D): Session → Turn → node → step. ``header`` holds the session-level facts (who / channel / agent / outcome / memory) shown once. ``session`` holds any remaining session-lane steps not folded into the header. ``turns`` holds the per-turn trees, ordered by turn start. A read alternative to the flat :class:`SessionTraceResponse`; the flat shape stays for back-compat.
  - `header` TraceSessionHeader — Session-level facts shown ONCE at the top of the trace (never repeated per turn). Derived from the conversation row + the session-lane steps, so the timeline opens with a single 'who / what / outcome' block instead of burying identity / memory / start / end events inside the turn stream.
    - `channel` string, nullable
    - `customer` string, nullable
    - `agent` string, nullable
    - `started_at` string, date-time, nullable
    - `ended_at` string, date-time, nullable
    - `outcome` string, nullable
    - `memory` string, nullable
  - `session` TraceStep[], required
    - `kind` string, required
    - `actor` 'Customer' | 'Agent' | 'System', required
    - `title` string, required
    - `summary` string, nullable
    - `status` 'Succeeded' | 'Failed' | 'Skipped' | 'In Progress', required
    - `started_at` string, date-time, required
    - `ended_at` string, date-time, nullable
    - `duration_ms` integer, nullable
    - `turn_id` string, nullable
    - `details` object
  - `turns` TraceTurn[], required
    - `turn_id` string, required
    - `started_at` string, date-time, required
    - `customer_message` string, nullable
    - `ttft_ms` integer, nullable
    - `duration_ms` integer, nullable
    - `groups` TraceNodeGroup[], required
      - `node` string, nullable
      - `steps` TraceStep[], required
        - `kind` string, required
        - `actor` 'Customer' | 'Agent' | 'System', required
        - `title` string, required
        - `summary` string, nullable
        - `status` 'Succeeded' | 'Failed' | 'Skipped' | 'In Progress', required
        - `started_at` string, date-time, required
        - `ended_at` string, date-time, nullable
        - `duration_ms` integer, nullable
        - `turn_id` string, nullable
        - `details` object
  - `next_cursor` string, nullable

## Other responses

- `400` — Bad request
- `401` — Authentication required
- `404` — Resource not found
- `422` — Validation Error

---

[API](https://skmtc.net/oneloop-hq/apis/feather-api.md) · [All operations](https://skmtc.net/oneloop-hq/apis/feather-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/oneloop-hq/feather-api/revisions/5a5597ebb2d6/schema)
