curl --request GET \
--url https://api-partner.houdiniswap.com/v2/quotes/private-send \
--header 'Authorization: <api-key>'import requests
url = "https://api-partner.houdiniswap.com/v2/quotes/private-send"
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/private-send', 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/private-send",
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/private-send"
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/private-send")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-partner.houdiniswap.com/v2/quotes/private-send")
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{
"quotes": [
{
"swap": "<string>",
"quoteId": "<string>",
"duration": 123,
"providerEta": 123,
"gas": 123,
"gasUsd": 123,
"amountIn": 123,
"amountOut": 123,
"amountOutUsd": 123,
"amountInUsd": 123,
"feeUsd": 123,
"bridgeFeeUsd": 123,
"netAmountOut": 123,
"error": "<string>",
"swapName": "<string>",
"type": "private",
"filtered": false,
"filteredReason": "price_impact",
"supportsSignatures": true,
"logoUrl": "<string>",
"markupSupported": true,
"slippageSupported": true,
"apiMarkupValue": 123,
"markupType": "absolute",
"restrictedCountries": [
"<string>"
],
"rewardsAvailable": true,
"min": 123,
"max": 123,
"minOut": 123,
"maxOut": 123,
"rateId": "<string>",
"fixed": true,
"validUntil": "<string>",
"requiresApproval": true,
"isPriority": true,
"depositAddressSupported": true,
"requiresRefundAddress": true,
"appliedApiMarkup": 123,
"refundAddress": "<string>",
"amountType": "send"
}
],
"total": 123
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}Get private send quote
Quote a private send: send funds to another wallet via a private (two-hop) route. Same token in and out.
Returns receive amount, fees, ETA, and min/max. Pass a quoteId from the response to Create private send order.
Quotes are valid for about a minute — create the order before they expire.
Look up token ids with Get tokens (hasSelfPrivate=true).
See the Private send guide.
This endpoint only supports private same-token routes. If you want to keep one integration for every exchange type, use Get quotes instead with the same token on from and to and types=private.
curl --request GET \
--url https://api-partner.houdiniswap.com/v2/quotes/private-send \
--header 'Authorization: <api-key>'import requests
url = "https://api-partner.houdiniswap.com/v2/quotes/private-send"
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/private-send', 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/private-send",
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/private-send"
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/private-send")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-partner.houdiniswap.com/v2/quotes/private-send")
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{
"quotes": [
{
"swap": "<string>",
"quoteId": "<string>",
"duration": 123,
"providerEta": 123,
"gas": 123,
"gasUsd": 123,
"amountIn": 123,
"amountOut": 123,
"amountOutUsd": 123,
"amountInUsd": 123,
"feeUsd": 123,
"bridgeFeeUsd": 123,
"netAmountOut": 123,
"error": "<string>",
"swapName": "<string>",
"type": "private",
"filtered": false,
"filteredReason": "price_impact",
"supportsSignatures": true,
"logoUrl": "<string>",
"markupSupported": true,
"slippageSupported": true,
"apiMarkupValue": 123,
"markupType": "absolute",
"restrictedCountries": [
"<string>"
],
"rewardsAvailable": true,
"min": 123,
"max": 123,
"minOut": 123,
"maxOut": 123,
"rateId": "<string>",
"fixed": true,
"validUntil": "<string>",
"requiresApproval": true,
"isPriority": true,
"depositAddressSupported": true,
"requiresRefundAddress": true,
"appliedApiMarkup": 123,
"refundAddress": "<string>",
"amountType": "send"
}
],
"total": 123
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}{
"message": "<string>",
"code": "<string>",
"requestId": "<string>"
}Authorizations
Query Parameters
Amount as a decimal float in the token's display units
(e.g. 1.5 BTC, 250.75 USDT) — not a base-units / wei integer like 100000000000000.
Must be strictly greater than 0 and at most the maximum BSON Double value
(Number.MAX_VALUE ≈ 1.7976931348623157e308).
0 <= x <= 1.7976931348623157e+308Token id to send. Use an id from GET /v2/tokens?hasSelfPrivate=true — not a symbol.
Partner markup for this request, as a percentage (0.5 = 0.5%). Accepted range: 0–4. This value overrides your account’s default markup for this trade. Send 0 to apply no markup, or leave the field empty / set it to null if no markup is requested. Providers that do not support the requested markup will be excluded.
0 <= x <= 4Use XMR if true, if false use another token for the anonymous transaction
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.
Sender's wallet address for refunds if a fixed-rate swap fails.
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 <= 100Enable payout wallet rotation for better privacy. Only used for centralized quotes
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.
Allowlist for the in-leg of anonymous (private, 2-hop) paths. When set, only these providers may be used as the in-leg. Silently ignored for STANDARD and DEX quotes, which are single-hop and have no in/out leg concept.
Providers excluded from the in-leg of anonymous (private, 2-hop) paths. Does not affect the out-leg. Silently ignored for STANDARD and DEX quotes, which are single-hop and have no in/out leg concept.
Allowlist for the out-leg of anonymous (private, 2-hop) paths. When set, only these providers may be used as the out-leg. Silently ignored for STANDARD and DEX quotes, which are single-hop and have no in/out leg concept.
Providers excluded from the out-leg of anonymous (private, 2-hop) paths. Does not affect the in-leg. Silently ignored for STANDARD and DEX quotes, which are single-hop and have no in/out leg concept.