curl --request POST \
--url https://api.vane.xyz/api/v1/orders/create \
--header 'Content-Type: application/json' \
--header 'x-tenant-api-key: <api-key>' \
--data '
{
"depositTokenId": 158,
"settleTokenId": 231,
"receivingAddress": "0x1234567890abcdef1234567890abcdef12345678",
"intendedAmount": 0.005,
"intendedIsDeposit": true
}
'const options = {
method: 'POST',
headers: {'x-tenant-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
depositTokenId: 158,
settleTokenId: 231,
receivingAddress: '0x1234567890abcdef1234567890abcdef12345678',
intendedAmount: 0.005,
intendedIsDeposit: true
})
};
fetch('https://api.vane.xyz/api/v1/orders/create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.vane.xyz/api/v1/orders/create"
payload = {
"depositTokenId": 158,
"settleTokenId": 231,
"receivingAddress": "0x1234567890abcdef1234567890abcdef12345678",
"intendedAmount": 0.005,
"intendedIsDeposit": True
}
headers = {
"x-tenant-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": 74,
"uuid": "7f9c2e4a-1b3d-4c5e-8f6a-2d9b0c1e3f5a",
"status": "AWAITING_USER_DEPOSIT",
"timeout": "2026-01-15T14:30:00.000Z",
"intendedAmount": 0.005,
"intendedIsDeposit": true,
"initialQuote": 316.23212,
"depositTokenId": 158,
"settleTokenId": 231,
"receivingAddress": "0x1234567890abcdef1234567890abcdef12345678",
"depositAmount": null,
"depositEstSettleAmount": null,
"settleAmount": null,
"minimalAmount": 0.00020766,
"maximalAmount": 0.14162023,
"exchange": "CEX",
"senderDepositTx": null,
"exchangeWithdrawTx": null,
"exchangeWithdrawTxLink": null,
"tradePath": [
{
"symbol": "BTCUSDT",
"side": "SELL",
"inputToken": "BTC",
"outputToken": "USDT"
}
],
"userId": null,
"createdAt": "2026-01-15T14:00:00.000Z",
"walletAddress": "bc1p..."
}Create an order
Creates a swap order, your intent, and returns HTTP 201 with the full order object, including the per-order deposit address (walletAddress) on the deposit token’s chain. From there, send your deposit to walletAddress before timeout and a solver fills the order against the escrowed deposit.
A tenant API key is enough to create orders.
Validation failures (a missing or malformed receivingAddress, invalid token ids, missing fields) return HTTP 500 with a descriptive message. Match on the message field to tell causes apart. The address validator names the settle token’s chain (blockchain.network in the catalog), so the same mistake reads Invalid BTC address when settling to native Bitcoin and Invalid SOL address on Solana.
curl --request POST \
--url https://api.vane.xyz/api/v1/orders/create \
--header 'Content-Type: application/json' \
--header 'x-tenant-api-key: <api-key>' \
--data '
{
"depositTokenId": 158,
"settleTokenId": 231,
"receivingAddress": "0x1234567890abcdef1234567890abcdef12345678",
"intendedAmount": 0.005,
"intendedIsDeposit": true
}
'const options = {
method: 'POST',
headers: {'x-tenant-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
depositTokenId: 158,
settleTokenId: 231,
receivingAddress: '0x1234567890abcdef1234567890abcdef12345678',
intendedAmount: 0.005,
intendedIsDeposit: true
})
};
fetch('https://api.vane.xyz/api/v1/orders/create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.vane.xyz/api/v1/orders/create"
payload = {
"depositTokenId": 158,
"settleTokenId": 231,
"receivingAddress": "0x1234567890abcdef1234567890abcdef12345678",
"intendedAmount": 0.005,
"intendedIsDeposit": True
}
headers = {
"x-tenant-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": 74,
"uuid": "7f9c2e4a-1b3d-4c5e-8f6a-2d9b0c1e3f5a",
"status": "AWAITING_USER_DEPOSIT",
"timeout": "2026-01-15T14:30:00.000Z",
"intendedAmount": 0.005,
"intendedIsDeposit": true,
"initialQuote": 316.23212,
"depositTokenId": 158,
"settleTokenId": 231,
"receivingAddress": "0x1234567890abcdef1234567890abcdef12345678",
"depositAmount": null,
"depositEstSettleAmount": null,
"settleAmount": null,
"minimalAmount": 0.00020766,
"maximalAmount": 0.14162023,
"exchange": "CEX",
"senderDepositTx": null,
"exchangeWithdrawTx": null,
"exchangeWithdrawTxLink": null,
"tradePath": [
{
"symbol": "BTCUSDT",
"side": "SELL",
"inputToken": "BTC",
"outputToken": "USDT"
}
],
"userId": null,
"createdAt": "2026-01-15T14:00:00.000Z",
"walletAddress": "bc1p..."
}intendedAmount. An out-of-range intent is accepted, and one below the minimum returns initialQuote: 0. The minimalAmount and maximalAmount bounds in the response apply to the actual deposit: send an amount inside them, send only the exact deposit token, and fund walletAddress before timeout (about 30 minutes after creation). See Order lifecycle.Authorizations
Vane's shared tenant key. Contact support for a dedicated key if you need custom parameters or separate order tracking.
Body
Order creation payload, which is your swap intent.
Numeric id of the token you will deposit. Ids are chain-specific; look them up with GET /v1/tokens.
Numeric id of the token to receive, on the chain you want to receive it on.
Address where the settle tokens will be delivered by the filling solver. Must be valid for the settle token's chain.
Intended swap amount. It is not validated against the swap limits: an out-of-range intent is accepted, and a too-small one (0 included) yields initialQuote: 0. The actual deposit must respect the order's minimalAmount and maximalAmount.
true if intendedAmount is the deposit amount, false if it is the settle amount you want to receive.
Response
Order created. Send the deposit to walletAddress before timeout, within minimalAmount and maximalAmount.
A swap order. Created by POST /v1/orders/create. A solver fills it against the deposit escrowed at walletAddress.
Internal numeric order id. SSE events do not carry it; their orderId is the uuid.
Public order identifier and a bearer capability: anyone holding it can read the order. Store it server-side and keep it out of public URLs. For accountless orders it is your only handle. SSE events echo it as orderId.
Order lifecycle status.
AWAITING_USER_DEPOSIT: waiting for your deposit to the order'swalletAddress.AWAITING_USER_DEPOSIT_CONFIRMATIONS: deposit detected, waiting for on-chain confirmations (blockchain.neededConfirmations).PROCESSING: transitional state between deposit confirmation and completion. Treat it as in flight.COMPLETED: fill delivered andsettleAmountis final. Terminal.ERROR: the swap hit an error. Contact support with the order UUID. Terminal.TIMED_OUT: no deposit arrived beforetimeout. Terminal.
AWAITING_USER_DEPOSIT, AWAITING_USER_DEPOSIT_CONFIRMATIONS, PROCESSING, COMPLETED, ERROR, TIMED_OUT UTC time at which the order expires if no deposit is received (30 minutes after createdAt). Orders cannot expire after a deposit is made.
Amount declared at creation. Not validated against minimalAmount and maximalAmount; those bounds bind the actual deposit.
Whether intendedAmount was expressed in deposit-token units.
Estimated settle amount computed from intendedAmount at creation. Comes back as 0 when the intent is below the minimum.
Id of the deposit token.
Id of the settle token.
Address where the settle tokens are delivered.
Actual amount deposited, once detected. null before any deposit.
Estimated settle amount recomputed from the actual depositAmount. null before any deposit.
Amount delivered to receivingAddress. Updates while the order settles and is final once status is COMPLETED. null before settlement starts.
Minimum deposit-token amount this order accepts. It binds the actual deposit; creation does not check intendedAmount against it.
Maximum deposit-token amount this order accepts. The actual deposit must stay at or below it.
Pricing source label carried over from the quote (for example CEX). Settlement still happens through solver intent matching.
Transaction hash of your deposit, once detected. null before that.
Transaction hash of the transfer delivering settle tokens to receivingAddress. null until the fill.
Block-explorer link for exchangeWithdrawTx. null until the fill.
Order-book legs behind this order's quote. They describe pricing, not how the order settles.
Show child attributes
Show child attributes
User id for orders created with a JWT access token, a UUID string matching the id from GET /auth/me. null for accountless (tenant-key) orders.
UTC creation time.
The deposit address: a per-order escrow address on the deposit token's chain (a taproot bc1p... address for BTC). Send only the exact deposit token here, within the min/max bounds, before timeout.

