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

# Create multi exchange

> Create a group of exchanges linked by a shared multiId.
Each order is stored with status NEW and initialized asynchronously.
Quotes are resolved internally — no quoteId required.



## OpenAPI

````yaml https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi
openapi: 3.0.0
info:
  title: houdiniswap-backend
  version: 2.1.2
  description: Houdiniswap Backend
  license:
    name: ISC
  contact: {}
servers:
  - url: https://api-partner.houdiniswap.com/v2
security: []
paths:
  /exchanges/multi:
    post:
      tags:
        - Exchanges
      summary: Create multi exchange
      description: |-
        Create a group of exchanges linked by a shared multiId.
        Each order is stored with status NEW and initialized asynchronously.
        Quotes are resolved internally — no quoteId required.
      operationId: CreateMultiExchange
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MultiExchangeRequest'
      responses:
        '200':
          description: Multi exchange created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MultiExchangeCreateResult'
              examples:
                Example 1:
                  value:
                    multiId: example-multi-id
                    orders:
                      - order:
                          houdiniId: example-houdini-id
                          created: '2026-01-01T12:00:00.000Z'
                          depositAddress: bc1qexampledepositaddress000000000000000000
                          receiverAddress: '0x9f1f9a5c0f1d9a5c0f1d9a5c0f1d9a5c0f1d9a5c'
                          anonymous: false
                          expires: '2026-01-01T12:30:00.000Z'
                          status: 0
                          inAmount: 0.25
                          inSymbol: BTC
                          outAmount: 3.52
                          outSymbol: ETH
                          displayStatus: WAITING_FOR_DEPOSIT
        '422':
          description: Validation Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKey: []
components:
  schemas:
    MultiExchangeRequest:
      properties:
        orders:
          items:
            $ref: '#/components/schemas/MultiOrderItem'
          type: array
          minItems: 1
          maxItems: 50
        filters:
          $ref: '#/components/schemas/QuoteFilters'
          description: Provider filters applied to every order in the batch
      required:
        - orders
      type: object
      additionalProperties: false
    MultiExchangeCreateResult:
      description: >-
        Response for POST /exchanges/multi — per-item envelope, some may be
        errors
      properties:
        multiId:
          type: string
        orders:
          items:
            $ref: '#/components/schemas/MultiOrderResult'
          type: array
      required:
        - multiId
        - orders
      type: object
      additionalProperties: false
    ValidationError:
      properties:
        message:
          type: string
        code:
          type: string
        requestId:
          type: string
        fields:
          $ref: '#/components/schemas/FieldErrors'
      required:
        - message
        - code
        - fields
      type: object
      additionalProperties: false
    ErrorResponse:
      properties:
        message:
          type: string
        code:
          type: string
        requestId:
          type: string
      required:
        - message
        - code
      type: object
      additionalProperties: false
    MultiOrderItem:
      description: |-
        A single order within a multi exchange batch.
        Quotes are resolved internally — no quoteId required.
      properties:
        from:
          type: string
          description: >-
            Token ID from which the swap is initiated. Must be a MongoDB
            ObjectId (24-char hex string).

            Use GET /v2/tokens to look up token IDs.
          example: 6689b73ec90e45f3b3e51564
          minLength: 24
          maxLength: 24
        to:
          type: string
          description: >-
            Token ID to which the swap is directed. Must be a MongoDB ObjectId
            (24-char hex string).

            Use GET /v2/tokens to look up token IDs.
          example: 6689b73ec90e45f3b3e51558
          minLength: 24
          maxLength: 24
        amount:
          type: number
          format: double
          description: Input amount
        addressTo:
          type: string
          description: Destination wallet address
          minLength: 1
          maxLength: 200
        anonymous:
          type: boolean
          description: Use anonymous (private) routing
        destinationTag:
          type: string
          description: Destination tag / memo (e.g. for XRP, XLM)
          maxLength: 64
        useXmr:
          type: boolean
          description: Force XMR as the anonymous bridge token
        walletInfo:
          type: string
          description: Wallet info string
          maxLength: 256
        filters:
          $ref: '#/components/schemas/QuoteFilters'
          description: >-
            Deprecated provider filters alias. Use top-level
            MultiExchangeRequest.filters instead.
        fixed:
          type: boolean
          description: Request a fixed (guaranteed) rate for this order
        refundAddress:
          type: string
          description: |-
            Sender's wallet address for refunds if a fixed-rate swap fails.
            Required when fixed: true.
          maxLength: 200
      required:
        - from
        - to
        - amount
        - addressTo
      type: object
      additionalProperties: false
    QuoteFilters:
      properties:
        onlySwaps:
          items:
            type: string
          type: array
        rotatePayoutWallets:
          type: boolean
        deviationThreshold:
          type: number
          format: double
          minimum: 0
          maximum: 100
        rotationLookback:
          type: integer
          format: int32
          minimum: 1
          maximum: 100
        inLeg:
          $ref: '#/components/schemas/LegFilter'
        outLeg:
          $ref: '#/components/schemas/LegFilter'
      type: object
      additionalProperties: false
    MultiOrderResult:
      description: Per-item result envelope — mirrors GraphQL OrderWithErrorResult
      properties:
        order:
          $ref: '#/components/schemas/OrderV2PublicResponse'
        error:
          $ref: '#/components/schemas/MultiOrderError'
      type: object
      additionalProperties: false
    FieldErrors:
      properties: {}
      type: object
      additionalProperties:
        properties:
          value: {}
          message:
            type: string
        required:
          - message
        type: object
    LegFilter:
      properties:
        include:
          items:
            type: string
          type: array
        exclude:
          items:
            type: string
          type: array
      type: object
      additionalProperties: false
    OrderV2PublicResponse:
      properties:
        swapName:
          type: string
        fixed:
          type: boolean
        refundAddress:
          type: string
        houdiniId:
          type: string
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        depositAddress:
          type: string
          description: The CEX deposit address where the user must send funds
        receiverAddress:
          type: string
        anonymous:
          type: boolean
        expires:
          type: string
          format: date-time
        status:
          $ref: '#/components/schemas/OrderStatus'
        inAmount:
          type: number
          format: double
        inSymbol:
          type: string
        outAmount:
          type: number
          format: double
        outSymbol:
          type: string
        depositTag:
          type: string
          description: Memo/tag required when depositing funds for assets that use one
        notified:
          type: boolean
        eta:
          type: number
          format: double
          description: ETA time, depending on swap
        inAmountUsd:
          type: number
          format: double
          description: USD value of the input amount at order creation time.
        outAmountUsd:
          type: number
          format: double
        multiId:
          type: string
        inCreated:
          type: string
          format: date-time
        id:
          type: string
        nonRefundable:
          type: boolean
        metadata: {}
        isDex:
          type: boolean
        orderFinishedReceived:
          type: string
          format: date-time
        actionRequired:
          type: boolean
        outToken:
          $ref: '#/components/schemas/Token'
        inToken:
          $ref: '#/components/schemas/Token'
        inStatus:
          $ref: '#/components/schemas/Status'
        outStatus:
          $ref: '#/components/schemas/Status'
        outTransactionOutHash:
          type: string
        displayStatus:
          $ref: '#/components/schemas/DisplayStatus'
        receiverTag:
          type: string
          nullable: true
          description: Memo/tag required when receiving funds for assets that use one
      required:
        - swapName
        - houdiniId
        - created
        - depositAddress
        - receiverAddress
        - anonymous
        - expires
        - status
        - inAmount
        - inSymbol
        - outAmount
        - outSymbol
        - notified
        - eta
        - inAmountUsd
        - outAmountUsd
        - multiId
        - inCreated
        - id
        - isDex
        - orderFinishedReceived
        - actionRequired
        - outToken
        - inToken
        - inStatus
        - outStatus
        - outTransactionOutHash
        - displayStatus
      type: object
      additionalProperties: false
    MultiOrderError:
      properties:
        message:
          type: string
        code:
          anyOf:
            - type: string
            - type: number
              format: double
      required:
        - message
      type: object
      additionalProperties: false
    OrderStatus:
      description: |-
        - **-2** Order is being initialized (label: INITIALIZING)
        - **-1** Order initialized (label: NEW)
        - **0** Waiting for deposit confirmation (label: WAITING)
        - **1** Deposit is being confirmed (label: CONFIRMING)
        - **2** Exchange is in progress (label: EXCHANGING)
        - **3** Order is going through anonymization (label: ANONYMIZING)
        - **4** Order completed successfully (label: FINISHED)
        - **5** Order has expired (label: EXPIRED)
        - **6** Order failed (label: FAILED)
        - **7** Order was refunded (label: REFUNDED)
        - **8** Order was deleted (label: DELETED)
      enum:
        - -2
        - -1
        - 0
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
        - 7
        - 8
      type: number
    Token:
      properties:
        icon:
          type: string
        id:
          type: string
        address:
          type: string
          nullable: true
        chain:
          type: string
        decimals:
          type: number
          format: double
          default: 0
        symbol:
          type: string
          default: ''
        name:
          type: string
          default: ''
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        chainData:
          $ref: '#/components/schemas/Chain'
        description:
          type: string
          nullable: true
        mainnet:
          type: boolean
        enabled:
          type: boolean
        unverified:
          type: boolean
        hasDex:
          type: boolean
        hasCex:
          type: boolean
        hasSelfPrivate:
          type: boolean
          description: >-
            Indicates if token supports private (self-to-self) swaps.

            Stored field computed when token is saved.

            True when token has CEX support AND at least 2 enabled CEX swap
            provider mappings.
        cexTokenId:
          type: string
          default: ''
        rank:
          type: number
          format: double
          nullable: true
        cgId:
          type: string
          nullable: true
        marketCapChange24h:
          type: number
          format: double
          description: 24h market cap change percentage from CoinGecko.
        circulatingSupply:
          type: number
          format: double
          description: Token circulating supply from CoinGecko.
        price:
          type: number
          format: double
          nullable: true
        marketCap:
          type: number
          format: double
          nullable: true
        volume:
          type: number
          format: double
          nullable: true
        fdv:
          type: number
          format: double
          nullable: true
        change:
          type: number
          format: double
          nullable: true
        priority:
          type: number
          format: double
          nullable: true
        warningMessage:
          type: string
      required:
        - icon
        - id
        - chain
        - created
        - chainData
      type: object
      additionalProperties: false
    Status:
      description: |-
        - **0** New swap
        - **1** Waiting for confirmation
        - **2** Being confirmed
        - **3** Exchange in progress
        - **4** Sending to destination
        - **5** Swap completed
        - **6** Swap failed
        - **7** Swap refunded
        - **8** Verifying swap
        - **9** Swap expired
        - **10** Fallback mode
      enum:
        - 0
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
        - 7
        - 8
        - 9
        - 10
      type: number
    DisplayStatus:
      enum:
        - WAITING_FOR_DEPOSIT
        - DEPOSIT_DETECTED
        - EXCHANGE_IN_PROGRESS
        - SENDING_TO_INTERMEDIARY
        - REACHED_INTERMEDIARY
        - INITIATING_SECOND_EXCHANGE
        - SECOND_EXCHANGE_IN_PROGRESS
        - SENDING_TO_RECEIVER
        - SWAP_COMPLETED
        - EXPIRED
        - FAILED
        - REFUNDED
        - DELETED
      type: string
    Chain:
      properties:
        icon:
          type: string
        addressValidation:
          type: string
        tokenAddressValidation:
          type: string
        id:
          type: string
        created:
          type: string
          format: date-time
        modified:
          type: string
          format: date-time
        name:
          type: string
        shortName:
          type: string
        memoNeeded:
          type: boolean
          nullable: true
        hashUrl:
          type: string
        explorerUrl:
          type: string
        addressUrl:
          type: string
        priority:
          type: number
          format: double
        kind:
          type: string
        chainId:
          type: number
          format: double
          nullable: true
        enabled:
          type: boolean
        shortNameV1:
          type: string
      required:
        - icon
        - addressValidation
        - tokenAddressValidation
        - id
        - created
        - name
        - shortName
        - explorerUrl
        - addressUrl
        - kind
        - enabled
        - shortNameV1
      type: object
      additionalProperties: false
  securitySchemes:
    apiKey:
      type: apiKey
      name: Authorization
      in: header

````