Prerequisites
- The user is onboarded and verified (KYC is complete).
- A funded account to cover the withdrawal amount and fees.
- A
bankexternal account to receive the funds. - The bank-withdrawals capability is enabled for the user.
- Your system listens to webhooks for transaction updates.
With bank withdrawals, funds are pushed from Uphold to a user’s bank account. These transactions are quote-based, so the user must accept the quote before the withdrawal is executed.
The flow
Choose the source account
List accounts (e.g., with List Accounts) and let the user select one with sufficient balance.Choose the external account
Select an external account of typebank which will serve as the destination of the withdrawal transaction.
This can be implemented entirely via the REST API, by directly calling the necessary endpoints, or by using the Payment Widget, which will handle the process for you.
Both implementations are described below.
For FPS external accounts, they are only created after a successful deposit is made. For more details, see Bank Deposit flow.
Using the REST API
Follow these steps to perform a bank withdrawal using the REST API.List external accounts
To get all available external accounts, use the List External Accounts endpoint. Filter the external accounts that have typebank and that have the withdraw feature enabled.
Present the filtered list to the user for selection.
Using the Payment Widget
To use the Payment Widget for bank withdrawals, you must use theSelect for Withdrawal flow.
Select for Withdrawal flow
TheSelect for Withdrawal flow allows the user to select a withdrawal method, including bank transfer, and displays the necessary instructions to complete the withdrawal.
Please refer to the Select for Withdrawal guide for a step-by-step tutorial.
Regardless of how the withdrawal account was selected (REST API or Payment Widget), the rest of the process is handled via REST API.
Create a quote
Create a quote for the withdrawal with Create Quote. For cross-asset withdrawals, the FX rate is captured in the quote.- FPS
Quote object
A successful response returns aquote object with details about the withdrawal, including fees and expiration.
- FPS
Quotes typically expire quickly. Prompt for user confirmation within the expiry window and regenerate if needed.
Create a transaction
Once the user accepts the quote, create the transaction using Create Transaction.Transaction object
A successful response returns atransaction object with details about the initiated withdrawal.
- FPS
origin.node.type:accountorigin.node.id: The id of the source accountdestination.node.type:external-accountdestination.node.id: The id of the destination external accountdestination.node.typeisexternal-account(the user’s bank)destination.node.networkisfps
Monitor for settlement
Prefer webhooks for real-time updates, or fall back to polling if webhooks are not feasible.- Webhook events (recommended):
- core.transaction.created
status: processing→ payout submitted to the bank network
- core.transaction.status-changed
status: completed→ funds delivered to the user’s bankstatus: failed→ irrecoverable error
- core.transaction.created
- Polling (fallback): Get Transaction
Notify the user
Display an in-app confirmation when the transaction is executed, and surface failures so the user can retry or contact support. Send an email if applicable.You now support bank transfer withdrawals with the Enterprise API Suite.