---
title: "List simulation runs"
method: GET
path: "/v1/simulation/runs"
tags: ["simulation_runs"]
---

# List simulation runs

`GET /v1/simulation/runs`

Live operational data — always revalidate; do not rely on a client-side cache. Follow `next_cursor` to page; cursors stay valid across concurrent writes.

## Query parameters

- `status` 'pending' | 'running' | 'completed' | 'failed' | 'cancelled' | 'budget_exceeded'
- `agent_id` string, uuid, nullable
- `channel` 'text' | 'voice'
- `q` string, nullable — Case-insensitive substring match on the agent, persona and scenario names, plus the run id (exact UUID, or an 8+ character id prefix). Names are matched against the **current** persona/scenario/agent records, while each row displays the names frozen at dispatch time, so a renamed entity is found by its new name.
- `limit` integer
- `cursor` string, nullable

## Response `200`

Successful Response

- CursorPageSimulationRunResponse
  - `items` SimulationRunResponse[], required
    - `id` string, uuid, required
    - `session_id` string, uuid, required
    - `organization_id` string, uuid, required
    - `agent_id` string, uuid, required
    - `agent_revision_id` string, uuid, nullable, required
    - `persona_id` string, uuid, required
    - `scenario_id` string, uuid, required
    - `suite_id` string, uuid, nullable
    - `suite_run_id` string, uuid, nullable
    - `suite_item_id` string, uuid, nullable
    - `suite_attempt` integer
    - `channel` 'text' | 'voice', required
    - `tool_overrides` object, nullable, required
    - `sut_snapshot_sha256` string, nullable
    - `status` string, required
    - `idempotency_key` string, nullable
    - `budget_usd` string, nullable
    - `spent_usd` string, nullable
    - `started_at` string, date-time, nullable, required
    - `finished_at` string, date-time, nullable, required
    - `error_text` string, nullable, required
    - `stop_reason` string, nullable
    - `persona_turn_count` integer
    - `agent_turn_count` integer
    - `transcript_chars` integer
    - `heartbeat_at` string, date-time, nullable
    - `inputs_snapshot` object, required
    - `created_at` string, date-time, required
    - `recording_id` string, uuid, nullable
    - `recording_status` string, nullable
  - `next_cursor` string, nullable
  - `has_more` boolean, required

## Other responses

- `400` — Bad request
- `401` — Authentication required
- `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)
