Source: https://docs.sogni.ai/api-reference/replay/

# Replay Records

Look back at how a run came together: replay stores prompts, responses, and tool inputs and results. Durable chat runs write a record automatically under their `runId`; client-side agents can upload their own. Only the authenticated account can read its records through these endpoints.

**Review before sharing.** Credential filtering is best-effort, not anonymization. `redacted: true` means the filter ran, not that every sensitive detail was removed. Keep secrets out of prompts and tool data, and review any record you export or share.

### POST /v1/replay/records

Stores a RunRecord and returns `201`. The owner is derived from the authenticated wallet, so clients cannot write into someone else's namespace. Posting the same `run_id` again replaces the stored record. Malformed JSON or a missing required field returns `400`.

### [#](https://docs.sogni.ai/api-reference/replay/#body)Body

| Name | Type | In | Description |
| --- | --- | --- | --- |
| schemaVersionrequired | integer | body | RunRecord schema version. Currently `1` or `2`. |
| run\_idrequired | string | body | Caller-chosen run id (max 128 chars). Uniqueness is per owner. |
| user\_requestrequired | string | body | The user prompt or request that triggered the run. |
| roundsrequired | array | body | Recorded model messages, tool calls, and tool results. |

**Payload cap.** JSON is capped at `1,000,000` UTF-8 bytes (1 MB), not characters. Larger payloads return `413`.

### [#](https://docs.sogni.ai/api-reference/replay/#response)Response

```json
{
  "runId": "run_…",
  "schemaVersion": 2,
  "redacted": true,
  "createTime": 1731950400,
  "updateTime": 1731950400
}
```

### GET /v1/replay/records

Lists recent RunRecords for the caller, newest first. Summaries include the first 1,024 Unicode characters of each prompt and final response. Fetch an individual record for the full text and tool data.

### [#](https://docs.sogni.ai/api-reference/replay/#query-parameters)Query parameters

| Name | Type | In | Description |
| --- | --- | --- | --- |
| limit | integer | query | Default `50`, clamped to 1–200. A non-numeric value returns `400`. |
| cursor | string | query | Omit for the first page. Pass the previous response's `nextCursor` unchanged to fetch the next page; a modified cursor returns `400`. Stop when it is `null`. |

### [#](https://docs.sogni.ai/api-reference/replay/#response-1)Response

```json
{
  "records": [
    {
      "runId": "run_…",
      "schemaVersion": 2,
      "createTime": 1731950400,
      "updateTime": 1731950400,
      "userRequest": "Storyboard a 5-shot neon teaser.",
      "finalResponse": "Here's your storyboard.",
      "modelId": "qwen3.6-35b-a3b-gguf-iq4xs",
      "rounds": 3
    }
  ],
  "nextCursor": null
}
```

### GET /v1/replay/records/:id

Returns a full RunRecord, suitable for the replay viewer. Unknown ids return `404`. The credential filter is applied again when records are read.

### [#](https://docs.sogni.ai/api-reference/replay/#response-2)Response

```json
{
  "record": { "schemaVersion": 2, "run_id": "run_…", "rounds": [ "…" ] },
  "createTime": 1731950400
}
```
