- Create a quote on behalf of the sender.
- Create a transaction from that quote.
Prerequisites
Before creating sends:- The sender must have completed onboarding and have the
sendscapability enabled. - The recipient must have completed onboarding and have the
receivescapability enabled. - The sender and recipient must belong to the same organization.
Both accounts must be denominated in the same asset.A send moves a single asset between two same-asset accounts (e.g. USD → USD). The recipient does not need an existing balance — a freshly created, zero-balance account in that asset can receive the send.
Walkthrough
Identify the sender and recipient accounts
A send involves two different users:- Origin account — the sender’s account.
- Destination account — the recipient’s account.
ownerId than the sender.
Before creating a quote, verify the recipient account exists using Get account.
Do not expose recipient
ownerId values directly to end users.Instead, resolve account ownership server-side and display a friendly identifier such as a name, username, or contact entry.Create a quote
Create a quote on behalf of the sender. The quote acts as a confirmation handle and validation step before funds move. Because both accounts hold the same asset, the amounts in the quote are always identical.Quotes have a short validity window even at a 1:1 rate. If a quote expires, transaction creation returns
404 entity_not_found — create a new quote and ask the sender to confirm again.Create the transaction
Once the sender confirms the transfer, create the transaction from the quote. As with trades, thequoteId becomes the transactionId, allowing a single identifier to be used throughout the transfer lifecycle.
Sends settle synchronously. In most cases, by the time the API responds, balances have already been updated.
Notify sender and recipient
After the transaction succeeds:Notify the sender
Display a confirmation such as:Sent 50.00 USD to Jane Smith.Refresh balances using Get account.
Notify the recipient
Send an in-app, push, SMS, or email notification indicating that funds were received. The recipient webhook payload contains the same transactionid returned during transaction creation, allowing notifications to be deduplicated across systems.
You now support peer-to-peer sends using the Uphold Enterprise API Suite.
Common errors
| Status | Code | Cause | Recommended action |
|---|---|---|---|
409 | user_capability_failure (capability.code: "sends") | Sender does not have the sends capability enabled. | Verify onboarding status and sender capability requirements. |
409 | user_capability_failure (capability.code: "receives") | Recipient cannot receive funds. | Verify recipient onboarding and capability status. |
404 | entity_not_found (entity: "account") | Destination account does not exist or is not visible to your partner relationship. | Verify the recipient account ID before retrying. |
404 | entity_not_found (entity: "quote") | Quote expired or no longer exists. | Create a new quote and request confirmation again. |
409 | insufficient_balance | Sender account does not have sufficient available funds. | Refresh balances and prompt the sender to enter a lower amount. |