Prerequisites
Before using the deposit address hooks, enable the deposit address feature for your app in the Privy Dashboard. See here for full guidance.Overview
The headlessuseDepositAddress hook from @privy-io/react-auth/hooks provides stateless helpers for building a fully custom deposit address UI. Unlike the modal-based useDepositAddress from @privy-io/react-auth, this hook does not render the Privy modal — your app controls the entire user experience.Access the hook
Methods
Step 1: Load deposit configuration
CallgetConfig to fetch the available currencies and chains:DepositConfig object contains:currencies— an array of supported tokens with their chain availabilitychains— a record keyed by caip2 with chain metadata
Config shape
Example config response
Using the config
Use the config to build chain and currency selectors in your UI:Step 2: Generate a deposit address
CallgenerateDepositAddress with the source and destination details:DepositAddressQuote includes id, deposit_address, indicative_rate, time_estimate_seconds, and created_at.Deposit addresses can be reused. If a user sends funds to the same deposit address again, Privy
routes the new deposit using the same source token, source chain, and destination settings.
Parameters
string
required
CAIP-2 identifier for the source chain (e.g.
eip155:1 for Ethereum).string
required
Token contract address on the source chain.
string
required
CAIP-2 identifier for the destination chain (e.g.
eip155:8453 for Base).string
required
Token contract address on the destination chain.
string
required
Wallet address to receive the deposited funds.
string
Refund address on the source chain. If not provided, Privy resolves one automatically from the
user’s linked wallets or creates an embedded wallet.
number
Slippage tolerance in basis points. Uses the default for the route if not provided.
Step 3: Display the deposit address
Once you have the quote, displayquote.deposit_address to the user. The user sends funds to this address from the source chain. You can also show quote.indicative_rate and quote.time_estimate_seconds to set expectations.Step 4: Poll for deposit and completion
Wait for the deposit
After the user sends funds, callwaitForDeposit to poll until the deposit is detected:string
required
The quote ID returned as
DepositAddressQuote.id.string
required
The quote creation timestamp returned as
DepositAddressQuote.created_at.AbortSignal
Optional abort signal to cancel polling.
number
Optional polling interval override in milliseconds.
number
Optional polling timeout override in milliseconds.
Polling return type
BothwaitForDeposit and waitForCompletion return a DepositAddressPollingResult:status is 'completed', destination_amount contains the delivered amount. For all other statuses, destination_amount is null.Wait for order completion
Once a deposit order is detected, poll until it reaches a terminal status (completed, refunded, or failed):string
required
The deposit address order ID.
AbortSignal
Optional abort signal to cancel polling.
number
Optional polling interval override in milliseconds.
number
Optional polling timeout override in milliseconds.
Fetch order details
CallgetDeposit to fetch the full DepositAddressOrder for a given order at any time:string
required
The deposit address order ID (returned as
order.id from waitForDeposit or
waitForCompletion).DepositAddressOrder with the order’s current status, source and destination details, amounts, and a tracking_url for external tracking.Full example
Related
Crypto deposit addresses
Use the modal-based deposit address flow.
Funding overview
All available methods for funding wallets.

