# List my submissions

```http
GET /api/public/v1/competitions/igp24/submissions/mine
```

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

Returns the immutable deadline team's append-only IGP24 submission history, newest accepted batch first. Every eligible deadline-team member can read the same collection; an owner role is not required.

This endpoint returns compact batch summaries. It does not embed coefficient strings or per-polynomial results. Use [Get a submission by ID](./get-submission.md) for the detailed positional result and [Download a submission](./download-submission.md) for the original lines.

## Query parameters

| Parameter | Type | Required | Default | Description |
| :--- | :--- | :---: | :--- | :--- |
| `cursor` | string | No | — | Opaque cursor returned as `nextCursor` by the previous page. |
| `limit` | integer | No | `25` | Maximum summaries to return, from `1` through `100`. |

Omit `cursor` on the first request. Pass `nextCursor` back unchanged and only to this endpoint for the same competition and deadline team. Do not decode or construct cursors.

## Response

```ts
type ListMyIgp24SubmissionsResponse = {
  ok: true;
  data: {
    items: Igp24SubmissionSummary[];
    nextCursor: string | null;
  };
};

type Igp24SubmissionSummary = {
  submissionId: string;
  competitionId: 'igp24';
  kind: 'igp24-polynomial';
  batchId?: string;
  submissionStatus: 'queued' | 'complete';
  totalCount: number;
  submittedCount: number;
  filteredPublishedCount: number;
  queuedForEvaluationCount: number;
  queuedCount: number;
  verifiedCount: number;
  failedCount: number;
  sourcePhase: 'competition' | 'discovery_only';
  officialScoringEligible: boolean;
  meta: {
    description?: string;
  };
  createdAt: string;
  updatedAt: string;
};
```

### Submission summary

| Field | Description |
| :--- | :--- |
| `submissionId` | Stable public history-record ID. Use it with detail and download endpoints. |
| `competitionId` | Always `igp24`. |
| `kind` | Always `igp24-polynomial`. |
| `batchId` | Persistent validation batch ID. Omitted when every original position was malformed and no batch was created. |
| `submissionStatus` | `queued` while at least one original position awaits validation; otherwise `complete`. |
| `totalCount` | Original request positions, including malformed, duplicate, filtered, and evaluated positions. |
| `submittedCount` | Well-formed positions accepted by admission, including duplicates and filtered positions. |
| `filteredPublishedCount` | Positions matched to the published Open Data release and not evaluated again. |
| `queuedForEvaluationCount` | Distinct canonical polynomials admitted to asynchronous evaluation. This admission-time count is fixed. |
| `queuedCount` | Original positions still waiting for a verdict, including duplicate positions. |
| `verifiedCount` | Original positions whose current validation status is successful. |
| `failedCount` | Original positions that were malformed, mathematically invalid, or could not be evaluated. |
| `sourcePhase` | Phase frozen when the submission was accepted. New post-event records use `discovery_only`. |
| `officialScoringEligible` | Whether this record can affect official scoring. It is permanently `false` for `sourcePhase: "discovery_only"`. |
| `meta.description` | Optional stored batch note. |
| `createdAt` | ISO 8601 UTC acceptance time. |
| `updatedAt` | ISO 8601 UTC time when this visible summary last changed. |

The current-position counts satisfy:

```text
queuedCount + verifiedCount + failedCount + filteredPublishedCount = totalCount
```

`submissionStatus: "complete"` means processing is terminal, not that every polynomial verified successfully. Inspect `verifiedCount`, `failedCount`, and `filteredPublishedCount`, then use the detail endpoint when individual reasons are needed.

## Example request

```bash
curl "https://api.sair.foundation/api/public/v1/competitions/igp24/submissions/mine?limit=25" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Example response

The IDs, timestamps, and cursor below are illustrative. The first record is still processing; the second is terminal.

```json
{
  "ok": true,
  "data": {
    "items": [
      {
        "submissionId": "sub_01JIGP24000000000000000002",
        "competitionId": "igp24",
        "kind": "igp24-polynomial",
        "batchId": "igp24_lab_batch_8c1f932a72984ff9b51a63c1a62fd997",
        "submissionStatus": "queued",
        "totalCount": 3,
        "submittedCount": 2,
        "filteredPublishedCount": 1,
        "queuedForEvaluationCount": 1,
        "queuedCount": 1,
        "verifiedCount": 0,
        "failedCount": 1,
        "sourcePhase": "discovery_only",
        "officialScoringEligible": false,
        "meta": {
          "description": "Search batch 13."
        },
        "createdAt": "2026-08-31T12:45:00Z",
        "updatedAt": "2026-08-31T12:45:00Z"
      },
      {
        "submissionId": "sub_01JIGP24000000000000000001",
        "competitionId": "igp24",
        "kind": "igp24-polynomial",
        "batchId": "igp24_lab_batch_5d74fc60beae4362a31895a4a78057dc",
        "submissionStatus": "complete",
        "totalCount": 1,
        "submittedCount": 1,
        "filteredPublishedCount": 0,
        "queuedForEvaluationCount": 1,
        "queuedCount": 0,
        "verifiedCount": 1,
        "failedCount": 0,
        "sourcePhase": "discovery_only",
        "officialScoringEligible": false,
        "meta": {
          "description": "Search batch 12."
        },
        "createdAt": "2026-08-31T12:34:56Z",
        "updatedAt": "2026-08-31T12:40:03Z"
      }
    ],
    "nextCursor": "cursor_igp24_history_next_page"
  }
}
```

## Collection behavior

- History is append-only. A new persistent submission creates a new `submissionId`; it never replaces an older record.
- Items are ordered by server acceptance order, newest first. Verification updates do not reorder existing records.
- A cursor continues strictly after the last item of the previous page. Newer submissions accepted during traversal do not appear in later pages; start a new traversal to include them.
- Verification summaries are current when each page is generated, so an existing item's counts and `updatedAt` may advance between requests without changing its position.
- A caller with no eligible deadline team, or a deadline team with no history, receives `200 OK` with `items: []` and `nextCursor: null`.
- `nextCursor: null` means the traversal is complete.

## Legacy compatibility

Existing clients may continue to use:

```http
GET /api/public/v1/competitions/igp24/submissions/me?cursor={cursor}&limit={limit}
```

For IGP24, the legacy route uses the same deadline-team visibility, summary shape, ordering, and pagination. New integrations should use `/submissions/mine`.

## Errors

| HTTP | Code | When |
| :---: | :--- | :--- |
| `400` | `MALFORMED_BODY` | `cursor` is invalid, altered, or belongs to another traversal. |
| `404` | `NOT_FOUND` | IGP24 does not exist or is not publicly visible. |
| `422` | `RESOURCE_FIELD_INVALID` | `limit` is not an integer from `1` through `100`. |
| `503` | `IGP24_SERVICE_UNAVAILABLE` | A current and complete batch summary cannot be produced. |

Missing deadline-team context and an empty history are successful empty results, not endpoint errors. See [Errors](../../../errors.md) for shared authentication, scope, and account-rate-limit errors.
