Skip to main content
Withdraw stablecoins to a recipient by previewing the amount, submitting the request, and tracking delivery. Ground redeems investments and moves funds between networks when needed. Some withdrawals also require your approval.

Prerequisites

Use a funded wallet, your server-side API key, and a recipient on a supported network. Set BASE_URL, API_TOKEN, and WALLET_ID for the requests below. If your organization requires signing, prepare an authorized signer.

Withdrawal lifecycle

The typical flow is: preview -> initiate -> track -> complete.
  1. Preview — call withdrawal-preview to see what’s available and get a sourcing plan.
  2. Initiate — call withdrawals to create the withdrawal. The system reserves liquidity and begins sourcing.
  3. Track — poll the withdrawal or subscribe to webhooks. The withdrawal moves through statuses as positions unwind, funds bridge, and payouts execute.
  4. Complete — the withdrawal reaches completed when all funds have been delivered.

Preview a withdrawal

Before initiating, preview what balance is available for a given destination.
Set the destination network and token you want to receive. Include amountUsd for a specific gross amount, or omit it to preview the maximum available amount. With an explicit amountUsd, amountRequestedUsd echoes the requested amount:
When amountUsd is omitted, the preview resolves the maximum available balance and returns that amount in amountRequestedUsd:
Use amountToReceiveUsd for the estimated payout after fees and processingEstimate for expected timing. A missing estimate is unavailable, not immediate settlement. Preview withdrawableUsd can be lower than the wallet balance because it applies to your selected destination. withdrawableUsd on the wallet object and in preview are related but different:
  • Wallet withdrawableUsd is the wallet-level conservative gross amount that can be withdrawn now before plan-specific fees.
  • Preview withdrawableUsd is the destination-specific gross amount that can safely start right now.
  • Preview withdrawableUsd can be lower than the wallet object’s withdrawableUsd.
Funds awaiting redemption, bridging, or payout can remain part of the wallet’s total value while being unavailable for a new withdrawal to this destination.

Check the destination

Tempo beta limit

USDC.e withdrawals to Tempo allow at most 100 USDC.e per request, before fees. Both preview and create return HTTP 400 tempo_beta_transfer_limit_exceeded above the limit, without reserving funds. Identical request-ID replays of committed withdrawals still work. If amountUsd is omitted, preview checks the full withdrawable amount and rejects it when it exceeds the limit. Supply an explicit amount to preview a smaller withdrawal. Deposits and total wallet balances are not capped.

Stellar memos

For stellar or stellar_testnet, use the memo type and value provided by the receiving exchange or recipient. Include the same memo in both preview and create requests:
Use type: "id" for an unsigned 64-bit number sent as a string, or type: "text" for 1–28 UTF-8 bytes. Text is preserved exactly. For example: {"type":"text","value":"customer-123"}. Do not infer the memo type from the value; a text memo can contain only digits. Omit memo when the recipient does not require one; other networks reject it. The memo is attached to each final Stellar payout. It appears in the preview, withdrawal responses, withdrawal activity and webhooks, and customer approval details. Retrying the same request preserves it; changing it requires a new requestId.

Initiate a withdrawal

Use the same destination, amount, memo, selected sources, and fees you previewed. Add the recipient address and a new UUID v4 requestId. Save the ID and exact payload before sending; retry an uncertain response with them unchanged. To withdraw exact amounts from selected positions, disable automatic rebalancing and send the same sources array to preview and create:
Use position IDs returned by GET /v2/wallets/{id}. Ground does not fall back to another position when a selected source cannot cover its requested amount. Wallets with automatic rebalancing do not support explicit sources in V1. When withdraw succeeds, Ground has accepted the gross debit and reserved liquidity against the wallet. The destination receives the gross amountUsd minus execution fees and any partner fee. Ground snapshots the partner fee and recipient for that withdrawal and sends the customer payout and partner fee atomically. The payout legs remain the source of truth for what was actually delivered, especially for asynchronous exits. Sandbox notes:
  • Sandbox USDC destinations include ethereum_sepolia and solana_devnet, plus stellar_testnet.
  • Sandbox USDT withdrawals require token: "usdt" with destinationChain: "ethereum_sepolia" or "tron_shasta", matching the funded allocation group.
  • destinationAddress must match the selected chain format: EVM hex for EVM chains, base58 for Solana, a G-address for Stellar, and checksummed TRON base58 for TRON.

Solana Devnet withdrawal

List withdrawals

Query parameters:

Fetch a withdrawal

Top-level fields: The payoutLegs array contains the individual legs of the withdrawal. Each leg moves funds from one representation (from) to another (to) through one or more onchain steps: Use portfolio_wallet.withdrawal.payout.status_changed for per-leg progress, including the redeem and payout-transfer steps. When a step enters pending_customer_approval, fetch the pending Turnkey activity and verify it before approving — see Transaction Approvals.

Payout statuses

Withdrawal payoutLegs[].status and payoutLegs[].steps[].state use the workflow status set:

Withdrawal statuses

Withdrawals move through five public statuses: If realized redemption proceeds are not enough to pay the committed partner fee while leaving a positive customer payout, the withdrawal fails before payout with failureReason: "insufficient_proceeds_after_partner_fee". No customer payout or partner fee is sent, and the realized proceeds remain available in the portfolio wallet. Submit a new withdrawal with a lower or zero partner fee.

Tempo withdrawals

Use destinationChain: "tempo" and token: "usdc" to receive USDC.e on Tempo mainnet. Preview first, then submit a withdrawal with the same destination and a new requestId. USDC.e withdrawals to Tempo are not available in sandbox. Partner fees are not supported for Tempo withdrawals.
Track the withdrawal until completed; acceptance does not confirm delivery.

Timing expectations

Creating a withdrawal reserves funds but does not guarantee the final payout. Morpho exits are normally synchronous, while Syrup USDC, the U.S. Treasury Bill Vault, and JTRSY may settle asynchronously. JTRSY USDC redemptions are instant through Basin when available; otherwise JTRSY typically takes 1-2 banking days and up to 3.
Investing through a fee wrapper accrues fees in wrapper shares. This is separate from the optional partner fee deducted during a withdrawal payout. Withdrawal time depends on which yield positions need to unwind and whether cross-chain bridging is required. Cross-chain delivery (CCTP) adds time on top of the unwind. Withdrawal previews currently estimate this CCTP leg at about 20 minutes (PT20M); live settlement can vary with chain and Circle attestation conditions. For precise per-position estimates to a specific destination, use the withdrawal preview endpoint.

Withdrawal webhooks

Subscribe to portfolio_wallet.withdrawal.status_changed for real-time withdrawal tracking. See Webhooks for registration and payload details.

Fund and destination compatibility

Withdrawals source cash and eligible yield positions compatible with the requested stablecoin and destination network. When sources is omitted, cash is used first and positions are unwound when additional liquidity is needed. For manual wallets with explicit sources, the withdrawal uses only the selected positions. Use the token you want to receive and the exact destinationChain key for your environment. Sandbox uses ethereum_sepolia, solana_devnet, stellar_testnet, and tron_shasta according to Supported Chains. Destination addresses must follow the selected network’s format. The destination Stellar account must be active and able to receive Circle USDC. Sandbox supports native OUSD on tempo_moderato for enabled organizations; conversion to Stellar USDC requires mainnet. Use the preview response to determine the amount available for your destination and its estimated completion time. Source redemption can depend on market liquidity, provider settlement, and transaction confirmation. Payouts follow the same approval workflow across supported networks; track the withdrawal until completed.