Skip to main content

Overview

Private swaps route through multiple CEX hops to break the transaction trail, providing enhanced anonymity. Optionally routes through Monero (XMR) as an untraceable intermediate layer. In API v2, private swaps use the same /quotes and /exchanges endpoints as standard and DEX swaps — pass types=private to get only private quotes, or filter the response by type: "private".
Best For: Users who prioritize privacy and are willing to accept longer completion times (15–45 minutes) for enhanced anonymity.
Looking for the v1 private swap guide? See API v1 — Private Swap.
Private swaps support fixed rate and reverse quotes. Add fixed=true to lock the rate across both hops, and amountType=receive to specify what the recipient receives instead of what the user sends. See Fixed Rate & Reverse Quote.

Key Features

Multi-Hop Routing

Routes through 2 exchanges to break the transaction trail

Optional XMR Privacy Layer

Monero used as an untraceable intermediate when available

No Wallet Connection

No browser wallet or on-chain approvals required

Maximum Anonymity

No direct on-chain link between source and destination

Optional Rate Lock

Add fixed=true to guarantee the output amount across both hops

Optional Reverse Quote

Add amountType=receive to specify the amount the recipient gets

How It Works

1

Get Tokens

Bulk fetch CEX-supported tokens and cache to your DB, or search by name/symbol. Note each token’s id.
2

Get Quotes

Call GET /quotes with token IDs. Either pass types=private to get only private quotes, or filter the response by type: "private".
3

Create Order

Call POST /exchanges with the selected quoteId and destination address.
4

Send Deposit

Send exactly inAmount to the depositAddress returned in the order.
5

Monitor Status

Poll GET /orders/{houdiniId}. Private swaps pass through ANONYMIZING before FINISHED.

Integration Guide

Step 1: Get Tokens

There are two approaches for getting tokens. Choose the one that fits your integration:
Fetch all CEX-supported tokens once and store them in your backend database.
Cache the token list in your backend database. Never call /tokens on every user request — load on server startup or via a scheduled job and refresh every 24 hours.

Step 2: Get Private Quote

Call GET /quotes with token IDs. Pass types=private to receive only private quotes, or omit it to get all types and filter by type: "private".

Quotes Response (private quote)

Key Private Quote Fields:
  • quoteId: Pass this to /exchanges to create the order
  • type: "private" indicates multi-hop routing
  • duration: Estimated time in minutes — longer due to multi-hop (typically 60 min)

Rate options

The quote above is a floating rate — amountOut is an estimate that can move before settlement. Two options change that: Both require a refundAddress on the source chain when you create the order, and both can return fewer routes — or none — for a pair that floating rate serves. See Fixed Rate & Reverse Quote for the full flow, response differences, and error codes.

Step 3: Create Private Order

Pass the quoteId and destination address to POST /exchanges. No additional parameters are needed to enable private routing — the quote type determines the routing.

Order Response

Send exactly inAmount of inSymbol to depositAddress before expires (typically 30 minutes).

Step 4: Monitor Order Status

Poll GET /orders/{houdiniId} to track multi-hop progress, or subscribe via the WebSocket API for real-time updates:

Private Swap Status Progression

Private swaps pass through an additional ANONYMIZING stage during the XMR privacy layer:
Status Fields:
  • statusLabel: Overall order status
  • inStatusLabel: First hop status
  • outStatusLabel: Second hop status (private swaps only)
Poll every 30 seconds. Private swaps typically complete in 15–45 minutes due to multi-hop routing. For real-time updates without polling, use the WebSocket API.

Best Practices

Clearly communicate the 15–45 minute completion time. Users should understand they are trading speed for privacy.
Display both inStatusLabel and outStatusLabel to show users which leg of the swap is processing.
Implement loading states and progress indicators. Multi-hop routing takes significantly longer than standard swaps.
Never expose API keys in frontend code. Validate all destination addresses before submitting. Store houdiniId for support lookups.

Common Issues

Cause: Multi-hop routing through 2 exchanges takes longer than a direct swap.Solution: This is expected for private swaps. Monitor inStatusLabel and outStatusLabel to see which hop is processing.
Question: “How private is this really?”Answer: Private swaps break the transaction trail by routing through multiple exchanges. When XMR routing is used, it adds an untraceable intermediate step. However, this is not absolute anonymity — compliance checks still apply.
Cause: Deposit was not received before the expires timestamp.Solution: Fetch a new quote and create a new order.

Example Repositories

See full working integrations on GitHub:

Next.js Example

Full Next.js integration showing standard, private, and DEX swap flows

Node.js Example

Backend Node.js integration with token fetching, quoting, and order tracking

Next Steps

Standard Swap

Fast single-hop CEX swaps

DEX Swap

On-chain decentralized swaps

Fixed Rate & Reverse Quote

Guarantee the output amount, or specify what the recipient receives

Order Lifecycle

Understand all order statuses