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

# Cross-venue market families for a single game, grouped by section

> Returns one game's markets grouped into sections such as game lines, halves, player props, exact score, and corners. Cross-venue families can include Polymarket, Kalshi, Predict.fun, and Hyperliquid. Each family is either a pill of named outcomes or a ladder of ordered Over/Under rungs. Tradeable legs carry provider identifiers and pricing; equivalent families and outcomes share opaque `mergeKey` and `outcomeKey` values. Combo-capable legs include their eligibility and position identifiers. Responses are briefly cached.



## OpenAPI

````yaml /openapi/data-api.yaml get /sports/game-markets
openapi: 3.1.0
info:
  title: Kairos Data API
  version: 1.0.0
  summary: >-
    The full Kairos data plane — markets, candles, trades, search, discover,
    sports, trader analytics, and PnL.
  description: |
    The Kairos Data API at `data.kairos.trade` is the platform's primary data
    plane: market metadata and prices, OHLCV candles, live venue trade proxies,
    normalized trade history, full-text search, discovery feeds, the sports
    catalog, public trader analytics, and account PnL.

    ## Authentication

    Most endpoints accept a Kairos **API key** (`X-Client-Id` + `X-Api-Key` +
    `X-Api-Secret`, all three) or a first-party session JWT. Endpoints tagged
    `public` (trader analytics, provider configs, several sports feeds) need
    no credentials at all. Some endpoints additionally require an API-key
    **scope** (`trade:read`, `position:read`) — stated per operation.

    For high-volume market-data consumption (candles/trades/metadata at
    scale), prefer the dedicated **Market Data API** at `md.kairos.trade` —
    it has higher budgets, ETag caching, and a binary candle format.

    ## Rate limits

    Rate limits use a sliding window keyed on the authenticated user (JWT
    `sub`) or, for anonymous callers, the trusted client IP. Routes belong to
    a named **bucket** (`x-kairos-bucket`) whose per-minute budget is shared
    by every route in it; routes with no bucket run under the service default
    of 100/minute. `x-kairos-rate-limit` states the bucket's compile-time
    default — operators can raise or lower a bucket at runtime, so treat the
    documented number as the baseline, not a contract. 429 responses carry
    `Retry-After` and `X-RateLimit-*`.

    ## Conventions

    - Prices are on the **0–100 cents scale** unless a field says otherwise
      (trader-analytics position/trade prices use the 0–1 scale; each field's
      description states its scale).
    - Errors: `{"detail": "<message>"}` for handler errors; FastAPI's
      standard validation envelope for 422s. Errors surfaced from a venue
      adapter instead use `{"error", "provider", "operation", "message"}` —
      see `DataProviderError`. Unhandled failures always return the generic
      500 body; internal details are logged, never returned.
    - Every request body is capped at 8 MiB service-wide (413).
  contact:
    name: Kairos
    url: https://app.kairos.trade/docs/api-reference
  termsOfService: https://kairos.trade/terms
servers:
  - url: https://data.kairos.trade
    description: Production
  - url: https://staging-data.kairos.trade
    description: Staging
security:
  - apiKeyClientId: []
    apiKeyKey: []
    apiKeySecret: []
paths:
  /sports/game-markets:
    get:
      tags:
        - Sports
      summary: Cross-venue market families for a single game, grouped by section
      description: >-
        Returns one game's markets grouped into sections such as game lines,
        halves, player props, exact score, and corners. Cross-venue families can
        include Polymarket, Kalshi, Predict.fun, and Hyperliquid. Each family is
        either a pill of named outcomes or a ladder of ordered Over/Under rungs.
        Tradeable legs carry provider identifiers and pricing; equivalent
        families and outcomes share opaque `mergeKey` and `outcomeKey` values.
        Combo-capable legs include their eligibility and position identifiers.
        Responses are briefly cached.
      operationId: getSportsGameMarkets
      parameters:
        - name: slug
          in: query
          required: false
          description: Game/event slug. Supply exactly one of `slug` or `game_id`.
          schema:
            type: string
            minLength: 1
            maxLength: 200
          example: nba-lal-bos-2026-01-15
        - name: game_id
          in: query
          required: false
          description: >-
            Provider game id. Supply exactly one of `game_id` or `slug`; this is
            preferred when the discovery response carries one.
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[A-Za-z0-9_-]+$
          example: '12345678'
      responses:
        '200':
          description: >-
            Cross-venue markets grouped into sections of pill/ladder market
            families.
          headers:
            Cache-Control:
              schema:
                type: string
                example: public, max-age=30
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SportsGameMarketsResponse'
        '400':
          description: Neither identifier was supplied, or both were supplied.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
                    example: exactly one of game_id or slug is required
        '422':
          $ref: '#/components/responses/DataValidationError'
        '429':
          $ref: '#/components/responses/DataRateLimited'
      security: []
components:
  schemas:
    SportsGameMarketsResponse:
      type: object
      required:
        - slug
        - teamA
        - teamB
        - teamALogo
        - teamBLogo
        - sport
        - sections
      properties:
        slug:
          type: string
          example: nba-lal-bos-2026-01-15
        teamA:
          type:
            - string
            - 'null'
          example: Los Angeles Lakers
        teamB:
          type:
            - string
            - 'null'
          example: Boston Celtics
        teamALogo:
          type:
            - string
            - 'null'
        teamBLogo:
          type:
            - string
            - 'null'
        sport:
          type:
            - string
            - 'null'
          example: nba
        sections:
          $ref: '#/components/schemas/SportsGameMarketsSections'
    SportsGameMarketsSections:
      type: object
      required:
        - gameLines
        - halves
        - playerProps
        - moreMarkets
        - exactScore
        - corners
      properties:
        gameLines:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketFamily'
        halves:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketFamily'
        playerProps:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketFamily'
        moreMarkets:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketFamily'
        exactScore:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketFamily'
        corners:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketFamily'
    SportsGameMarketFamily:
      type: object
      description: >-
        A market family from one venue. layout=pills carries a flat legs list;
        layout=ladder carries spread/total rungs grouped by line value.
        Polymarket families may be combo-eligible; Predict.fun families never
        are.
      required:
        - key
        - title
        - section
        - layout
        - provider
        - mergeKey
        - volume
      properties:
        key:
          type: string
          example: moneyline
        title:
          type: string
          example: Moneyline
        section:
          type: string
          enum:
            - gameLines
            - halves
            - playerProps
            - moreMarkets
            - exactScore
            - corners
        layout:
          type: string
          enum:
            - pills
            - ladder
        provider:
          type: string
          enum:
            - polymarket
            - predictfun
            - kalshi
            - hyperliquid
          description: Venue for every market in this family.
        mergeKey:
          type: string
          description: >-
            Opaque server-assigned identity for equivalent families across
            venues. Group pill families by this value rather than inferring
            identity from titles.
          example: moneyline
        volume:
          type: number
          format: double
        kind:
          type: string
          enum:
            - spread
            - total
          description: Only present when layout=ladder.
        legs:
          type: array
          description: Only present when layout=pills.
          items:
            $ref: '#/components/schemas/SportsGameMarketLeg'
        rungs:
          type: array
          description: Only present when layout=ladder.
          items:
            $ref: '#/components/schemas/SportsGameMarketRung'
    SportsGameMarketLeg:
      type: object
      required:
        - label
        - marketId
        - price
        - side
        - outcomeKey
      properties:
        label:
          type: string
          example: Celtics -4.5
        marketId:
          type: string
          example: '587234'
        price:
          type: number
          format: double
          minimum: 0
          exclusiveMaximum: 1
          description: >-
            Probability-scale price. Predict.fun may return 0 when an open
            market has no usable quote; 0 is unavailable pricing, not an
            executable price.
          example: 0.52
        side:
          type: string
          enum:
            - 'yes'
            - 'no'
          description: >-
            Contract side represented by this leg. Select the matching position
            ID for combos; a no-side leg must use noPositionId.
        outcomeKey:
          type: string
          description: >-
            Opaque server-assigned identity for equivalent outcome rows across
            venues.
          example: team:boston celtics
        comboEligible:
          type: boolean
          description: >-
            Present only when eligibility is known. Predict.fun legs always set
            false; an absent field means unknown, not false.
        yesPositionId:
          type:
            - string
            - 'null'
          description: Present when eligibility is known. Use only for side=yes.
        noPositionId:
          type:
            - string
            - 'null'
          description: Present when eligibility is known. Use only for side=no.
    SportsGameMarketRung:
      type: object
      required:
        - line
        - legs
      properties:
        line:
          type:
            - number
            - 'null'
          format: double
          example: 220.5
        legs:
          type: array
          items:
            $ref: '#/components/schemas/SportsGameMarketLeg'
  responses:
    DataValidationError:
      description: Request failed FastAPI parameter validation.
      content:
        application/json:
          schema:
            type: object
            required:
              - detail
            properties:
              detail:
                type: array
                description: >-
                  One entry per failed field, with location, message, and error
                  type.
                items:
                  type: object
                  additionalProperties: true
    DataRateLimited:
      description: >
        Rate limit exceeded for this route's sliding window, keyed on the
        session `sub` when

        authenticated and on the trusted client IP otherwise. Honor
        `Retry-After`. A per-API-key

        data ceiling (set per credential) rejects with `{"detail": "API key data
        rate limit

        exceeded"}` instead of the `error` envelope below.
      headers:
        Retry-After:
          schema:
            type: integer
        X-RateLimit-Limit:
          schema:
            type: integer
        X-RateLimit-Remaining:
          schema:
            type: integer
        X-RateLimit-Reset:
          schema:
            type: integer
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: 'Rate limit exceeded: 100 per 1 minute'
  securitySchemes:
    apiKeyClientId:
      type: apiKey
      in: header
      name: X-Client-Id
      description: >-
        Credential client id (`kairos_ck_...`). Must be sent together with
        X-Api-Key and X-Api-Secret.
    apiKeyKey:
      type: apiKey
      in: header
      name: X-Api-Key
      description: 64-char hex API key.
    apiKeySecret:
      type: apiKey
      in: header
      name: X-Api-Secret
      description: 64-char hex API secret.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.