Skip to main content

Overview

Dedicated private-send endpoints let you send funds to another address privately — the same token goes in and comes out. The request takes a single token, with no from/to pair.
Best For: Moving funds privately to a new address without changing assets, so there is no on-chain link between the source and destination.
If you would rather keep one integration for every exchange type (standard, private, DEX, and private send), skip these endpoints and use the main GET /quotes and POST /exchanges routes instead. Set from and to to the same token id and pass types=private. See Private Swap.

Authentication

Full access uses the API key header (no Bearer, no base64):
<apiKeyId> is the API key’s public id, not your partner id. See Authentication. The quote endpoint also accepts the public partner-id header. Creating an order requires full API-key (or x402) access.

How It Works

1

Find a token

Find a token that supports private send (hasSelfPrivate=true).
2

Get a quote

Call GET /v2/quotes/private-send with token and amount.
3

Create the order

Call POST /v2/exchanges/private-send with the quoteId and destination addressTo.
4

Deposit and track

Deposit to depositAddress before expires, then poll the order.

Integration Guide

Step 1: Find a Token

Search for tokens that support private send by passing hasSelfPrivate=true. Note the token’s id.

Step 2: Get a Private Send Quote

Call GET /quotes/private-send with a single token and the amount to send.
Check amountOut, duration, min, and max before committing.
useXmr=true forces Monero as the bridge token. Omit it or send false to use another privacy token.
amountOut will be slightly lower than the amount sent — network and exchange fees apply per hop even though the token is the same. Use the quoted amountOut when setting recipient expectations.

Step 3: Create the Order

Pass the quoteId and destination address to POST /exchanges/private-send. Create the order within about a minute of quoting — a stale quoteId is rejected with 422, and the error message names the age limit.
When the quote has fixed: true or requiresRefundAddress: true, also set refundAddress to a wallet you control.

Order Response

Send exactly inAmount of inSymbol to depositAddress before expires.

Step 4: Monitor Order Status

Poll GET /orders/{houdiniId} to track progress, or subscribe via the WebSocket API for real-time updates:
Like any other order, private-send orders drop out of the API after 48 hours.

Common Mistakes

  • Passing a token that does not support private send — filter with hasSelfPrivate=true
  • Using a quoteId from GET /v2/quotes that is not a private same-token send quote
  • Waiting too long after the quote — create the order while the quoteId is still valid

Next Steps

Private Swap

Private multi-hop routing into a different asset

Order Lifecycle

Understand all order statuses

Tokens & Networks

Token discovery and filtering, including hasSelfPrivate

WebSocket Order Updates

Real-time order status without polling