# pics.2bit.challenge.list

> Published by [2bit.pics](https://lexicon.garden/identity/did:plc:sbmntiflmknij2axeck3w6u7)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:sbmntiflmknij2axeck3w6u7/pics.2bit.challenge.list)
- [Documentation](https://lexicon.garden/lexicon/did:plc:sbmntiflmknij2axeck3w6u7/pics.2bit.challenge.list/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:sbmntiflmknij2axeck3w6u7/pics.2bit.challenge.list/examples)

## Definitions

### `pics.2bit.challenge.list`

**Type**: `record`

A photo challenge: a named set of prompts, published by its organizer, that anyone can enter by writing a pics.2bit.challenge.entry for one of their own photos. The record key is a short readable slug (e.g. `gbcamtober-2026`) and is only unique within the organizer's repo, so a challenge is always named by organizer and key together - in URLs as `<organizer handle>/<rkey>`, in records by its at-uri.

**Key**: `any`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `createdAt` | `string` (datetime) | Yes |  |
| `description` | `string` | No | The rules or intro text, shown on the challenge page. |
| `endsAt` | `string` (datetime) | Yes | When the challenge closes, exclusive. Must be after `startsAt`. |
| `hashtag` | `string` | No | The challenge's hashtag, without the leading `#`, e.g. `GBCamtober2026`. Clients add it to the caption of a photo entered into the challenge, so entries also reach the tag's page and feed. Must be a tag under this app's hashtag grammar (see pics.2bit.feed.photo#caption); a list whose hashtag isn't one is indexed as if it had none. |
| `name` | `string` | Yes | Display name, e.g. "GBCamtober 2026". |
| `prompts` | `array` | Yes | The prompts, in display order. Keys must be unique within the list. |
| `startsAt` | `string` (datetime) | Yes | When the challenge opens. Together with `endsAt` this decides whether the challenge is active and which prompt is today's; it never limits when an entry can be written - entering late is allowed. |

### `pics.2bit.challenge.list#prompt`

**Type**: `object`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `key` | `string` | Yes | Stable identifier that entries point at, e.g. `6`. Letters, digits, `-` and `_` only - this app's AppView skips a list with any other key. No padding is needed for order: the array order is the display order, and numeric keys compare naturally. Keep keys fixed once entries exist; titles can change freely. |
| `title` | `string` | Yes | The prompt as shown, e.g. "Duck". |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "A photo challenge: a named set of prompts, published by its organizer, that anyone can enter by writing a pics.2bit.challenge.entry for one of their own photos. The record key is a short readable slug (e.g. `gbcamtober-2026`) and is only unique within the organizer's repo, so a challenge is always named by organizer and key together - in URLs as `<organizer handle>/<rkey>`, in records by its at-uri.",
      "key": "any",
      "record": {
        "properties": {
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "description": "The rules or intro text, shown on the challenge page.",
            "maxGraphemes": 1000,
            "maxLength": 10000,
            "type": "string"
          },
          "endsAt": {
            "description": "When the challenge closes, exclusive. Must be after `startsAt`.",
            "format": "datetime",
            "type": "string"
          },
          "hashtag": {
            "description": "The challenge's hashtag, without the leading `#`, e.g. `GBCamtober2026`. Clients add it to the caption of a photo entered into the challenge, so entries also reach the tag's page and feed. Must be a tag under this app's hashtag grammar (see pics.2bit.feed.photo#caption); a list whose hashtag isn't one is indexed as if it had none.",
            "maxLength": 64,
            "type": "string"
          },
          "name": {
            "description": "Display name, e.g. \"GBCamtober 2026\".",
            "maxGraphemes": 64,
            "maxLength": 640,
            "minLength": 1,
            "type": "string"
          },
          "prompts": {
            "description": "The prompts, in display order. Keys must be unique within the list.",
            "items": {
              "ref": "#prompt",
              "type": "ref"
            },
            "maxLength": 64,
            "minLength": 1,
            "type": "array"
          },
          "startsAt": {
            "description": "When the challenge opens. Together with `endsAt` this decides whether the challenge is active and which prompt is today's; it never limits when an entry can be written - entering late is allowed.",
            "format": "datetime",
            "type": "string"
          }
        },
        "required": [
          "name",
          "startsAt",
          "endsAt",
          "prompts",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "prompt": {
      "properties": {
        "key": {
          "description": "Stable identifier that entries point at, e.g. `6`. Letters, digits, `-` and `_` only - this app's AppView skips a list with any other key. No padding is needed for order: the array order is the display order, and numeric keys compare naturally. Keep keys fixed once entries exist; titles can change freely.",
          "maxLength": 32,
          "minLength": 1,
          "type": "string"
        },
        "title": {
          "description": "The prompt as shown, e.g. \"Duck\".",
          "maxGraphemes": 64,
          "maxLength": 640,
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "key",
        "title"
      ],
      "type": "object"
    }
  },
  "id": "pics.2bit.challenge.list",
  "lexicon": 1
}
```
