> ## 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 live odds and betslip metadata for a future (not yet available)

> Get current odds and metadata for a **futures** (outright) selection.

Provide `futureId` plus the selection:

- **Participant-keyed** markets (outright winner, topscorer, relegation, mvp) carry the sentinel `futureOutcomeId=0` — the participant IS the selection, so `participantId` must be a real id.
- **Decomposed** markets (prediction Yes/No, season totals Over/Under) carry a real `futureOutcomeId` (>= 100001) and may leave `participantId=0`.

There is **no `playerId`** on futures — `participantId` names a team or a player alike — and **no period**: a future resolves when its season does.

Fixtures live on **`GET /fixtures/betslip`**.

**Feed-authoritative.** Futures odds come from the OddsPAPI cache only — no bookmaker integration implements a futures betslip fetch, so `verifyBetslip` on an account has no effect here.

**Limit cascade:** account.minStake/maxStake > bookmaker.minStake/maxStake > odds.limitMin/limit — same as fixtures.

**WebSocket integration:** each poll registers (or refreshes) a 60-second subscription on the `betslip` channel for this selection, the snapshot is broadcast immediately, and deltas follow as prices change. Futures payloads carry `futureId`/`futureOutcomeId`/`participantId` instead of `fixtureId`/`outcomeId`/`playerId`.

> **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/betslip
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/betslip:
    get:
      tags:
        - Futures
      summary: Get live odds and betslip metadata for a future (not yet available)
      description: >-
        Get current odds and metadata for a **futures** (outright) selection.


        Provide `futureId` plus the selection:


        - **Participant-keyed** markets (outright winner, topscorer, relegation,
        mvp) carry the sentinel `futureOutcomeId=0` — the participant IS the
        selection, so `participantId` must be a real id.

        - **Decomposed** markets (prediction Yes/No, season totals Over/Under)
        carry a real `futureOutcomeId` (>= 100001) and may leave
        `participantId=0`.


        There is **no `playerId`** on futures — `participantId` names a team or
        a player alike — and **no period**: a future resolves when its season
        does.


        Fixtures live on **`GET /fixtures/betslip`**.


        **Feed-authoritative.** Futures odds come from the OddsPAPI cache only —
        no bookmaker integration implements a futures betslip fetch, so
        `verifyBetslip` on an account has no effect here.


        **Limit cascade:** account.minStake/maxStake >
        bookmaker.minStake/maxStake > odds.limitMin/limit — same as fixtures.


        **WebSocket integration:** each poll registers (or refreshes) a
        60-second subscription on the `betslip` channel for this selection, the
        snapshot is broadcast immediately, and deltas follow as prices change.
        Futures payloads carry `futureId`/`futureOutcomeId`/`participantId`
        instead of `fixtureId`/`outcomeId`/`playerId`.


        > **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_betslip
      parameters:
        - name: futureId
          in: query
          required: true
          schema:
            type: string
          description: >-
            Future identifier in OddsPAPI's db-v2 form (e.g.,
            'id1012639310001'). A bare-integer id from the current feed is
            refused with a 400.
          example: id1012639310001
        - name: futureOutcomeId
          in: query
          required: false
          schema:
            type: integer
            default: 0
          description: >-
            0 (default) for a participant-keyed market where the participant IS
            the selection; a real id (>= 100001) for a decomposed market
            (Yes/No, Over/Under).
          example: 0
        - name: participantId
          in: query
          required: false
          schema:
            type: integer
            default: 0
          description: >-
            The team or player you back (participant-keyed), or the entity a
            line is about (decomposed). Required (non-zero) when futureOutcomeId
            is 0.
          example: 7193
        - name: bookmakers
          in: query
          required: false
          schema:
            type: string
            nullable: true
          description: >-
            Comma-separated bookmaker slugs. If omitted, uses all the client's
            configured bookmakers.
          example: polymarket,kalshi
      responses:
        '200':
          description: >-
            Current odds and betslip metadata for a future — the shape served
            once futures are enabled; today this endpoint answers 501
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FuturesBetslipResponse'
              example:
                futureId: id1012639310001
                futureOutcomeId: 0
                participantId: 7193
                client: demo
                userRef: null
                futureInfo:
                  futureId: id1012639310001
                  sportId: 10
                  seasonId: 126393
                  tournamentId: 17
                  statusId: 0
                  startTime: 1760000000
                  endTime: null
                outcomeInfo: null
                odds:
                  polymarket:
                    id1012639310001:polymarket:0:7193:
                      price: 4.2
                      limit: 2500
                      limitMin: 1
                      limitCurrency: USD
                      limitUsd: 2500
                      limitMinUsd: 1
                      active: true
                      account: '0xAe58B89E84a625C8D0b7E630f40Cb163fcA73F01'
                      currencyInfo:
                        currency: USD
                        currencyValue: 1
                        updatedAt: '2026-10-09T09:12:04+00:00'
                      bookmakerFixtureId: null
                      bookmakerMarketId: '10001'
                      bookmakerOutcomeId: >-
                        475604749945647560845331314831514336920894613040458588818765764150561104610
                      meta: null
        '400':
          description: Malformed futureId, or a selection pair that names nothing
          content:
            application/json:
              example:
                detail: futureOutcomeId 0 with participantId 0 names no selection
        '401':
          description: Unauthorized — missing or invalid API key
        '403':
          description: >-
            Access denied — no accounts for the requested bookmaker(s), or the
            future's sport is not allowed for this API key
          content:
            application/json:
              example:
                detail: SportId '10' not allowed
        '404':
          description: No odds found for the given futures selection
          content:
            application/json:
              example:
                detail: No odds found for given parameters
        '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 betslip 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:
    FuturesBetslipResponse:
      type: object
      description: >-
        The betslip response for a futures selection. Same shape as
        `BetslipResponse` with the selection swapped: `futureId` /
        `futureOutcomeId` / `participantId` and `futureInfo` instead of
        `fixtureId` / `outcomeId` / `playerId` and `fixtureInfo`. There is **no
        `playerId`** and no `playerInfo`.
      properties:
        futureId:
          type: string
          example: id1012639310001
        futureOutcomeId:
          type: integer
          example: 0
        participantId:
          type: integer
          example: 7193
        client:
          type: string
          example: demo
        userRef:
          type: string
          nullable: true
        futureInfo:
          type: object
          nullable: true
          description: Future details (season, tournament, status, start/end time).
        outcomeInfo:
          type: object
          nullable: true
          description: >-
            Outcome details. `null` for a participant-keyed market, which has no
            outcome row.
        odds:
          type: object
          description: >-
            Live odds keyed by bookmaker, then by oddsId. Treat the oddsId as
            **opaque** — store it, do not parse it.
  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.