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

# Get all futures markets (not yet available)

> Returns the futures markets present in the OddsPAPI metadata cache, grouped by `(sportId, futureMarketId)`, each with the futures (season × market) that carry it. Sorted by `sportId`, then `futureMarketId`.

This is the futures counterpart of `GET /fixtures/markets`, but it is **derived from the cached futures themselves** — OddsPAPI publishes no separate futures-market catalogue. Consequences worth knowing:

- It lists what is currently cached, not every market that has ever existed.
- `marketName` / `marketType` are `null` unless OddsPAPI puts them on the future row. They are read, never inferred.
- It does **not** list outcomes. A futures selection is `(futureOutcomeId, participantId)`, and the available pairs come from the odds on `GET /futures/betslip`, not from a market definition: on a participant-keyed market the outcome id is always the sentinel `0` and the *participants* are the selections.

> **Returns HTTP 501 today.** ABP implements the OddsPAPI **db-v2** futures identifier scheme only, and the feed still publishes the current-state one, so futures ingest is switched off and nothing is cached. This endpoint answers `501` rather than an empty `200` that would read as "no odds" — and your request is **validated first**, so a malformed `futureId` (a bare integer from the current feed is refused) or a selection pair that names nothing is still a `400` even today. The response shape below is what it serves the day futures turn on (expected late 2026-10).



## OpenAPI

````yaml /zh/abp-api/openapi.json get /futures/markets
openapi: 3.1.0
info:
  title: ABP v2 - Automated Bet Placing API
  description: >

    Place bets across 36 bookmakers through a single API.


    ## Authentication


    All endpoints require the `x-api-key` header (except `/health`, `/ready`,
    `/status`, `/metrics`).


    **Swagger UI**: Click the **Authorize** button (lock icon) at the top right,
    enter your API key, and click **Authorize**.


    ## Two surfaces: fixtures and futures


    Selections come in two kinds and each has its own path prefix, so no
    endpoint has to guess which identifiers it was given:


    | | Fixtures | Futures (outrights) |

    |---|---|---|

    | Prefix | `/fixtures/*` | `/futures/*` |

    | Selection | `fixtureId` + `outcomeId` + `playerId` | `futureId` +
    `futureOutcomeId` + `participantId` |

    | Status | fully live | reads live; placement and order/bet reads answer
    `501` |


    Each surface **rejects the other's identifiers** with `422`. The pre-split
    unprefixed paths (`/betslip`, `/place-orders`, `/orders`, `/bets`,
    `/markets`, …) still work unchanged and are listed here as deprecated
    aliases of their `/fixtures/*` equivalents.


    `/accounts`, `/bookmakers`, `/positions` and `/pnl` name no selection and
    stay unprefixed.


    ## Quick Start


    1. **List your accounts**: `GET /accounts`

    2. **Get live odds**: `GET
    /fixtures/betslip?fixtureId=...&outcomeId=...&playerId=0`

    3. **Place an order**: `POST /fixtures/place-orders`

    4. **Track results**: `GET /fixtures/orders` or subscribe to WebSocket
    updates


    ## WebSocket


    Connect to `/ws` for real-time order, bet, and settlement updates.


    ```json

    {"type": "login", "apiKey": "your-api-key", "channels": []}

    ```


    Send an empty `channels` array to receive all updates. Available channels:
    `orders`, `bets`, `settlements`, `accounts`, `balance`, `betslip`,
    `fixtures`, `currencies`, `status`, `emergency`.


    Send `{"type": "ping"}` every 30 seconds to keep the connection alive.
  version: '2.0'
servers:
  - url: https://v2.55-tech.com
    description: Production
security:
  - apiKey: []
tags:
  - name: Orders
    description: Place, retrieve, and cancel betting orders on fixtures
  - name: Bets
    description: Query individual bets placed with bookmakers
  - name: Betslip
    description: Get live odds and metadata for fixtures
  - name: Markets
    description: Get available markets and odds types
  - name: Futures
    description: >-
      Outright markets, keyed by futureId + (futureOutcomeId, participantId).
      Reads are live; placement and order/bet reads answer 501 for now.
  - name: Accounts
    description: Manage bookmaker accounts
  - name: Bookmakers
    description: List supported bookmakers
  - name: Analytics
    description: Positions and profit/loss analytics
paths:
  /futures/markets:
    get:
      tags:
        - Futures
      summary: Get all futures markets (not yet available)
      description: >-
        Returns the futures markets present in the OddsPAPI metadata cache,
        grouped by `(sportId, futureMarketId)`, each with the futures (season ×
        market) that carry it. Sorted by `sportId`, then `futureMarketId`.


        This is the futures counterpart of `GET /fixtures/markets`, but it is
        **derived from the cached futures themselves** — OddsPAPI publishes no
        separate futures-market catalogue. Consequences worth knowing:


        - It lists what is currently cached, not every market that has ever
        existed.

        - `marketName` / `marketType` are `null` unless OddsPAPI puts them on
        the future row. They are read, never inferred.

        - It does **not** list outcomes. A futures selection is
        `(futureOutcomeId, participantId)`, and the available pairs come from
        the odds on `GET /futures/betslip`, not from a market definition: on a
        participant-keyed market the outcome id is always the sentinel `0` and
        the *participants* are the selections.


        > **Returns HTTP 501 today.** ABP implements the OddsPAPI **db-v2**
        futures identifier scheme only, and the feed still publishes the
        current-state one, so futures ingest is switched off and nothing is
        cached. This endpoint answers `501` rather than an empty `200` that
        would read as "no odds" — and your request is **validated first**, so a
        malformed `futureId` (a bare integer from the current feed is refused)
        or a selection pair that names nothing is still a `400` even today. The
        response shape below is what it serves the day futures turn on (expected
        late 2026-10).
      operationId: get_futures_markets
      parameters:
        - name: sportId
          in: query
          required: false
          schema:
            type: integer
            nullable: true
          description: Filter by sport ID (e.g., 10 for Soccer)
          example: 10
        - name: tournamentId
          in: query
          required: false
          schema:
            type: integer
            nullable: true
          description: Filter by tournament ID
          example: 17
      responses:
        '200':
          description: >-
            List of futures markets — the shape served once futures are enabled;
            today this endpoint answers 501
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FutureMarketResponse'
              example:
                - futureMarketId: 10001
                  sportId: 10
                  marketName: Winner
                  marketType: null
                  futureCount: 1
                  futures:
                    - futureId: id1012639310001
                      seasonId: 126393
                      tournamentId: 17
                      startTime: 1760000000
                      endTime: null
                      statusId: 0
                      reissuedFutureId: null
        '401':
          description: Unauthorized — missing or invalid API key
        '500':
          description: Internal server error
        '501':
          description: Not implemented — futures ingest is off until OddsPAPI db-v2 is live
          content:
            application/json:
              example:
                detail: >-
                  Futures market listing is not yet available. ABP implements
                  the OddsPAPI db-v2 futures identifier scheme only, and the
                  feed still publishes the current-state one, so futures ingest
                  is disabled (ODDSPAPI_FUTURES_ENABLED=false) and nothing is
                  cached. This endpoint answers 501 rather than an empty 200
                  that would read as 'no odds'. Futures identifiers ARE
                  validated here: a malformed request is a 400/422 even today.
components:
  schemas:
    FutureMarketResponse:
      type: object
      required:
        - futureMarketId
        - sportId
        - futureCount
        - futures
      description: A futures market, with the futures currently carrying it.
      properties:
        futureMarketId:
          type: integer
          description: Future market identifier (the futureId's 5-digit tail).
          example: 10001
        sportId:
          type: integer
          description: Sport identifier.
          example: 10
        marketName:
          type: string
          nullable: true
          description: >-
            Market display name when OddsPAPI publishes one on the future row;
            `null` otherwise. Read, never inferred.
        marketType:
          type: string
          nullable: true
          description: >-
            Market type slug when OddsPAPI publishes one on the future row;
            `null` otherwise.
        futureCount:
          type: integer
          description: How many cached futures carry this market.
        futures:
          type: array
          items:
            $ref: '#/components/schemas/FutureSeasonEntry'
          description: The futures carrying this market, newest start time first.
    FutureSeasonEntry:
      type: object
      required:
        - futureId
      description: One future — a season × market pair — under a futures market.
      properties:
        futureId:
          type: string
          description: Future identifier — use this on `GET /futures/betslip`.
          example: id1012639310001
        seasonId:
          type: integer
          nullable: true
          description: Season identifier.
        tournamentId:
          type: integer
          nullable: true
          description: >-
            Tournament identifier. A **field**, not a segment of the id — which
            is what lets a futureId stay stable when a provider re-parents a
            season.
        startTime:
          type: integer
          nullable: true
          description: Unix seconds.
        endTime:
          type: integer
          nullable: true
          description: Unix seconds.
        statusId:
          type: integer
          nullable: true
          description: >-
            0 upcoming/open, 1 in progress, 2 finished, 3 cancelled, 4 removed.
            **0 and 1 are both tradeable** for an outright — 1 means the
            competition is running, not that the market is in-play.
        reissuedFutureId:
          type: string
          nullable: true
          description: >-
            Replacement id for a cancelled (`statusId 3`) future that has been
            re-listed. `null` means no replacement **yet** — the value can
            appear after you first saw the future cancelled. One hop only; not
            resolved for you.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for authentication. Contact contact@55-tech.com to obtain a key.

````

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