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

> Submit one or more betting orders for placement with bookmakers.

**Required fields per order:** `requestUuid`, `outcomeId`, `playerId`, `orderPrice`, `orderStake`, `userRef`, `testOrder`, and either `fixtureId` (fixture markets) or `futureId` (futures/outright markets — coming soon)

**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`



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


    ## Quick Start


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

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

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

    4. **Track results**: `GET /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
  - name: Bets
    description: Query individual bets placed with bookmakers
  - name: Betslip
    description: Get live odds and metadata for fixtures
  - name: Accounts
    description: Manage bookmaker accounts
  - name: Markets
    description: Get available markets and odds types
  - name: Bookmakers
    description: List supported bookmakers
  - name: Analytics
    description: Positions and profit/loss analytics
paths:
  /place-orders:
    post:
      tags:
        - Orders
      summary: Place betting orders
      description: >-
        Submit one or more betting orders for placement with bookmakers.


        **Required fields per order:** `requestUuid`, `outcomeId`, `playerId`,
        `orderPrice`, `orderStake`, `userRef`, `testOrder`, and either
        `fixtureId` (fixture markets) or `futureId` (futures/outright markets —
        coming soon)


        **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`
      operationId: place_orders
      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
        '501':
          description: >-
            Futures order placement not yet implemented (returned when any order
            contains futureId)
          content:
            application/json:
              example:
                detail: Futures order placement is not yet implemented
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
        - outcomeId
        - orderPrice
        - orderStake
        - userRef
        - testOrder
      description: >-
        Either `fixtureId` or `futureId` must be provided (mutually exclusive).
        For fixture orders, `playerId` is required. For futures orders,
        `participantId` is used instead.
      properties:
        requestUuid:
          type: string
          description: >-
            Unique idempotency key (UUID format). 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: true
          description: >-
            OddsPAPI fixture identifier (e.g., 'id1000004461512432'). Required
            for fixture orders. Mutually exclusive with futureId.
          example: id1000004461512432
        futureId:
          type: string
          nullable: true
          description: >-
            [Coming soon] Future/outright market identifier. Mutually exclusive
            with fixtureId. Orders with futureId currently return 501.
          example: fut_123456
        participantId:
          type: integer
          nullable: true
          default: 0
          description: >-
            [Coming soon] Participant identifier for futures markets (e.g., team
            or player selection). Only used with futureId.
          example: 0
        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.

````