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

# Create multiple orders in a single batch



## OpenAPI

````yaml https://vooi-api-app.fly.dev/swagger/json post /exchange/batch-orders
openapi: 3.1.0
info:
  title: VOOI API
  description: Unified perps API
  version: '1.0'
  contact: {}
servers:
  - url: https://perps-api.vooi.io
security: []
tags: []
paths:
  /exchange/batch-orders:
    post:
      tags:
        - Exchange
      summary: Create multiple orders in a single batch
      operationId: ExchangeController_batchCreateOrders
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchCreateOrderBodyDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchCreateOrderResultDto'
        '503':
          description: ExchangeApiError
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDTO'
      security:
        - bearer: []
components:
  schemas:
    BatchCreateOrderBodyDto:
      minItems: 1
      type: array
      items:
        $ref: '#/components/schemas/CreateOrderBodyDto'
      description: List of orders to create
      title: BatchCreateOrder
    BatchCreateOrderResultDto:
      type: object
      properties:
        results:
          type: array
          items:
            oneOf:
              - type: object
                properties:
                  status:
                    type: string
                    enum:
                      - created
                required:
                  - status
                description: Order was placed successfully
              - type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
                    description: Error messages
                  status:
                    type: string
                    enum:
                      - error
                required:
                  - errors
                  - status
                description: Order placement failed
            title: BatchCreateOrderItemResult
            type: object
          description: Per-order results, index-correlated with input
      required:
        - results
      title: BatchCreateOrderResult
    ErrorResponseDTO:
      type: object
      properties:
        message:
          type: string
          example: 'Invalid order id: 123'
        statusCode:
          example: 503
          type: number
      required:
        - message
      title: ErrorResponse
    CreateOrderBodyDto:
      type: object
      properties:
        asset:
          type: string
          minLength: 1
          description: >-
            Asset identifier: base symbol (e.g. "ETH") or full pair (e.g.
            "ETHUSDC").
          example: ETH
        broker:
          description: >-
            Broker configuration. Hyperliquid: id is builder address, feeBps is
            builder fee. Lighter/Robinhood: id is integrator account index,
            feeBps is integrator fee (applies to both taker and maker). Aster:
            id is builder address, feeBps is builder fee in BPS. MEXC: id is the
            Broker_ID sent as the source header to attribute the order; feeBps
            is still required but has no effect, since MEXC charges no builder
            fee. On Hyperliquid, Lighter, and Robinhood the user must have
            pre-approved this builder/integrator on-chain (and feeBps must be ≤
            the approved cap); on Aster the approval is bundled into
            registration. Overridden by the broker settings (if any) of the
            broker the user is registered through: orders the venue executes as
            limit take the limitFeeBps of those settings, orders it executes as
            market take the marketFeeBps (trigger orders count as market on
            Hyperliquid, Aster and Ondo), and Lighter/Robinhood receive both as
            maker/taker fees.
          type: object
          properties:
            feeBps:
              type: string
              pattern: \d+(\.\d+)?
              description: Broker fee in bps
              example: '15'
            id:
              type: string
              description: Broker ID
              example: '123'
          required:
            - feeBps
            - id
          title: Broker
        clientOrderId:
          description: >-
            Your custom order identifier, forwarded to the exchange as-is (max
            32 characters on Binance). On Binance, when omitted, an id carrying
            the broker rebate tag is generated instead. Ignored on
            Lighter/Robinhood when placing orders with takeProfit or stopLoss.
          type: string
        exchange:
          type: string
          enum:
            - aster
            - binance
            - bybit
            - extended
            - gate
            - hyperliquid
            - lighter
            - mexc
            - ondo
            - robinhood
          description: Supported perpetual exchange
        normalizeParams:
          description: >-
            When true, forces normalization of parameters to match exchange
            requirements if possible.
          type: boolean
        price:
          description: Limit price (optional for market orders)
          example: '1850.50'
          type: string
          pattern: \d+(\.\d+)?
        reduceOnly:
          description: >-
            If true, order will only reduce existing position. Used for TP/SL
            orders
          example: true
          type: boolean
        side:
          type: string
          enum:
            - buy
            - sell
        size:
          type: string
          pattern: \d+(\.\d+)?
          description: Order size in base currency
          example: '0.001'
        stopLoss:
          description: >-
            Stop loss order configuration (combine with takeProfit for bracket
            orders, not supported on Aster)
          type: object
          properties:
            limitPrice:
              description: Limit price for order execution (omit for market execution)
              example: '1995.00'
              type: string
              pattern: \d+(\.\d+)?
            size:
              description: >-
                Position size to close, omit to use main order size (not
                supported on Lighter/Robinhood — child orders are always
                position-tied)
              example: '0.5'
              type: string
              pattern: \d+(\.\d+)?
            triggerPrice:
              type: string
              pattern: \d+(\.\d+)?
              description: Trigger price at which to activate this order
              example: '2000.00'
          required:
            - triggerPrice
          title: TakeProfitStopLoss
        takeProfit:
          description: >-
            Take profit order configuration (combine with stopLoss for bracket
            orders, not supported on Aster)
          type: object
          properties:
            limitPrice:
              description: Limit price for order execution (omit for market execution)
              example: '1995.00'
              type: string
              pattern: \d+(\.\d+)?
            size:
              description: >-
                Position size to close, omit to use main order size (not
                supported on Lighter/Robinhood — child orders are always
                position-tied)
              example: '0.5'
              type: string
              pattern: \d+(\.\d+)?
            triggerPrice:
              type: string
              pattern: \d+(\.\d+)?
              description: Trigger price at which to activate this order
              example: '2000.00'
          required:
            - triggerPrice
          title: TakeProfitStopLoss
        timeInForce:
          description: >-
            Order time in force policy. gtc (Good-Till-Cancel) — order stays
            active until filled or manually canceled. ioc (Immediate-Or-Cancel)
            — fills immediately (fully or partially), unfilled remainder is
            canceled. fok (Fill-Or-Kill) — fills entirely and immediately or is
            canceled completely; supported only on Aster. alo (Add Liquidity
            Only) — order only adds liquidity as a maker; canceled if it would
            execute as taker. Defaults to gtc when omitted.
          example: gtc
          type: string
          enum:
            - gtc
            - ioc
            - fok
            - alo
        trigger:
          description: Optional trigger configuration for stop-loss or take-profit orders
          type: object
          properties:
            price:
              type: string
              pattern: \d+(\.\d+)?
              description: Trigger price at which the order will be activated
              example: '1800.00'
            type:
              type: string
              enum:
                - sl
                - tp
              description: 'Trigger type: sl (stop-loss) or tp (take-profit)'
              example: sl
          required:
            - price
            - type
      required:
        - asset
        - exchange
        - side
        - size
      title: CreateOrder
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: JWT
      type: http

````

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