---
title: "Create multi exchange"
method: POST
path: "/exchanges/multi"
tags: ["Exchanges"]
---

# Create multi exchange

`POST /exchanges/multi`

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.

## Request body

- MultiExchangeRequest
  - `orders` MultiOrderItem[], required
    - `from` string, required — 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.
    - `to` string, required — 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.
    - `amount` number, double, required — Input amount
    - `addressTo` string, required — Destination wallet address
    - `anonymous` boolean — Use anonymous (private) routing
    - `destinationTag` string — Destination tag / memo (e.g. for XRP, XLM)
    - `useXmr` boolean — Force XMR as the anonymous bridge token
    - `walletInfo` string — Wallet info string
    - `filters` QuoteFilters
      - `onlySwaps` string[]
      - `rotatePayoutWallets` boolean
      - `rotateFallback` boolean
      - `deviationThreshold` number, double
      - `rotationLookback` integer
      - `inLeg` LegFilter
        - `include` string[]
        - `exclude` string[]
      - `outLeg` LegFilter
        - `include` string[]
        - `exclude` string[]
    - `fixed` boolean — Request a fixed (guaranteed) rate for this order
    - `refundAddress` string — Sender's wallet address for refunds if a fixed-rate swap fails. Required when fixed: true.
    - `refundExtraId` string — Memo/tag for refundAddress on memo-bearing chains (XRP, Stellar, TON, …).
  - `filters` QuoteFilters
    - `onlySwaps` string[]
    - `rotatePayoutWallets` boolean
    - `rotateFallback` boolean
    - `deviationThreshold` number, double
    - `rotationLookback` integer
    - `inLeg` LegFilter
      - `include` string[]
      - `exclude` string[]
    - `outLeg` LegFilter
      - `include` string[]
      - `exclude` string[]

## Response `200`

Multi exchange created

- MultiExchangeCreateResult — Response for POST /exchanges/multi — per-item envelope, some may be errors
  - `multiId` string, required
  - `orders` MultiOrderResult[], required
    - `order` OrderV2PublicResponse
      - `swapName` string, required
      - `fixed` boolean
      - `refundAddress` string
      - `houdiniId` string, required
      - `created` string, date-time, required
      - `modified` string, date-time
      - `depositAddress` string, required — The CEX deposit address where the user must send funds
      - `receiverAddress` string, required
      - `anonymous` boolean, required
      - `expires` string, date-time, required
      - `status` -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8, required — - **-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)
      - `inAmount` number, double, required
      - `inSymbol` string, required
      - `outAmount` number, double, required
      - `outSymbol` string, required
      - `depositTag` string — Memo/tag required when depositing funds for assets that use one
      - `notified` boolean, required
      - `eta` number, double, required — ETA time, depending on swap
      - `inAmountUsd` number, double, required — USD value of the input amount at order creation time.
      - `outAmountUsd` number, double, required
      - `multiId` string, required
      - `inCreated` string, date-time, required
      - `id` string, required
      - `nonRefundable` boolean
      - `metadata` unknown
      - `isDex` boolean, required
      - `orderFinishedReceived` string, date-time, required
      - `actionRequired` boolean, required
      - `outToken` Token, required
        - `icon` string, required
        - `id` string, required
        - `address` string, nullable
        - `chain` string, required
        - `decimals` number, double
        - `symbol` string
        - `name` string
        - `created` string, date-time, required
        - `modified` string, date-time
        - `chainData` Chain, required
          - `icon` string, required
          - `addressValidation` string, required
          - `tokenAddressValidation` string, required
          - `id` string, required
          - `created` string, date-time, required
          - `modified` string, date-time
          - `name` string, required
          - `shortName` string, required
          - `memoNeeded` boolean, nullable
          - `hashUrl` string
          - `explorerUrl` string, required
          - `addressUrl` string, required
          - `priority` number, double
          - `kind` string, required
          - `chainId` number, double, nullable
          - `enabled` boolean, required
          - `shortNameV1` string, required
        - `description` string, nullable
        - `mainnet` boolean
        - `enabled` boolean
        - `unverified` boolean
        - `hasDex` boolean
        - `hasCex` boolean
        - `hasSelfPrivate` boolean — 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` string
        - `rank` number, double, nullable
        - `cgId` string, nullable
        - `marketCapChange24h` number, double — 24h market cap change percentage from CoinGecko.
        - `circulatingSupply` number, double — Token circulating supply from CoinGecko.
        - `price` number, double, nullable
        - `marketCap` number, double, nullable
        - `volume` number, double, nullable
        - `fdv` number, double, nullable
        - `change` number, double, nullable
        - `priority` number, double, nullable
        - `warningMessage` string
      - `inToken` Token, required
        - `icon` string, required
        - `id` string, required
        - `address` string, nullable
        - `chain` string, required
        - `decimals` number, double
        - `symbol` string
        - `name` string
        - `created` string, date-time, required
        - `modified` string, date-time
        - `chainData` Chain, required
          - `icon` string, required
          - `addressValidation` string, required
          - `tokenAddressValidation` string, required
          - `id` string, required
          - `created` string, date-time, required
          - `modified` string, date-time
          - `name` string, required
          - `shortName` string, required
          - `memoNeeded` boolean, nullable
          - `hashUrl` string
          - `explorerUrl` string, required
          - `addressUrl` string, required
          - `priority` number, double
          - `kind` string, required
          - `chainId` number, double, nullable
          - `enabled` boolean, required
          - `shortNameV1` string, required
        - `description` string, nullable
        - `mainnet` boolean
        - `enabled` boolean
        - `unverified` boolean
        - `hasDex` boolean
        - `hasCex` boolean
        - `hasSelfPrivate` boolean — 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` string
        - `rank` number, double, nullable
        - `cgId` string, nullable
        - `marketCapChange24h` number, double — 24h market cap change percentage from CoinGecko.
        - `circulatingSupply` number, double — Token circulating supply from CoinGecko.
        - `price` number, double, nullable
        - `marketCap` number, double, nullable
        - `volume` number, double, nullable
        - `fdv` number, double, nullable
        - `change` number, double, nullable
        - `priority` number, double, nullable
        - `warningMessage` string
      - `inStatus` 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10, required — - **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
      - `outStatus` 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10, required — - **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
      - `outTransactionOutHash` string, required
      - `displayStatus` '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', required
      - `receiverTag` string, nullable — Memo/tag required when receiving funds for assets that use one
    - `error` MultiOrderError
      - `message` string, required
      - `code` union
        - string
        - number, double

## Other responses

- `422` — Validation Failed
- `500` — Internal Server Error

---

[API](https://skmtc.net/houdiniswap/apis/houdiniswap-backend.md) · [All operations](https://skmtc.net/houdiniswap/apis/houdiniswap-backend/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/houdiniswap/houdiniswap-backend/versions/2063dbc88d59/schema)
