# List my submissions

```http
GET /api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage2/submissions/mine
```

**Scope**: `competition.read`.

Returns every current Stage 2 `(track, modelId)` entry belonging to the caller's active competition team. Any active team member may read the collection, including each stored `solverCode`; the owner role is required only for writes.

This is a bounded current-state collection, not submission history. Replacing a pair updates its stable entry instead of appending another item.

## Example request

```bash
curl "https://api.sair.foundation/api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage2/submissions/mine" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Example response

```json
{
  "ok": true,
  "data": {
    "items": [
      {
        "submissionId": "sub_01JSTAGE200000000000000001",
        "competitionId": "mathematics-distillation-challenge-equational-theories-stage2",
        "kind": "solver-participation",
        "payload": {
          "track": "solo",
          "modelId": "openai-gpt-oss-120b",
          "solverCode": "import json\ncontext = json.loads(input())\nprint(json.dumps({\"call\": \"judge\", \"verdict\": \"true\", \"code\": \"by rfl\"}), flush=True)\njudge_result = json.loads(input())"
        },
        "meta": {
          "description": "Reflexive Solo baseline."
        },
        "createdAt": "2026-05-18T12:34:56Z",
        "updatedAt": "2026-05-18T12:34:56Z"
      },
      {
        "submissionId": "sub_01JSTAGE200000000000000002",
        "competitionId": "mathematics-distillation-challenge-equational-theories-stage2",
        "kind": "solver-participation",
        "payload": {
          "track": "solo",
          "modelId": "google-gemma-4-31b-it",
          "solverCode": "import json\ncontext = json.loads(input())\nprint(json.dumps({\"call\": \"judge\", \"verdict\": \"true\", \"code\": \"by rfl\"}), flush=True)\njudge_result = json.loads(input())"
        },
        "meta": {},
        "createdAt": "2026-05-18T12:40:00Z",
        "updatedAt": "2026-05-18T12:40:00Z"
      }
    ],
    "nextCursor": null
  }
}
```

The short solvers illustrate the stored response shape, not a general competition strategy.

## Response fields

| Field | Type | Description |
| :---- | :--- | :---------- |
| `items` | [Solver participation submission](#solver-participation-submission)[] | Complete current collection for the caller's active team. |
| `nextCursor` | null | Always `null`; this endpoint is not paginated. |

### Solver participation submission

| Field | Type | Description |
| :---- | :--- | :---------- |
| `submissionId` | string | Stable public ID for this team, track, and model combination. |
| `competitionId` | string | Stage 2 competition ID. |
| `kind` | `solver-participation` | Submission discriminator. |
| `payload.track` | string | Track selected for this entry. |
| `payload.modelId` | string | Model selected for this entry. Together with `track`, it identifies the entry. |
| `payload.solverCode` | string | Exact stored Python source. |
| `meta.description` | string | Optional submission note; omitted when absent. |
| `meta.contributorNetworkItemId` | string | Optional Contributor Network attribution; omitted when absent. |
| `createdAt` | string | ISO 8601 UTC creation time of this stable pair entry. |
| `updatedAt` | string | ISO 8601 UTC time of its latest accepted replacement. |

## Collection behavior

- Entries follow the competition catalog's track order, then model order. An entry whose track or model is no longer in the live catalog remains readable and sorts after current catalog entries, using its track and model IDs as stable fallbacks.
- A caller with no active team, or an active team with no current entries, receives `200 OK` with `items: []` and `nextCursor: null`.
- Team membership is evaluated when this request is made. A participant who has left the team can no longer read that team's collection.
- Use [Get a submission by ID](./get-submission.md) or [Download a submission](./download-submission.md) after selecting an item. Do not reconstruct a submission ID from its track or model.

## Legacy compatibility

Existing clients may still use the direct legacy selector:

```http
GET /api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage2/submissions/me?track={track}&modelId={modelId}
```

`track` is required; `modelId` is optional only for backward compatibility. The endpoint returns one [Solver participation submission](#solver-participation-submission) directly in `data`:

| Selection | Result |
| :-------- | :----- |
| `track` and `modelId` | Returns that exact pair, or `404 NOT_FOUND` when it does not exist for the active team. |
| `track` only, no entries | Returns `404 NOT_FOUND`. |
| `track` only, exactly one model entry | Returns that entry. |
| `track` only, multiple model entries | Returns `409 AMBIGUOUS_SUBMISSION_SELECTION`; retry with `modelId` or use `/submissions/mine`. |

New integrations should use `/submissions/mine` and select by the returned `submissionId`.

## Errors

| HTTP | Code | When |
| :---: | :--- | :--- |
| `404` | `NOT_FOUND` | The competition is not publicly visible. |

Missing team context and an empty collection are successful empty results, not endpoint errors. Shared authentication, scope, and rate-limit errors are documented in [Errors](../../../errors.md).
