{"openapi":"3.0.0","components":{"examples":{},"headers":{},"parameters":{},"requestBodies":{},"responses":{},"schemas":{"FieldErrors":{"properties":{},"type":"object","additionalProperties":{"properties":{"value":{},"message":{"type":"string"}},"required":["message"],"type":"object"}},"ValidationError":{"properties":{"message":{"type":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest."},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs."},"fields":{"$ref":"#/components/schemas/FieldErrors","description":"The inputs that failed, keyed by field name — or by path for a nested field, e.g. `filters.rotatePayoutWallets`. Each entry has a `message` and, when you sent one, the `value`.\n\nNot every `422` names its input, so `fields` can be `{}`: branch on `code`, and use `fields` to highlight the input when one is named."}},"required":["message","code","fields"],"type":"object","additionalProperties":false},"ErrorResponse":{"properties":{"message":{"type":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest."},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs."}},"required":["message","code"],"type":"object","additionalProperties":false},"X402PaymentRequired":{"description":"Body of a `402 Payment required`. Empty — `{}` — for API clients; a request that looks like a browser gets an HTML paywall page instead.\n\nThis is the x402 payment protocol, not the normal error format, so there is no `code` or `message` to branch on. What to pay is always in the `payment-required` response header, in both cases: base64-encoded JSON whose `accepts[]` entries each carry the `network`, the `asset` to pay in, the `amount`, and the `payTo` address, alongside `maxTimeoutSeconds` and the x402 `scheme`.\n\nSending `Authorization` skips the payment flow, so a 402 only reaches callers paying per request. An `apiKey` query param also skips it but is not a credential — those requests fail with `401 INVALID_API_CREDENTIALS`.","properties":{},"type":"object","additionalProperties":false},"WebhookAck":{"properties":{"received":{"type":"boolean"}},"required":["received"],"type":"object","additionalProperties":false},"CexWebhookEvent":{"properties":{},"type":"object","additionalProperties":{}},"VolumeResponse":{"properties":{"count":{"type":"number","format":"double","description":"Total number of completed transactions"},"totalTransactedUSD":{"type":"number","format":"double","description":"Total transacted value in USD"},"totalOrders":{"type":"number","format":"double","description":"Total number of completed transactions (alias for count)"},"thisMonthVolumeUsd":{"type":"number","format":"double","description":"This month transacted value in USD"},"lastMonthVolumeUsd":{"type":"number","format":"double","description":"Last month transacted value in USD"},"thisMonthOrders":{"type":"number","format":"double","description":"This month completed transactions"}},"required":["count","totalTransactedUSD","totalOrders","thisMonthVolumeUsd","lastMonthVolumeUsd","thisMonthOrders"],"type":"object","additionalProperties":false},"WeeklyVolumeResponse":{"properties":{"week":{"type":"number","format":"double","description":"ISO week number"},"year":{"type":"number","format":"double","description":"Year"},"count":{"type":"number","format":"double","description":"Number of transactions"},"anonymous":{"type":"number","format":"double","description":"Number of anonymous transactions"},"volume":{"type":"number","format":"double","description":"Total volume in USD"},"commission":{"type":"number","format":"double","description":"Commission earned in USD"}},"required":["week","year","count","anonymous","volume","commission"],"type":"object","additionalProperties":false},"Chain":{"properties":{"icon":{"type":"string","description":"Chain icon URL."},"addressValidation":{"type":"string","description":"Regex a wallet address on this chain must match. Use it to validate `addressTo` before creating an exchange."},"tokenAddressValidation":{"type":"string","description":"Regex a token contract address on this chain must match."},"id":{"type":"string"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"name":{"type":"string","description":"Readable chain name, e.g. `Bitcoin`."},"shortName":{"type":"string","description":"The chain's identifier. Pass this wherever an endpoint takes a chain, e.g. `ethereum`."},"memoNeeded":{"type":"boolean","nullable":true,"description":"True when an address on this chain needs a memo or destination tag, e.g. XRP or TON. Send it as `destinationTag` for the payout address, or `refundExtraId` for the refund address."},"hashUrl":{"type":"string","description":"Explorer link for a transaction hash, when it differs from `explorerUrl`."},"explorerUrl":{"type":"string","description":"Template for a transaction link — substitute `{txHash}`, e.g. `https://blockchair.com/bitcoin/transaction/{txHash}`."},"addressUrl":{"type":"string","description":"Template for an address link — substitute `{address}`, e.g. `https://blockchair.com/bitcoin/address/{address}`."},"priority":{"type":"number","format":"double","description":"Display order, lower sorts first.\n* `0` is the highest priority and `99999` the lowest."},"kind":{"type":"string","description":"Chain family, e.g. `evm`, `sol`, `bitcoin`, `xmr`, `ltc`. Determines the address format and which on-chain steps a DEX swap needs."},"chainId":{"type":"number","format":"double","nullable":true,"description":"EVM chain id, e.g. `1` for Ethereum. Null on non-EVM chains."},"enabled":{"type":"boolean","description":"False when the chain is temporarily not routing swaps."},"shortNameV1":{"type":"string","description":"The chain's name in the v1 API. Use `shortName` instead."}},"required":["icon","addressValidation","tokenAddressValidation","id","created","name","shortName","explorerUrl","addressUrl","priority","kind","enabled","shortNameV1"],"type":"object","additionalProperties":false},"TokenScanResult":{"description":"Security verdict for a token. Branch on this rather than on `features`.\n\n- `Benign` — no issues found\n- `Warning` — show a warning before swapping\n- `Malicious` — do not swap\n- `Unscanned` — could not be screened. Screening is fail-open, so this never blocks a swap on its own.","enum":["Benign","Warning","Malicious","Unscanned"],"type":"string"},"TokenScanFeature":{"description":"One finding from the security scan, for display only. The list of possible findings changes over time, so branch on `resultType` instead.","properties":{"featureId":{"type":"string"},"type":{"type":"string","description":"Provider severity for this feature: Malicious | Warning | Benign | Info."},"description":{"type":"string"}},"type":"object","additionalProperties":false},"TokenScanUnscannedReason":{"description":"Why a token ended up `UNSCANNED`. Diagnostic only — never a branching input.","enum":["NOT_CONFIGURED","UNSUPPORTED_CHAIN","NATIVE_TOKEN","RATE_LIMITED","TIMEOUT","PROVIDER_ERROR","NO_RESULT","SCAN_PENDING","NOT_A_TOKEN","UNKNOWN_RESULT_TYPE"],"type":"string"},"TokenSecurityScan":{"properties":{"provider":{"type":"string","description":"Screening provider that produced this verdict."},"resultType":{"$ref":"#/components/schemas/TokenScanResult"},"providerResultType":{"type":"string","description":"The provider's own `result_type` string, kept unmapped so a verdict we don't model yet is still visible to support instead of being erased."},"maliciousScore":{"type":"number","format":"double","description":"Provider `malicious_score`, 0..1. Arrives as a string; stored as a number."},"features":{"items":{"$ref":"#/components/schemas/TokenScanFeature"},"type":"array","default":[]},"unscannedReason":{"$ref":"#/components/schemas/TokenScanUnscannedReason"},"unscannedDetail":{"type":"string","description":"Free-text detail behind `unscannedReason` (provider message, status…)."},"scannedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"When this verdict goes stale and the token should be re-scanned."}},"required":["scannedAt","expiresAt"],"type":"object","additionalProperties":false},"Token":{"properties":{"icon":{"type":"string","description":"Token icon URL."},"id":{"type":"string","description":"The token id. Pass this as `from` / `to` when quoting."},"address":{"type":"string","nullable":true,"description":"Contract address. Null for a chain's native coin — see `mainnet`."},"chain":{"type":"string","description":"Chain short name, e.g. `ethereum`. Matches `shortName` on `chainData`."},"decimals":{"type":"integer","format":"int32","description":"On-chain decimals. Amounts in this API are decimals in the token's own units, so you only need this for on-chain work."},"symbol":{"type":"string"},"name":{"type":"string"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"chainData":{"$ref":"#/components/schemas/Chain","description":"The chain this token lives on."},"description":{"type":"string","nullable":true,"description":"Token description from CoinGecko."},"mainnet":{"type":"boolean","description":"True for the chain's native coin (e.g. ETH on Ethereum), false for an issued token (e.g. USDT). Not related to mainnet vs testnet."},"enabled":{"type":"boolean","description":"False when the token is temporarily not swappable."},"unverified":{"type":"boolean","description":"True when we have not reviewed this token yet — check `securityScan` before using it."},"hasDex":{"type":"boolean","description":"True when the token can be swapped on DEX routes."},"hasCex":{"type":"boolean","description":"True when the token can be swapped on private and standard routes."},"hasBundler":{"type":"boolean","description":"True when the bundler can fund this token — paying for a whole multi-exchange group with one transaction instead of a deposit per order. Available on Solana, and on supported EVM chains."},"hasSelfPrivate":{"type":"boolean","description":"True when the token supports self-to-self private swaps — send it and receive the same token at another address, with no on-chain link."},"cexTokenId":{"type":"string","description":"The token's identifier on centralized exchanges.","default":""},"rank":{"type":"number","format":"double","nullable":true,"description":"CoinGecko market-cap rank. Null when unranked."},"cgId":{"type":"string","nullable":true,"description":"CoinGecko id for this token."},"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,"description":"Current price in USD, from CoinGecko."},"marketCap":{"type":"number","format":"double","nullable":true,"description":"Market cap in USD, from CoinGecko."},"volume":{"type":"number","format":"double","nullable":true,"description":"24h trading volume in USD, from CoinGecko."},"fdv":{"type":"number","format":"double","nullable":true,"description":"Fully diluted valuation in USD, from CoinGecko."},"change":{"type":"number","format":"double","nullable":true,"description":"24h price change, as a percentage."},"priority":{"type":"number","format":"double","nullable":true,"description":"Display order — lower sorts first. Unrelated to `rank`."},"warningMessage":{"type":"string","description":"Warning to show the user before swapping this token."},"securityScan":{"$ref":"#/components/schemas/TokenSecurityScan","description":"Latest security verdict for this token. Absent until the token has been used in a swap at least once."}},"required":["icon","id","chain","decimals","symbol","name","created","chainData","enabled"],"type":"object","additionalProperties":false},"TokenSearchResult":{"properties":{"tokens":{"items":{"$ref":"#/components/schemas/Token"},"type":"array"},"total":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}},"required":["tokens","total","totalPages"],"type":"object","additionalProperties":false},"SwapResponse":{"description":"A provider that can route swaps.","properties":{"id":{"type":"string","description":"Internal id of the provider record. Use `shortName` to refer to a provider."},"name":{"type":"string","description":"Display name, e.g. `Changelly`."},"shortName":{"type":"string","description":"Short code identifying the provider, e.g. `cl`. This is the value returned as `swap` on a quote, and the one to pass in `swaps`, `inLegIncludedSwaps` and the other provider filters."},"txUrl":{"type":"string","description":"Prefix for viewing a transaction with this provider — append the transaction hash to it."},"enabled":{"type":"boolean","description":"False when the provider is temporarily not routing swaps."},"isDex":{"type":"boolean","description":"True for DEX providers, false for CEX providers."},"deprecated":{"type":"boolean","description":"True when the provider is being retired and should not be relied on."},"markupSupported":{"type":"boolean","description":"True when the provider can apply partner markup."},"slippageSupported":{"type":"boolean","description":"DEX providers only. True when the provider honours the `slippage` parameter."},"autoSlippageSupported":{"type":"boolean","nullable":true,"description":"DEX providers only. True when the provider can pick the slippage for you when you omit `slippage`."},"logoUrl":{"type":"string","description":"Provider logo, ready to show in your UI."}},"required":["id","name","shortName","enabled"],"type":"object","additionalProperties":false},"RateLimitsResponse":{"properties":{"monthlyRequestCount":{"type":"number","format":"double","description":"Requests made in current month"},"quote":{"properties":{"perDay":{"type":"number","format":"double","description":"Requests allowed per day"},"perHour":{"type":"number","format":"double","description":"Requests allowed per hour"},"perMinute":{"type":"number","format":"double","description":"Requests allowed per minute"}},"required":["perDay","perHour","perMinute"],"type":"object"},"exchange":{"properties":{"perDay":{"type":"number","format":"double","description":"Requests allowed per day"},"perHour":{"type":"number","format":"double","description":"Requests allowed per hour"},"perMinute":{"type":"number","format":"double","description":"Requests allowed per minute"}},"required":["perDay","perHour","perMinute"],"type":"object"}},"required":["monthlyRequestCount","quote","exchange"],"type":"object","additionalProperties":false},"QuoteType":{"enum":["private","standard","dex"],"type":"string"},"FilteredReason":{"enum":["price_impact","different_recipient"],"type":"string"},"QuoteV2":{"properties":{"swap":{"type":"string","description":"Provider short code, e.g. `se`. Matches `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers).\n\nAbsent on private quotes — the providers behind a private route are not disclosed."},"quoteId":{"type":"string","description":"Pass this to [Create exchange](/api-reference/private-and-standard-swaps/create-exchange) to execute the quote."},"duration":{"type":"number","format":"double","description":"Our estimate of how long the swap takes, in minutes."},"providerEta":{"type":"number","format":"double","description":"The provider's own stated ETA, in minutes. May differ from `duration`."},"gas":{"type":"number","format":"double","description":"Estimated gas cost, in the source chain's native gas units. DEX routes only."},"gasUsd":{"type":"number","format":"double","description":"Estimated gas cost in USD. DEX routes only."},"amountIn":{"type":"number","format":"double","description":"Amount you send, e.g. `0.25` BTC."},"amountOut":{"type":"number","format":"double","description":"Amount you receive, e.g. `3.52` ETH."},"amountOutUsd":{"type":"number","format":"double","description":"`amountOut` valued in USD."},"amountInUsd":{"type":"number","format":"double","description":"`amountIn` valued in USD. Present on exact-out quotes only."},"feeUsd":{"type":"number","format":"double","description":"Provider fee in USD, charged on the source chain in its native token. Does not include gas."},"bridgeFeeUsd":{"type":"number","format":"double","description":"Bridge fee in USD, when the route crosses chains."},"netAmountOut":{"type":"number","format":"double","description":"The field to compare routes on: `amountOut` minus `feeUsd`, in the output token — not USD.\n\n- equals `amountOut` on CEX quotes, which carry no `feeUsd`\n- gas is not deducted\n- falls back to `amountOut` when the output token has no USD price"},"error":{"type":"string","description":"Why this route could not be priced. When set, the amounts are not usable."},"swapName":{"type":"string","description":"Provider display name, e.g. `StealthEx`.\n\nAbsent on private quotes, for the same reason as `swap`."},"type":{"$ref":"#/components/schemas/QuoteType","description":"Which route this is: `private`, `standard`, or `dex`."},"filtered":{"type":"boolean","description":"True when the route was returned but should not be used — check `filteredReason`. Creating an exchange from a filtered route is rejected.","default":false},"filteredReason":{"$ref":"#/components/schemas/FilteredReason","description":"Why the route was filtered: unacceptable price impact, or the payout wallet differs from the sender."},"supportsSignatures":{"type":"boolean","description":"True when the route accepts EIP-712 permit signatures instead of a separate approval transaction."},"logoUrl":{"type":"string","description":"Provider logo."},"markupSupported":{"type":"boolean","description":"True when the route can apply partner markup. Routes that cannot are excluded when you send `markup`."},"slippageSupported":{"type":"boolean","description":"True when the route honours the `slippage` parameter."},"apiMarkupValue":{"type":"number","format":"double","description":"Markup the route was priced with, in the unit given by `markupType`."},"markupType":{"type":"string","enum":["absolute","percentage","bp"],"description":"How to read `apiMarkupValue`: `percentage`, `absolute`, or `bp` (basis points)."},"restrictedCountries":{"items":{"type":"string"},"type":"array","description":"ISO country codes where this route may not be offered."},"min":{"type":"number","format":"double","description":"Smallest amount this route accepts, e.g. `0.001` BTC."},"max":{"type":"number","format":"double","description":"Largest amount this route accepts, e.g. `5` BTC."},"minOut":{"type":"number","format":"double","description":"Smallest amount you can receive, e.g. `100` USDT. Present only when `amountType` is `receive` and the provider returns receive-side bounds."},"maxOut":{"type":"number","format":"double","description":"Largest amount you can receive, e.g. `50000` USDT. Present only when `amountType` is `receive` and the provider returns receive-side bounds."},"rateId":{"type":"string","description":"Identifies the locked rate on a fixed-rate quote. You do not pass this when creating the exchange — `quoteId` carries it."},"fixed":{"type":"boolean","description":"True when the rate is locked until `validUntil`."},"validUntil":{"type":"string","description":"When the locked rate expires, as a Unix timestamp in seconds, e.g. `\"1767225600\"`. Fixed-rate quotes only — create the exchange before it passes."},"requiresApproval":{"type":"boolean","description":"DEX quotes only. True when the wallet must approve the token before swapping — EVM and Tron non-native tokens. Call [Get token approval data](/api-reference/on-chain-dex-or-bridge/get-token-approval-data), send what it returns, then poll [Check token allowance](/api-reference/on-chain-dex-or-bridge/check-token-allowance) until it turns true."},"isPriority":{"type":"boolean"},"depositAddressSupported":{"type":"boolean","description":"DEX quotes only. True when the route can be funded by sending to a deposit address, with no connected wallet."},"requiresRefundAddress":{"type":"boolean","description":"True when this provider needs a `refundAddress` to execute. Collect one before creating the exchange; without it the swap falls through to the next provider."},"appliedApiMarkup":{"type":"number","format":"double","description":"The `markup` you sent, as a percentage (`0.5` = 0.5%), returned back so you can check it was used. Absent when your stored account markup applied. On a private swap this is the PER-LEG value and is charged on both legs."},"express":{"type":"boolean","description":"True when this private route is expected to settle faster than usual. Absent when it is not."},"refundAddress":{"type":"string","description":"The `refundAddress` you sent, returned back so you can check it was used. It sits on the source chain."},"amountType":{"type":"string","enum":["send","receive"],"description":"Whether the amounts are driven by the send side (`send`) or the receive side (`receive`)."},"requiresIntermediateRefundAddress":{"type":"boolean","description":"True when this route settles through an on-chain hop, which needs a second refund address on top of `refundAddress`.\n\nCollect it from the user and send it as `intermediateRefundAddress` at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange), or the call is rejected. `intermediateRefundChain` and `intermediateRefundToken` say which chain it must be on and which token it would receive.\n\nAPI v2 returns these routes only when private routes with an on-chain hop are turned on for your account — see [Private routes with an on-chain hop](/docs/v2/private-onchain-leg)."},"intermediateRefundChain":{"type":"string","description":"Chain the `intermediateRefundAddress` must be on, e.g. `base`, `ethereum` or `solana`. Present only on a route that settles through an on-chain hop."},"intermediateRefundToken":{"type":"string","description":"Token the intermediate refund arrives in, e.g. `USDC`. The address you supply must be able to receive it. Present only on a route that settles through an on-chain hop."}},"type":"object","additionalProperties":false},"QuoteResultV2":{"properties":{"quotes":{"items":{"$ref":"#/components/schemas/QuoteV2"},"type":"array"},"total":{"type":"number","format":"double"}},"required":["quotes","total"],"type":"object","additionalProperties":false},"ExchangeType":{"type":"string","enum":["ch","cl","cn","ff","le","se","ss","sx","sxby","sxhu","sxku","sxmx","sz","sp","eb","nx","cc","qx","sg","tc","hu","nic","dl","ad","wh","cf","un","jp","mn","rd","ps","cs","kd","ct","zx","wc","su","tt","ni","sd","bg","ab","pt","ax","rl"]},"QuoteSort":{"enum":["amountOut","amountOutUsd","amountIn","duration"],"type":"string"},"SortDirection":{"enum":["asc","desc"],"type":"string"},"QuoteQueryParams":{"properties":{"amount":{"type":"number","format":"double","description":"Amount of the `from` token to swap, e.g. `1.5` BTC or `250.75` USDT — not base units / wei like `100000000000000`.","example":1,"minimum":0,"maximum":1.7976931348623157e+308},"from":{"type":"string","description":"Token you are swapping from. Use an `id` from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens) — a 24-character hex id such as `6689b73ec90e45f3b3e51566`, not a symbol like `ETH`.","example":"6689b73ec90e45f3b3e51566"},"to":{"type":"string","description":"Token you are swapping to. Use an `id` from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens) — a 24-character hex id such as `6689b73ec90e45f3b3e51558`, not a symbol like `SOL`.","example":"6689b73ec90e45f3b3e51558"},"markup":{"type":"number","format":"double","description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results\n- not supported on DEX routes. Leave `types` unset and DEX quotes are simply left out; ask for `types=dex` together with a markup and the request is rejected","minimum":0,"maximum":4},"useXmr":{"type":"boolean","description":"Use Monero (XMR) as the bridge token on a private swap.\n\nA private route hops through an intermediary token so the deposit and the payout are not linkable on-chain. `true` pins that hop to XMR; leave it unset and the hop is picked from a rotating set of other tokens. Ignored by standard and DEX quotes, which are single-leg.","example":false},"fixed":{"type":"boolean","description":"Request a fixed-rate quote. Only partners that support fixed rate will be returned. Available for standard and private CEX quotes; not supported for DEX.","example":false},"refundAddress":{"type":"string","description":"Where funds are returned if a swap cannot complete. Optional here — quotes are never filtered by it.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited\n- a route that will need one comes back with `requiresRefundAddress: true`\n- supply it at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange), where it is required for fixed-rate quotes and for those routes","example":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa","maxLength":200},"deviationThreshold":{"type":"number","format":"double","description":"Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5","example":5,"minimum":0,"maximum":100},"rotationLookback":{"type":"integer","format":"int32","description":"Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10","example":10,"minimum":1,"maximum":100},"rotatePayoutWallets":{"type":"boolean","description":"Rotate the payout path for better privacy. Only used for private swaps (`types=private`) — standard and DEX are single-leg and ignore it.","example":false},"rotateFallback":{"type":"boolean","description":"When strict rotation exhausts every rotated route, fall back to a valid non-rotated route instead of failing. Default false. Requires rotatePayoutWallets — a no-op on its own.","example":false},"inLegIncludedSwaps":{"items":{"type":"string"},"type":"array","description":"Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop."},"inLegExcludedSwaps":{"items":{"type":"string"},"type":"array","description":"Never use these providers for the in-leg of a private (2-hop) route. Does not affect the out-leg. Ignored by standard and DEX quotes."},"outLegIncludedSwaps":{"items":{"type":"string"},"type":"array","description":"Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop."},"outLegExcludedSwaps":{"items":{"type":"string"},"type":"array","description":"Never use these providers for the out-leg of a private (2-hop) route. Does not affect the in-leg. Ignored by standard and DEX quotes."},"slippage":{"type":"number","format":"double","description":"Slippage percentage. Only used for DEX swaps.","example":1,"minimum":0,"maximum":100},"types":{"items":{"$ref":"#/components/schemas/QuoteType"},"type":"array","description":"Types of quotes to return; if omitted, all types are used"},"swaps":{"items":{"$ref":"#/components/schemas/ExchangeType"},"type":"array","description":"Only quote these providers. Omit to use all of them.\n\n- values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)\n- applies to every quote type — private, standard and DEX"},"senderAddress":{"type":"string","description":"Wallet that funds the swap, on the source chain. Used by DEX quotes only — private and standard swaps ignore it.","example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40"},"receiverAddress":{"type":"string","description":"Wallet that receives the payout.\n\n- when it differs from `senderAddress`, DEX routes that cannot pay out to a different wallet are returned with `filtered: true` and `filteredReason: different_recipient` — still listed, but not usable\n- also used for payout wallet rotation","example":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC"},"sort":{"$ref":"#/components/schemas/QuoteSort","description":"Sort the quotes by the given field (default: amountOut)"},"sortOrder":{"$ref":"#/components/schemas/SortDirection","description":"Sort direction for quotes (default: desc)"},"amountType":{"type":"string","enum":["send","receive"],"description":"Whether `amount` refers to the send side or the receive side.\n- `\"send\"` (default): amount is what the user sends — system computes what they receive.\n- `\"receive\"`: amount is what the user wants to receive — system computes what they must send. Requires `fixed=true`. Available for standard and private CEX quotes; DEX quotes are dropped from the result, and a DEX-only request is rejected.","example":"send"}},"required":["amount","from","to"],"type":"object","additionalProperties":false},"PrivateSendQuoteQuery":{"description":"Quote a private same-token send (same token in and out).","properties":{"amount":{"type":"number","format":"double","description":"Amount of the `from` token to swap, e.g. `1.5` BTC or `250.75` USDT — not base units / wei like `100000000000000`.","example":1,"minimum":0,"maximum":1.7976931348623157e+308},"token":{"type":"string","description":"Token to send. Use an `id` from [Get tokens](/api-reference/private-send/get-tokens) with `hasSelfPrivate=true` — not a symbol.","example":"6689b73ec90e45f3b3e51566"},"markup":{"type":"number","format":"double","description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results\n- not supported on DEX routes. Leave `types` unset and DEX quotes are simply left out; ask for `types=dex` together with a markup and the request is rejected","minimum":0,"maximum":4},"useXmr":{"type":"boolean","description":"Use Monero (XMR) as the bridge token on a private swap.\n\nA private route hops through an intermediary token so the deposit and the payout are not linkable on-chain. `true` pins that hop to XMR; leave it unset and the hop is picked from a rotating set of other tokens. Ignored by standard and DEX quotes, which are single-leg.","example":false},"fixed":{"type":"boolean","description":"Request a fixed-rate quote. Only partners that support fixed rate will be returned. Available for standard and private CEX quotes; not supported for DEX.","example":false},"refundAddress":{"type":"string","description":"Where funds are returned if a swap cannot complete. Optional here — quotes are never filtered by it.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited\n- a route that will need one comes back with `requiresRefundAddress: true`\n- supply it at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange), where it is required for fixed-rate quotes and for those routes","example":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa","maxLength":200},"deviationThreshold":{"type":"number","format":"double","description":"Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5","example":5,"minimum":0,"maximum":100},"rotationLookback":{"type":"integer","format":"int32","description":"Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10","example":10,"minimum":1,"maximum":100},"rotatePayoutWallets":{"type":"boolean","description":"Rotate the payout path for better privacy. Only used for private swaps (`types=private`) — standard and DEX are single-leg and ignore it.","example":false},"rotateFallback":{"type":"boolean","description":"When strict rotation exhausts every rotated route, fall back to a valid non-rotated route instead of failing. Default false. Requires rotatePayoutWallets — a no-op on its own.","example":false},"inLegIncludedSwaps":{"items":{"type":"string"},"type":"array","description":"Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop."},"inLegExcludedSwaps":{"items":{"type":"string"},"type":"array","description":"Never use these providers for the in-leg of a private (2-hop) route. Does not affect the out-leg. Ignored by standard and DEX quotes."},"outLegIncludedSwaps":{"items":{"type":"string"},"type":"array","description":"Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop."},"outLegExcludedSwaps":{"items":{"type":"string"},"type":"array","description":"Never use these providers for the out-leg of a private (2-hop) route. Does not affect the in-leg. Ignored by standard and DEX quotes."}},"required":["amount","token"],"type":"object","additionalProperties":false},"MultiQuoteMode":{"type":"string","enum":["all","single"],"description":"Controls how many of the submitted orders are individually quoted.\n- `all` (default): every order is quoted and returns its own array of\n  candidate routes.\n- `single`: only the first order is quoted; the remaining orders come back\n  with `quoted: false` and no candidates — a lighter, faster preview for\n  when quoting the whole batch is too slow."},"MultiQuoteOrderError":{"properties":{"message":{"type":"string","description":"What went wrong, in plain text. Show it, but do not branch on it — the wording can change."},"code":{"anyOf":[{"type":"string"},{"type":"number","format":"double"}],"description":"Machine-readable reason, from the same set of codes as a top-level error response. Branch on this."}},"required":["message"],"type":"object","additionalProperties":false},"MultiQuoteOrderResult":{"description":"Per-order quote result envelope; `quotes` is empty when `error` is set.","properties":{"index":{"type":"number","format":"double","description":"Index of this order in the request `orders` array."},"quoted":{"type":"boolean","description":"False when the order was not individually quoted (single mode)."},"total":{"type":"number","format":"double","description":"Number of candidate quotes returned for this order."},"quotes":{"items":{"$ref":"#/components/schemas/QuoteV2"},"type":"array","description":"Routes for this order, best rate first. Empty when `quoted` is false or `error` is set."},"error":{"$ref":"#/components/schemas/MultiQuoteOrderError","description":"Why this order could not be quoted. Only the affected order fails — the rest of the batch still returns, and the request is still a 200."}},"required":["index","quoted","total","quotes"],"type":"object","additionalProperties":false},"MultiQuoteResult":{"properties":{"mode":{"$ref":"#/components/schemas/MultiQuoteMode","description":"The `mode` this batch was quoted with."},"batched":{"type":"boolean","description":"The `batched` setting this request ran with."},"orders":{"items":{"$ref":"#/components/schemas/MultiQuoteOrderResult"},"type":"array","description":"One entry per order you sent, in the same order. Match them up with `index`."}},"required":["mode","batched","orders"],"type":"object","additionalProperties":false},"MultiQuoteOrderItem":{"description":"A single order to quote within a POST /quotes/multi batch.","properties":{"from":{"type":"string","description":"Token ID from which the swap is initiated. Must be a MongoDB ObjectId (24-char hex string).","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).","example":"6689b73ec90e45f3b3e51558","minLength":24,"maxLength":24},"amount":{"type":"number","format":"double","description":"Input amount as a decimal float in the token's display units. Must be > 0.","minimum":0},"anonymous":{"type":"boolean","description":"Use anonymous (private) routing for this order."},"useXmr":{"type":"boolean","description":"Use Monero (XMR) as the bridge token on a private swap. Unset picks from a rotating set of other tokens."},"markup":{"type":"number","format":"double","description":"Partner markup for this request, as a percentage (0.5 = 0.5%).\nAccepted range: 0–4. This value overrides your account’s default\nmarkup for this trade. Send 0 to apply no markup, or leave the field\nempty / set it to null if no markup is requested. Providers that do\nnot support the requested markup will be excluded.","example":0.5,"minimum":0,"maximum":4}},"required":["from","to","amount"],"type":"object","additionalProperties":false},"LegFilter":{"properties":{"include":{"items":{"type":"string"},"type":"array","description":"Only use these providers for this leg. Values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)."},"exclude":{"items":{"type":"string"},"type":"array","description":"Never use these providers for this leg. Values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)."}},"type":"object","additionalProperties":false},"QuoteFilters":{"properties":{"onlySwaps":{"items":{"type":"string"},"type":"array","description":"Only quote these providers. Omit to use all of them. Values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)."},"rotatePayoutWallets":{"type":"boolean","description":"Rotate the payout path for better privacy. Private swaps only — standard and DEX are single-leg and ignore it."},"rotateFallback":{"type":"boolean","description":"When strict rotation runs out of rotated routes, use a valid non-rotated route instead of failing. Default false. Needs `rotatePayoutWallets` — on its own it does nothing."},"deviationThreshold":{"type":"number","format":"double","description":"How far the rate may move, as a percentage, before a rotated route is rejected. Default 5. Only used when `rotatePayoutWallets` is true.","minimum":0,"maximum":100},"rotationLookback":{"type":"integer","format":"int32","description":"How many of your recent orders to look at when picking a different payout path. Default 10. Only used when `rotatePayoutWallets` is true.","minimum":1,"maximum":100},"inLeg":{"$ref":"#/components/schemas/LegFilter","description":"Provider filter for the in-leg of a private (2-hop) route. Omit it and `onlySwaps` applies to both legs. Ignored by standard and DEX, which are single-hop."},"outLeg":{"$ref":"#/components/schemas/LegFilter","description":"Provider filter for the out-leg of a private (2-hop) route. Omit it and `onlySwaps` applies to both legs. Ignored by standard and DEX, which are single-hop."}},"type":"object","additionalProperties":false},"MultiQuoteRequest":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/MultiQuoteOrderItem"},"type":"array","description":"The swaps to quote, 1 to 10 per request. Each is quoted on its own, so one failing does not fail the rest.","minItems":1,"maxItems":10},"filters":{"$ref":"#/components/schemas/QuoteFilters","description":"Provider filters applied to every order in the batch."},"mode":{"$ref":"#/components/schemas/MultiQuoteMode","description":"How many of the submitted orders to quote. `all` (the default) quotes every order; `single` quotes only the first order and returns the rest with `quoted: false`. See MultiQuoteMode for the full behaviour."},"batched":{"type":"boolean","description":"Quote the orders in parallel (`true`, the default) or one after another. Leave it unset unless you are measuring latency — the results are the same either way."}},"required":["orders"],"type":"object","additionalProperties":false},"QuoteByChainAddressQueryParams":{"properties":{"amount":{"type":"number","format":"double","description":"Amount of the `from` token to swap, e.g. `1.5` BTC or `250.75` USDT — not base units / wei like `100000000000000`.","example":1,"minimum":0,"maximum":1.7976931348623157e+308},"fromChain":{"type":"string","description":"Source chain identifier — shortName from [Get chains](/api-reference/reference-data/get-chains) (e.g. \"ethereum\", \"kava_2222-10\", \"AssetHub\") or numeric EVM chainId (e.g. \"1\", \"42161\").","example":"ethereum","pattern":"^[A-Za-z0-9][A-Za-z0-9_.\\-]{0,49}$"},"toChain":{"type":"string","description":"Destination chain identifier — shortName from [Get chains](/api-reference/reference-data/get-chains) (e.g. \"ethereum\", \"kava_2222-10\", \"AssetHub\") or numeric EVM chainId (e.g. \"1\", \"42161\").","example":"solana","pattern":"^[A-Za-z0-9][A-Za-z0-9_.\\-]{0,49}$"},"fromTokenAddress":{"type":"string","description":"Contract address of the token you are swapping from. Omit for the chain's native coin.","example":""},"toTokenAddress":{"type":"string","description":"Contract address of the token you are swapping to. Omit for the chain's native coin.","example":""},"slippage":{"type":"number","format":"double","description":"Slippage percentage. Only used for DEX swaps.","example":1,"minimum":0,"maximum":100},"markup":{"type":"number","format":"double","description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results\n- not supported on DEX routes. Leave `types` unset and DEX quotes are simply left out; ask for `types=dex` together with a markup and the request is rejected","minimum":0,"maximum":4},"useXmr":{"type":"boolean","description":"Use Monero (XMR) as the bridge token on a private swap.\n\nA private route hops through an intermediary token so the deposit and the payout are not linkable on-chain. `true` pins that hop to XMR; leave it unset and the hop is picked from a rotating set of other tokens. Ignored by standard and DEX quotes, which are single-leg.","example":false},"fixed":{"type":"boolean","description":"Request a fixed-rate quote. Only partners that support fixed rate will be returned. On this endpoint fixed rate is limited to standard CEX quotes — use [Get quotes](/api-reference/private-and-standard-swaps/get-quotes) for private fixed-rate quotes or `amountType=receive`.","example":false},"deviationThreshold":{"type":"number","format":"double","description":"Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5","example":5,"minimum":0,"maximum":100},"rotationLookback":{"type":"integer","format":"int32","description":"Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10","example":10,"minimum":1,"maximum":100},"rotatePayoutWallets":{"type":"boolean","description":"Rotate the payout path for better privacy. Only used for private swaps (`types=private`) — standard and DEX are single-leg and ignore it.","example":false},"rotateFallback":{"type":"boolean","description":"When strict rotation exhausts every rotated route, fall back to a valid non-rotated route instead of failing. Default false. Requires rotatePayoutWallets — a no-op on its own.","example":false},"types":{"items":{"$ref":"#/components/schemas/QuoteType"},"type":"array","description":"Types of quotes to return; if omitted, all types are used"},"swaps":{"items":{"$ref":"#/components/schemas/ExchangeType"},"type":"array","description":"Only quote these providers. Omit to use all of them.\n\n- values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)\n- applies to every quote type — private, standard and DEX"},"inLegIncludedSwaps":{"items":{"type":"string"},"type":"array","description":"Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop."},"inLegExcludedSwaps":{"items":{"type":"string"},"type":"array","description":"Never use these providers for the in-leg of a private (2-hop) route. Does not affect the out-leg. Ignored by standard and DEX quotes."},"outLegIncludedSwaps":{"items":{"type":"string"},"type":"array","description":"Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop."},"outLegExcludedSwaps":{"items":{"type":"string"},"type":"array","description":"Never use these providers for the out-leg of a private (2-hop) route. Does not affect the in-leg. Ignored by standard and DEX quotes."},"senderAddress":{"type":"string","description":"Wallet that funds the swap, on the source chain. Used by DEX quotes only — private and standard swaps ignore it.","example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40"},"receiverAddress":{"type":"string","description":"Wallet that receives the payout.\n\n- when it differs from `senderAddress`, DEX routes that cannot pay out to a different wallet are returned with `filtered: true` and `filteredReason: different_recipient` — still listed, but not usable\n- also used for payout wallet rotation","example":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC"},"sort":{"$ref":"#/components/schemas/QuoteSort","description":"Sort the quotes by the given field (default: amountOut)"},"sortOrder":{"$ref":"#/components/schemas/SortDirection","description":"Sort direction for quotes (default: desc)"}},"required":["amount","fromChain","toChain"],"type":"object","additionalProperties":false},"PartnerProfileResponse":{"properties":{"id":{"type":"string","description":"Your partner id — the first half of your API credentials."},"name":{"type":"string","description":"Your company or product name."},"nickname":{"type":"string","description":"Short handle for your account."},"email":{"type":"string","description":"Contact address on the account."},"tier":{"type":"string","description":"Your plan: `free` or `pro`. It sets your rate limits — see [Get rate limits](/api-reference/partner-account/get-rate-limits)."},"commissionRate":{"type":"number","format":"double","description":"Base commission percentage used when no route-specific commission is set. `privateCommissionRate`, `standardCommissionRate`, and `dexCommissionRate` override this value for their matching order routes."},"privateCommissionRate":{"type":"number","format":"double","description":"Commission percentage for private/anonymous (2-hop) orders. Overrides `commissionRate` for this route when set."},"standardCommissionRate":{"type":"number","format":"double","description":"Commission percentage for standard non-anonymous CEX orders. Overrides `commissionRate` for this route when set."},"dexCommissionRate":{"type":"number","format":"double","description":"Commission percentage for DEX/bridge/onchain orders. Overrides `commissionRate` for this route when set."},"markup":{"type":"number","format":"double","nullable":true,"description":"API markup percentage value. `0.65` means `0.65%`, not `65%`."},"privateOnchainLegEnabled":{"type":"boolean","description":"Whether private routes with an on-chain hop are turned on for your account. Turn it on in the partner portal only after you handle `intermediateRefundAddress` — see [Private routes with an on-chain hop](/docs/v2/private-onchain-leg)."},"walletAddress":{"type":"string","description":"Where your commissions are paid out."},"created":{"type":"string","format":"date-time","description":"When your account was created."}},"required":["id","email","privateOnchainLegEnabled","created"],"type":"object","additionalProperties":false},"DisplayStatus":{"description":"Human-readable order state, derived from `status` and the per-leg statuses. Use this to drive your UI.\n\n- `WAITING_FOR_DEPOSIT` — waiting for your deposit to arrive\n- `DEPOSIT_DETECTED` — deposit seen, waiting for confirmations\n- `EXCHANGE_IN_PROGRESS` — the swap is running\n- `SENDING_TO_INTERMEDIARY` — private only: first leg on its way to the bridge token\n- `REACHED_INTERMEDIARY` — private only: first leg done\n- `INITIATING_SECOND_EXCHANGE` — private only: second leg starting\n- `SECOND_EXCHANGE_IN_PROGRESS` — private only: second leg running\n- `SENDING_TO_RECEIVER` — payout on its way to `receiverAddress`\n- `SWAP_COMPLETED` — finished\n- `EXPIRED` — no deposit arrived before `expires`\n- `FAILED` — the swap could not complete; check `actionRequired`\n- `REFUNDED` — funds returned to `refundAddress`\n- `DELETED` — order removed","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"},"OrderStatus":{"description":"- **-2** Order is being initialized (label: INITIALIZING)\n- **-1** Order initialized (label: NEW)\n- **0** Waiting for deposit confirmation (label: WAITING)\n- **1** Deposit is being confirmed (label: CONFIRMING)\n- **2** Exchange is in progress (label: EXCHANGING)\n- **3** Order is going through anonymization (label: ANONYMIZING)\n- **4** Order completed successfully (label: FINISHED)\n- **5** Order has expired (label: EXPIRED)\n- **6** Order failed (label: FAILED)\n- **7** Order was refunded (label: REFUNDED)\n- **8** Order was deleted (label: DELETED)","enum":[-2,-1,0,1,2,3,4,5,6,7,8],"type":"number"},"Status":{"description":"- **0** New swap\n- **1** Waiting for confirmation\n- **2** Being confirmed\n- **3** Exchange in progress\n- **4** Sending to destination\n- **5** Swap completed\n- **6** Swap failed\n- **7** Swap refunded\n- **8** Verifying swap\n- **9** Swap expired\n- **10** Fallback mode","enum":[0,1,2,3,4,5,6,7,8,9,10],"type":"number"},"Pick_Pick_Order.PublicOrderFields_.Exclude_keyofPick_Order.PublicOrderFields_.keyofOrderV2PublicOverrides__":{"properties":{"fixed":{"type":"boolean","description":"True when the order settled at a locked rate."},"express":{"type":"boolean","description":"True when this swap ran on a route expected to settle faster than usual. Absent when it did not."},"refundAddress":{"type":"string","description":"Refund address recorded for this order."},"houdiniId":{"type":"string","description":"Public order id. Use it with Get order details."},"depositTag":{"type":"string","description":"Memo/tag that must be sent with the deposit, on chains that use one (XRP, TON, Stellar, …).\n\nShow it to your user next to `depositAddress` — a deposit sent without it may not be credited."},"expires":{"type":"string","format":"date-time","description":"Deposit deadline — send the funds by this time or the order expires. Not a rate lock."},"displayStatus":{"$ref":"#/components/schemas/DisplayStatus","description":"Human-readable state for your UI, derived from `status` and the leg statuses. Prefer this over `status`."},"status":{"$ref":"#/components/schemas/OrderStatus","description":"Numeric order state. For anything user-facing prefer `displayStatus`.\n\n- `-2` initializing\n- `-1` created\n- `0` waiting for your deposit\n- `1` confirming your deposit\n- `2` exchanging\n- `3` anonymizing — private swaps only\n- `4` finished\n- `5` expired\n- `6` failed\n- `7` refunded\n- `8` deleted"},"eta":{"type":"number","format":"double","description":"ETA time, depending on swap"},"inAmount":{"type":"number","format":"double","description":"Amount to deposit, in the input token."},"inSymbol":{"type":"string","description":"Symbol of the input token, e.g. `BTC`."},"outAmount":{"type":"number","format":"double","description":"Amount you receive, in the output token."},"outSymbol":{"type":"string","description":"Symbol of the output token, e.g. `ETH`."},"inAmountUsd":{"type":"number","format":"double","description":"USD value of the input amount at order creation time."},"outAmountUsd":{"type":"number","format":"double","description":"`outAmount` valued in USD."},"inToken":{"$ref":"#/components/schemas/Token","description":"Token you sent."},"outToken":{"$ref":"#/components/schemas/Token","description":"Token you received."},"receiverAddress":{"type":"string","description":"Wallet the payout is sent to."},"intermediateRefundAddress":{"type":"string","description":"The `intermediateRefundAddress` sent at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange): where the intermediate hop's funds are returned if that hop cannot complete. Separate from `refundAddress`, which covers the deposit leg.\n\nPresent only on orders whose route settles through an on-chain hop — those quoted with `requiresIntermediateRefundAddress: true`."},"anonymous":{"type":"boolean","description":"True when this order took the private two-leg route."},"isDex":{"type":"boolean","description":"True when the order executed on a DEX route."},"nonRefundable":{"type":"boolean","description":"True when the deposit can no longer be refunded."},"actionRequired":{"type":"boolean","description":"True when the order failed but your deposit had already arrived — contact support to recover the funds."},"rerouted":{"type":"boolean","description":"True when the route that executed is not the one that was quoted, because the quoted route failed and a fallback was used. The amounts may differ from the quote — compare `inAmount` against `quotedInAmount` and `outAmount` against `quotedOutAmount`."},"quotedInAmount":{"type":"number","format":"double","description":"The deposit amount originally quoted, present only when the order was rerouted. `inAmount` is what the fallback route actually asks for; on an exact-out order this is the side that moves."},"quotedOutAmount":{"type":"number","format":"double","description":"The payout originally quoted, present only when the order was rerouted. `outAmount` is what the fallback route will actually pay; on an exact-in order this is the side that moves."},"refundHash":{"type":"string","description":"Hash of the transaction that returned your funds. Absent unless the order refunded."},"refundChain":{"type":"string","description":"Chain the refund was returned on, e.g. \"bsc\". Refunds are returned on the input chain."},"refundAmount":{"type":"number","format":"double","description":"Amount returned to you, after the provider's refund fee. Absent when the exchange did not report one."},"inStatus":{"$ref":"#/components/schemas/Status","description":"Progress of the incoming leg — your deposit reaching the provider. For reference and debugging; drive your UI from `displayStatus` instead.\n\n- `0` created\n- `1` waiting for the deposit\n- `2` deposit seen, waiting for confirmations\n- `3` exchanging\n- `4` sending funds on\n- `5` finished\n- `6` failed\n- `7` refunded\n- `8` on hold for a compliance check\n- `9` expired — no deposit arrived in time\n- `10` finished through a fallback payout"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"inCreated":{"type":"string","format":"date-time","description":"When the incoming leg was created."},"notified":{"type":"boolean"},"id":{"type":"string"},"metadata":{"description":"Extra data from the provider. The shape depends on the route."}},"required":["houdiniId","expires","displayStatus","status","eta","inAmount","inSymbol","outAmount","outSymbol","inAmountUsd","outAmountUsd","inToken","outToken","receiverAddress","anonymous","isDex","actionRequired","inStatus","created","inCreated","notified","id"],"type":"object","description":"From T, pick a set of properties whose keys are in the union K"},"OrderV2PublicResponse":{"properties":{"fixed":{"type":"boolean","description":"True when the order settled at a locked rate."},"express":{"type":"boolean","description":"True when this swap ran on a route expected to settle faster than usual. Absent when it did not."},"refundAddress":{"type":"string","description":"Refund address recorded for this order."},"houdiniId":{"type":"string","description":"Public order id. Use it with Get order details."},"depositTag":{"type":"string","description":"Memo/tag that must be sent with the deposit, on chains that use one (XRP, TON, Stellar, …).\n\nShow it to your user next to `depositAddress` — a deposit sent without it may not be credited."},"expires":{"type":"string","format":"date-time","description":"Deposit deadline — send the funds by this time or the order expires. Not a rate lock."},"displayStatus":{"$ref":"#/components/schemas/DisplayStatus","description":"Human-readable state for your UI, derived from `status` and the leg statuses. Prefer this over `status`."},"status":{"$ref":"#/components/schemas/OrderStatus","description":"Numeric order state. For anything user-facing prefer `displayStatus`.\n\n- `-2` initializing\n- `-1` created\n- `0` waiting for your deposit\n- `1` confirming your deposit\n- `2` exchanging\n- `3` anonymizing — private swaps only\n- `4` finished\n- `5` expired\n- `6` failed\n- `7` refunded\n- `8` deleted"},"eta":{"type":"number","format":"double","description":"ETA time, depending on swap"},"inAmount":{"type":"number","format":"double","description":"Amount to deposit, in the input token."},"inSymbol":{"type":"string","description":"Symbol of the input token, e.g. `BTC`."},"outAmount":{"type":"number","format":"double","description":"Amount you receive, in the output token."},"outSymbol":{"type":"string","description":"Symbol of the output token, e.g. `ETH`."},"inAmountUsd":{"type":"number","format":"double","description":"USD value of the input amount at order creation time."},"outAmountUsd":{"type":"number","format":"double","description":"`outAmount` valued in USD."},"inToken":{"$ref":"#/components/schemas/Token","description":"Token you sent."},"outToken":{"$ref":"#/components/schemas/Token","description":"Token you received."},"receiverAddress":{"type":"string","description":"Wallet the payout is sent to."},"intermediateRefundAddress":{"type":"string","description":"The `intermediateRefundAddress` sent at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange): where the intermediate hop's funds are returned if that hop cannot complete. Separate from `refundAddress`, which covers the deposit leg.\n\nPresent only on orders whose route settles through an on-chain hop — those quoted with `requiresIntermediateRefundAddress: true`."},"anonymous":{"type":"boolean","description":"True when this order took the private two-leg route."},"isDex":{"type":"boolean","description":"True when the order executed on a DEX route."},"nonRefundable":{"type":"boolean","description":"True when the deposit can no longer be refunded."},"actionRequired":{"type":"boolean","description":"True when the order failed but your deposit had already arrived — contact support to recover the funds."},"rerouted":{"type":"boolean","description":"True when the route that executed is not the one that was quoted, because the quoted route failed and a fallback was used. The amounts may differ from the quote — compare `inAmount` against `quotedInAmount` and `outAmount` against `quotedOutAmount`."},"quotedInAmount":{"type":"number","format":"double","description":"The deposit amount originally quoted, present only when the order was rerouted. `inAmount` is what the fallback route actually asks for; on an exact-out order this is the side that moves."},"quotedOutAmount":{"type":"number","format":"double","description":"The payout originally quoted, present only when the order was rerouted. `outAmount` is what the fallback route will actually pay; on an exact-in order this is the side that moves."},"refundHash":{"type":"string","description":"Hash of the transaction that returned your funds. Absent unless the order refunded."},"refundChain":{"type":"string","description":"Chain the refund was returned on, e.g. \"bsc\". Refunds are returned on the input chain."},"refundAmount":{"type":"number","format":"double","description":"Amount returned to you, after the provider's refund fee. Absent when the exchange did not report one."},"inStatus":{"$ref":"#/components/schemas/Status","description":"Progress of the incoming leg — your deposit reaching the provider. For reference and debugging; drive your UI from `displayStatus` instead.\n\n- `0` created\n- `1` waiting for the deposit\n- `2` deposit seen, waiting for confirmations\n- `3` exchanging\n- `4` sending funds on\n- `5` finished\n- `6` failed\n- `7` refunded\n- `8` on hold for a compliance check\n- `9` expired — no deposit arrived in time\n- `10` finished through a fallback payout"},"created":{"type":"string","format":"date-time"},"modified":{"type":"string","format":"date-time"},"inCreated":{"type":"string","format":"date-time","description":"When the incoming leg was created."},"notified":{"type":"boolean"},"id":{"type":"string"},"metadata":{"description":"Extra data from the provider. The shape depends on the route."},"receiverTag":{"type":"string","nullable":true,"description":"Memo/tag required when receiving funds for assets that use one"},"swapName":{"type":"string","description":"Name of the exchange handling the deposit leg. Omitted on private orders, which withhold the provider, and on multiswap orders that have not yet been assigned one."},"multiId":{"type":"string","description":"Multi ID. Present only on orders created as part of a batch."},"outStatus":{"$ref":"#/components/schemas/Status","description":"Status of the payout leg. Present only on private orders — public orders settle in a single leg and never carry one. For reference and debugging; drive your UI from `displayStatus` instead.\n\n- `0` created\n- `1` waiting for the deposit\n- `2` deposit seen, waiting for confirmations\n- `3` exchanging\n- `4` sending funds on\n- `5` finished\n- `6` failed\n- `7` refunded\n- `8` on hold for a compliance check\n- `9` expired — no deposit arrived in time\n- `10` finished through a fallback payout"},"transactionHash":{"type":"string","nullable":true,"description":"Hash of the transaction that delivered the result of the order. Use this field to show or link the payout — it works the same on standard and private orders.\n\n- Finished order: the payout to `receiverAddress`.\n- Refunded order: the transaction that returned your funds.\n- Otherwise: empty until the payout is sent."},"hashUrl":{"type":"string","description":"Block explorer link for `transactionHash`. Empty until `transactionHash` is set, or when the chain has no explorer."},"inHash":{"type":"string","nullable":true,"description":"Hash of your deposit transaction. Empty until the deposit is seen."},"inTransactionInHash":{"type":"string","nullable":true,"description":"Deprecated. Use `inHash`.\n\nHash of your deposit transaction. Empty until the deposit is seen.","deprecated":true},"outTransactionOutHash":{"type":"string","nullable":true,"description":"Deprecated. Use `transactionHash`.\n\nPayout hash of the second leg of a private order. Empty on standard orders, and on private orders until that leg has paid out.","deprecated":true},"orderFinishedReceived":{"type":"string","format":"date-time","description":"When the order reached a final state. Stamped only when an order finishes — orders that expire, fail or refund never receive one."},"depositAddress":{"type":"string","description":"The deposit address where the user must send funds. Omitted on multiswap orders whose per-order setup did not complete."}},"required":["houdiniId","expires","displayStatus","status","eta","inAmount","inSymbol","outAmount","outSymbol","inAmountUsd","outAmountUsd","inToken","outToken","receiverAddress","anonymous","isDex","actionRequired","inStatus","created","inCreated","notified","id"],"type":"object","additionalProperties":false},"PaginatedOrdersV2Response":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/OrderV2PublicResponse"},"type":"array"},"totalPages":{"type":"number","format":"double"},"total":{"type":"number","format":"double"}},"required":["orders","totalPages","total"],"type":"object","additionalProperties":false},"OrderSortField":{"enum":["created","updated","amount"],"type":"string"},"MinMaxResponse":{"properties":{"cex":{"properties":{"maxOut":{"type":"number","format":"double","description":"Largest amount you can receive. Only for `amountType=receive`.","example":50000},"minOut":{"type":"number","format":"double","description":"Smallest amount you can receive. Only for `amountType=receive`.","example":75},"max":{"type":"number","format":"double","description":"Largest amount you can send.","example":16.914175},"min":{"type":"number","format":"double","description":"Smallest amount you can send.","example":0.0253712625}},"required":["maxOut","minOut","max","min"],"type":"object","nullable":true,"description":"CEX min/max values"},"dex":{"properties":{"maxOut":{"type":"number","format":"double","description":"Not returned — DEX does not support `amountType=receive`."},"minOut":{"type":"number","format":"double","description":"Not returned — DEX does not support `amountType=receive`."},"max":{"type":"number","format":"double","description":"Largest amount you can send.","example":50},"min":{"type":"number","format":"double","description":"Smallest amount you can send.","example":0.005}},"required":["max","min"],"type":"object","nullable":true,"description":"DEX min/max values"},"private":{"properties":{"maxOut":{"type":"number","format":"double","description":"Largest amount you can receive. Only for `amountType=receive`.","example":50000},"minOut":{"type":"number","format":"double","description":"Smallest amount you can receive. Only for `amountType=receive`.","example":100},"max":{"type":"number","format":"double","description":"Largest amount you can send.","example":16.914175},"min":{"type":"number","format":"double","description":"Smallest amount you can send.","example":0.0845708751}},"required":["maxOut","minOut","max","min"],"type":"object","nullable":true,"description":"Private/anonymous CEX min/max values"}},"required":["cex","dex","private"],"type":"object","additionalProperties":false},"PartnerHealthStatus":{"type":"string","enum":["ok","degraded","down"],"description":"`ok` — operating normally. `degraded` — partially available, swaps may fail or be slow. `down` — not usable."},"PartnerHealthResponse":{"properties":{"status":{"$ref":"#/components/schemas/PartnerHealthStatus","description":"Overall status. `down` when the API is down, or when both quote engines are down. `degraded` when the API is degraded, either quote engine is not `ok`, or the snapshot is more than 15 minutes old."},"api":{"properties":{"status":{"$ref":"#/components/schemas/PartnerHealthStatus"}},"required":["status"],"type":"object","description":"Availability of the API itself."},"quotes":{"properties":{"cex":{"$ref":"#/components/schemas/PartnerHealthStatus"},"dex":{"$ref":"#/components/schemas/PartnerHealthStatus"}},"required":["cex","dex"],"type":"object","description":"Availability of quoting, per route type. `ok` when at least 80% of that engine's providers are healthy, `down` when none are, `degraded` in between."},"timestamp":{"type":"string","format":"date-time","nullable":true,"description":"When this snapshot was taken. Null when no health data is available, in which case everything reports `down`."}},"required":["status","api","quotes","timestamp"],"type":"object","additionalProperties":false},"Record_string.any_":{"properties":{},"additionalProperties":{},"type":"object","description":"Construct a type with a set of properties K of type T"},"SignatureObject":{"properties":{"signature":{"type":"string"},"key":{"type":"string"},"swapRequiredMetadata":{"$ref":"#/components/schemas/Record_string.any_"}},"required":["signature","key"],"type":"object","additionalProperties":false},"ExchangeRequest":{"description":"Request body for creating a new exchange","properties":{"addressTo":{"type":"string","description":"Destination wallet address where funds will be sent","minLength":1,"maxLength":200},"quoteId":{"type":"string","description":"The `quoteId` from a quote response. It carries the amount, the token pair and the provider, so you do not send those again.\n\nQuotes expire. Create the exchange while the quote is still fresh:\n\n- about a minute for private and standard quotes, and for DEX quotes on a chain's native coin\n- 10 minutes for DEX quotes on a token that needs an approval, leaving room for the approval transaction\n- once it lapses the call returns 422. Fetch a new quote and retry\n\nIf the chosen provider fails, private and standard swaps fall back to the next best route. The order then comes back with `rerouted: true` and the amounts can differ from the quote, so compare `quotedInAmount` and `quotedOutAmount` before showing the result."},"markup":{"type":"number","format":"double","description":"Markup for this trade, as a percentage — `0.5` means 0.5%. Range 0–4.\n\nThe quote already carries the markup it was priced with, so you normally omit this field.\n\n- send it only to repeat the quote's own markup. A different value is rejected with 422 `MARKUP_MISMATCHES_QUOTE`\n- sending it on a DEX quote is rejected with 422 `MARKUP_NOT_SUPPORTED_FOR_DEX`\n- above your account ceiling it is rejected with 422 `MARKUP_EXCEEDS_LIMIT`\n\nTo change the markup, quote again with the new value rather than overriding it here.","example":0.5,"minimum":0,"maximum":4},"refundAddress":{"type":"string","description":"Where funds are returned if the swap cannot complete.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited\n- required when the quote has `fixed: true` or `requiresRefundAddress: true`","maxLength":200},"refundExtraId":{"type":"string","description":"Memo/tag for `refundAddress`, e.g. XRP destination tag, Stellar memo, TON comment. Send it when the source token's chain has `memoNeeded: true` — see [Get chains](/api-reference/reference-data/get-chains).","maxLength":64},"intermediateRefundAddress":{"type":"string","description":"Where the intermediate hop's funds are returned if that hop cannot complete. Separate from `refundAddress`, which covers the deposit leg.\n\n- required when the quote has `requiresIntermediateRefundAddress: true`; ignored otherwise\n- must be on the quote's `intermediateRefundChain` and able to receive `intermediateRefundToken`\n- **use a wallet the user controls, not an exchange deposit address**\n\nSee [Private routes with an on-chain hop](/docs/v2/private-onchain-leg).","maxLength":200},"destinationTag":{"type":"string","description":"Memo/tag for `addressTo`, e.g. XRP destination tag, Stellar memo, TON comment. Send it when the destination token's chain has `memoNeeded: true` — see [Get chains](/api-reference/reference-data/get-chains).","maxLength":64},"addressFrom":{"type":"string","description":"Source wallet address (required for DEX, ignored for CEX)"},"signatures":{"items":{"$ref":"#/components/schemas/SignatureObject"},"type":"array","description":"EIP-712 signatures for permit-based approvals (DEX only)"},"walletInfo":{"type":"string","description":"Name of the wallet the user is swapping from, e.g. `MetaMask`, `Phantom`, `Trust Wallet`. Optional.","maxLength":256}},"required":["addressTo","quoteId"],"type":"object","additionalProperties":false},"PrivateSendExchangeRequest":{"description":"Create a private same-token order from a prior private-send quote.","properties":{"addressTo":{"type":"string","description":"Destination wallet address where funds will be sent","minLength":1,"maxLength":200},"quoteId":{"type":"string","description":"The `quoteId` from a quote response. It carries the amount, the token pair and the provider, so you do not send those again.\n\nQuotes expire. Create the exchange while the quote is still fresh:\n\n- about a minute for private and standard quotes, and for DEX quotes on a chain's native coin\n- 10 minutes for DEX quotes on a token that needs an approval, leaving room for the approval transaction\n- once it lapses the call returns 422. Fetch a new quote and retry\n\nIf the chosen provider fails, private and standard swaps fall back to the next best route. The order then comes back with `rerouted: true` and the amounts can differ from the quote, so compare `quotedInAmount` and `quotedOutAmount` before showing the result."},"markup":{"type":"number","format":"double","description":"Markup for this trade, as a percentage — `0.5` means 0.5%. Range 0–4.\n\nThe quote already carries the markup it was priced with, so you normally omit this field.\n\n- send it only to repeat the quote's own markup. A different value is rejected with 422 `MARKUP_MISMATCHES_QUOTE`\n- sending it on a DEX quote is rejected with 422 `MARKUP_NOT_SUPPORTED_FOR_DEX`\n- above your account ceiling it is rejected with 422 `MARKUP_EXCEEDS_LIMIT`\n\nTo change the markup, quote again with the new value rather than overriding it here.","example":0.5,"minimum":0,"maximum":4},"refundAddress":{"type":"string","description":"Where funds are returned if the swap cannot complete.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited\n- required when the quote has `fixed: true` or `requiresRefundAddress: true`","maxLength":200},"refundExtraId":{"type":"string","description":"Memo/tag for `refundAddress`, e.g. XRP destination tag, Stellar memo, TON comment. Send it when the source token's chain has `memoNeeded: true` — see [Get chains](/api-reference/reference-data/get-chains).","maxLength":64},"intermediateRefundAddress":{"type":"string","description":"Where the intermediate hop's funds are returned if that hop cannot complete. Separate from `refundAddress`, which covers the deposit leg.\n\n- required when the quote has `requiresIntermediateRefundAddress: true`; ignored otherwise\n- must be on the quote's `intermediateRefundChain` and able to receive `intermediateRefundToken`\n- **use a wallet the user controls, not an exchange deposit address**\n\nSee [Private routes with an on-chain hop](/docs/v2/private-onchain-leg).","maxLength":200},"destinationTag":{"type":"string","description":"Memo/tag for `addressTo`, e.g. XRP destination tag, Stellar memo, TON comment. Send it when the destination token's chain has `memoNeeded: true` — see [Get chains](/api-reference/reference-data/get-chains).","maxLength":64}},"required":["addressTo","quoteId"],"type":"object","additionalProperties":false},"MultiOrderError":{"properties":{"message":{"type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"number","format":"double"}]}},"required":["message"],"type":"object","additionalProperties":false},"MultiOrderResult":{"description":"One entry per requested swap: either the created order, or the error that stopped it","properties":{"order":{"$ref":"#/components/schemas/OrderV2PublicResponse"},"error":{"$ref":"#/components/schemas/MultiOrderError"}},"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},"MultiOrderItem":{"description":"A single order within a multi exchange batch. Quotes are resolved internally — no quoteId required.","properties":{"from":{"type":"string","description":"Token you are swapping from — an `id` from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens), e.g. `6689b73ec90e45f3b3e51566`.","example":"6689b73ec90e45f3b3e51566","minLength":24,"maxLength":24},"to":{"type":"string","description":"Token you are swapping to — an `id` from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens), e.g. `6689b73ec90e45f3b3e51558`.","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":"Memo/tag for `addressTo`, e.g. XRP destination tag, Stellar memo, TON comment. Send it when the destination token's chain has `memoNeeded: true` — see [Get chains](/api-reference/reference-data/get-chains).","maxLength":64},"useXmr":{"type":"boolean","description":"Use Monero (XMR) as the bridge token on a private swap. Unset picks from a rotating set of other tokens."},"walletInfo":{"type":"string","description":"Name of the wallet the user is swapping from, e.g. `MetaMask`, `Phantom`, `Trust Wallet`. Optional.","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":"Where funds are returned if the swap cannot complete. Required when `fixed` is true, or the provider requires one.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited","maxLength":200},"refundExtraId":{"type":"string","description":"Memo/tag for `refundAddress`, e.g. XRP destination tag, Stellar memo, TON comment. Send it when the source token's chain has `memoNeeded: true` — see [Get chains](/api-reference/reference-data/get-chains).","maxLength":64},"markup":{"type":"number","format":"double","description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results","example":0.5,"minimum":0,"maximum":4}},"required":["from","to","amount","addressTo"],"type":"object","additionalProperties":false},"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},"RecoveryAssetInfoResult":{"properties":{"tokenAddress":{"type":"string","description":"Contract address of the stuck token."},"tokenSymbol":{"type":"string","description":"Symbol of the stuck token, e.g. `USDT`."},"decimals":{"type":"number","format":"double","description":"Decimals of the stuck token, for turning `balance` into a display amount."},"balance":{"type":"string","description":"Amount held, in the token's smallest unit."},"sourceHoudiniIds":{"items":{"type":"string"},"type":"array","description":"The orders whose funds ended up here."}},"required":["tokenAddress","tokenSymbol","decimals","balance","sourceHoudiniIds"],"type":"object","additionalProperties":false},"EvmBatchTxSlimData":{"description":"The fields needed to sign and submit the batch.","properties":{"userOpHash":{"type":"string","description":"The digest the user's wallet must sign, as 32 bytes of hex. Sign it as a message — `signMessage({ message: { raw: userOpHash } })` in viem, `signMessage(getBytes(userOpHash))` in ethers — then post the signature to [Submit signed transaction](/api-reference/bundler-evm/submit-signed-transaction)."},"to":{"type":"string","description":"Where to send the funding transaction. It is **not** always the smart account:\n\n- ERC-20 source token — the token contract. The smart account is the recipient encoded inside `data`.\n- native source coin — the smart account itself."},"data":{"type":"string","description":"Calldata for the funding transaction. An ERC-20 `transfer` moving the tokens to the smart account, or `0x` when the source token is the chain's native coin.\n\nThe amount encoded here is the full balance the batch needs."},"value":{"type":"string","description":"Native coin to send with the transaction, in wei. Covers gas plus the swap amount when the source token is the native coin, and is `\"0\"` for ERC-20 sources."},"chainId":{"type":"number","format":"double","description":"EVM chain the batch runs on, e.g. `1` for Ethereum, `8453` for Base."},"tokenAmount":{"type":"string","description":"How much of the source token still has to reach the smart account, in the token's smallest unit. Already funded balance is deducted. `\"0\"` when the source token is the chain's native coin."}},"required":["userOpHash","to","data","value","chainId","tokenAmount"],"type":"object","additionalProperties":false},"SolanaBatchTxData":{"properties":{"data":{"type":"string","description":"Serialized transaction bytes (base64)"}},"required":["data"],"type":"object","additionalProperties":false},"EvmUserOp":{"description":"EntryPoint v0.7 unpacked UserOp. User pays gas from Smart Account balance — no paymaster.","properties":{"sender":{"type":"string"},"nonce":{"type":"string"},"factory":{"type":"string"},"factoryData":{"type":"string"},"callData":{"type":"string"},"callGasLimit":{"type":"string"},"verificationGasLimit":{"type":"string"},"preVerificationGas":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"},"signature":{"type":"string"},"paymaster":{"type":"string"},"paymasterData":{"type":"string"},"paymasterVerificationGasLimit":{"type":"string"},"paymasterPostOpGasLimit":{"type":"string"}},"required":["sender","nonce","callData","callGasLimit","verificationGasLimit","preVerificationGas","maxFeePerGas","maxPriorityFeePerGas","signature"],"type":"object","additionalProperties":false},"EvmGasEstimate":{"properties":{"gasCostWei":{"type":"string"},"gasCostNative":{"type":"string"},"nativeSymbol":{"type":"string"},"totalTransferAmountWei":{"type":"string"},"requiredSmartAccountBalanceWei":{"type":"string"},"gasCostToken":{"type":"string"},"gasCostTokenDecimals":{"type":"number","format":"double"},"exchangeRate":{"type":"string"},"paymasterStub":{"type":"boolean"}},"required":["gasCostWei","gasCostNative","nativeSymbol","totalTransferAmountWei","requiredSmartAccountBalanceWei"],"type":"object","additionalProperties":false},"EvmBatchTxData":{"properties":{"userOp":{"$ref":"#/components/schemas/EvmUserOp"},"userOpHash":{"type":"string"},"chainId":{"type":"number","format":"double"},"entryPoint":{"type":"string"},"to":{"type":"string"},"smartAccountAddress":{"type":"string"},"gasEstimate":{"$ref":"#/components/schemas/EvmGasEstimate"},"data":{"type":"string"},"value":{"type":"string"},"tokenAmount":{"type":"string"}},"required":["userOp","userOpHash","chainId","entryPoint","to","smartAccountAddress","gasEstimate","data","value","tokenAmount"],"type":"object","additionalProperties":false},"BatchTxData":{"anyOf":[{"$ref":"#/components/schemas/SolanaBatchTxData"},{"$ref":"#/components/schemas/EvmBatchTxData"}],"description":"Union — add new network types here as they are supported"},"TxBatch":{"properties":{"houdiniIds":{"items":{"type":"string"},"type":"array","description":"HoudiniIds of the orders included in this batch"},"txData":{"anyOf":[{"$ref":"#/components/schemas/EvmBatchTxSlimData"},{"$ref":"#/components/schemas/BatchTxData"}],"description":"Network-specific transaction data ready to broadcast"}},"required":["houdiniIds","txData"],"type":"object","additionalProperties":false},"FailedMultiswapRecoveryResult":{"properties":{"saAddress":{"type":"string","description":"Smart account holding the stuck funds. It is owned by the wallet that built the batch, so the funds stay recoverable by that wallet alone."},"assets":{"items":{"$ref":"#/components/schemas/RecoveryAssetInfoResult"},"type":"array","description":"Every stuck token, with its balance."},"transactions":{"items":{"$ref":"#/components/schemas/TxBatch"},"type":"array","description":"Withdrawal transactions to sign and submit, one per batch."}},"required":["saAddress","assets","transactions"],"type":"object","additionalProperties":false},"FailedMultiswapRecoveryRequest":{"description":"Request body for POST /exchanges/multi/recovery","properties":{"multiId":{"type":"string","description":"The multi exchange group ID","maxLength":64}},"required":["multiId"],"type":"object","additionalProperties":false},"OrderStatus.DELETED":{"enum":[8],"type":"number"},"MultiExchangeDeletedOrder":{"description":"Minimal order tombstone returned for stale or deleted multi-exchange orders","properties":{"houdiniId":{"type":"string"},"status":{"$ref":"#/components/schemas/OrderStatus.DELETED"}},"required":["houdiniId","status"],"type":"object","additionalProperties":false},"MultiExchangeStatusItem":{"anyOf":[{"$ref":"#/components/schemas/OrderV2PublicResponse"},{"$ref":"#/components/schemas/MultiExchangeDeletedOrder"}]},"MultiExchangeStatusResult":{"description":"Status of every swap in the group","properties":{"multiId":{"type":"string"},"orders":{"items":{"$ref":"#/components/schemas/MultiExchangeStatusItem"},"type":"array"},"txHash":{"type":"string","description":"On-chain transaction hash once the EVM bundle is confirmed; null until then"},"bundleStatus":{"type":"string","description":"Status of the most recent bundle record: pending | submitted | confirmed | failed | withdrawn. Absent when no bundle has been built yet (or for non-EVM multiswaps)."},"failureReason":{"type":"string","description":"Why the bundle failed; only set when bundleStatus is \"failed\""}},"required":["multiId","orders"],"type":"object","additionalProperties":false},"SolanaTxVersion":{"enum":["legacy","v0","v1"],"type":"string"},"MultiExchangeTxResult":{"properties":{"multiId":{"type":"string","description":"The group these transactions fund."},"chain":{"type":"string","description":"Chain kind of the from token (e.g. \"solana\", \"evm\")"},"txVersion":{"$ref":"#/components/schemas/SolanaTxVersion","description":"Solana only. Format of every transaction in `transactions`. Matches the `txVersion` you requested, or `legacy` if you did not set one."},"transactions":{"items":{"$ref":"#/components/schemas/TxBatch"},"type":"array","description":"One entry per batch. A group larger than the per-chain batch limit is split across several."},"depositNeeded":{"type":"string","description":"Native coin the smart account still needs before you can submit, in wei. `\"0\"` means it is already funded."},"saCurrentBalance":{"type":"string","description":"Native coin the smart account holds right now, in wei. The account is owned by the `sender` wallet, so this balance stays under the user's control."}},"required":["multiId","chain","transactions"],"type":"object","additionalProperties":false},"RetryResult":{"properties":{"txData":{"$ref":"#/components/schemas/MultiExchangeTxResult","description":"Rebuilt transaction data for the failed bundle — ready to sign and submit immediately"}},"required":["txData"],"type":"object","additionalProperties":false},"RetryFailedOrdersRequest":{"description":"Request body for POST /exchanges/multi/{multiId}/retry","properties":{"houdiniIds":{"items":{"type":"string"},"type":"array","description":"Optional subset of orders to retry; defaults to all retryable orders","maxItems":50}},"type":"object","additionalProperties":false},"MultiExchangeTxBuildRequest":{"description":"Request body for POST /exchanges/multi/{multiId}/tx/build","properties":{"sender":{"type":"string","description":"Wallet that will sign and fund the transaction(s). On EVM it also owns the smart account the batch runs through, so the same wallet must sign at [Submit signed transaction](/api-reference/bundler-evm/submit-signed-transaction).","minLength":1},"houdiniIds":{"items":{"type":"string"},"type":"array","description":"Optional subset of orders to build for; defaults to all orders in the group","maxItems":50}},"required":["sender"],"type":"object","additionalProperties":false},"SubmitEvmBatchTxResult":{"properties":{"userOpHashes":{"items":{"type":"string"},"type":"array","description":"One hash per submitted batch — the on-chain reference for each UserOperation."}},"required":["userOpHashes"],"type":"object","additionalProperties":false},"SubmitEvmBatchTxRequest":{"properties":{"signatures":{"items":{"type":"string"},"type":"array","description":"One signature per batch, in the same order as `transactions` in the build response.\n\nSign each batch's `userOpHash` as a message, with the same wallet you passed as `sender` when building. Pass the hash as **bytes**, not as a hex string — signing the `\"0x…\"` text produces a different digest and the submit is rejected.\n\n- viem — `walletClient.signMessage({ account, message: { raw: userOpHash } })`\n- ethers v6 — `signer.signMessage(getBytes(userOpHash))`\n- ethers v5 — `signer.signMessage(ethers.utils.arrayify(userOpHash))`","minItems":1}},"required":["signatures"],"type":"object","additionalProperties":false},"DexConfirmTxRequest":{"description":"Request body for confirming a DEX transaction","properties":{"id":{"type":"string","description":"The Houdini order ID","minLength":3},"txHash":{"type":"string","description":"The transaction hash to confirm. Required for on-chain orders, optional for off-chain orders. Supports multiple chain formats: EVM (0x + 64 hex), Solana (base58), Bitcoin (hex), TON, Tron, Sui.","minLength":10,"maxLength":128,"pattern":"^[a-zA-Z0-9+/=_.-]+$"}},"required":["id"],"type":"object","additionalProperties":false},"TypedDataDomain":{"properties":{"name":{"type":"string"},"version":{"type":"string"},"chainId":{"type":"number","format":"double"},"verifyingContract":{"type":"string"},"salt":{"type":"string"}},"type":"object","additionalProperties":false},"TypedDataField":{"properties":{"name":{"type":"string"},"type":{"type":"string"}},"required":["name","type"],"type":"object","additionalProperties":false},"Record_string.TypedDataField-Array_":{"properties":{},"additionalProperties":{"items":{"$ref":"#/components/schemas/TypedDataField"},"type":"array"},"type":"object","description":"Construct a type with a set of properties K of type T"},"EIP712TypedData":{"properties":{"domain":{"$ref":"#/components/schemas/TypedDataDomain"},"types":{"$ref":"#/components/schemas/Record_string.TypedDataField-Array_"},"primaryType":{"type":"string"},"message":{"$ref":"#/components/schemas/Record_string.any_"}},"required":["domain","types","primaryType","message"],"type":"object","additionalProperties":false},"SignatureType":{"enum":["single","chained"],"type":"string"},"ApprovalTypedData":{"properties":{"data":{"$ref":"#/components/schemas/EIP712TypedData","description":"The EIP-712 payload for the wallet to sign."},"type":{"$ref":"#/components/schemas/SignatureType","description":"`single` — sign it and you are done. `chained` — sign it, then call [Get next chain signature](/api-reference/on-chain-dex-or-bridge/get-next-chain-signature) for the next one."},"totalSteps":{"type":"number","format":"double","description":"How many signatures this chain needs in total. `1` for a single signature."},"step":{"type":"number","format":"double","description":"Which signature this is, counting from 1."},"isComplete":{"type":"boolean","description":"True on the last signature of the chain — stop asking for more once you see it."},"key":{"type":"string","description":"Identifies this signature. Pass it as `key` to [Get next chain signature](/api-reference/on-chain-dex-or-bridge/get-next-chain-signature) to fetch the next step."},"swapRequiredMetadata":{"$ref":"#/components/schemas/Record_string.any_","description":"Provider data attached to this signature. Send it back unchanged with the signed result — the swap fails without it."}},"required":["data","type","totalSteps","step","isComplete","key"],"type":"object","additionalProperties":false},"ChainSignaturesRequest":{"properties":{"quoteId":{"type":"string","description":"Quote ID from a prior quote response.","example":"69a02882f48d56c923119d95"},"addressFrom":{"type":"string","description":"EVM address from which the amount will be deducted","example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40","pattern":"^0x[0-9a-fA-F]{40}$"},"previousSignature":{"$ref":"#/components/schemas/SignatureObject","description":"Previous signature object from the wallet signing step"},"signatureKey":{"type":"string","description":"Key for the signature in the chain, returned from the previous approve or chainSignatures call","example":"permit"},"signatureStep":{"type":"integer","format":"int32","description":"Step number in the signature chain sequence","example":1,"minimum":0}},"required":["quoteId","addressFrom","previousSignature","signatureKey","signatureStep"],"type":"object","additionalProperties":false},"ApproveTransaction":{"properties":{"data":{"type":"string","description":"Calldata to send. Encodes the approval for the amount this swap needs."},"to":{"type":"string","description":"Send the transaction to this address — the contract of the token being approved."},"from":{"type":"string","description":"Wallet that must send the transaction — the `addressFrom` you supplied."},"fromChain":{"$ref":"#/components/schemas/Chain","description":"Chain the transaction runs on."}},"required":["data","to","from","fromChain"],"type":"object","additionalProperties":false},"ApprovalResponse":{"properties":{"approvals":{"items":{"$ref":"#/components/schemas/ApproveTransaction"},"type":"array","description":"Transactions the wallet must send before the swap. Empty when the allowance already covers it."},"signatures":{"items":{"$ref":"#/components/schemas/ApprovalTypedData"},"type":"array","description":"Messages to sign instead of sending an approval transaction, when the token and provider both support it. Pass the signed results to `signatures` on [Create exchange](/api-reference/private-and-standard-swaps/create-exchange)."}},"required":["approvals","signatures"],"type":"object","additionalProperties":false},"ApproveRequest":{"properties":{"quoteId":{"type":"string","description":"Quote ID from a prior quote response.","example":"69a02882f48d56c923119d95"},"addressFrom":{"type":"string","description":"Address from which the amount will be deducted (EVM or Tron)","example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40","pattern":"^(0x[0-9a-fA-F]{40}|T[1-9A-HJ-NP-Za-km-z]{33})$"},"addressTo":{"type":"string","description":"Destination address on the output chain. Only required by routes whose approval step signs the destination, currently HyperCore withdrawals. Format follows the output chain, so it is not restricted to EVM.","example":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC"},"usePermit":{"type":"boolean","description":"Whether to use permit instead of approve. Defaults to true for swaps that support it.","example":false}},"required":["quoteId","addressFrom"],"type":"object","additionalProperties":false},"AllowanceRequest":{"properties":{"quoteId":{"type":"string","description":"Quote ID from a prior quote response.","example":"69a02882f48d56c923119d95"},"addressFrom":{"type":"string","description":"Address from which the amount will be deducted (EVM or Tron)","example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40","pattern":"^(0x[0-9a-fA-F]{40}|T[1-9A-HJ-NP-Za-km-z]{33})$"},"usePermit":{"type":"boolean","description":"Whether to use permit instead of approve. Defaults to true for swaps that support it.","example":false}},"required":["quoteId","addressFrom"],"type":"object","additionalProperties":false},"CommissionOrderSummary":{"properties":{"id":{"type":"string","description":"Internal id of the order."},"houdiniId":{"type":"string","description":"The order id you track the swap with."},"created":{"type":"string","format":"date-time","description":"When the order was created."},"anonymous":{"type":"boolean","description":"True when it was a private swap."},"outAmountUsd":{"type":"number","format":"double","description":"Value paid out to the user, in USD."},"status":{"type":"number","format":"double","description":"Numeric order state — same values as `status` on [Get order details](/api-reference/private-and-standard-swaps/get-order-details). `4` means finished."}},"type":"object","additionalProperties":false},"CommissionItemResponse":{"properties":{"id":{"type":"string","description":"Id of this commission entry."},"created":{"type":"string","format":"date-time","description":"When the commission was earned."},"commissionAmountUsd":{"type":"number","format":"double","description":"What you earned on this order, in USD."},"commissionPercentage":{"type":"number","format":"double","description":"The rate applied to this order, as a percentage."},"orderVolumeUsd":{"type":"number","format":"double","description":"Size of the order it was earned on, in USD."},"processed":{"type":"boolean","description":"True once the commission has been paid out to you."},"processedTx":{"type":"string","description":"Transaction that paid it out. Present once `processed` is true."},"processedAt":{"type":"string","format":"date-time","description":"When it was paid out. Present once `processed` is true."},"commissionMonth":{"type":"string","description":"The month it counts towards, as `YYYY-MM`. Payouts are grouped by month."},"routeType":{"type":"string","description":"Which route earned it — `standard`, `privateSwap` or `dex`. Each can have its own rate."},"order":{"$ref":"#/components/schemas/CommissionOrderSummary","description":"The order it was earned on."}},"required":["id","created","commissionAmountUsd","commissionPercentage","orderVolumeUsd","processed","commissionMonth"],"type":"object","additionalProperties":false},"PaginatedCommissionsResponse":{"properties":{"commissions":{"items":{"$ref":"#/components/schemas/CommissionItemResponse"},"type":"array"},"total":{"type":"number","format":"double"},"totalPages":{"type":"number","format":"double"}},"required":["commissions","total","totalPages"],"type":"object","additionalProperties":false},"CommissionSummaryResponse":{"properties":{"totalEarnings":{"type":"number","format":"double","description":"Everything you have earned, in USD — paid out and not yet paid out."},"pendingCommissions":{"type":"number","format":"double","description":"Earned but not yet paid out, in USD."},"processedCommissions":{"type":"number","format":"double","description":"Already paid out, in USD."},"thisMonthEarnings":{"type":"number","format":"double","description":"Earned this calendar month, in USD. Not affected by the `month` filter."},"lastMonthEarnings":{"type":"number","format":"double","description":"Earned last calendar month, in USD. Not affected by the `month` filter."},"commissionCount":{"type":"number","format":"double","description":"How many commission entries are included."}},"required":["totalEarnings","pendingCommissions","processedCommissions","thisMonthEarnings","lastMonthEarnings","commissionCount"],"type":"object","additionalProperties":false},"ChartDataPoint":{"properties":{"date":{"type":"string"},"volumeUsd":{"type":"number","format":"double"},"count":{"type":"number","format":"double"}},"required":["date","volumeUsd","count"],"type":"object","additionalProperties":false},"ChartMetric":{"enum":["volume"],"type":"string"},"ChartGranularity":{"enum":["day","month"],"type":"string"},"ChainResponse":{"description":"Chain response with only public fields","properties":{"id":{"type":"string","description":"Chain ID","example":"507f1f77bcf86cd799439011"},"name":{"type":"string","description":"Readable chain name","example":"Bitcoin"},"shortName":{"type":"string","description":"Short name for DEX endpoints","example":"bitcoin"},"memoNeeded":{"type":"boolean","nullable":true,"description":"True when an address on this chain needs a memo or destination tag, e.g. XRP or TON. Send it as `destinationTag` for the payout address, or `refundExtraId` for the refund address.","example":false},"explorerUrl":{"type":"string","description":"Transaction explorer URL template","example":"https://blockchair.com/bitcoin/transaction/{txHash}"},"addressUrl":{"type":"string","description":"Address explorer URL template","example":"https://blockchair.com/bitcoin/address/{address}"},"icon":{"type":"string","description":"Chain icon URL (auto-formatted with ASSETS_URL if relative)","example":"https://api.houdiniswap.com/assets/networks/BTC.png"},"priority":{"type":"number","format":"double","description":"Display order, lower sorts first.\n* `0` is the highest priority and `99999` the lowest.","example":2},"kind":{"type":"string","description":"Chain kind/type","example":"bitcoin"},"addressValidation":{"type":"string","description":"Regex pattern for address validation","example":"^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,59}$"},"tokenAddressValidation":{"type":"string","description":"Regex pattern for token address validation","example":"^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,59}$"},"chainId":{"type":"number","format":"double","nullable":true,"description":"EVM chain ID (for EVM-compatible chains)","example":1}},"required":["id","name","shortName","explorerUrl","addressUrl","priority","kind","addressValidation","tokenAddressValidation"],"type":"object","additionalProperties":false},"PaginatedChainResponse":{"description":"Paginated response for chains","properties":{"chains":{"items":{"$ref":"#/components/schemas/ChainResponse"},"type":"array","description":"List of chains for the current page"},"total":{"type":"number","format":"double","description":"Total number of chains matching the filters"},"totalPages":{"type":"number","format":"double","description":"Total number of pages"}},"required":["chains","total","totalPages"],"type":"object","additionalProperties":false},"ChainKindFilter":{"type":"string","example":"evm","description":"Chain kind filter value (exact match against the `kind` field).","maxLength":16},"WithdrawalItemResponse":{"properties":{"id":{"type":"string","description":"Id of this payout."},"amountUsd":{"type":"number","format":"double","description":"Amount paid out, in USD."},"status":{"type":"string","enum":["pending","processing","completed","failed"],"description":"Where the payout is up to. `completed` means the funds have been sent."},"batchId":{"type":"string","description":"Groups payouts that were sent together."},"processedTx":{"type":"string","description":"Transaction that sent the funds. Present once the status is `completed`."},"created":{"type":"string","format":"date-time","description":"When the payout was requested."}},"required":["id","amountUsd","status","batchId","created"],"type":"object","additionalProperties":false},"WithdrawalsResponse":{"properties":{"withdrawals":{"items":{"$ref":"#/components/schemas/WithdrawalItemResponse"},"type":"array","description":"Payouts on this page, newest first."},"total":{"type":"number","format":"double","description":"How many payouts you have in total."},"totalPages":{"type":"number","format":"double","description":"How many pages that is, at the current `pageSize`."}},"required":["withdrawals","total","totalPages"],"type":"object","additionalProperties":false}},"securitySchemes":{"apiKey":{"type":"apiKey","name":"Authorization","in":"header","description":"Send `Authorization: <ApiKey>:<ApiSecret>` — joined by a colon, raw. No `Bearer` prefix, no base64.\n\n[Get your credentials](https://docs.houdiniswap.com/developer-hub/getting-started/authentication)"},"x402":{"type":"apiKey","name":"PAYMENT-SIGNATURE","in":"header","description":"x402 payment protocol, for callers paying per request instead of using API credentials. Send the signed USDC payment, base64-encoded, in the `PAYMENT-SIGNATURE` header.\n\nWithout payment you get a `402`; what to pay is in the base64 `payment-required` response header. Most callers never see this: sending an `Authorization` header skips the payment flow entirely.\n\nSee [x402 payments](/docs/v2/x402-payments) for the full exchange."}}},"info":{"title":"Houdini Swap Partner API","version":"2.1.2","description":"Quote and execute private, standard, and DEX swaps — one at a time or batched.","license":{"name":"ISC"},"contact":{}},"paths":{"/stats/volume":{"get":{"operationId":"GetVolume","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VolumeResponse"},"examples":{"Example 1":{"value":{"count":1284,"totalOrders":1284,"totalTransactedUSD":4820155.42,"thisMonthVolumeUsd":318420.11,"lastMonthVolumeUsd":402188.9,"thisMonthOrders":96}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns your lifetime and current-month swap volume and order counts.","summary":"Get volume stats","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[]}},"/stats/weeklyVolume":{"get":{"operationId":"GetWeeklyVolume","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WeeklyVolumeResponse"},"type":"array"},"examples":{"Example 1":{"value":[{"year":2026,"week":1,"count":52,"anonymous":31,"volume":61430.88,"commission":214.91},{"year":2026,"week":2,"count":44,"anonymous":25,"volume":48250.12,"commission":168.87}]}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns volume, order count and commission broken down by ISO week.","summary":"Get weekly volume","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[]}},"/tokens":{"get":{"operationId":"GetTokens","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenSearchResult"},"examples":{"Example 1":{"value":{"tokens":[{"address":null,"chain":"ethereum","decimals":18,"symbol":"ETH","name":"Ethereum","created":"2024-07-06T21:29:34.823Z","modified":"2026-09-16T07:06:46.700Z","chainData":{"created":"2024-07-06T21:02:11.672Z","modified":"2026-09-14T10:01:00.292Z","name":"Ethereum Mainnet","shortName":"ethereum","addressValidation":"^(0x)[0-9A-Za-z]{40}$","tokenAddressValidation":"^(0x)[0-9A-Za-z]{40}$","memoNeeded":false,"explorerUrl":"https://etherscan.io/tx/{txHash}","addressUrl":"https://etherscan.io/address/{address}","priority":2,"kind":"evm","chainId":1,"enabled":true,"shortNameV1":"ETH","id":"6689b0d3c52f263938c44844","icon":"https://api.houdiniswap.com/assets/networks/ETH.png"},"description":"Ethereum is a global, open-source platform for decentralized applications. In other words, the vision is to create a world computer that anyone can build applications in a decentralized manner; while all states and data are distributed and publicly accessible. Ethereum supports smart contracts in which developers can write code in order to program digital value. Examples of decentralized apps (dapps) that are built on Ethereum includes tokens, non-fungible tokens, decentralized finance apps, lending protocol, decentralized exchanges, and much more.\r\n\r\nOn Ethereum, all transactions and smart contract executions require a small fee to be paid. This fee is called Gas. In technical terms, Gas refers to the unit of measure on the amount of computational effort required to execute an operation or a smart contract. The more complex the execution operation is, the more gas is required to fulfill that operation. Gas fees are paid entirely in Ether (ETH), which is the native coin of the blockchain. The price of gas can fluctuate from time to time depending on the network demand.","mainnet":true,"enabled":true,"unverified":false,"hasDex":true,"hasCex":true,"hasSelfPrivate":true,"cexTokenId":"ETH","rank":2,"cgId":"ethereum","marketCapChange24h":-3.15312,"circulatingSupply":122053082.69974948,"price":2401.7,"marketCap":293069408497,"volume":18775255556,"fdv":293069408497,"change":-3.1168,"priority":2,"securityScan":{"provider":"blockaid","resultType":"Unscanned","features":[],"unscannedReason":"NATIVE_TOKEN","unscannedDetail":"ETH has no contract address to scan","scannedAt":"2026-09-15T08:25:54.920Z","expiresAt":"2026-09-16T08:25:54.920Z"},"id":"6689b73ec90e45f3b3e51566","icon":"https://api.houdiniswap.com/assets/tokens/ETH-ETH-lejbdy.png"}],"total":1,"totalPages":1}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the list of available tokens. Use the returned `id` as the `from` / `to` of a quote.\n\nWithout filters this returns every enabled token, 1000 per page and several MB per response. Narrow it with:\n\n- `term` — search by name, symbol, address or cexTokenId\n- `hasCex` — tokens available for private and standard swaps\n- `hasDex` — tokens available for DEX swaps\n- `hasBundler` — tokens the bundler can fund in one transaction\n- `chain` — one chain only, e.g. `ethereum`. Use a `shortName` from [Get chains](/api-reference/reference-data/get-chains)\n\nTokens we have not reviewed are excluded unless you pass `unverified=true`.","summary":"Get tokens","tags":["Private and Standard Swaps","Private Send","On-chain DEX or Bridge","Multi-Exchange"],"security":[{"apiKey":[]}],"parameters":[{"description":"Search term that matches against name, symbol, address, keyword, cexTokenId fields","in":"query","name":"term","required":false,"schema":{"type":"string","maxLength":100},"example":"SOL"},{"description":"Filter by chain, e.g. \"ethereum\". Use a shortName from [Get chains](/api-reference/reference-data/get-chains)","in":"query","name":"chain","required":false,"schema":{"type":"string"},"example":"solana"},{"description":"Filter by exact token symbol, e.g. \"USDT\"","in":"query","name":"symbol","required":false,"schema":{"type":"string","maxLength":20},"example":"SOL"},{"description":"Filter tokens by contract address","in":"query","name":"address","required":false,"schema":{"type":"string","maxLength":200},"example":""},{"description":"Filter tokens available for private and standard swaps.","in":"query","name":"hasCex","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter tokens available for DEX swaps.","in":"query","name":"hasDex","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter tokens that support self-to-self private swaps — send a token and receive the same token at another address, with no on-chain link between them.","in":"query","name":"hasSelfPrivate","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter tokens the bundler can fund — paying for a whole multi-exchange group with one transaction instead of a deposit per order.","in":"query","name":"hasBundler","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter by token type. true returns each chain's native coin (e.g. ETH on Ethereum, BNB on BSC); false returns issued tokens (e.g. USDT). Omit to return both.","in":"query","name":"mainnet","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Include tokens we have not reviewed. Defaults to false. Any contract address quoted through the API is added automatically, so this list contains arbitrary tokens — check `securityScan` before offering one to users.","in":"query","name":"unverified","required":false,"schema":{"default":false,"type":"boolean"},"example":false},{"in":"query","name":"page","required":false,"schema":{"default":1,"format":"int32","type":"integer","minimum":1,"maximum":10000},"example":20},{"description":"Number of results to return per page","in":"query","name":"pageSize","required":false,"schema":{"default":1000,"format":"int32","type":"integer","maximum":1000,"minimum":1},"example":20}]}},"/tokens/{id}":{"get":{"operationId":"GetTokenById","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"},"examples":{"Example 1":{"value":{"address":null,"chain":"solana","decimals":9,"symbol":"SOL","name":"Solana","created":"2024-07-06T21:29:34.822Z","modified":"2026-09-16T07:17:14.429Z","chainData":{"created":"2024-07-06T21:02:11.673Z","modified":"2026-09-14T10:01:00.292Z","name":"Solana","shortName":"solana","addressValidation":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","tokenAddressValidation":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","memoNeeded":false,"explorerUrl":"https://solscan.io/tx/{txHash}","addressUrl":"https://solscan.io/account/{address}","priority":1,"kind":"sol","enabled":true,"shortNameV1":"SOL","id":"6689b0d3c52f263938c4484e","icon":"https://api.houdiniswap.com/assets/chains/solana-n1gfe3.png"},"description":"Solana is a highly functional open source project that banks on blockchain technology’s permissionless nature to provide decentralized finance (DeFi) solutions. It is a layer 1 network that offers fast speeds and affordable costs. While the idea and initial work on the project began in 2017, Solana was officially launched in March 2020 by the Solana Foundation with headquarters in Geneva, Switzerland.","mainnet":true,"enabled":true,"unverified":false,"hasDex":true,"hasCex":true,"hasBundler":true,"hasSelfPrivate":true,"cexTokenId":"SOL","rank":7,"cgId":"solana","marketCapChange24h":-3.76076,"circulatingSupply":587064779.4352292,"price":97.3,"marketCap":56980421616,"volume":3952383111,"fdv":61546706124,"change":-3.61639,"securityScan":{"provider":"blockaid","resultType":"Unscanned","features":[],"unscannedReason":"NATIVE_TOKEN","unscannedDetail":"SOL has no contract address to scan","scannedAt":"2026-09-15T08:23:22.968Z","expiresAt":"2026-09-16T08:23:22.968Z"},"id":"6689b73ec90e45f3b3e51558","icon":"https://api.houdiniswap.com/assets/tokens/sol-solana.png"}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"404":{"description":"Token not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns a single token by its `id`. Use this to refresh one token you already know, rather than re-fetching the whole list.","summary":"Get token by ID","tags":["Reference Data"],"security":[{"apiKey":[]}],"parameters":[{"description":"The token id returned by [Get tokens](/api-reference/private-and-standard-swaps/get-tokens)","in":"path","name":"id","required":true,"schema":{"type":"string","pattern":"^[a-fA-F0-9]{24}$"},"example":"6689b73ec90e45f3b3e51558"}]}},"/swaps":{"get":{"operationId":"GetSwaps","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SwapResponse"},"type":"array"},"examples":{"Example 1":{"value":[{"id":"6421c1bb38a32da00696b9bc","name":"ChangeNow","shortName":"cn","txUrl":"https://changenow.io/exchange/txs/","enabled":true,"isDex":false,"deprecated":false,"markupSupported":false,"slippageSupported":false,"logoUrl":"https://api.houdiniswap.com/assets/logos/changenow.png"},{"id":"661fbcfbe0197bc93edf8d59","name":"Changelly","shortName":"cl","txUrl":"https://changelly.com/transaction/","enabled":true,"isDex":false,"deprecated":false,"markupSupported":false,"slippageSupported":false,"logoUrl":"https://api.houdiniswap.com/assets/logos/changelly.jpg"},{"id":"67d93eb4fef3c27b53393519","name":"Uniswap","shortName":"un","txUrl":"https://etherscan.io/tx/","enabled":true,"isDex":true,"deprecated":false,"markupSupported":false,"slippageSupported":true,"logoUrl":"https://api.houdiniswap.com/assets/logos/uniswap-uo9q0r.png"}]}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the list of available swap providers, for both CEX and DEX swaps. Filter with `isDex`.","summary":"Get swap providers","tags":["Reference Data"],"security":[{"apiKey":[]}],"parameters":[{"description":"Filter providers by type: true for DEX (onchain) providers, false for CEX providers","in":"query","name":"isDex","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Filter providers by whether they support partner markup","in":"query","name":"markupSupported","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter providers by whether they support slippage configuration. DEX providers only — CEX providers never do, so `true` returns DEX providers alone.","in":"query","name":"slippageSupported","required":false,"schema":{"type":"boolean"},"example":false}]}},"/rateLimits":{"get":{"operationId":"GetRateLimits","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitsResponse"},"examples":{"Example 1":{"value":{"monthlyRequestCount":0,"quote":{"perMinute":10,"perHour":100,"perDay":500},"exchange":{"perMinute":5,"perHour":10,"perDay":50}}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the effective rate limits for the authenticated partner, resolved from partner-specific overrides or tier defaults.","summary":"Get rate limits","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[]}},"/quotes":{"get":{"operationId":"GetQuotes","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResultV2"},"examples":{"Example 1":{"value":{"total":3,"quotes":[{"amountIn":1,"amountOut":24.308952,"min":0.041681,"max":1617.53705385,"duration":4,"amountOutUsd":2366.7195667200003,"quoteId":"6aaa4273aa41ccf7cad03086","type":"private","fixed":false},{"amountIn":1,"amountOut":24.50601963,"min":0.01250098966168155,"max":9007199254740991,"duration":21,"amountOutUsd":2385.9060711768,"swap":"se","swapName":"StealthEx","logoUrl":"https://api.houdiniswap.com/assets/logos/stealthex.png","quoteId":"6aaa4272aa41ccf7cad03035","type":"standard","rateId":null},{"swap":"cf","quoteId":"6aaa4272aa41ccf7cad0303c","duration":2.71,"gas":0,"amountIn":1,"amountOut":24.690801441,"amountOutUsd":2402.4149802093,"netAmountOut":24.690801441,"swapName":"ChainFlip","type":"dex","logoUrl":"https://api.houdiniswap.com/assets/logos/chainflip.png","markupSupported":true,"apiMarkupValue":10,"markupType":"bp","restrictedCountries":[],"min":0,"max":9007199254740991,"requiresApproval":false,"depositAddressSupported":true}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"404":{"description":"Token not found or disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns every available route for a token pair and amount — private, standard and DEX. Narrow the set with `types`.\n\n`from` and `to` are token ids; look them up with [Get tokens](/api-reference/private-and-standard-swaps/get-tokens).\n\nFor a private same-token send you can use [Get private send quote](/api-reference/private-send/get-private-send-quote), or stay on this endpoint with the same token on `from` and `to` and `types=private` — see the [Private send](/developer-hub/swap-flows/send) guide.","summary":"Get quotes","tags":["Private and Standard Swaps","On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[{"description":"Amount of the `from` token to swap, e.g. `1.5` BTC or `250.75` USDT — not base units / wei like `100000000000000`.","in":"query","name":"amount","required":true,"schema":{"format":"double","type":"number","minimum":0,"maximum":1.7976931348623157e+308},"example":1},{"description":"Token you are swapping from. Use an `id` from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens) — a 24-character hex id such as `6689b73ec90e45f3b3e51566`, not a symbol like `ETH`.","in":"query","name":"from","required":true,"schema":{"type":"string"},"example":"6689b73ec90e45f3b3e51566"},{"description":"Token you are swapping to. Use an `id` from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens) — a 24-character hex id such as `6689b73ec90e45f3b3e51558`, not a symbol like `SOL`.","in":"query","name":"to","required":true,"schema":{"type":"string"},"example":"6689b73ec90e45f3b3e51558"},{"description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results\n- not supported on DEX routes. Leave `types` unset and DEX quotes are simply left out; ask for `types=dex` together with a markup and the request is rejected","in":"query","name":"markup","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":4}},{"description":"Use Monero (XMR) as the bridge token on a private swap.\n\nA private route hops through an intermediary token so the deposit and the payout are not linkable on-chain. `true` pins that hop to XMR; leave it unset and the hop is picked from a rotating set of other tokens. Ignored by standard and DEX quotes, which are single-leg.","in":"query","name":"useXmr","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Request a fixed-rate quote. Only partners that support fixed rate will be returned. Available for standard and private CEX quotes; not supported for DEX.","in":"query","name":"fixed","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Where funds are returned if a swap cannot complete. Optional here — quotes are never filtered by it.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited\n- a route that will need one comes back with `requiresRefundAddress: true`\n- supply it at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange), where it is required for fixed-rate quotes and for those routes","in":"query","name":"refundAddress","required":false,"schema":{"type":"string","maxLength":200},"example":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"},{"description":"Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5","in":"query","name":"deviationThreshold","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":100},"example":5},{"description":"Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10","in":"query","name":"rotationLookback","required":false,"schema":{"format":"int32","type":"integer","minimum":1,"maximum":100},"example":10},{"description":"Rotate the payout path for better privacy. Only used for private swaps (`types=private`) — standard and DEX are single-leg and ignore it.","in":"query","name":"rotatePayoutWallets","required":false,"schema":{"type":"boolean"},"example":false},{"description":"When strict rotation exhausts every rotated route, fall back to a valid non-rotated route instead of failing. Default false. Requires rotatePayoutWallets — a no-op on its own.","in":"query","name":"rotateFallback","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.","in":"query","name":"inLegIncludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Never use these providers for the in-leg of a private (2-hop) route. Does not affect the out-leg. Ignored by standard and DEX quotes.","in":"query","name":"inLegExcludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.","in":"query","name":"outLegIncludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Never use these providers for the out-leg of a private (2-hop) route. Does not affect the in-leg. Ignored by standard and DEX quotes.","in":"query","name":"outLegExcludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Slippage percentage. Only used for DEX swaps.","in":"query","name":"slippage","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":100},"example":1},{"description":"Types of quotes to return; if omitted, all types are used","in":"query","name":"types","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteType"}}},{"description":"Only quote these providers. Omit to use all of them.\n\n- values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)\n- applies to every quote type — private, standard and DEX","in":"query","name":"swaps","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeType"}}},{"description":"Wallet that funds the swap, on the source chain. Used by DEX quotes only — private and standard swaps ignore it.","in":"query","name":"senderAddress","required":false,"schema":{"type":"string"},"example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40"},{"description":"Wallet that receives the payout.\n\n- when it differs from `senderAddress`, DEX routes that cannot pay out to a different wallet are returned with `filtered: true` and `filteredReason: different_recipient` — still listed, but not usable\n- also used for payout wallet rotation","in":"query","name":"receiverAddress","required":false,"schema":{"type":"string"},"example":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC"},{"description":"Sort the quotes by the given field (default: amountOut)","in":"query","name":"sort","required":false,"schema":{"$ref":"#/components/schemas/QuoteSort"}},{"description":"Sort direction for quotes (default: desc)","in":"query","name":"sortOrder","required":false,"schema":{"$ref":"#/components/schemas/SortDirection"}},{"description":"Whether `amount` refers to the send side or the receive side.\n- `\"send\"` (default): amount is what the user sends — system computes what they receive.\n- `\"receive\"`: amount is what the user wants to receive — system computes what they must send. Requires `fixed=true`. Available for standard and private CEX quotes; DEX quotes are dropped from the result, and a DEX-only request is rejected.","in":"query","name":"amountType","required":false,"schema":{"type":"string","enum":["send","receive"]},"example":"send"}]}},"/quotes/private-send":{"get":{"operationId":"GetPrivateSendQuote","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResultV2"},"examples":{"Example 1":{"value":{"total":3,"quotes":[{"amountIn":0.1,"amountOut":0.09845812,"min":0.0012053668334948734,"max":111.14801288872027,"duration":44,"amountOutUsd":8232.872062741199,"quoteId":"6abcd9544740df03928bb7ee","type":"private","fixed":false},{"amountIn":0.1,"amountOut":0.09845029,"min":0.00119657,"max":12.158054581842057,"duration":37,"amountOutUsd":8232.2173337229,"quoteId":"6abcd9544740df03928bb7ef","type":"private","fixed":false},{"amountIn":0.1,"amountOut":0.09842404,"min":0.001205773828948278,"max":111.18554232344803,"duration":35,"amountOutUsd":8230.0223609604,"quoteId":"6abcd9544740df03928bb7f8","type":"private","fixed":false}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"404":{"description":"Token not found or unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Token does not support private send","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Quote a private send: send funds to another wallet via a private (two-hop) route. Same token in and out.\n\nReturns receive amount, fees, ETA, and min/max. Pass a `quoteId` from the response to [Create private send order](/api-reference/private-send/create-private-send-order).\nQuotes are valid for about a minute — create the order before they expire.\n\nLook up token ids with [Get tokens](/api-reference/private-send/get-tokens) (`hasSelfPrivate=true`).\nSee the [Private send](/developer-hub/swap-flows/send) guide.\n\nThis endpoint only supports private same-token routes. If you want to keep one integration for every exchange type, use [Get quotes](/api-reference/private-and-standard-swaps/get-quotes) instead with the same token on `from` and `to` and `types=private`.","summary":"Get private send quote","tags":["Private Send"],"security":[{"apiKey":[]}],"parameters":[{"description":"Amount of the `from` token to swap, e.g. `1.5` BTC or `250.75` USDT — not base units / wei like `100000000000000`.","in":"query","name":"amount","required":true,"schema":{"format":"double","type":"number","minimum":0,"maximum":1.7976931348623157e+308},"example":1},{"description":"Token to send. Use an `id` from [Get tokens](/api-reference/private-send/get-tokens) with `hasSelfPrivate=true` — not a symbol.","in":"query","name":"token","required":true,"schema":{"type":"string"},"example":"6689b73ec90e45f3b3e51566"},{"description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results\n- not supported on DEX routes. Leave `types` unset and DEX quotes are simply left out; ask for `types=dex` together with a markup and the request is rejected","in":"query","name":"markup","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":4}},{"description":"Use Monero (XMR) as the bridge token on a private swap.\n\nA private route hops through an intermediary token so the deposit and the payout are not linkable on-chain. `true` pins that hop to XMR; leave it unset and the hop is picked from a rotating set of other tokens. Ignored by standard and DEX quotes, which are single-leg.","in":"query","name":"useXmr","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Request a fixed-rate quote. Only partners that support fixed rate will be returned. Available for standard and private CEX quotes; not supported for DEX.","in":"query","name":"fixed","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Where funds are returned if a swap cannot complete. Optional here — quotes are never filtered by it.\n\n- **use a wallet the user controls, not an exchange deposit address**\n- must be on the source chain — the refund comes back as the token you deposited\n- a route that will need one comes back with `requiresRefundAddress: true`\n- supply it at [Create exchange](/api-reference/private-and-standard-swaps/create-exchange), where it is required for fixed-rate quotes and for those routes","in":"query","name":"refundAddress","required":false,"schema":{"type":"string","maxLength":200},"example":"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"},{"description":"Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5","in":"query","name":"deviationThreshold","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":100},"example":5},{"description":"Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10","in":"query","name":"rotationLookback","required":false,"schema":{"format":"int32","type":"integer","minimum":1,"maximum":100},"example":10},{"description":"Rotate the payout path for better privacy. Only used for private swaps (`types=private`) — standard and DEX are single-leg and ignore it.","in":"query","name":"rotatePayoutWallets","required":false,"schema":{"type":"boolean"},"example":false},{"description":"When strict rotation exhausts every rotated route, fall back to a valid non-rotated route instead of failing. Default false. Requires rotatePayoutWallets — a no-op on its own.","in":"query","name":"rotateFallback","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.","in":"query","name":"inLegIncludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Never use these providers for the in-leg of a private (2-hop) route. Does not affect the out-leg. Ignored by standard and DEX quotes.","in":"query","name":"inLegExcludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.","in":"query","name":"outLegIncludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Never use these providers for the out-leg of a private (2-hop) route. Does not affect the in-leg. Ignored by standard and DEX quotes.","in":"query","name":"outLegExcludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}}]}},"/quotes/multi":{"post":{"operationId":"GetMultiQuotes","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiQuoteResult"},"examples":{"Example 1":{"value":{"mode":"all","batched":true,"orders":[{"index":0,"quoted":true,"total":1,"quotes":[{"quoteId":"69a02882f48d56c923119d95","swap":"cl","swapName":"Changelly","type":"private","amountIn":0.25,"amountOut":3.5182,"amountInUsd":26450.5,"amountOutUsd":26301.44,"netAmountOut":3.5182,"duration":22,"providerEta":18,"min":0.0012,"max":12.5,"fixed":false,"filtered":false,"amountType":"send"}]},{"index":1,"quoted":true,"total":0,"quotes":[],"error":{"code":"SWAP_AMOUNT_IS_OUT_OF_BOUNDS","message":"Amount is below the minimum for this pair"}}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"404":{"description":"Token not found or disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the available routes for each swap in a batch.\n\nOptional. [Create multi exchange](/api-reference/multi-exchange/create-multi-exchange) picks its own routes and takes no `quoteId`, so call this only when you want to show rates before committing.\n\n- standard and private CEX only — no DEX\n- `mode=single` quotes just the first swap, as a faster preview\n\nBeta — the response shape may still change.","summary":"Get multi quotes","tags":["Multi-Exchange"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiQuoteRequest"}}}}}},"/quotes/byChainAddress":{"get":{"operationId":"GetQuotesByChainAddress","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResultV2"},"examples":{"Example 1":{"value":{"total":3,"quotes":[{"amountIn":1,"amountOut":24.308952,"min":0.041681,"max":1617.53705385,"duration":4,"amountOutUsd":2366.7195667200003,"quoteId":"6aaa4273aa41ccf7cad03086","type":"private","fixed":false},{"amountIn":1,"amountOut":24.50601963,"min":0.01250098966168155,"max":9007199254740991,"duration":21,"amountOutUsd":2385.9060711768,"swap":"se","swapName":"StealthEx","logoUrl":"https://api.houdiniswap.com/assets/logos/stealthex.png","quoteId":"6aaa4272aa41ccf7cad03035","type":"standard","rateId":null},{"swap":"cf","quoteId":"6aaa4272aa41ccf7cad0303c","duration":2.71,"gas":0,"amountIn":1,"amountOut":24.690801441,"amountOutUsd":2402.4149802093,"netAmountOut":24.690801441,"swapName":"ChainFlip","type":"dex","logoUrl":"https://api.houdiniswap.com/assets/logos/chainflip.png","markupSupported":true,"apiMarkupValue":10,"markupType":"bp","restrictedCountries":[],"min":0,"max":9007199254740991,"requiresApproval":false,"depositAddressSupported":true}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"404":{"description":"Token not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Get quotes using contract addresses instead of token ids. Returns private, standard and DEX routes — narrow the set with `types`.\n\n- send `fromChain` + `fromTokenAddress` instead of `from`\n- send `toChain` + `toTokenAddress` instead of `to`\n\nEverything else works the same as [Get quotes](/api-reference/private-and-standard-swaps/get-quotes).","summary":"Get quotes by token address","tags":["Private and Standard Swaps","On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[{"description":"Amount of the `from` token to swap, e.g. `1.5` BTC or `250.75` USDT — not base units / wei like `100000000000000`.","in":"query","name":"amount","required":true,"schema":{"format":"double","type":"number","minimum":0,"maximum":1.7976931348623157e+308},"example":1},{"description":"Source chain identifier — shortName from [Get chains](/api-reference/reference-data/get-chains) (e.g. \"ethereum\", \"kava_2222-10\", \"AssetHub\") or numeric EVM chainId (e.g. \"1\", \"42161\").","in":"query","name":"fromChain","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.\\-]{0,49}$"},"example":"ethereum"},{"description":"Destination chain identifier — shortName from [Get chains](/api-reference/reference-data/get-chains) (e.g. \"ethereum\", \"kava_2222-10\", \"AssetHub\") or numeric EVM chainId (e.g. \"1\", \"42161\").","in":"query","name":"toChain","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.\\-]{0,49}$"},"example":"solana"},{"description":"Contract address of the token you are swapping from. Omit for the chain's native coin.","in":"query","name":"fromTokenAddress","required":false,"schema":{"type":"string"},"example":""},{"description":"Contract address of the token you are swapping to. Omit for the chain's native coin.","in":"query","name":"toTokenAddress","required":false,"schema":{"type":"string"},"example":""},{"description":"Slippage percentage. Only used for DEX swaps.","in":"query","name":"slippage","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":100},"example":1},{"description":"Markup for this request, as a percentage — `0.5` means 0.5%.\n\n- range 0–4; overrides your account default for this trade\n- send `0` for no markup, or omit the field to use your account default\n- providers that cannot apply it are excluded from the results\n- not supported on DEX routes. Leave `types` unset and DEX quotes are simply left out; ask for `types=dex` together with a markup and the request is rejected","in":"query","name":"markup","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":4}},{"description":"Use Monero (XMR) as the bridge token on a private swap.\n\nA private route hops through an intermediary token so the deposit and the payout are not linkable on-chain. `true` pins that hop to XMR; leave it unset and the hop is picked from a rotating set of other tokens. Ignored by standard and DEX quotes, which are single-leg.","in":"query","name":"useXmr","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Request a fixed-rate quote. Only partners that support fixed rate will be returned. On this endpoint fixed rate is limited to standard CEX quotes — use [Get quotes](/api-reference/private-and-standard-swaps/get-quotes) for private fixed-rate quotes or `amountType=receive`.","in":"query","name":"fixed","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5","in":"query","name":"deviationThreshold","required":false,"schema":{"format":"double","type":"number","minimum":0,"maximum":100},"example":5},{"description":"Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10","in":"query","name":"rotationLookback","required":false,"schema":{"format":"int32","type":"integer","minimum":1,"maximum":100},"example":10},{"description":"Rotate the payout path for better privacy. Only used for private swaps (`types=private`) — standard and DEX are single-leg and ignore it.","in":"query","name":"rotatePayoutWallets","required":false,"schema":{"type":"boolean"},"example":false},{"description":"When strict rotation exhausts every rotated route, fall back to a valid non-rotated route instead of failing. Default false. Requires rotatePayoutWallets — a no-op on its own.","in":"query","name":"rotateFallback","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Types of quotes to return; if omitted, all types are used","in":"query","name":"types","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteType"}}},{"description":"Only quote these providers. Omit to use all of them.\n\n- values are `shortName` from [Get swap providers](/api-reference/reference-data/get-swap-providers)\n- applies to every quote type — private, standard and DEX","in":"query","name":"swaps","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeType"}}},{"description":"Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.","in":"query","name":"inLegIncludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Never use these providers for the in-leg of a private (2-hop) route. Does not affect the out-leg. Ignored by standard and DEX quotes.","in":"query","name":"inLegExcludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.","in":"query","name":"outLegIncludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Never use these providers for the out-leg of a private (2-hop) route. Does not affect the in-leg. Ignored by standard and DEX quotes.","in":"query","name":"outLegExcludedSwaps","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"description":"Wallet that funds the swap, on the source chain. Used by DEX quotes only — private and standard swaps ignore it.","in":"query","name":"senderAddress","required":false,"schema":{"type":"string"},"example":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40"},{"description":"Wallet that receives the payout.\n\n- when it differs from `senderAddress`, DEX routes that cannot pay out to a different wallet are returned with `filtered: true` and `filteredReason: different_recipient` — still listed, but not usable\n- also used for payout wallet rotation","in":"query","name":"receiverAddress","required":false,"schema":{"type":"string"},"example":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC"},{"description":"Sort the quotes by the given field (default: amountOut)","in":"query","name":"sort","required":false,"schema":{"$ref":"#/components/schemas/QuoteSort"}},{"description":"Sort direction for quotes (default: desc)","in":"query","name":"sortOrder","required":false,"schema":{"$ref":"#/components/schemas/SortDirection"}}]}},"/me":{"get":{"operationId":"GetMe","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerProfileResponse"},"examples":{"Example 1":{"value":{"id":"6689b73ec90e45f3b3e51500","name":"Example Partner","nickname":"example-partner","email":"partner@example.com","tier":"pro","commissionRate":0.5,"privateCommissionRate":0.5,"standardCommissionRate":0.5,"dexCommissionRate":0.5,"markup":0.5,"privateOnchainLegEnabled":false,"walletAddress":"0x0000000000000000000000000000000000000000","created":"2024-07-06T10:21:18.000Z"}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Partner not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the profile of the partner that owns the API key making the request, including tier, commission rates per route, and default markup.","summary":"Get partner profile","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[]}},"/orders/{houdiniId}":{"get":{"operationId":"GetOrder","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderV2PublicResponse"},"examples":{"Example 1":{"value":{"created":"2026-09-28T02:44:44.178Z","houdiniId":"ao5tBEaAxkjJJdZnZeuXo6","receiverAddress":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC","status":0,"anonymous":false,"expires":"2026-09-28T03:14:44.178Z","in":"se","inAmount":0.05,"inSymbol":"ETH","inStatus":0,"inCreated":"2026-09-28T02:44:44.178Z","outAmount":1.09202632,"outSymbol":"SOL","eta":8,"inAmountUsd":132.6355,"isDex":false,"swapName":"StealthEx","depositAddress":"0x0000000000000000000000000000000000000000","id":"6ab9d49ca4f8db2c6ce6dfb2","hashUrl":"","statusLabel":"WAITING","inStatusLabel":"NEW","displayStatus":"WAITING_FOR_DEPOSIT"}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"404":{"description":"Order not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns order details for a given Houdini order ID created in the last 48 hours.\n\nPast that window the order drops out of the API and returns 404, the same as an id that never existed — store whatever you need to keep before then.","summary":"Get order details","tags":["Private and Standard Swaps","Private Send","On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[{"in":"path","name":"houdiniId","required":true,"schema":{"type":"string","maxLength":64},"example":"hxK7mQp2"}]}},"/orders":{"get":{"operationId":"GetOrders","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOrdersV2Response"},"examples":{"Example 1":{"value":{"orders":[{"created":"2026-09-28T02:44:44.178Z","houdiniId":"ao5tBEaAxkjJJdZnZeuXo6","receiverAddress":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC","status":0,"anonymous":false,"expires":"2026-09-28T03:14:44.178Z","in":"se","inAmount":0.05,"inSymbol":"ETH","inStatus":0,"inCreated":"2026-09-28T02:44:44.178Z","outAmount":1.09202632,"outSymbol":"SOL","eta":8,"inAmountUsd":132.6355,"isDex":false,"swapName":"StealthEx","depositAddress":"0x0000000000000000000000000000000000000000","id":"6ab9d49ca4f8db2c6ce6dfb2","hashUrl":"","statusLabel":"WAITING","inStatusLabel":"NEW","displayStatus":"WAITING_FOR_DEPOSIT"}],"total":1,"totalPages":1}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns a paginated list of orders created in the last 48 hours.\n\nOlder orders drop out of the API entirely — a `from` date earlier than that is clamped to the window, so keep your own record of anything you need long-term.","summary":"Get orders","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"format":"int32","type":"integer","minimum":1,"maximum":10000},"example":20},{"description":"Page size","in":"query","name":"pageSize","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":1,"maximum":100},"example":20},{"description":"Get all orders from a multi swap","in":"query","name":"multiId","required":false,"schema":{"type":"string","maxLength":64}},{"description":"Order status","in":"query","name":"status","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderStatus"}}},{"description":"Created from date ISO 8601 format","in":"query","name":"from","required":false,"schema":{"format":"date-time","type":"string"},"example":"2026-09-15T00:00:00.000Z"},{"description":"Created until date ISO 8601 format","in":"query","name":"to","required":false,"schema":{"format":"date-time","type":"string"},"example":"2026-09-16T00:00:00.000Z"},{"description":"Field to sort by: `created` sorts by `created`, `updated` by `modified`, and `amount` by `inAmountUsd`, the USD value of the deposit at order creation, so orders in different tokens compare.","in":"query","name":"sortBy","required":false,"schema":{"$ref":"#/components/schemas/OrderSortField"}},{"description":"Sort order direction","in":"query","name":"sortOrder","required":false,"schema":{"$ref":"#/components/schemas/SortDirection"}},{"description":"Filter by order privacy: true for private (anonymous) orders, false for standard orders","in":"query","name":"anonymous","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter by the token being sent, using an id from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens)","in":"query","name":"inTokenId","required":false,"schema":{"type":"string","pattern":"^[a-fA-F0-9]{24}$"}},{"description":"Filter by the token being received, using an id from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens)","in":"query","name":"outTokenId","required":false,"schema":{"type":"string","pattern":"^[a-fA-F0-9]{24}$"}}]}},"/minMax":{"get":{"operationId":"GetMinMax","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinMaxResponse"},"examples":{"Example 1":{"value":{"cex":{"min":0.0043690289937085985,"max":164.77480776272427,"minOut":0.10262725779967159,"maxOut":4105.0903119868635},"dex":null,"private":{"min":0.010922572484271495,"max":164.77480776272427,"minOut":0.256568144499179,"maxOut":4105.0903119868635}}}}}}},"400":{"description":"Bad request - missing required parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the smallest and largest amount you can swap for a token pair, reported separately for standard (`cex`), private, and DEX routes.\n\nBoth token parameters accept either format:\n\n- a token `id`, e.g. `6689b73ec90e45f3b3e51566` — required for DEX\n- a CEX token symbol, e.g. `ETH`, `BNB`, `USDT`","summary":"Get min and max amounts","tags":["Reference Data"],"security":[{"apiKey":[]}],"parameters":[{"description":"Token you are swapping from — an id from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens), or a CEX symbol like \"ETH\"","in":"query","name":"tokenIdFrom","required":true,"schema":{"type":"string"},"example":"6689b73ec90e45f3b3e51566"},{"description":"Token you are swapping to — an id from [Get tokens](/api-reference/private-and-standard-swaps/get-tokens), or a CEX symbol like \"BNB\"","in":"query","name":"tokenIdTo","required":true,"schema":{"type":"string"},"example":"6689b73ec90e45f3b3e51558"}]}},"/status":{"get":{"operationId":"GetHealth","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerHealthResponse"},"examples":{"Example 1":{"value":{"status":"ok","api":{"status":"ok"},"quotes":{"dex":"ok","cex":"ok"},"timestamp":"2026-03-23T16:00:00.000Z"}}}}}},"429":{"description":"Rate Limit Exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns a public, partner-safe summary of HoudiniSwap API and quote system availability. This endpoint does not require authentication or x402 payment.","summary":"Get system health","tags":["System"],"security":[],"parameters":[]}},"/exchanges":{"post":{"operationId":"CreateExchange","responses":{"200":{"description":"Exchange created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderV2PublicResponse"},"examples":{"Example 1":{"value":{"created":"2026-09-24T09:33:24.938Z","houdiniId":"3HHk9iwihtsUM5tUTksNeR","receiverAddress":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC","status":0,"anonymous":false,"expires":"2026-09-24T10:03:24.938Z","in":"se","inAmount":0.05,"inSymbol":"ETH","inStatus":0,"inCreated":"2026-09-24T09:33:24.938Z","outAmount":1.15832448,"outSymbol":"SOL","eta":23,"inAmountUsd":132.0905,"isDex":false,"swapName":"StealthEx","depositAddress":"0x0000000000000000000000000000000000000000","id":"6ab4ee647d5b21122e18201c","hashUrl":"","statusLabel":"WAITING","inStatusLabel":"NEW","displayStatus":"WAITING_FOR_DEPOSIT"}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Token not found or disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Creates the order from a `quoteId`.\n\nQuote first, then create right away — a stale `quoteId` is rejected with 422, and the message names the exact age limit. For `fixed: true` quotes the locked rate must also still be inside the quote's `validUntil`, or you get `FIXED_RATE_QUOTE_EXPIRED`.\n\nWith the order data returned by this endpoint:\n\n- private and standard: send the deposit to `depositAddress` before `expires`\n- DEX: see the [DEX swap flow](https://docs.houdiniswap.com/developer-hub/swap-flows/dex-swap)\n\nFor a private same-token send you can use [Create private send order](/api-reference/private-send/create-private-send-order), or stay on this endpoint with a private same-token `quoteId` — see the [Private send](/developer-hub/swap-flows/send) guide.","summary":"Create exchange","tags":["Private and Standard Swaps","On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRequest"}}}}}},"/exchanges/private-send":{"post":{"operationId":"CreatePrivateSend","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderV2PublicResponse"},"examples":{"Example 1":{"value":{"houdiniId":"hxK7mQp2","created":"2026-01-01T12:00:00.000Z","depositAddress":"bc1qexampledepositaddress000000000000000000","receiverAddress":"bc1qexampledestinationaddress000000000000","anonymous":true,"expires":"2026-01-01T12:30:00.000Z","status":0,"inAmount":0.1,"inSymbol":"BTC","outAmount":0.095,"outSymbol":"BTC","displayStatus":"WAITING_FOR_DEPOSIT"}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Token not found or disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"quoteId must be a private same-token send quote (from=to, type private).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Send funds to another wallet via a private (two-hop) route. Same token in and out.\n\nPass a `quoteId` from [Get private send quote](/api-reference/private-send/get-private-send-quote).\nQuote first, then create the order right away — a stale `quoteId` is rejected with 422.\nSend the deposit to `depositAddress` before `expires`.\n\nSee the [Private send](/developer-hub/swap-flows/send) guide.\n\nThis endpoint only supports private same-token routes. If you want to keep one integration for every exchange type, use [Create exchange](/api-reference/private-and-standard-swaps/create-exchange) with a private same-token `quoteId` from [Get quotes](/api-reference/private-and-standard-swaps/get-quotes) instead.","summary":"Create private send order","tags":["Private Send"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateSendExchangeRequest"}}}}}},"/exchanges/multi":{"post":{"operationId":"CreateMultiExchange","responses":{"200":{"description":"Multi exchange created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiExchangeCreateResult"},"examples":{"Example 1":{"value":{"multiId":"8ppABEC1HZGrSr1PGbUnCN","orders":[{"order":{"created":"2026-09-24T09:45:09.594Z","houdiniId":"nkuYKXXrfzabgG4u3nZhpq","receiverAddress":"0x9f1f9a5c0f1d9a5c0f1d9a5c0f1d9a5c0f1d9a5c","status":-1,"anonymous":false,"expires":"2026-09-24T10:15:09.594Z","fixed":false,"inFixed":false,"inAmount":0.3,"inSymbol":"SOL","outSymbol":"ETH","multiId":"8ppABEC1HZGrSr1PGbUnCN","isDex":false,"id":"6ab4f12584e2f105f5a2fbbf","hashUrl":"","statusLabel":"NEW","displayStatus":"WAITING_FOR_DEPOSIT"}}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Token not found or disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Creates a group of swaps that share one `multiId`. Post the orders straight here — there is no quote step and no `quoteId`.\n\n- routes are chosen for you, per order\n- [Get multi quotes](/api-reference/multi-exchange/get-multi-quotes) is optional, for showing rates first\n- each swap starts at status NEW and is prepared in the background\n- poll [Get batch status](/api-reference/multi-exchange/get-batch-status) for deposit addresses\n\nSee the [multi-swap flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap) for the full sequence.","summary":"Create multi exchange","tags":["Multi-Exchange"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiExchangeRequest"}}}}}},"/exchanges/multi/recovery":{"post":{"operationId":"BuildFailedMultiswapRecovery","responses":{"200":{"description":"Recovery data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FailedMultiswapRecoveryResult"},"examples":{"Example 1":{"value":{"saAddress":"0x3aF1c90b5E2d7B4a8c6E9f0a1B2c3D4e5F607182","assets":[{"tokenAddress":"0xdac17f958d2ee523a2206206994597c13d831ec7","tokenSymbol":"USDT","decimals":6,"balance":"1000000000","sourceHoudiniIds":["hxK7mQp2"]}],"transactions":[{"houdiniIds":["hxK7mQp2"],"txData":{"userOpHash":"0x7b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a","to":"0xdac17f958d2ee523a2206206994597c13d831ec7","data":"0xa9059cbb000000000000000000000000b7de6b6eebf7401afea5a49d6405c9048fef2d40","value":"0","chainId":1,"tokenAmount":"1000000000"}}]}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No stuck assets found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible.\n\n- 404 means nothing to withdraw — no failed swap for this `multiId`, or the smart account no longer holds those tokens","summary":"Recover stuck assets","tags":["Bundler EVM"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FailedMultiswapRecoveryRequest"}}}}}},"/exchanges/multi/{multiId}":{"get":{"operationId":"GetMultiExchangeStatus","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiExchangeStatusResult"},"examples":{"Example 1":{"value":{"multiId":"8ppABEC1HZGrSr1PGbUnCN","orders":[{"created":"2026-09-24T09:45:16.943Z","modified":"2026-09-24T09:46:09.972Z","houdiniId":"q2R66TDXHeHKb5kxEcAo9C","receiverAddress":"0x9f1f9a5c0f1d9a5c0f1d9a5c0f1d9a5c0f1d9a5c","status":0,"anonymous":false,"expires":"2026-09-24T12:45:15.466Z","in":"hu","inAmount":0.35,"inSymbol":"SOL","inStatus":1,"inCreated":"2026-09-24T09:45:16.943Z","outAmount":0.01481099,"outSymbol":"ETH","multiId":"8ppABEC1HZGrSr1PGbUnCN","eta":1,"inAmountUsd":39.605999999999995,"isDex":false,"swapName":"Verified Partner","depositAddress":"So1anaExampleDepositAddress11111111111111111","id":"6ab4f12684e2f105f5a2fbc7","hashUrl":"","statusLabel":"WAITING","inStatusLabel":"WAITING","displayStatus":"WAITING_FOR_DEPOSIT"}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the status of all orders belonging to a multi exchange group.","summary":"Get batch status","tags":["Multi-Exchange"],"security":[{"apiKey":[]}],"parameters":[{"description":"The multi exchange group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64},"example":"mx8Qa1"}]}},"/exchanges/multi/{multiId}/retry":{"post":{"operationId":"RetryFailedOrders","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryResult"},"examples":{"Example 1":{"value":{"txData":{"multiId":"mx8Qa1","chain":"evm","depositNeeded":"0","saCurrentBalance":"18400000000000000","transactions":[{"houdiniIds":["hxK7mQp2"],"txData":{"userOpHash":"0x9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f","to":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0xb61d27f6000000000000000000000000000000000000000000000000000000000000000","value":"0","chainId":1,"tokenAmount":"1000000000"}}]}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Retries a failed bundle, returning fresh `txData` to re-sign and submit.\n\n- only within 30 minutes of order creation, while deposit addresses are valid\n- returns 400 after that, and for refunded orders — use [Recover stuck assets](/api-reference/bundler-evm/recover-stuck-assets) to withdraw the funds instead","summary":"Retry failed orders","tags":["Bundler EVM"],"security":[{"apiKey":[]}],"parameters":[{"description":"The multi exchange group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64},"example":"mx8Qa1"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryFailedOrdersRequest"}}}}}},"/exchanges/multi/{multiId}/tx":{"get":{"operationId":"GetMultiExchangeTxData","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiExchangeTxResult"},"examples":{"Example 1":{"value":{"multiId":"8ppABEC1HZGrSr1PGbUnCN","chain":"sol","txVersion":"legacy","transactions":[{"houdiniIds":["nkuYKXXrfzabgG4u3nZhpq","q2R66TDXHeHKb5kxEcAo9C"],"txData":{"data":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB..."}}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the Solana transactions that pay every deposit address in the group. This is the only call a Solana batch needs — sign each returned transaction and broadcast it yourself, then poll [Get batch status](/api-reference/multi-exchange/get-batch-status).\n\n- Solana only. For EVM use [Build batch transaction](/api-reference/bundler-evm/build-batch-transaction)\n- every order must send the same token — all native SOL, or all the same SPL token\n- one transaction pays up to 20 deposits in SOL or 10 in a token. With `txVersion=v1` it pays up to 60 in SOL; tokens stay at 10\n- a larger group comes back as several entries in `transactions`. Sign and broadcast every one\n- `txData.data` is the unsigned transaction, base64 encoded\n- nothing to submit back afterwards","summary":"Get batch transaction","tags":["Bundler SOL"],"security":[{"apiKey":[]}],"parameters":[{"description":"The multi exchange group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64},"example":"mx8Qa1"},{"description":"Wallet address that will sign and fund the transaction(s)","in":"query","name":"sender","required":true,"schema":{"type":"string","minLength":1},"example":"8jZnXYnZB1MJQG6zBXyouzcycsaPTrZtPXPHDNifjYaC"},{"in":"query","name":"houdiniIds","required":false,"schema":{"type":"string"}},{"description":"Transaction format to build. If you are not sure, leave it out.\n- `legacy` (default): works with every Solana wallet\n- `v0`: same capacity as `legacy`. Use it if your code expects a versioned transaction\n- `v1`: fits 3 times more SOL deposits in one transaction, so the user signs fewer times. Token batches stay the same size. Use it only if the wallet or library that signs supports v1. See [Choosing a transaction format](/api-reference/bundler-sol/get-batch-transaction#choosing-a-transaction-format)","in":"query","name":"txVersion","required":false,"schema":{"$ref":"#/components/schemas/SolanaTxVersion"}}]},"post":{"operationId":"SubmitMultiExchangeTx","responses":{"200":{"description":"UserOperation(s) submitted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitEvmBatchTxResult"},"examples":{"Example 1":{"value":{"userOpHashes":["0x9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f"]}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No pending transaction found for this multiId","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Sends the batch on-chain, using the signatures from the user's wallet.\n\n- sign the `userOpHash` of each batch from [Build batch transaction](/api-reference/bundler-evm/build-batch-transaction), and send them in the same order\n- most groups fit in one batch, so usually one signature\n- fund the smart account first, using `txData` from the build response. For an ERC-20 source `txData.to` is the token contract, not the smart account\n- 404 means nothing is awaiting submission — either never built, or already submitted. Check [Get batch status](/api-reference/multi-exchange/get-batch-status).","summary":"Submit signed transaction","tags":["Bundler EVM"],"security":[{"apiKey":[]}],"parameters":[{"description":"The multi exchange group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64},"example":"mx8Qa1"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitEvmBatchTxRequest"}}}}}},"/exchanges/multi/{multiId}/tx/build":{"post":{"operationId":"BuildMultiExchangeTx","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiExchangeTxResult"},"examples":{"Example 1":{"value":{"multiId":"mx8Qa1","chain":"evm","depositNeeded":"500012687","saCurrentBalance":"0","transactions":[{"houdiniIds":["hxK7mQp2","hxK7mQp3"],"txData":{"userOpHash":"0xa52e838c3667a152f26a3e039abe5bd0274261ef64dfa32d45c3a4604537852b","to":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","data":"0xa9059cbb000000000000000000000000067423f2da169b79497f1ae57863a1d1ee7af772000000000000000000000000000000000000000000000000000000001dcdb5a6","value":"0","chainId":8453,"tokenAmount":"500012687"}}]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Bundle already submitted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Funds every order in the group with one ERC-4337 UserOperation instead of paying each deposit address. Every order must send the same source token — all the chain's native coin, or all the same ERC-20.\n\n- fund the smart account: send the transaction to `to` with `data` and `value`, moving `tokenAmount` of the source token\n- pass the signature to [Submit signed transaction](/api-reference/bundler-evm/submit-signed-transaction)\n- up to 50 orders, funded in one transaction; a larger group is rejected — still handle every entry in `transactions`\n- rejected while any order is still initializing, with those orders listed — wait until every order has a deposit address, then build again\n- supported on Ethereum, Base and BNB Smart Chain. Other EVM chains are rejected\n- EVM only. For Solana use [Get batch transaction](/api-reference/bundler-sol/get-batch-transaction) instead\n\nSee the [multi-swap flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap) for the full sequence.","summary":"Build batch transaction","tags":["Bundler EVM"],"security":[{"apiKey":[]}],"parameters":[{"description":"The multi exchange group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64},"example":"mx8Qa1"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiExchangeTxBuildRequest"}}}}}},"/dex/confirmTx":{"post":{"operationId":"ConfirmTx","responses":{"200":{"description":"Transaction confirmed","content":{"application/json":{"schema":{"type":"boolean"}}}},"400":{"description":"Missing transaction hash for on-chain order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Order not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Confirms a DEX transaction with the provided transaction hash. This endpoint should be called after the user has signed and submitted the transaction. Without it the Order status may not be determined","summary":"Confirm DEX transaction","tags":["On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DexConfirmTxRequest"}}}}}},"/dex/chainSignatures":{"post":{"operationId":"ChainSignatures","responses":{"200":{"description":"The next signature in the chain","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApprovalTypedData"},"type":"array"},"examples":{"Example 1":{"value":[{"key":"permit","type":"chained","step":1,"totalSteps":2,"isComplete":false,"data":{"primaryType":"Permit","domain":{"name":"USD Coin","version":"2","chainId":1,"verifyingContract":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"},"types":{"Permit":[{"name":"owner","type":"address"},{"name":"spender","type":"address"},{"name":"value","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}]},"message":{"owner":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40","spender":"0x1111111254eeb25477b68fb85ed929f73a960582","value":"1000000000","nonce":"3","deadline":"1767225600"}}}]}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the next signature in a multi-step chain, for swaps needing more than one (e.g. permit + bridge).\n\n- only needed when [Get token approval data](/api-reference/on-chain-dex-or-bridge/get-token-approval-data) returned a signature of type `CHAINED`\n- sign the returned data, post it back, repeat until `isComplete` is true","summary":"Get next chain signature","tags":["On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainSignaturesRequest"}}}}}},"/dex/approve":{"post":{"operationId":"Approve","responses":{"200":{"description":"What the wallet must approve; both arrays empty if nothing is needed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"},"examples":{"Example 1":{"value":{"approvals":[{"from":"0xb7dE6b6eEBF7401aFea5a49D6405C9048fEf2d40","to":"0xdac17f958d2ee523a2206206994597c13d831ec7","data":"0x095ea7b30000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000000000000000000000000000000000003b9aca00","fromChain":{"id":"6689b73ec90e45f3b3e5150a","name":"Ethereum","shortName":"ethereum","shortNameV1":"ETH","kind":"evm","chainId":1,"enabled":true,"icon":"https://api.houdiniswap.com/assets/networks/ETH.png","created":"2024-07-06T10:21:18.000Z","explorerUrl":"https://etherscan.io/tx/{txHash}","addressUrl":"https://etherscan.io/address/{address}","addressValidation":"^0x[a-fA-F0-9]{40}$","tokenAddressValidation":"^0x[a-fA-F0-9]{40}$"}}],"signatures":[]}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns what the wallet must approve before a DEX swap. Call this first — both arrays come back empty when the allowance already covers the swap.\n\n- `approvals` — transactions to send. After sending them, poll [Check token allowance](/api-reference/on-chain-dex-or-bridge/check-token-allowance) until it returns true.\n- `signatures` — EIP-712 permits to sign instead, when the token and provider both support EIP-2612","summary":"Get token approval data","tags":["On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRequest"}}}}}},"/dex/allowance":{"post":{"operationId":"Allowance","responses":{"200":{"description":"`true` when the allowance covers the swap","content":{"application/json":{"schema":{"type":"boolean"}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Check if token allowance is sufficient for a DEX swap\n\nReturns true when the current allowance covers the swap. Poll this after sending an approval from [Get token approval data](/api-reference/on-chain-dex-or-bridge/get-token-approval-data), and create the exchange once it turns true.","summary":"Check token allowance","tags":["On-chain DEX or Bridge"],"security":[{"apiKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllowanceRequest"}}}}}},"/commissions":{"get":{"operationId":"GetCommissions","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCommissionsResponse"},"examples":{"Example 1":{"value":{"commissions":[{"id":"6707c1a2e4b0f3a9d8c18001","created":"2026-01-01T12:24:31.000Z","commissionAmountUsd":92.05,"commissionPercentage":0.35,"orderVolumeUsd":26301.44,"processed":false,"commissionMonth":"2026-01","routeType":"privateSwap","order":{"id":"6707c1a2e4b0f3a9d8c12345","houdiniId":"hxK7mQp2","created":"2026-01-01T12:00:00.000Z","anonymous":true,"outAmountUsd":26301.44,"status":4}}],"total":1,"totalPages":1}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the list of commissions you have earned, newest first. Each entry links to the order that generated it. Filter to one month with `month` (`YYYY-MM`).","summary":"Get commissions","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[{"in":"query","name":"month","required":false,"schema":{"type":"string"},"example":"2026-09"},{"in":"query","name":"page","required":false,"schema":{"default":1,"format":"int32","type":"integer","minimum":1,"maximum":10000},"example":20},{"in":"query","name":"pageSize","required":false,"schema":{"default":20,"format":"int32","type":"integer","minimum":1,"maximum":100},"example":20}]}},"/commissions/summary":{"get":{"operationId":"GetCommissionSummary","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommissionSummaryResponse"},"examples":{"Example 1":{"value":{"totalEarnings":12840.55,"pendingCommissions":318.42,"processedCommissions":12522.13,"thisMonthEarnings":318.42,"lastMonthEarnings":402.18,"commissionCount":1284}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns your commission totals — lifetime, pending, processed, and the current and previous month.","summary":"Get commission summary","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[{"description":"Optional YYYY-MM filter. When provided, totalEarnings/pendingCommissions/processedCommissions/commissionCount are scoped to that month. thisMonthEarnings and lastMonthEarnings always reflect the current and previous calendar months.","in":"query","name":"month","required":false,"schema":{"type":"string"},"example":"2026-09"}]}},"/stats/chart":{"get":{"operationId":"GetChart","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ChartDataPoint"},"type":"array"},"examples":{"Example 1":{"value":[{"date":"2026-01-01","volumeUsd":48250.12,"count":37},{"date":"2026-01-02","volumeUsd":61430.88,"count":52}]}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns a volume time series for charting, bucketed by day or month. `from` and `to` are ISO 8601 dates and may span at most 730 days.","summary":"Get chart stats","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[{"in":"query","name":"metric","required":true,"schema":{"$ref":"#/components/schemas/ChartMetric"}},{"in":"query","name":"from","required":true,"schema":{"format":"date-time","type":"string"},"example":"2026-08-01"},{"in":"query","name":"to","required":true,"schema":{"format":"date-time","type":"string"},"example":"2026-09-16"},{"in":"query","name":"granularity","required":false,"schema":{"$ref":"#/components/schemas/ChartGranularity"}}]}},"/chains":{"get":{"operationId":"GetChains","responses":{"200":{"description":"List of available chains","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedChainResponse"},"examples":{"Example 1":{"value":{"chains":[{"id":"6689b0d3c52f263938c44844","name":"Ethereum Mainnet","shortName":"ethereum","memoNeeded":false,"explorerUrl":"https://etherscan.io/tx/{txHash}","addressUrl":"https://etherscan.io/address/{address}","icon":"https://api.houdiniswap.com/assets/networks/ETH.png","priority":2,"kind":"evm","addressValidation":"^(0x)[0-9A-Za-z]{40}$","tokenAddressValidation":"^(0x)[0-9A-Za-z]{40}$","chainId":1}],"totalPages":1,"total":1}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequired"}}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the list of available chains for CEX and DEX swaps.\n\nUse the `shortName` field wherever another endpoint takes a chain.","summary":"Get chains","tags":["Reference Data"],"security":[{"apiKey":[]}],"parameters":[{"description":"Filter by chain name (case-insensitive search in name, shortName)","in":"query","name":"name","required":false,"schema":{"type":"string","maxLength":50},"example":"ethereum"},{"description":"Filter by chain kind, exact match against the `kind` field returned by this endpoint (e.g., \"evm\", \"sol\", \"bitcoin\", \"xmr\", \"ltc\"). Call this endpoint without filters to discover available kinds. Each value must be 16 characters or less.","in":"query","name":"kind","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChainKindFilter"},"maxItems":10},"example":["evm"]},{"description":"Filter by numeric EVM chain ID (e.g. 1 for Ethereum, 42161 for Arbitrum)","in":"query","name":"chainId","required":false,"schema":{"format":"int32","type":"integer","minimum":1},"example":1},{"description":"Filter chains that support CEX swaps","in":"query","name":"hasCex","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter chains that support DEX swaps","in":"query","name":"hasDex","required":false,"schema":{"type":"boolean"},"example":true},{"description":"Filter chains by whether they require a destination memo/tag","in":"query","name":"memoNeeded","required":false,"schema":{"type":"boolean"},"example":false},{"description":"Page number","in":"query","name":"page","required":false,"schema":{"default":1,"format":"int32","type":"integer","minimum":1,"maximum":10000},"example":20},{"description":"Page size","in":"query","name":"pageSize","required":false,"schema":{"default":100,"format":"int32","type":"integer","minimum":1,"maximum":100},"example":20}]}},"/withdrawals":{"get":{"operationId":"GetWithdrawals","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalsResponse"},"examples":{"Example 1":{"value":{"withdrawals":[{"id":"6707c1a2e4b0f3a9d8c19001","amountUsd":1284.55,"status":"completed","batchId":"2026-01-payout-03","processedTx":"0x4e3c1b7a9d2f5e8c0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f6071","created":"2026-01-05T09:12:00.000Z"}],"total":1,"totalPages":1}}}}}},"401":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"description":"Returns the list of commission payouts made to your wallet, newest first.","summary":"Get withdrawals","tags":["Partner Account"],"security":[{"apiKey":[]}],"parameters":[{"in":"query","name":"page","required":false,"schema":{"default":1,"format":"int32","type":"integer","minimum":1,"maximum":10000},"example":20},{"in":"query","name":"pageSize","required":false,"schema":{"default":20,"format":"int32","type":"integer","minimum":1,"maximum":100},"example":20}]}}},"servers":[{"url":"https://api-partner.houdiniswap.com/v2"}],"tags":[{"name":"Private and Standard Swaps","description":"CEX swaps in two modes, sharing the same endpoints — pick one with the `types` parameter.\n\n- `types=standard` — direct single-leg swap. Fastest, no privacy hop.\n- `types=private` — two legs through a privacy bridge, so deposit and payout are not linkable on-chain. Adds `anonymous`, `useXmr`, `rotatePayoutWallets` and the `inLeg*` / `outLeg*` filters.\n\nFlow: [Get tokens](/api-reference/private-and-standard-swaps/get-tokens) with `hasCex=true` → [Get quotes](/api-reference/private-and-standard-swaps/get-quotes) → [Create exchange](/api-reference/private-and-standard-swaps/create-exchange) → [track the order](/api-reference/private-and-standard-swaps/get-order-details). `markup` works in both modes."},{"name":"Private Send","description":"Send a token to another wallet privately — same token in and out, with no on-chain link between the two addresses.\n\n- find eligible tokens with [Get tokens](/api-reference/private-send/get-tokens) and `hasSelfPrivate=true`\n- quote with Get private send quote, then create with Create private send order\n- you can also stay on the main endpoints with a private same-token `quoteId`\n\nSee the [Private send](/docs/v2/private-send) guide."},{"name":"Multi-Exchange","description":"Create and track a group of swaps sharing one `multiId`.\n\n- post the orders straight to Create multi exchange — there is no quote step and no `quoteId`\n- Get multi quotes is optional, for showing rates first\n- each order gets its own deposit address; poll [Get batch status](/api-reference/multi-exchange/get-batch-status) for every leg\n- CEX standard and private only — no DEX in a batch\n\nTo fund the whole group in one transaction, see Bundler SOL or Bundler EVM. See the [multi-swap flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap) for the full sequence."},{"name":"Bundler SOL","description":"Fund a whole multi-exchange group with one Solana batch transfer.\n\n- one call — Get batch transaction returns the transaction to sign and broadcast\n- every order must send the same token\n- deposits per batch depend on `txVersion`: up to 20 SOL or 10 token deposits with `legacy` or `v0`, up to 60 SOL or 10 token deposits with `v1`\n- find batchable tokens with [Get tokens](/api-reference/multi-exchange/get-tokens) and `hasBundler=true`\n- nothing to submit back afterwards — retry and recovery are EVM-only\n\nSee the [multi-swap flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap) for the full sequence."},{"name":"Bundler EVM","description":"Fund a whole multi-exchange group with one ERC-4337 UserOperation, submitted through the bundler.\n\n- Ethereum, Base and BNB Smart Chain only; other EVM chains are rejected\n- up to 50 orders per group, funded in one transaction; every order must send the same source token\n- find batchable tokens with [Get tokens](/api-reference/multi-exchange/get-tokens) and `hasBundler=true`\n- build the UserOp, then submit the signed result\n- if a bundle fails: retry within 30 minutes, or recover stuck assets\n\nSee the [multi-swap flow](https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap) for the full sequence."},{"name":"On-chain DEX or Bridge","description":"On-chain swaps signed and funded from the user's own wallet.\n\nFlow: [Get tokens](/api-reference/on-chain-dex-or-bridge/get-tokens) with `hasDex=true` → [Get quotes](/api-reference/on-chain-dex-or-bridge/get-quotes) with `types=dex` → [Get token approval data](/api-reference/on-chain-dex-or-bridge/get-token-approval-data) → send it and poll [Check token allowance](/api-reference/on-chain-dex-or-bridge/check-token-allowance) → [Get next chain signature](/api-reference/on-chain-dex-or-bridge/get-next-chain-signature) → [Create exchange](/api-reference/on-chain-dex-or-bridge/create-exchange) → [Confirm DEX transaction](/api-reference/on-chain-dex-or-bridge/confirm-dex-transaction) → [track the order](/api-reference/on-chain-dex-or-bridge/get-order-details).\n\n- `slippage` applies to DEX only\n- `markup` is not supported"},{"name":"Reference Data","description":"Optional lookups: supported chains, liquidity providers, and per-pair min/max swap amounts. Responses are cached and change rarely — safe to fetch once and reuse. Token ids come from `/tokens`, listed in each swap section above."},{"name":"Partner Account","description":"Your orders, profile, earned commissions, withdrawals, volume analytics, and the rate-limit budget attached to your API key. Every endpoint is scoped to the partner that owns the key making the request."},{"name":"System","description":"Service health. [Get system health](/api-reference/system/get-system-health) is unauthenticated and exempt from x402 payment — use it for uptime monitoring."}]}