# Get a Playground Run

```http
GET /api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage1/playground/runs/{runId}
```

**Scope**: `playground.read`.

Returns one Stage 1 Run owned by the calling account, including immutable input snapshots, progress, credit settlement, and grouped metrics. A Run owned by another account is indistinguishable from a missing Run.

## Status lifecycle

| Status | Meaning |
| :--- | :--- |
| `pending` | Created and waiting for an evaluator. |
| `running` | Claimed by an evaluator; results may still be incomplete. |
| `done` | Every execution reached a terminal result and credits were settled. |
| `failed` | The Run could not finish normally. Partial results may remain available. |
| `cancelled` | Cancelled before evaluation started; the reserved credits were released. |

## Path parameters

| Parameter | Type | Required | Description |
| :--- | :--- | :---: | :--- |
| `runId` | string | Yes | Run ID returned by create or list. |

## Response fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `runId` | string | Stable Run ID. |
| `status` | string | Current [lifecycle status](#status-lifecycle). |
| `params` | [Stage1RunParams](#input-snapshots) | Inputs resolved and frozen during creation. |
| `progress.completedExecutions` | integer | Terminal result rows currently recorded, including failed executions. |
| `progress.totalExecutions` | integer | Total result rows expected. |
| `credits.rate` | number | Positive USD-per-credit rate frozen for this Run. |
| `credits.reserved` | number | Maximum credits reserved during creation. |
| `credits.charged` | number \| null | Settled terminal charge; `null` before settlement. |
| `summary.groups` | [Stage1RunGroup](#grouped-metrics)[] | Aggregate metrics available from completed executions. |
| `error` | object \| null | Stable `code` and human-readable `message` when `status` is `failed`; otherwise `null`. |
| `createdAt` | string | ISO 8601 UTC creation time. |
| `finishedAt` | string \| null | Terminal time, or `null` while active. |

### Input snapshots

`Stage1RunParams` contains:

| Field | Type | Description |
| :--- | :--- | :--- |
| `models` | string[] | Model IDs in request order. |
| `problems` | [RunProblemSnapshot](#problem-snapshot-fields)[] | Resolved problem snapshots in request order. |
| `configurations` | [RunConfigurationSnapshot](#configuration-snapshot-fields)[] | Cheatsheet snapshots in request order. |
| `repeat` | integer | Executions per model × problem × configuration cell. |

#### Problem snapshot fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `position` | integer | Zero-based position in the original request. |
| `source.type` | string | `problem-set` or `custom`. |
| `source.problemSetId` | string | Present for `problem-set` sources. |
| `source.index` | integer | Original problem-set index; present for `problem-set` sources. |
| `equation1` | string | First snapshotted equation. |
| `equation2` | string | Second snapshotted equation. |
| `goldAnswer` | boolean | Snapshotted expected practice answer. |

`position` uniquely identifies multiple inline custom problems; it does not collapse every custom problem to index `0`.

#### Configuration snapshot fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `position` | integer | Zero-based position in the original request. |
| `cheatsheetId` | string | Source library ID at creation time. |
| `title` | string | Snapshotted cheatsheet title. |
| `content` | string | Exact content used by the evaluator. |
| `contentSha256` | string | Lowercase SHA-256 digest of the UTF-8 `content` bytes. |

### Grouped metrics

Each `Stage1RunGroup` aggregates completed executions for one model and cheatsheet configuration:

| Field | Type | Description |
| :--- | :--- | :--- |
| `modelId` | string | Evaluated model ID. |
| `cheatsheetId` | string | Snapshotted configuration cheatsheet ID. |
| `executionCount` | integer | Completed executions in this group. |
| `scoredExecutionCount` | integer | Executions with a valid scored answer. |
| `correctExecutionCount` | integer | Scored executions marked correct. |
| `failedExecutionCount` | integer | Executions that failed before producing a scored answer. |
| `accuracy` | number \| null | `correctExecutionCount / scoredExecutionCount`, or `null` when no execution was scored. |
| `meanCostUsd` | number | Mean actual model cost over executions with cost data. |
| `totalCostUsd` | number | Sum of actual model costs for the group. |
| `totalCredits` | number | Credits charged for the group after per-execution rounding. |
| `meanElapsedMs` | number | Mean duration in milliseconds over executions with timing data. |

`totalCredits` uses the Run's frozen rate and the conversion documented by [List Playground models](./list-playground-models.md); it is not `totalCostUsd × credits.rate`.

## Example response

```json
{
  "ok": true,
  "data": {
    "runId": "run_01JSTAGE100000000000000001",
    "status": "done",
    "params": {
      "models": ["qwen3"],
      "problems": [
        {
          "position": 0,
          "source": {
            "type": "problem-set",
            "problemSetId": "pset_hard3",
            "index": 0
          },
          "equation1": "x + y = y + x",
          "equation2": "y + x = x + y",
          "goldAnswer": true
        }
      ],
      "configurations": [
        {
          "position": 0,
          "cheatsheetId": "cs_01JSTAGE100000000000000001",
          "title": "Prime modulus shortcuts",
          "content": "Use symmetry before expanding the equations.",
          "contentSha256": "3e4cc70d5477ec48985d21da4ef9409c4ff71f57aaa42bea09f3521195918aa4"
        }
      ],
      "repeat": 1
    },
    "progress": {
      "completedExecutions": 1,
      "totalExecutions": 1
    },
    "credits": {
      "rate": 0.01,
      "reserved": 0.7,
      "charged": 0.4
    },
    "summary": {
      "groups": [
        {
          "modelId": "qwen3",
          "cheatsheetId": "cs_01JSTAGE100000000000000001",
          "executionCount": 1,
          "scoredExecutionCount": 1,
          "correctExecutionCount": 1,
          "failedExecutionCount": 0,
          "accuracy": 1,
          "meanCostUsd": 0.0032,
          "totalCostUsd": 0.0032,
          "totalCredits": 0.4,
          "meanElapsedMs": 1240
        }
      ]
    },
    "error": null,
    "createdAt": "2026-08-30T08:21:30Z",
    "finishedAt": "2026-08-30T08:21:32Z"
  }
}
```

## Errors

See [Errors](../../../errors.md). A missing, cross-account, or cross-competition Run returns `404 NOT_FOUND`.
