# Get competition detail

```http
GET /api/public/v1/competitions/modular-arithmetic-challenge
```

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

Returns the Modular Arithmetic Challenge metadata and live contract for formal model-reference submissions. Read it before constructing a submission so the client does not hard-code capabilities, dates, or slot limits.

This response describes competition-wide configuration. It does not indicate whether the current caller may submit; use [Get my participation](./get-my-participation.md) for enrollment, team role, and `canSubmit`.

## Example request

```bash
curl "https://api.sair.foundation/api/public/v1/competitions/modular-arithmetic-challenge" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Example response

The text, publication state, timestamps, and limits below illustrate the response shape. Use the values returned by the live endpoint.

```json
{
  "ok": true,
  "data": {
    "id": "modular-arithmetic-challenge",
    "title": "Modular Arithmetic Challenge",
    "description": "Submit a pinned public model revision for modular arithmetic evaluation.",
    "capabilities": {
      "playground": true,
      "contributorNetwork": true,
      "leaderboard": false
    },
    "leaderboardPublished": false,
    "leaderboardTeamDetailsEnabled": false,
    "submissionSpec": {
      "kind": "model-reference",
      "schema": {
        "type": "object",
        "required": ["modelName", "commitHash"],
        "properties": {
          "modelName": {
            "type": "string",
            "pattern": "^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$"
          },
          "commitHash": {
            "type": "string",
            "pattern": "^[0-9a-fA-F]{40}$"
          }
        },
        "additionalProperties": false
      },
      "metaSchema": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "maxLength": 5000
          }
        },
        "additionalProperties": false
      },
      "permission": {
        "teamRole": "owner"
      },
      "window": {
        "opensAt": "2026-04-01T00:00:00Z",
        "closesAt": "2026-09-30T23:59:59Z"
      },
      "limits": {
        "maxBytes": null,
        "maxEntries": 3
      }
    }
  }
}
```

## Response fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `id` | string | Stable competition ID used in competition-scoped routes. |
| `title` | string | Display title. |
| `description` | string \| null | Competition description, when configured. |
| `capabilities.playground` | boolean | Whether the competition exposes its Playground case-generation and answer-checking workflow. |
| `capabilities.contributorNetwork` | boolean | Whether the competition supports Contributor Network model-reference items. |
| `capabilities.leaderboard` | boolean | Whether official leaderboard results are currently published. |
| `leaderboardPublished` | boolean | Explicit leaderboard publication state. It currently matches `capabilities.leaderboard`. |
| `leaderboardTeamDetailsEnabled` | boolean | Whether a published leaderboard may include the [`teamDetails` projection](../../competitions.md#leaderboard-team-details-and-privacy). |
| `submissionSpec` | object | Live contract for formal model-reference submissions. |

### Submission specification

| Field | Description |
| :--- | :--- |
| `kind` | Submission discriminator. This competition returns `model-reference`. |
| `schema` | JSON Schema for the request's `payload`. `modelName` uses Hugging Face `owner/name` form and `commitHash` is a full 40-character SHA. Unknown payload fields are rejected. The write endpoint also verifies that the public repository revision exists. |
| `metaSchema` | JSON Schema for the optional `meta` object. This competition accepts only an optional `description` of at most 5,000 characters. |
| `permission.teamRole` | Required team role. `owner` means only the active competition-team owner may create, replace, or delete a formal slot. |
| `window.opensAt` | Formal-submission opening time as an ISO 8601 UTC string, or `null` when no opening time is configured. |
| `window.closesAt` | Formal-submission deadline as an ISO 8601 UTC string, or `null` when no deadline is configured. |
| `limits.maxBytes` | `null` because SAIR stores an external model reference rather than uploaded model bytes. |
| `limits.maxEntries` | Number of independent, current team slots. Valid slot numbers are `1` through this value; omitting `slot` selects slot `1`, and writing an occupied slot replaces it in place. |

Do not infer caller eligibility from the window or role declaration alone. Verified email, enrollment, active team membership, owner role, and current competition state are also enforced; [Get my participation](./get-my-participation.md) resolves these checks into `canSubmit` and `submitBlockedReason`.

See [Submit a model](./submit-model.md) for the request and response fields.

## Errors

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

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