Prerequisites
- The user is onboarded and verified (KYC is complete).
- A receiving account to credit the funds.
- The bank-deposits capability is enabled for the user.
- The bank transfer network you wish to use is enabled in your environment (e.g. FPS, ACH).
- Your system is set up to listen to webhooks for incoming transactions.
Bank deposits are push transactions — the user initiates the transfer from their banking app using the account details provided as destination. No quote is required to initiate the deposit because the amount can only be settled when the transfer is received by Uphold.
The flow
The flow 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.Using the REST API
Follow these steps to perform a bank deposit using the REST API.Choose the target account
Let the user select the target account to credit. To list the user’s accounts, use the List Accounts endpoint. When the target account asset differs from the bank transfer currency, the conversion will happen when the deposit is settled, using Uphold’s prevailing rate.- For US bank networks (ACH, Wire, FedNow) only USD target accounts are supported. I.e., the user can only deposit into a USD account.
- For UK bank networks (FPS), any currency is supported for the target account. I.e., the user can deposit directly into a BTC account.
Generate deposit method
- FPS
Request an FPS bank deposit method for the chosen account by calling Set up Account Deposit Method with:A successful response includes the routing details (sort code + account number) and a unique payment reference.
type:banknetwork:fpsasset:GBP
Display deposit instructions
- FPS
Show the required bank fields for FPS (sort code + account number) and the reference, plus any beneficiary details returned (name/address) if present. Deposits with no reference will be credited to a target account with the user’s default currency (GBP in the UK, EUR in the EU, or USD in all other regions).
Using the Payment Widget
To use the Payment Widget for bank deposits, you must use theSelect for Deposit flow.
Select for Deposit flow
TheSelect for Deposit flow allows the user to select a deposit method, including bank transfer, and displays the necessary instructions to complete the deposit.
Please refer to the Select for Deposit guide for a step-by-step tutorial.
Regardless of how the deposit instructions were generated (REST API or Payment Widget), the rest of the process is handled via REST API.
Monitor for the incoming transfer
Prefer webhooks for real-time updates, or fall back to polling if webhooks are not feasible.- Webhook events (recommended):
- core.transaction.created
status: processing→ bank transfer received, pending posting
- core.transaction.status-changed
status: completed→ funds settled in user’s target accountstatus: failed→ irrecoverable error
- core.transaction.created
- Polling (fallback):
- Get Transaction endpoint.
- FPS
origin.node.type:external-accountorigin.node.id: The id of the source external accountorigin.node.ownerId: The id of the user that owns the source external accountdestination.node.type:accountdestination.node.id: The id of the destination accountdestination.node.ownerId: The id of the user that owns the destination account
An external account is created only after a bank deposit posts successfully. If a deposit is rejected or cannot be matched (for example, missing reference), no external account linkage is created.
Sample transaction
Below is a sample transaction object returned by the Get Transaction endpoint. Theorigin field shows how the source of the deposit is represented:
- FPS
Notify the user
Display an in-app confirmation when the transaction iscompleted, and send an email if applicable.
You now support bank transfer deposits with the Enterprise API Suite.