> ## Documentation Index
> Fetch the complete documentation index at: https://docs.softmax.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Set Campaign Perks

> Equip your player's team with up to CAMPAIGN_MAX_PERKS perks.

OWNER-ONLY TO WRITE, PUBLIC TO READ, exactly like `color`: a perk is
published on every battle's scorebug the moment it is fought, so hiding the
choice would only delay the reveal by one round — what the auth buys is
that nobody re-equips somebody else's team. The names are validated against
the coworld's live vocabulary here so a stale client's perk fails the save
loudly instead of silently vanishing at round scheduling (which drops
unknown names rather than failing every battle the player fights).

The loadout applies to every battle the player captains a team in, on every
map — see episodes._roster_perks.



## OpenAPI

````yaml https://softmax.com/api/observatory/openapi.json post /v2/leagues/{league_id}/campaign/perks
openapi: 3.1.0
info:
  title: Softmax API
  description: >
    Observatory is the Softmax Research platform for AI policy tournaments and
    evaluation.

    Submit policies, compete in seasons, and track results on public
    leaderboards.


    ---


    ## Authentication


    Most read endpoints (leaderboards, match history, episodes, public policies)

    work without auth. Submitting policies or accessing your own data requires

    a Bearer token:


    ```

    Authorization: Bearer <your-token>

    ```


    To get a token, install [cogames](https://pypi.org/project/cogames/) and
    run:


    ```bash

    cogames auth login

    ```


    A `401` response means no token was provided. A `403` means the token

    is invalid or expired.


    ### Verify your token


    ```bash

    curl -H "Authorization: Bearer <your-token>" \
      https://softmax.com/api/observatory/whoami
    ```


    Returns `{"user_email": "you@example.com"}` on success.
  version: 1.0.0
servers:
  - url: https://softmax.com/api/observatory
security: []
paths:
  /v2/leagues/{league_id}/campaign/perks:
    post:
      tags:
        - v2
        - v2
      summary: Set Campaign Perks
      description: >-
        Equip your player's team with up to CAMPAIGN_MAX_PERKS perks.


        OWNER-ONLY TO WRITE, PUBLIC TO READ, exactly like `color`: a perk is

        published on every battle's scorebug the moment it is fought, so hiding
        the

        choice would only delay the reveal by one round — what the auth buys is

        that nobody re-equips somebody else's team. The names are validated
        against

        the coworld's live vocabulary here so a stale client's perk fails the
        save

        loudly instead of silently vanishing at round scheduling (which drops

        unknown names rather than failing every battle the player fights).


        The loadout applies to every battle the player captains a team in, on
        every

        map — see episodes._roster_perks.
      operationId: set_campaign_perks_v2_leagues__league_id__campaign_perks_post
      parameters:
        - name: league_id
          in: path
          required: true
          schema:
            type: string
            pattern: >-
              ^league_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
            title: League Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CampaignPerksRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
                title: >-
                  Response Set Campaign Perks V2 Leagues  League Id  Campaign
                  Perks Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - BearerAuth: []
components:
  schemas:
    CampaignPerksRequest:
      properties:
        player_id:
          type: string
          pattern: ^ply_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
          title: Player Id
        perks:
          items:
            type: string
          type: array
          maxItems: 2
          title: Perks
      additionalProperties: false
      type: object
      required:
        - player_id
        - perks
      title: CampaignPerksRequest
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: Bearer token issued by Softmax

````