This guide walks you through the steps to support ACH bank withdrawals using the REST API — from creating an external account to monitoring for settlement.Documentation Index
Fetch the complete documentation index at: https://developer.uphold.com/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
- The user has completed onboarding and has the required capabilities enabled.
Walkthrough
Check available rails
Before creating a quote, verify the ACH rail is available for withdrawals. Call List Rails forUSD to confirm the ach network has the withdraw feature.
Select source account
ACH withdrawals can be sourced from any account. If the selected account is not in USD, the balance will be converted at the time of the transaction using Uphold’s prevailing rate. Make sure the origin asset has the necessary features enabled. Call List accounts to retrieve the user’s accounts and let them pick the one to withdraw from.Select a bank account
ACH bank accounts are not linked automatically. Users must provide their routing and account number to add one. Select an existing linked account or add a new one.Find an existing bank account
Call List external accounts and filter for accounts withtype: "bank". If no USD bank account exists, proceed to link one.
status: "ok" and "withdraw" in features.
Link a new bank account
Create a USD bank account by calling Create external account with the user’s bank details.The
secondaryNetworks field is present only when the destination bank supports FedNow. If it appears, you may use "fednow" as the network in the quote to settle funds faster.Create a quote
Create a quote with Create quote. Passnetwork: "ach" on the destination node to route the transfer via ACH, or leave it out to route via the external account’s default network. If the external account has secondaryNetworks, the user can choose which one to use for the transfer. The quote must be created with the selected network to ensure accurate fees and expiration time.
quote object with fees and expiration.
Quotes typically expire quickly. Prompt for user confirmation within the expiry window and requote if needed.
Confirm and create transaction
After the user confirms the withdrawal, call Create transaction with the quote ID to execute the transfer.account and the destination is the external-account representing the user’s bank. The transaction status is initially processing and updates to completed once the transfer settles.
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 iscompleted, and send an email if applicable.
You now support ACH bank transfer withdrawals via the REST API.