> ## Documentation Index
> Fetch the complete documentation index at: https://docs.houdini.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Private Send

> Send funds to another wallet privately — same token in and out

## 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.

> [!NOTE]
>
> **Best For**: Moving funds privately to a new address without changing assets, so there is no on-chain link between the source and destination.

> [!TIP]
>
> 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](https://docs.houdini.com/developer-hub/swap-flows/private-swap.md).

## Authentication

Full access uses the API key header (no `Bearer`, no base64):

```http theme={null}
Authorization: <apiKeyId>:<secret>
```

`<apiKeyId>` is the API key's public id, not your partner id. See [Authentication](https://docs.houdini.com/developer-hub/getting-started/authentication.md).

The quote endpoint also accepts the public `partner-id` header. Creating an order requires full API-key (or [x402](https://docs.houdini.com/developer-hub/core-concepts/x402-pay-per-request.md)) 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`.

```javascript JavaScript theme={null}
const params = new URLSearchParams({
  hasSelfPrivate: 'true',  // only tokens that support private send
  hasCex: 'true',
  pageSize: '20',
  page: '1'
});

const response = await fetch(
  `https://api-partner.houdiniswap.com/v2/tokens?${params}`,
  {
    headers: { 'Authorization': `${API_KEY}:${API_SECRET}` }
  }
);

const { tokens } = await response.json();
const tokenId = tokens[0].id; // use this `id` in the private-send quote
```

```bash cURL theme={null}
curl -X GET "https://api-partner.houdiniswap.com/v2/tokens?hasSelfPrivate=true&hasCex=true&pageSize=20&page=1" \
  -H "Authorization: your_api_key:your_api_secret"
```

### Step 2: Get a Private Send Quote

Call `GET /quotes/private-send` with a single `token` and the `amount` to send.

```javascript JavaScript theme={null}
const params = new URLSearchParams({
  token: '6689b73ec90e45f3b3e51551',  // same token in and out
  amount: '0.1',
});

const response = await fetch(
  `https://api-partner.houdiniswap.com/v2/quotes/private-send?${params}`,
  {
    headers: {
      'Authorization': `${API_KEY}:${API_SECRET}`,
      'x-user-ip': userIp,
      'x-user-agent': userAgent,
      'x-user-timezone': userTimezone
    }
  }
);

const { quotes } = await response.json();

const quote = quotes[0];
console.log('Amount out:', quote.amountOut);
console.log('ETA:', quote.duration, 'minutes');
console.log('Min / max:', quote.min, quote.max);
console.log('Quote ID:', quote.quoteId);  // needed for /exchanges/private-send
```

```bash cURL theme={null}
curl -X GET "https://api-partner.houdiniswap.com/v2/quotes/private-send?token=6689b73ec90e45f3b3e51551&amount=0.1" \
  -H "Authorization: your_api_key:your_api_secret" \
  -H "x-user-ip: 192.168.1.1" \
  -H "x-user-agent: Mozilla/5.0..." \
  -H "x-user-timezone: America/New_York"
```

Check `amountOut`, `duration`, `min`, and `max` before committing.

> [!NOTE]
>
> `useXmr=true` forces Monero as the bridge token. Omit it or send `false` to use another privacy token.

> [!NOTE]
>
> `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.

```javascript JavaScript theme={null}
const response = await fetch('https://api-partner.houdiniswap.com/v2/exchanges/private-send', {
  method: 'POST',
  headers: {
    'Authorization': `${API_KEY}:${API_SECRET}`,
    'Content-Type': 'application/json',
    'x-user-ip': userIp,
    'x-user-agent': userAgent,
    'x-user-timezone': userTimezone
  },
  body: JSON.stringify({
    quoteId: '6aaa4273aa41ccf7cad03086',  // from /quotes/private-send
    addressTo: 'bc1qexampledestinationaddress000000000000'
  })
});

const order = await response.json();
console.log('Order ID:', order.houdiniId);
console.log('Deposit to:', order.depositAddress);
console.log('Send amount:', order.inAmount, order.inSymbol);
console.log('Expires:', order.expires);
```

```bash cURL theme={null}
curl -X POST "https://api-partner.houdiniswap.com/v2/exchanges/private-send" \
  -H "Authorization: your_api_key:your_api_secret" \
  -H "Content-Type: application/json" \
  -H "x-user-ip: 192.168.1.1" \
  -H "x-user-agent: Mozilla/5.0..." \
  -H "x-user-timezone: America/New_York" \
  -d '{
    "quoteId": "6aaa4273aa41ccf7cad03086",
    "addressTo": "bc1qexampledestinationaddress000000000000"
  }'
```

When the quote has `fixed: true` or `requiresRefundAddress: true`, also set `refundAddress` to a wallet you control.

### Order Response

```json theme={null}
{
  "houdiniId": "hxK7mQp2",
  "created": "2026-01-01T12:00:00.000Z",
  "expires": "2026-01-01T12:30:00.000Z",
  "depositAddress": "bc1qexampledepositaddress000000000000000000",
  "receiverAddress": "bc1qexampledestinationaddress000000000000",
  "anonymous": true,
  "status": 0,
  "inAmount": 0.1,
  "inSymbol": "BTC",
  "outAmount": 0.095,
  "outSymbol": "BTC",
  "displayStatus": "WAITING_FOR_DEPOSIT"
}
```

> [!WARNING]
>
> 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](https://docs.houdini.com/developer-hub/core-concepts/websocket-order-updates.md) for real-time updates:

```javascript JavaScript theme={null}
const response = await fetch(
  `https://api-partner.houdiniswap.com/v2/orders/${order.houdiniId}`,
  {
    headers: {
      'Authorization': `${API_KEY}:${API_SECRET}`,
      'x-user-ip': userIp,
      'x-user-agent': userAgent,
      'x-user-timezone': userTimezone
    }
  }
);

const status = await response.json();
console.log('Overall status:', status.statusLabel);
console.log('First hop:', status.inStatusLabel);
console.log('Second hop:', status.outStatusLabel);
```

```bash cURL theme={null}
curl -X GET "https://api-partner.houdiniswap.com/v2/orders/hxK7mQp2" \
  -H "Authorization: your_api_key:your_api_secret" \
  -H "x-user-ip: 192.168.1.1" \
  -H "x-user-agent: Mozilla/5.0..." \
  -H "x-user-timezone: America/New_York"
```

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

> [card] [Private Swap](https://docs.houdini.com/developer-hub/swap-flows/private-swap.md)
>
> Private multi-hop routing into a different asset

> [card] [Order Lifecycle](https://docs.houdini.com/developer-hub/core-concepts/order-lifecycle.md)
>
> Understand all order statuses

> [card] [Tokens & Networks](https://docs.houdini.com/developer-hub/core-concepts/tokens-networks.md)
>
> Token discovery and filtering, including `hasSelfPrivate`

> [card] [WebSocket Order Updates](https://docs.houdini.com/developer-hub/core-concepts/websocket-order-updates.md)
>
> Real-time order status without polling


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.