You’ll need: a signed-in user (Authentication & sessions).
Result: the user’s deposit addresses, a funded balance, and a withdrawal polled to
completed, partial, or failed.x-app-id and the user’s Authorization: Bearer token.
1. Get deposit addresses
GET /execution/deposit-addresses returns 202 with { "ready": false } while the addresses are
being created. Poll until it returns 200.
evmAddress receives on every EVM chain in supportedChains. svmAddress receives on Solana.
Only send the tokens listed for each chain. Treat supportedChains as the source of truth; it can
change.
The wallets.ready webhook fires when a user’s addresses are created.
2. Deposit and wait for the balance
The user sends a supported token to the address. The deposit shows in the balance after on-chain confirmation. There is no confirm call on your side. Thedeposits.confirmed webhook fires for
each confirmed deposit.
availableRaw is what can be spent now. reservedRaw is held for open limit orders and trades in
progress. Amounts are integer strings in the token’s decimals: 125000000 with 6 decimals is 125
USDC. Pass custody=self to read the user’s linked self-custody wallets instead.
To keep a minimum USDC balance on one chain after trades, see
Managed balance refills.
3. Withdraw
Withdrawals always come from the managed balance, to any address on a supported destination chain. Supported tokens areUSDC, USDC.e, and USDT. Amounts are in the destination token’s atomic
units (6 decimals, or 18 on BNB Chain). The minimum is one whole token. Fees come out of the
amount.
Show the maximum
For a Max button, ask how much can actually arrive after fees:"max": true on the withdrawal. The server caps the amount to what
can be delivered.
Preview before submitting
Optional, but show it before the user confirms:receiveAmountRaw, feeRaw, pricingStatus (quoted or unviable),
unviableReason, and quoteExpiresAt. The preview creates nothing.
Submit
withdrawalId and status: "pending".
requestId is an optional UUID that makes an exact-amount withdrawal safe to retry: the same
requestId and body return the original withdrawal instead of sending twice, and a changed body
returns 409. Do not combine requestId with max.
Poll to a final state
legs[] and sources[] carry per-transfer status and txHash values.
Related
Managed balance refills
Keep a USDC minimum on a chosen chain.
Webhooks
wallets.ready and deposits.confirmed events.