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

# Create free rounds campaign

> Creates the container that bonus codes attach to. A campaign fixes the stake per round, the currency, the eligible games and the validity window.

Create the campaign first, then issue one bonus code per player with [Create free rounds bonus code](/api-reference/customer/create-bonus-code).



## OpenAPI

````yaml api-reference/customer.json POST /api/v1/free-rounds/campaigns
openapi: 3.1.0
info:
  title: Zero-Dash Customer API
  version: 1.0.0
  summary: >-
    Server-to-server API that operators call to list games, launch sessions and
    manage free rounds.
  description: >-
    Endpoints that **you (the operator) call on Zero-Dash**.


    Every request is authenticated with an HMAC-SHA512 signature over
    `apiPath|timestamp|data`. See [Request signature](/security/signature) for
    the algorithm and ready-made clients.


    All endpoints are RESTful, accept and return JSON, and are served over HTTPS
    with a valid TLS certificate.
  contact:
    name: Zero-Dash Integrations
    email: info@zerodash.studio
servers:
  - url: https://{host}
    description: The exact host is assigned to you during onboarding.
    variables:
      host:
        default: api.zerodash.studio
        description: >-
          Base host provided by Zero-Dash. A separate staging host is issued for
          certification.
security:
  - operatorId: []
    signature: []
    timestamp: []
tags:
  - name: Games
    description: Discover the game catalogue and open a player session.
  - name: Free Rounds
    description: Create and inspect free round campaigns and bonus codes.
paths:
  /api/v1/free-rounds/campaigns:
    post:
      tags:
        - Free Rounds
      summary: Create free rounds campaign
      description: >-
        Creates the container that bonus codes attach to. A campaign fixes the
        stake per round, the currency, the eligible games and the validity
        window.


        Create the campaign first, then issue one bonus code per player with
        [Create free rounds bonus
        code](/api-reference/customer/create-bonus-code).
      operationId: createFreeRoundsCampaign
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCampaignRequest'
            example:
              campaignCode: XMAS-2026
              campaignName: XMAS 2026
              amount: 2.5
              currencyCode: USD
              startDate: '2026-05-15T11:25:16Z'
              endDate: '2026-08-15T11:25:16Z'
              gameSlugs:
                - lucky-duck
              maxRounds: 1
      responses:
        '201':
          description: Created. No response body.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    CreateCampaignRequest:
      type: object
      required:
        - campaignCode
        - campaignName
        - amount
        - currencyCode
        - startDate
        - endDate
        - gameSlugs
      properties:
        campaignCode:
          type: string
          description: Unique campaign identifier chosen by you.
        campaignName:
          type: string
          description: Display name of the campaign.
          examples:
            - XMAS 2026
        amount:
          oneOf:
            - type: number
            - type: string
          description: >-
            Stake redeemed by the player in **one** free round, as a decimal.
            Parsed as a Decimal on our side — send it as a JSON string if your
            language cannot represent the value exactly.
          examples:
            - 2.5
        currencyCode:
          type: string
          description: ISO-4217 currency of `amount`.
          examples:
            - USD
        startDate:
          type: string
          format: date-time
          description: Start of the redemption window (ISO-8601 UTC).
        endDate:
          type: string
          format: date-time
          description: End of the redemption window (ISO-8601 UTC).
        gameSlugs:
          type: array
          description: >-
            Games where the free rounds can be played. All of them must support
            free rounds.
          items:
            type: string
        maxRounds:
          type: integer
          minimum: 1
          description: >-
            How many rounds a single bonus code grants. Each round redeems the
            full campaign `amount` (5 USD × 2 rounds = 10 USD). Set it here or
            per bonus code.
    Error:
      type: object
      properties:
        message:
          type: string
          description: Human-readable explanation of the failure.
  responses:
    BadRequest:
      description: Invalid request payload or query format.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: invalid currency code
    Unauthorized:
      description: >-
        Missing, malformed, stale or mismatched signature — or a source IP
        outside your allowlist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: invalid signature
    InternalError:
      description: Internal server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: internal error
  securitySchemes:
    operatorId:
      type: apiKey
      in: header
      name: X-Operator
      description: Your operator identifier, issued by Zero-Dash during onboarding.
    signature:
      type: apiKey
      in: header
      name: X-Zd-Signature
      description: >-
        Hex-encoded `HMAC-SHA512(apiPath|timestamp|data, secretKey)`. See
        [Request signature](/security/signature).
    timestamp:
      type: apiKey
      in: header
      name: X-Zd-Timestamp
      description: >-
        Unix time in **milliseconds**, and the exact value signed. Requests
        older than 5 minutes are rejected.

````