Deposits
Fiat bank transfers and crypto-to-fiat offramp flows.
Fiat deposit via bank transfer
This flow also applies to UR Peer Transfers — fiat transfers between 2 Live UR accounts.
This flow enables a fully verified (Live) user to fund their UR account from an external, third-party bank account (e.g., their primary bank).
EUR and CHF deposits must come from a bank account in the user's own name (same-name). USD deposits may also come from a third-party account, with additional review; see USD deposits from a third-party account.
Prerequisite: User is Live
The user's status must be Live to access this feature. Your UI should only show the "Deposit" option to Live users.
Partner
User Clicks "Deposit"
The user selects "Deposit" and chooses "Bank Transfer" from within your app.
Partner
Partner Fetches Account Details
Your backend, which must be authorized, calls UR's API to retrieve the user's personal bank account details (IBAN, BIC, Bank Name).
Partner
Partner Displays Account Details
Your app's frontend displays the user's unique IBAN and transfer instructions (e.g., "Only send EUR or CHF to this account").
Partner
User Initiates External Transfer
The user leaves your app, logs into their external bank app (e.g., UBS, Revolut), and initiates a SEPA/SWIFT transfer to the IBAN provided.
User
UR Receives Funds & Notifies Partner
When the funds arrive (hours or days later), UR's banking core identifies the receiving IBAN, credits the user's account balance, and sends a payment.received webhook to your backend.
Alternatively, you may monitor on-chain transactions specific to said user.
UR -> Partner
Partner Updates User
Your backend receives the webhook, verifies the details, and updates the user's balance in your system.
You should send a push notification or in-app update to inform the user (e.g., "Your €100.00 deposit has arrived.").
Partner
EUR and CHF use the default IBAN; USD uses a separate one on request. When a user reaches Live, UR automatically issues a personal Swiss IBAN for EUR and CHF transfers. UR does not issue a USD IBAN by default; you request one when the user wants to receive USD. The EUR/CHF IBAN does not receive USD; show the USD IBAN for USD transfers.
The EUR/CHF IBAN is ready as soon as the user is Live, with no request and no prerequisite pay-in. To get the user a USD IBAN, call POST /v1/apply-usd-payin. The call is synchronous: if the user is Live, UR creates the USD IBAN and returns success, with no manual review and no prior EUR or CHF pay-in required. After a successful call, the USD IBAN appears under the USD key of depositBank in the user profile; read it from there before showing it to the user. USD deposits from an account not in the user's own name are subject to additional review (see USD deposits from a third-party account).
Fetch deposit details from the BR profile (GET /api/fma/v1/br), where depositBank is keyed by currency. Show the user the IBAN whose currency matches the transfer they will send. Do not show the EUR/CHF IBAN for a USD transfer, or the USD IBAN for a EUR or CHF transfer.
USD deposits from a third-party account
UR screens inbound USD by who sent it:
Same-name sender: the deposit comes from an account in the user's own name. UR credits it to the user's UR account with no hold.
Any other sender: UR holds the deposit for up to 7 days for review. On release, UR deducts a fixed USD 50 fee and credits the remainder to the user's UR account; UR does not return the funds to the sending bank. If the review does not pass, UR does not release the funds.
This review applies to USD only; EUR and CHF deposits must always come from a same-name account. Tell your users to send USD from an account in their own name to avoid the hold and the fee.
Crypto-to-fiat conversion (off-ramp)
1. Initiate Off-ramp
The user taps "Cash Out" for 1 ETH on your app.
Partner
2. Internal Debit
Your backend deducts 1 ETH from the user's custodial balance.
Partner
3. Request Quote
Your backend calls the liquidity provider API to request a real-time conversion quote for 1 ETH to EUR.
Partner
4. Source Liquidity
The liquidity provider API gets a live, executable price.
UR / Partner
5. Provide Quote
The liquidity provider API returns a firm, time-limited quote (e.g., "€1900.00, valid for 30s") to your backend.
UR -> Partner
6. Confirm Quote
Your frontend displays the quote, and the user taps "Confirm."
Partner
7. Execute Trade
Your backend calls the liquidity provider API with the unique quote_id to execute the trade.
Partner
8. Settle Trade
UR performs an atomic sequence:a. Debits 1 ETH from Partner's corporate crypto account.b. Sells 1 ETH via the liquidity provider.c. Credits the resulting €1900.00 to the end-user's UR account.
UR
9. Notify User
UR sends a payment.received webhook. Your backend updates the user's UI and sends a push notification.
UR -> Partner -> User
Last updated