# List my submissions

```http
GET /api/public/v1/competitions/lean-kernel-challenge/submissions/mine
```

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

Returns the current effective entrant's current-visible formal candidates, newest first. An individual entrant sees their own candidates. Active members of a team entrant see the same shared team candidates.

The list contains active candidates and candidates selected for final evaluation. Replaced, withdrawn, or invalidated candidates are no longer available through this endpoint or participant downloads.

The endpoint remains readable after the competition closes. A draft or otherwise non-public competition returns `404 NOT_FOUND`; formal result fields follow the separate result-disclosure rules below.

## Query parameters

| Parameter | Type, default, and meaning |
| :--- | :--- |
| `cursor` | **Optional string.** Opaque `nextCursor` returned by the previous page. Do not parse, construct, or modify it. |
| `limit` | **Optional integer, default `25`.** Number of current-visible candidates to return, from `1` through `100`. |

Results are ordered by `createdAt` descending, then `submissionId` descending. The cursor belongs to that ordering. The visible candidate set may change when a new submission replaces an older candidate or the entrant changes; restart from the first page when refreshing the complete list.

## Example request

```bash
export SAIR_API_BASE="https://api.sair.foundation/api/public/v1"

curl --get "$SAIR_API_BASE/competitions/lean-kernel-challenge/submissions/mine" \
  --data-urlencode "limit=25" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Response

```ts
type FormalSubmissionStatus =
  | "submitted"
  | "queued"
  | "evaluating"
  | "accepted"
  | "rejected"
  | "error"
  | "disqualified";

type ListLeanSubmissionsResponse = {
  ok: true;
  data: {
    items: Array<{
      submissionId: string;
      problem: string;
      createdAt: string;
      status: FormalSubmissionStatus;
      note?: string;
      contractVersion: string;
      snapshotId: string;
      canonicalSourceTreeSha256: string;
      rawUploadSha256: string;
      manifestSha256: string;
      score?: string;
      reason?: string;
      completedAt?: string;
      metrics?: {
        mode?: string;
        checker?: string;
        instructionMedian?: string;
        wallTimeMs?: number;
        headlineN?: string;
      };
    }>;
    nextCursor: string | null;
  };
};
```

### Submission fields

| Field | Meaning |
| :--- | :--- |
| `submissionId` | Stable formal-submission ID used by participant downloads and any published result. |
| `problem` | Exact Problem ID associated with this candidate. |
| `createdAt` | ISO 8601 UTC creation timestamp. |
| `status` | Current participant-visible formal lifecycle state, described below. |
| `note` | Stored submission note. Omitted when no non-empty note was supplied. |
| `contractVersion` | Opaque rules and workspace contract frozen with the source snapshot. |
| `snapshotId` | Stable ID of the immutable formal source snapshot. |
| `canonicalSourceTreeSha256` | SHA-256 digest of the canonical source-tree representation. |
| `rawUploadSha256` | SHA-256 digest of the decoded `payload.text` UTF-8 bytes stored as `Submission.lean`. |
| `manifestSha256` | SHA-256 digest of the canonical source manifest. |
| `score` | Published formal score summary, when the approved disclosure includes one. |
| `reason` | Published, sanitized rejection, infrastructure-error, or disqualification reason. It never contains hidden inputs or raw evaluator output. |
| `completedAt` | ISO 8601 UTC completion timestamp for a published terminal result. |
| `metrics` | Published, sanitized structured measurements. Fields are omitted when they were not recorded or are outside the approved disclosure. |

The IDs, version, digest values, and timestamp below are illustrative. Use the live response.

```json
{
  "ok": true,
  "data": {
    "items": [
      {
        "submissionId": "42",
        "problem": "fib",
        "createdAt": "2026-08-31T12:34:56Z",
        "status": "submitted",
        "note": "Fast-doubling candidate",
        "contractVersion": "7a0abb4a80d635740a91aed1894f714dfbb82edd",
        "snapshotId": "42",
        "canonicalSourceTreeSha256": "8c04fd5b1f4c20a1dfd19cb46bcb4aa12c589712e072024920d444852a17ff05",
        "rawUploadSha256": "9d72b952efa332d915c3dd7f27adc6028f4c85b68d910570208b7377e169fa48",
        "manifestSha256": "24fcb69b9f98ac0d67bdab4ff6e5f03b0bbbd772e63a78bdd6db460fce3f275d"
      }
    ],
    "nextCursor": null
  }
}
```

## Status and result visibility

| Status | Meaning |
| :--- | :--- |
| `submitted` | The immutable candidate exists and formal evaluation has not started. |
| `queued` | This candidate was frozen as the final entry for its Problem and is waiting for formal evaluation. |
| `evaluating` | Formal evaluation is in progress. No partial score or hidden evaluation detail is exposed. |
| `accepted` | Formal evaluation completed successfully. Published score and measurement fields may be present. |
| `rejected` | The source did not satisfy the formal competition rules and is not rank-eligible. A sanitized `reason` may be present. |
| `error` | Evaluation encountered an infrastructure or service failure. This is not a participant failure and may be reevaluated. |
| `disqualified` | An authorized competition operation removed the result from ranking eligibility. |

Formal evaluation uses only the final candidate frozen after the cutoff. Playground Run status, verdicts, and measurements never appear in this endpoint and never become formal results.

Result-bearing terminal states and their `score`, `reason`, `completedAt`, and `metrics` fields are returned only after the applicable formal result disclosure is published. Until then, the endpoint exposes only the participant-safe lifecycle state and immutable source provenance.

### Published metrics

Every metrics field is optional:

| Field | Meaning |
| :--- | :--- |
| `mode` | Published measurement mode. |
| `checker` | Published checker identifier. |
| `instructionMedian` | Median instruction count as a decimal string, preserving integers beyond JavaScript's safe range. |
| `wallTimeMs` | Published wall-clock diagnostic in milliseconds. |
| `headlineN` | Published headline input as a decimal string. |

`nextCursor` is `null` after the final page. `items: []` means the current entrant has no visible formal candidate.

## Errors

- `400 INVALID_LIMIT` — `limit` is not an integer from `1` through `100`.
- `400 INVALID_CURSOR` — `cursor` is not a valid opaque cursor issued by this endpoint.
- `403 ENROLL_REQUIRED` — The caller has not completed competition enrollment.
- `404 NOT_FOUND` — The competition does not exist or is not publicly visible.
- `502 PLATFORM_UNAVAILABLE` — The current entrant or competition visibility could not be verified.
- `502 PLATFORM_RESPONSE_INVALID` — The platform returned an invalid participant context.
- `502 SERVICE_UNAVAILABLE` — The authoritative formal-submission service is unavailable or returned an inconsistent response.

See [Errors](../../../errors.md) for shared authentication, scope, and account-rate-limit errors.
