curl --request GET \
--url https://api-partner.houdiniswap.com/v2/quotes \
--header 'Authorization: <api-key>'import requests
url = "https://api-partner.houdiniswap.com/v2/quotes"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api-partner.houdiniswap.com/v2/quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-partner.houdiniswap.com/v2/quotes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-partner.houdiniswap.com/v2/quotes"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-partner.houdiniswap.com/v2/quotes")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-partner.houdiniswap.com/v2/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"total": 3,
"quotes": [
{
"amountIn": 1,
"amountOut": 24.308952,
"min": 0.041681,
"max": 1617.53705385,
"duration": 4,
"amountOutUsd": 2366.7195667200003,
"quoteId": "6aaa4273aa41ccf7cad03086",
"type": "private",
"rewardsAvailable": true,
"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",
"rewardsAvailable": false,
"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": [],
"rewardsAvailable": false,
"min": 0,
"max": 9007199254740991,
"requiresApproval": false,
"depositAddressSupported": true
}
]
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"fields": {},
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}Get quotes
Returns every available route for a token pair and amount — private, standard and DEX. Narrow the set with types.
from and to are token ids; look them up with Get tokens.
For a private same-token send you can use Get private send quote, or stay on this endpoint with the same token on from and to and types=private — see the Private send guide.
curl --request GET \
--url https://api-partner.houdiniswap.com/v2/quotes \
--header 'Authorization: <api-key>'import requests
url = "https://api-partner.houdiniswap.com/v2/quotes"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api-partner.houdiniswap.com/v2/quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-partner.houdiniswap.com/v2/quotes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-partner.houdiniswap.com/v2/quotes"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-partner.houdiniswap.com/v2/quotes")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-partner.houdiniswap.com/v2/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"total": 3,
"quotes": [
{
"amountIn": 1,
"amountOut": 24.308952,
"min": 0.041681,
"max": 1617.53705385,
"duration": 4,
"amountOutUsd": 2366.7195667200003,
"quoteId": "6aaa4273aa41ccf7cad03086",
"type": "private",
"rewardsAvailable": true,
"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",
"rewardsAvailable": false,
"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": [],
"rewardsAvailable": false,
"min": 0,
"max": 9007199254740991,
"requiresApproval": false,
"depositAddressSupported": true
}
]
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"fields": {},
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}Authorizations
Send Authorization: <ApiKey>:<ApiSecret> — joined by a colon, raw. No Bearer prefix, no base64.
Query Parameters
Amount of the from token to swap, e.g. 1.5 BTC or 250.75 USDT — not base units / wei like 100000000000000.
0 <= x <= 1.7976931348623157e+308Token you are swapping from. Use an id from Get tokens — a 24-character hex id such as 6689b73ec90e45f3b3e51566, not a symbol like ETH.
Token you are swapping to. Use an id from Get tokens — a 24-character hex id such as 6689b73ec90e45f3b3e51558, not a symbol like SOL.
Markup for this request, as a percentage — 0.5 means 0.5%.
- range 0–4; overrides your account default for this trade
- send
0for no markup, or omit the field to use your account default - providers that cannot apply it are excluded from the results
- not supported on DEX routes. Leave
typesunset and DEX quotes are simply left out; ask fortypes=dextogether with a markup and the request is rejected
0 <= x <= 4Use Monero (XMR) as the bridge token on a private swap.
A 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.
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.
Where funds are returned if a swap cannot complete. Optional here — quotes are never filtered by it.
- use a wallet the user controls, not an exchange deposit address
- must be on the source chain — the refund comes back as the token you deposited
- a route that will need one comes back with
requiresRefundAddress: true - supply it at Create exchange, where it is required for fixed-rate quotes and for those routes
200Maximum price deviation percentage when rotating wallets. Only used if rotatePayoutWallets is true. Default 5
0 <= x <= 100Number of recent orders to check for path rotation. Only used if rotatePayoutWallets is true. Default 10
1 <= x <= 100Rotate the payout path for better privacy. Only used for private swaps (types=private) — standard and DEX are single-leg and ignore it.
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.
Only use these providers for the in-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.
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.
Only use these providers for the out-leg of a private (2-hop) route. Ignored by standard and DEX quotes, which are single-hop.
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 percentage. Only used for DEX swaps.
0 <= x <= 100Types of quotes to return; if omitted, all types are used
private, standard, dex Only quote these providers. Omit to use all of them.
- values are
shortNamefrom Get swap providers - applies to every quote type — private, standard and DEX
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 Wallet that funds the swap, on the source chain. Used by DEX quotes only — private and standard swaps ignore it.
Wallet that receives the payout.
- when it differs from
senderAddress, DEX routes that cannot pay out to a different wallet are returned withfiltered: trueandfilteredReason: different_recipient— still listed, but not usable - also used for payout wallet rotation
Sort the quotes by the given field (default: amountOut)
amountOut, amountOutUsd, amountIn, duration Sort direction for quotes (default: desc)
asc, desc Whether amount refers to the send side or the receive side.
"send"(default): amount is what the user sends — system computes what they receive."receive": amount is what the user wants to receive — system computes what they must send. Requiresfixed=true. Available for standard and private CEX quotes; DEX quotes are dropped from the result, and a DEX-only request is rejected.
send, receive