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

# `POST /user/season-claim/redeem` — verifies a season-claim voucher issued
by the testnet side and redeems it (merging the testnet root's XP into
the caller's mainnet account), or dry-runs the entitlement when
`preview` is set. Root-only, same as the issue side.



## OpenAPI

````yaml /api-reference/openapi.json post /api/v1/user/season-claim/redeem
openapi: 3.1.0
info:
  title: ekiden-gateway
  description: >-
    API Gateway and WebSocket proxy based on Axum and Utoipa, handling auth,
    rate limiting, and connection buffering.
  license:
    name: ''
  version: 0.1.1
servers:
  - url: https://api.ekiden.fi/
    description: Production
  - url: https://api.cnt.ekiden.fi/
    description: Testnet
  - url: https://api.canton.ekiden.fi/
    description: Staging
security: []
paths:
  /api/v1/user/season-claim/redeem:
    post:
      tags:
        - User
      summary: >-
        `POST /user/season-claim/redeem` — verifies a season-claim voucher
        issued

        by the testnet side and redeems it (merging the testnet root's XP into

        the caller's mainnet account), or dry-runs the entitlement when

        `preview` is set. Root-only, same as the issue side.
      operationId: redeem_season_claim
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RedeemSeasonClaimRequest'
        required: true
      responses:
        '200':
          description: Redemption outcome
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RedeemSeasonClaimResponse'
      security:
        - bearer_auth: []
components:
  schemas:
    RedeemSeasonClaimRequest:
      type: object
      description: |-
        `POST /season-claim/redeem` — redeem (or, with `preview`, dry-run) a
        season-claim voucher.
      required:
        - voucher
      properties:
        preview:
          type: boolean
        voucher:
          type: string
    RedeemSeasonClaimResponse:
      type: object
      description: '`status` is one of `"preview"`, `"granted"`, or `"already_claimed"`.'
      required:
        - status
        - merged_xp
        - multiplier_bps
      properties:
        merged_xp:
          type: integer
          format: int64
        multiplier_bps:
          type: integer
          format: int32
        status:
          type: string
  securitySchemes:
    bearer_auth:
      type: http
      scheme: bearer

````