> ## 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.

# Place betting orders (deprecated path)

> > **Deprecated path.** This is the pre-split alias of `/fixtures/place-orders` and keeps working unchanged — same handler, same request, same response. New integrations should use `/fixtures/place-orders`; futures have their own surface under `/futures/*`.

Submit one or more betting orders for placement with bookmakers.

**Required fields per order:** `requestUuid`, `outcomeId`, `playerId`, `orderPrice`, `orderStake`, `userRef`, `testOrder`, `fixtureId`

**Optional fields:** `bookmakers`, `participantId` (futures only), `orderCurrency`, `back`, `expiresAt`, `acceptBetterOdds`, `acceptPartialStake`, `meta`

**Key behavior:**
- `requestUuid` must be a valid UUID format (used for idempotency — a duplicate within 30 minutes is skipped; if ALL orders in the request are duplicates the request returns 409)
- `fixtureId` and `futureId` are mutually exclusive — provide one or the other
- Orders with `futureId` currently return `501 Not Implemented` (coming soon)
- Server automatically selects the best bookmaker by odds/limits unless `bookmakers` is specified
- `clientName` is set automatically from your API key
- Orders expire after `expiresAt` (default: 5 seconds from now, capped at 24 hours maximum)
- Maximum 100 orders per request

**Response:**
- `status`: "accepted" (all accepted), "partial-success" (some declined), or "declined" (all declined)
- `acceptedOrders`: Orders that passed validation with their current status and any placed bets
- `declinedOrders`: Orders that failed validation with `declineReason`

**Fixtures only.** `futureId`, `futureOutcomeId` and `participantId` are rejected with `422` — post futures orders to `POST /futures/place-orders`.



## OpenAPI

````yaml /zh/abp-api/openapi.json post /place-orders
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:
  /place-orders:
    post:
      tags:
        - Orders
      summary: Place betting orders (deprecated path)
      description: >-
        > **Deprecated path.** This is the pre-split alias of
        `/fixtures/place-orders` and keeps working unchanged — same handler,
        same request, same response. New integrations should use
        `/fixtures/place-orders`; futures have their own surface under
        `/futures/*`.


        Submit one or more betting orders for placement with bookmakers.


        **Required fields per order:** `requestUuid`, `outcomeId`, `playerId`,
        `orderPrice`, `orderStake`, `userRef`, `testOrder`, `fixtureId`


        **Optional fields:** `bookmakers`, `participantId` (futures only),
        `orderCurrency`, `back`, `expiresAt`, `acceptBetterOdds`,
        `acceptPartialStake`, `meta`


        **Key behavior:**

        - `requestUuid` must be a valid UUID format (used for idempotency — a
        duplicate within 30 minutes is skipped; if ALL orders in the request are
        duplicates the request returns 409)

        - `fixtureId` and `futureId` are mutually exclusive — provide one or the
        other

        - Orders with `futureId` currently return `501 Not Implemented` (coming
        soon)

        - Server automatically selects the best bookmaker by odds/limits unless
        `bookmakers` is specified

        - `clientName` is set automatically from your API key

        - Orders expire after `expiresAt` (default: 5 seconds from now, capped
        at 24 hours maximum)

        - Maximum 100 orders per request


        **Response:**

        - `status`: "accepted" (all accepted), "partial-success" (some
        declined), or "declined" (all declined)

        - `acceptedOrders`: Orders that passed validation with their current
        status and any placed bets

        - `declinedOrders`: Orders that failed validation with `declineReason`


        **Fixtures only.** `futureId`, `futureOutcomeId` and `participantId` are
        rejected with `422` — post futures orders to `POST
        /futures/place-orders`.
      operationId: place_orders_legacy
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlaceOrdersRequest'
            example:
              orders:
                - requestUuid: eb45b192-317b-42d5-9f65-af497b9fa8c1
                  fixtureId: id1000004461512432
                  outcomeId: 103
                  playerId: 0
                  orderPrice: 1.95
                  orderStake: 10
                  userRef: bettor1234
                  testOrder: false
                - requestUuid: fb5f2dd9-c855-4ba9-8ef9-4c2278ca2f1d
                  fixtureId: id1000000758265385
                  outcomeId: 101
                  playerId: 0
                  orderPrice: 1.88
                  orderStake: 250.25
                  userRef: bettor1234
                  testOrder: false
                  bookmakers: pinnacle,vertex
                  orderCurrency: USD
                  back: true
                  expiresAt: '2026-02-07T22:26:05Z'
                  acceptBetterOdds: true
                  acceptPartialStake: true
                  meta:
                    strategy: value
                    source: api
      responses:
        '200':
          description: Order placement results with accepted and declined orders
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlaceOrdersResponse'
              example:
                status: partial-success
                acceptedOrders:
                  - orderId: 327
                    requestUuid: eb45b192-317b-42d5-9f65-af497b9fa8c1
                    allowedBookmakers: '*'
                    fixtureId: id1000004461512432
                    outcomeId: 103
                    playerId: 0
                    orderPrice: 1.95
                    orderStake: 10
                    filledStake: 10
                    userRef: bettor1234
                    testOrder: false
                    orderCurrency: USD
                    back: true
                    expiresAt: '2026-02-07T17:29:37.311377+00:00'
                    acceptBetterOdds: true
                    acceptPartialStake: true
                    clientName: demo
                    orderStatus: FILLED
                    createdAt: '2026-02-07T17:29:32.265368+00:00'
                    updatedAt: '2026-02-07T17:29:32.265368+00:00'
                    meta: null
                    bets:
                      - betId: 73
                        orderId: 327
                        bookmaker: pinnacle
                        bookmakerBetId: '3332684214'
                        placedPrice: 1.98
                        placedStake: 10
                        placedCurrency: USD
                        placedAt: '2026-02-07T17:29:32+00:00'
                        betStatus: CONFIRMED
                        settlementStatus: UNSETTLED
                        clientName: demo
                        testBet: false
                        userRef: bettor1234
                        requestUuid: eb45b192-317b-42d5-9f65-af497b9fa8c1
                        declineReason: null
                    fixtureInfo:
                      fixtureId: id1000004461512432
                      status:
                        live: false
                        statusId: 0
                        statusName: Pre-Game
                      sport:
                        sportId: 10
                        sportName: Soccer
                      tournament:
                        tournamentId: 44
                        tournamentName: 2. Bundesliga
                        categoryName: Germany
                      startTime: 1754159400
                      participants:
                        participant1Id: 2540
                        participant1Name: Arminia Bielefeld
                        participant2Id: 2588
                        participant2Name: Fortuna Dusseldorf
                    outcomeInfo:
                      marketId: 101
                      marketName: Full Time Result
                      marketNameShort: 1X2
                      marketType: 1x2
                      period: fulltime
                      playerProp: false
                      handicap: 0
                      outcomeId: 103
                      outcomeName: '2'
                    playerInfo: null
                    currencyInfo:
                      currency: USD
                      currencyValue: 1
                      updatedAt: '2026-02-07T17:29:32+00:00'
                declinedOrders:
                  - requestUuid: fb5f2dd9-c855-4ba9-8ef9-4c2278ca2f1d
                    allowedBookmakers: vertex
                    fixtureId: id1000004461512432
                    outcomeId: 103
                    playerId: 0
                    orderPrice: 1.95
                    orderStake: 10
                    userRef: bettor1234
                    testOrder: false
                    orderCurrency: USD
                    back: true
                    clientName: demo
                    declineReason: Odds temporarily unavailable; please retry
                    bets: []
        '400':
          description: Validation error or all orders declined
          content:
            application/json:
              example:
                status: declined
                acceptedOrders: []
                declinedOrders:
                  - requestUuid: fb5f2dd9-c855-4ba9-8ef9-4c2278ca2f1d
                    fixtureId: id1000004461512432
                    outcomeId: 103
                    declineReason: Order stake 100.00 USD exceeds available limit 50.00 USD
                    bets: []
        '401':
          description: Unauthorized — missing or invalid API key
        '403':
          description: Access denied — client not resolved from API key
        '409':
          description: >-
            Returned only when EVERY order in the request is a duplicate (each
            requestUuid already processed or in progress within the last 30
            minutes). If only some orders are duplicates, the duplicates are
            skipped and the rest are processed normally.
          content:
            application/json:
              example:
                detail:
                  error: All orders are duplicates
                  duplicateUuids:
                    - eb45b192-317b-42d5-9f65-af497b9fa8c1
                  inProgressUuids: []
        '422':
          description: Request body validation error (invalid field values)
        '500':
          description: Internal server error
      deprecated: true
components:
  schemas:
    PlaceOrdersRequest:
      type: object
      required:
        - orders
      properties:
        orders:
          type: array
          items:
            $ref: '#/components/schemas/PlaceOrderRequest'
          minItems: 1
          maxItems: 100
          description: List of orders to place (max 100 per request)
    PlaceOrdersResponse:
      type: object
      properties:
        status:
          type: string
          enum:
            - accepted
            - partial-success
            - declined
          description: >-
            Overall result: accepted (all OK), partial-success (some declined),
            declined (all failed)
        acceptedOrders:
          type: array
          items:
            type: object
          description: Enriched orders that passed validation
        declinedOrders:
          type: array
          items:
            type: object
          description: Orders that failed validation with declineReason
    PlaceOrderRequest:
      type: object
      required:
        - requestUuid
        - fixtureId
        - outcomeId
        - playerId
        - orderPrice
        - orderStake
        - userRef
        - testOrder
      description: >-
        A **fixture** order. `fixtureId`, `outcomeId` and `playerId` are all
        required (`playerId=0` for non-player markets). The futures keys
        `futureId`, `futureOutcomeId` and `participantId` are rejected with
        `422`; futures orders go to `POST /futures/place-orders`.
      properties:
        requestUuid:
          type: string
          description: >-
            Unique idempotency key (UUID format). Normalised to the canonical
            lower-case hyphenated form, so the value echoed back may differ in
            spelling from the one you sent (`{braces}`, upper-case and
            un-hyphenated forms all land on the same key). A duplicate within 30
            minutes is skipped; the request returns 409 only if every order is a
            duplicate.
          example: eb45b192-317b-42d5-9f65-af497b9fa8c1
        fixtureId:
          type: string
          nullable: false
          description: OddsPAPI fixture identifier (e.g., 'id1000004461512432').
          example: id1000004461512432
        outcomeId:
          type: integer
          description: Outcome/market ID from OddsPAPI (e.g., 103 for Match Winner Away)
          example: 103
        playerId:
          type: integer
          description: Player ID for player prop markets. Use 0 for non-player markets.
          example: 0
        orderPrice:
          type: number
          exclusiveMinimum: 0
          description: >-
            Minimum acceptable decimal odds. Bets will only be placed at this
            price or better.
          example: 1.95
        orderStake:
          type: number
          exclusiveMinimum: 0
          description: >-
            Stake amount in orderCurrency. Must be within bookmaker min/max
            limits.
          example: 10
        userRef:
          type: string
          minLength: 1
          description: >-
            Your reference string for grouping/filtering orders (e.g., user ID,
            session ID)
          example: bettor1234
        testOrder:
          type: boolean
          description: >-
            If true, order is validated and persisted but NOT placed with
            bookmaker. Use for testing.
          example: false
        bookmakers:
          type: string
          nullable: true
          description: >-
            Comma-separated bookmaker slugs to target (e.g., 'pinnacle,bet365').
            Use '*' or omit for automatic selection.
          example: pinnacle,vertex
        orderCurrency:
          type: string
          default: USD
          description: >-
            ISO 4217 currency code for orderStake. Converted to bookmaker
            currency at placement.
          example: USD
        back:
          type: boolean
          default: true
          description: >-
            Bet direction. true = back (win if selection wins), false = lay (win
            if selection loses).
          example: true
        expiresAt:
          type: string
          nullable: true
          description: >-
            ISO 8601 timestamp when order expires. Defaults to 5 seconds from
            now. Capped at 24 hours maximum.
          example: '2026-01-15T12:00:05Z'
        acceptBetterOdds:
          type: boolean
          default: true
          description: Accept odds better than orderPrice.
          example: true
        acceptPartialStake:
          type: boolean
          default: true
          description: Allow partial stake fills when full stake exceeds bookmaker limit.
          example: true
        meta:
          type: object
          nullable: true
          description: Custom metadata object. Stored with order but not sent to bookmaker.
          example:
            strategy: value
  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.