# Get leaderboard

```http
GET /api/public/v1/competitions/mathematics-distillation-challenge-equational-theories-stage1/leaderboard
```

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

Returns the cursor-paginated public Stage 1 team ranking. Higher scores rank first. Before publication, the endpoint returns an empty page and does not reveal provisional rows.

## Query parameters

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

## Response fields

| Field | Type | Description |
| :---- | :--- | :---------- |
| `items` | [Leaderboard entry](#leaderboard-entry)[] | Current page of published team results. |
| `nextCursor` | string \| null | Opaque cursor for the next page, or `null` at the end. |
| `meta.published` | boolean | Whether public leaderboard results are available. |
| `meta.publishedAt` | string \| null | ISO 8601 UTC publication time, when recorded. |

### Leaderboard entry

| Field | Type | Description |
| :---- | :--- | :---------- |
| `rank` | integer | One-based competition rank. Equal scores share a rank, so the next rank may skip a number. |
| `teamNumber` | string \| null | Assigned public team number, when available. |
| `teamName` | string | `teamNumber` when assigned; otherwise a stable anonymous display name such as `Team A1B2C3`. |
| `score` | number | Published official score. Higher values rank first. |
| `teamDetails` | [TeamMemberDetails](../../competitions.md#leaderboard-team-details-and-privacy) \| null | Consent-controlled public team projection, or `null`. |

Stage 1 leaderboard entries do not include a team ID. Treat `teamName` as display text; it is not a stable identifier.

## Example request

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

## Example response

```json
{
  "ok": true,
  "data": {
    "items": [
      {
        "rank": 1,
        "teamNumber": "MDC1-T00001",
        "teamName": "MDC1-T00001",
        "score": 0.941,
        "teamDetails": null
      }
    ],
    "nextCursor": null,
    "meta": {
      "published": true,
      "publishedAt": "2026-10-01T00:00:00Z"
    }
  }
}
```

When results are unpublished, the response is:

```json
{
  "ok": true,
  "data": {
    "items": [],
    "nextCursor": null,
    "meta": {
      "published": false,
      "publishedAt": null
    }
  }
}
```

`teamDetails` is always present on a published entry and is `null` when the projection is disabled or the team has not made it public. When paging a published leaderboard, an invalid cursor returns `400 MALFORMED_BODY`. Follow the shared [cursor traversal rules](../../../pagination.md); no total count is returned.
