# List Playground models

```http
GET /api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage2/playground/models
```

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

Returns the models currently executable by a Stage 2 solver in a practice Run. Use the returned `id` to select a model in a Run request.

Fetch this catalog shortly before [creating a Run](./create-playground-run.md). A model is accepted only while it appears in this response, so do not hard-code an ID copied from an example.

## Availability and selection

Every returned model is both enabled for this competition and backed by an available Playground runtime configuration when the response is generated. Run creation revalidates the selection because availability can change after this read.

- Send one or more returned IDs in `allowedModels` to restrict which models the solver may call.
- Omit `allowedModels` to snapshot every model that is available when the Run is created.
- If no models are available, this endpoint returns an empty page and Run creation returns `422 RUN_PARAMS_INVALID`.

Models are returned in the competition-defined display order, with model ID as the stable tie-breaker. Follow the shared [cursor traversal rules](../../../pagination.md).

## Credit metadata

`meta.creditsPerProblem` is the number of credits reserved for each selected problem when a Stage 2 Run is created. The model selection does not multiply this reservation: a Run containing 10 problems reserves `10 × creditsPerProblem`, whether `allowedModels` contains one model or several.

`meta.creditRate` is the number of US dollars represented by one credit. It is a conversion rate, not the credit charge for one problem. Use the live response rather than the example values below.

## Query parameters

| Parameter | Type | Required | Default | Description |
| :--- | :--- | :---: | :--- | :--- |
| `cursor` | string | No | — | Opaque cursor from the previous `nextCursor`. |
| `limit` | integer | No | `25` | Page size from `1` through `100`. |

## Response fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `items` | [PlaygroundModel](#playground-model-fields)[] | Models currently accepted in Stage 2 `allowedModels`. |
| `nextCursor` | string \| null | Cursor for the next page, or `null` after the final page. |
| `meta.creditsPerProblem` | number | Positive credit reservation for each problem included in a new Run. |
| `meta.creditRate` | number | Positive USD-per-credit conversion rate. |

### Playground model fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `id` | string | Case-sensitive public model ID to send in `allowedModels`. |
| `name` | string | Human-readable model name. |

## Example request

```bash
curl "https://api.sair.foundation/api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage2/playground/models?limit=25" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Example response

```json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "openai-gpt-oss-120b",
        "name": "OpenAI GPT-OSS 120B"
      }
    ],
    "nextCursor": null,
    "meta": {
      "creditsPerProblem": 0.1,
      "creditRate": 0.001
    }
  }
}
```

An empty catalog returns `200 OK` with `items: []` and `nextCursor: null`; the `meta` object is still present.

## Errors

See [Errors](../../../errors.md). An invalid `cursor` or `limit` returns `400 MALFORMED_BODY`. An unavailable competition returns `404 NOT_FOUND`.
