Prerequisites
- The user has completed onboarding and has the required capabilities enabled.
Walkthrough
Check available rails
Call List rails to confirm the asset and network the user wants to deposit from, and verify thedeposit feature is enabled.
features array — only proceed with networks that include "deposit". For assets supported by multiple networks, require an explicit network selection from the user.
Select destination account
Crypto deposits can target any account. If the selected account is not in the deposited asset, the amount will be converted at settlement using Uphold’s prevailing rate. Make sure the destination asset has the necessary features enabled.Find an existing account
Call List accounts to retrieve the user’s accounts and let them pick the one they want to fund.Create a new account
If the user has no accounts, create one with Create account before proceeding.Generate deposit method
Call Set up account deposit method with the target account id, asset, and network.address and, if applicable, a reference (e.g., destination tag, memo).
The deposit method may initially return
status: processing while the address is being prepared. Call Get account deposit method to confirm it is ready (status: ok) before displaying instructions to the user.reference is present, display it prominently and treat it as required input. We suggest also displaying a QR code to reduce input errors.
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→ detected on-chain but not yet confirmed
- core.transaction.status-changed
status: completed→ necessary confirmations reachedstatus: on-hold→ transaction checks paused (e.g., pending RFIs)status: failed→ irrecoverable error
- core.transaction.created
- Polling (fallback): Get transaction
Sample transaction
In a successful crypto deposit, the origin is represented as acrypto-address node reflecting the sender’s on-chain address. The destination is the account that was set up to receive the deposit.
Execution modes
Crypto deposits are executed in one of the following modes, indicated byorigin.node.execution.mode:
On-chain
On-chain
The transaction is received from the blockchain network.
origin.node.execution.mode is onchain, and origin.node.execution.transactionHash holds the transaction hash, as in the example above.Off-chain
Off-chain
When both the sender and recipient are Uphold users, the transfer is processed within Uphold’s infrastructure instead of the blockchain. This avoids network fees and is faster than on-chain processing.Each side sees the transfer from its own perspective:
When both users belong to the same organization, the execution also identifies the counterpart account:
destination.node.execution.accountOwnerId and destination.node.execution.accountId for the sender, and origin.node.execution.accountOwnerId and origin.node.execution.accountId for the recipient.Because funds move between Uphold accounts, the assets may differ from an on-chain transfer:- Sender:
destination.assetis the asset of the recipient account associated with the address, which may differ from the one in the quote. - Recipient:
origin.assetis the asset of the sender’s account, which may differ from the network’s asset or even be one the network doesn’t support, such as a fiat asset.
Simulated
Simulated
Used in development environments for testing, see Simulate crypto deposit. The transaction appears processed without affecting blockchain state, although user balances are updated.
origin.node.execution.mode is simulated.Handle on-hold transactions
If the crypto deposit is placedon-hold with reason pending-requests-for-information, resolve the pending RFIs before the deposit can complete. For the full step-by-step implementation, see the Travel Rule deposit flow guide.
Notify the user
Display an in-app confirmation when the transaction iscompleted, and send an email if applicable.
You now support crypto deposits with the Enterprise API Suite.