Skip to main content
Creates a virtual account: a permanent set of bank details on an incoming rail and currency, tied to a destination wallet. Money that arrives on the account is converted to the output asset and settled to that wallet - see Virtual accounts for what the product does.
Creating virtual accounts needs the virtual-accounts permission on your API key. It is granted separately from the rest of your key’s setup - ask us. A key without it gets 403 permission_denied from every endpoint in this section. See Authentication.

Request

The account is opened for a user you have already onboarded, and it inherits the corridor agreed on your account: which rail and currency it accepts, which asset the incoming money is converted into, and which network it settles on. Those are not passed per request, so a browser cannot redirect where money lands.
string
required
The id returned when the user was onboarded and their identity result shared with the banking partner. See Bank transfers.
string
required
The id of the wallet registered for that user at onboarding. It is the wallet the settled stablecoin is delivered to.

Response

string
The virtual account id. Keep it - see the note on reading accounts back below.
object
The bank details to display, plus the reference that ties a transfer to this account. The fields depend on the rail: an IBAN with a SWIFT code for SEPA, an account number with a routing number for ACH, an account number with a sort code for UK rails, a CLABE for SPEI. Render what comes back rather than assuming a shape, and show the reference exactly as returned - a transfer without it has to be attributed by hand.
number
Your fee on this account, in basis points (100 bps = 1%), taken from money arriving on it.
Store what you get back. Reading an account back after creation is not available yet: the get, list and update endpoints answer 501 not_implemented until the banking partner integration can serve them. Keep the details and the reference from this response rather than planning to fetch them later.
Some currencies provision asynchronously (USD, AED, COP): the details arrive moments after the account is created rather than with it. Until read-back exists, retry creation for the same user rather than polling - it is idempotent per user and wallet.

Errors