Skip to main content
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.
In a managed account, each user gets deposit addresses on the supported chains. The user deposits to any of them, without picking a venue first. AGG tracks the balance per chain and moves funds to the venue a trade routes to. Self-custody users fund from their own wallet instead; see Self-custody trading. All calls below are user-tier: send 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. The deposits.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 are USDC, 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:
When the user picks Max, send "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:
The response has receiveAmountRaw, feeRaw, pricingStatus (quoted or unviable), unviableReason, and quoteExpiresAt. The preview creates nothing.

Submit

The response has a 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.

Managed balance refills

Keep a USDC minimum on a chosen chain.

Webhooks

wallets.ready and deposits.confirmed events.