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").
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.