Skip to main content
Four calls take an account from no destination to settled value. You need an account with at least one connected wallet; create one on Universal Payment Account. Every call uses the sandbox base URL. Swap it for production when you go live; see Environments.

1. List the account’s destinations

Pick a row where status is active and capabilities.settlementSupported is true, and take its id.

2. Set the settlement profile

The body takes those two keys and nothing else. assetSymbol is optional.
Read status rather than assuming it: a newly created account’s profile is returned as draft, and the enum is draft, active, inactive, failed. Repeating the same selection returns the existing profile, and GET /v2/accounts/{accountId}/settlement-profile returns null when nothing is selected.

3. Collect a payment into the account

Create a receive payment addressed to the account. The destination is not in this request, and never is.
The response freezes the settlement snapshot and the fees onto the payment:
merchantNetAmountAtomic is what the destination receives. Fees are deducted from the verified amount, not recalculated at settlement time.
A recipient account with no active settlement profile is refused with a 409 conflict naming the account. Set the profile before you point any value at an account.

4. Confirm the value landed

Subscribe to payment.accepted and payment.succeeded rather than polling, and treat each event as a prompt to read the payment. payment.settlement_returned fires when a broadcast settlement comes back. See Webhooks. The account now has a standing destination. Every later deposit into it settles there, net of fees, with no destination in any request body.

Next: Settlement lifecycle

When accepted becomes succeeded, and what to read in between.