Skip to main content
Withdrawals are submitted via a user-signed EIP-712 payload using perps.withdraw(), or createAction / executeAction with action: ActionType.WITHDRAWAL (see SDK / Actions). Agents cannot initiate withdrawals — the user’s wallet must sign each withdrawal directly. This is a protocol-level constraint, not an SDK choice. On Hyperliquid, withdrawals always send USDC on Arbitrum to destination via the Hyperliquid L1 -> Arbitrum bridge. Processing typically takes 3-4 minutes (Hyperliquid’s bridge estimate). Fee: a flat 1 USDC (withdrawalFeeUsd: '1' on the provider) is deducted from every USDC withdrawal. getWithdrawableBalances() also reports it as withdrawalFee on the quote-asset rows, with isFeeDeducted: true. Withdraw more than the fee.

withdrawal

destination is any Ethereum address; USDC is sent to it on Arbitrum (typically the user’s own address). amount is the USDC amount as a human-readable string (e.g. "100.00").
withdraw() triggers a wallet popup. Trading actions are signed by the agent without a wallet prompt. Withdrawals require an explicit signature from the user’s connected wallet. Plan for this in your UX flow.

Withdrawable balances by category

perps.getWithdrawableBalances({ provider: 'hyperliquid', address }) returns rows keyed by categoryId: In Standard (disabled) mode only the perps row exists. Only the quote-asset USDC rows can be withdrawn with the Hyperliquid withdrawal action; rows for other spot tokens are informational, so filter to the USDC asset before rendering a withdrawal picker. Do not sum the same asset across the perps and spot categories.