---
title: "List a run's sessions"
method: GET
path: "/projects/{projectId}/journey-runs/{runId}/sessions"
tags: ["Swarm runs"]
---

# List a run's sessions

`GET /projects/{projectId}/journey-runs/{runId}/sessions`

One entry per chat session the run produced. Summaries, not transcripts — read a transcript through the chat-session routes using `id`.

## Request body

- object
  - `cursor` string — Opaque pagination cursor from a previous response's `nextCursor`. Don't parse it.

## Response `200`

A page of sessions.

- JourneyRunSessionPage
  - `items` JourneyRunSession[], required
    - `id` string, required — The session's document id — the same value `GET /chat-sessions` returns as `id`, so a session found here can be looked up there.
    - `chatSessionId` string, required — The RUNTIME key for the same session, used by the chat transport and the app's deep links. Distinct from `id` and NOT interchangeable with it.
    - `projectId` string, required
    - `hostId` string
    - `runId` string
    - `journeyId` string
    - `personaId` string
    - `personaLabel` string
    - `status` 'active' | 'archived' | 'null', nullable, required — ARCHIVAL state. A run session stays `active` forever unless archived, so this says nothing about how the run went — read `outcome` for the verdict.
    - `outcome` 'succeeded' | 'failed' | 'rate_limited' | 'running' | 'pending' | 'null', nullable — How this session's attempt ended. `null` when the attempt cannot be matched (historical runs); absent on servers that predate the field.
    - `readiness` unknown, required
    - `goalScore` unknown, required
    - `messageCount` integer, required
    - `preview` string — First message only. The transcript is a separate read.
    - `modelId` string
    - `startedAt` number, nullable, required — Epoch milliseconds.
    - `lastActivityAt` number, nullable, required — Epoch milliseconds.
  - `nextCursor` string — Present only when another page exists.

## Other responses

- `401` — Missing, invalid, revoked, or orphaned key (`UNAUTHORIZED`) — or the **target MCP server** needs an OAuth grant (`OAUTH_REQUIRED`), which is a property of the server, not your key.
- `403` — Key is valid but not allowed to do this.
- `404` — Unknown project, server, or resource.
- `429` — Per-key rate limit exceeded (60 requests/minute sustained, bursts up to 10). Honor `Retry-After` and back off with jitter.
- `500` — Something failed on MCPJam's side.

---

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