# List shared cheatsheets

```http
GET /api/public/v1/contributor-network/items
```

**Scope**: `contributor-network.read`.

Lists active Contributor Network cheatsheets for Mathematics Distillation Stage 1. Send both fixed discriminator filters so the response has the Stage 1 cheatsheet summary shape documented on this page.

Withdrawn, hidden, deleted, or force-revoked items are never returned. Published content is omitted from this collection; fetch one item when its content is needed.

## Query parameters

| Parameter | Type | Required | Default | Description |
| :--- | :--- | :---: | :--- | :--- |
| `competitionId` | string | Yes | — | Use the Stage 1 competition ID shown in the example. |
| `kind` | string | Yes | — | Must be `cheatsheet`. |
| `scope` | string | No | `all` | `all`, `mine`, or `favorites`. |
| `search` | string | No | — | Trimmed, non-empty text of at most 200 characters. Matches public author, title, remark, or published cheatsheet text. |
| `publicCode` | string | No | — | Exact public-code filter after trimming and case normalization. |
| `sort` | string | No | `newest` | `newest` or `earliest`. |
| `cursor` | string | No | — | Opaque cursor from the previous `nextCursor`. |
| `limit` | integer | No | `25` | Page size from `1` through `100`. |

`scope=mine` selects items authored by the calling account. `scope=favorites` selects items the calling account has favorited. `search` is a case-insensitive substring match over public author display name, title, remark, and immutable published cheatsheet content; matching content is not copied into this response.

When `publicCode` is present, the response contains at most one item and `nextCursor` is always `null`; do not combine it with `cursor`. A code that does not identify an active item matching the other filters returns an empty collection.

## Ordering and pagination

`newest` orders by `publishedAt` descending; `earliest` orders ascending. Item ID is the stable tie-breaker in both directions. Reuse a cursor only with the same filters and sort order, as described in [Pagination](../../../pagination.md).

## Example request

```bash
curl "https://api.sair.foundation/api/public/v1/contributor-network/items?competitionId=mathematics-distillation-challenge-equational-theories-stage1&kind=cheatsheet&limit=25" \
  -H "Authorization: Bearer $SAIR_API_KEY"
```

## Response fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `items` | [ContributorCheatsheetSummary](#summary-fields)[] | Cheatsheet summaries. Fetch one item for its published content and parent reference. |
| `nextCursor` | string \| null | Cursor for the next page, or `null` after the final page. |

### Summary fields

| Field | Type | Description |
| :--- | :--- | :--- |
| `id` | string | Stable Contributor Network item ID. |
| `publicCode` | string | Immutable, globally unique code intended for sharing and lookup. |
| `competitionId` | string | Stage 1 competition ID. |
| `kind` | string | Always `cheatsheet`. |
| `title` | string | Published cheatsheet title. |
| `remark` | string \| null | Optional publication note. |
| `author.sairId` | string | Public SAIR account ID. |
| `author.displayName` | string | Display name snapshotted for the publication. |
| `author.avatarUrl` | string \| null | Public avatar URL, or `null` when absent. |
| `contentBytes` | integer | UTF-8 byte length of the immutable published content. |
| `contentSha256` | string | Lowercase SHA-256 digest of the published UTF-8 content bytes. |
| `favoriteCount` | integer | Accounts currently favoriting the item. |
| `viewerHasFavorited` | boolean | Whether the calling account has favorited the item. |
| `commentCount` | integer | Visible comments currently attached to the item. |
| `directChildCount` | integer | Active items that directly reference this item as their parent. |
| `publishedAt` | string | ISO 8601 UTC publication time. |

Kind-specific summaries omit unrelated fields instead of returning Stage 2 `track` or `modelId` values as `null`.

## Example response

```json
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "cn_01JSTAGE100000000000000001",
        "publicCode": "EQT01-000042",
        "competitionId": "mathematics-distillation-challenge-equational-theories-stage1",
        "kind": "cheatsheet",
        "title": "Prime modulus shortcuts",
        "remark": "Adds a reusable prime-modulus strategy.",
        "author": {
          "sairId": "U-9f7e1c00",
          "displayName": "alice",
          "avatarUrl": null
        },
        "contentBytes": 85,
        "contentSha256": "c91039d66e6d249aa522e530d982e56573972f9d00b37e1cd35971a3a4235a29",
        "favoriteCount": 4,
        "viewerHasFavorited": false,
        "commentCount": 2,
        "directChildCount": 1,
        "publishedAt": "2026-04-12T09:00:00Z"
      }
    ],
    "nextCursor": null
  }
}
```

An empty match returns `items: []` and `nextCursor: null` with `200 OK`.

## Errors

| HTTP | Code | When |
| :---: | :--- | :--- |
| `400` | `MALFORMED_BODY` | `cursor` is invalid or `limit` is outside its allowed range. |
| `404` | `NOT_FOUND` | The requested competition is unavailable. |
| `422` | `RESOURCE_FIELD_INVALID` | A discriminator, scope, search, sort, public code, or query-parameter combination is invalid. |

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