status is the primary signal: succeeded means the fiat settled, not just that the crypto moved.
Read the current state with GET /v1/wallets/{wallet_id}/actions/{action_id}, or subscribe to wallet action webhooks:
Payload fields include
provider, environment, source_asset, source_chain, source_amount, destination_fiat_account_id, destination_currency, and destination_payment_rail, alongside the standard wallet action fields, plus failure_reason on the terminal failure events.
Failure modes
rejected and failed call for different handling, and failed itself covers more than one situation. The question that decides the response is whether the crypto has already left the wallet, because retrying a payout sends more crypto.
The specific steps Privy runs for a payout are an implementation
detail and may change. Inspect
steps for
diagnostics rather than assuming a fixed order, count, or set of types.steps and work through them:
1
Check whether any on-chain step confirmed
Look for a step of type
evm_transaction or svm_transaction with status confirmed. If none
confirmed, the crypto never left the wallet.2
If no on-chain step confirmed, resolve the cause and retry
The failure is either pre-broadcast (
rejected) or an on-chain failure such as reverted,
replaced, or abandoned. Read the step’s failure_reason, confirm the balance is intact, and
retry once the cause is fixed.3
If an on-chain step confirmed, do not retry
The crypto reached the provider and the fiat leg is what failed. Read the failed step’s
failure_reason and the provider state below to determine where the funds are. Reissuing the
payout would send a second transfer.Next steps
Wallet action webhooks
Track payouts and other wallet actions in real time
Fiat deposits
Fund a wallet with fiat through a dedicated bank account

