Start at Bank transfers for the virtual account
flow, or One-off bank deposit for the other. Which
one a country supports is answered by
GET /v1/payment-methods.
Provider sandbox on this deployment. Onboarding, consent and the virtual
account flow run against the banking partner’s sandbox: test bank details, no
real transfer, settlement on a testnet. Every response says which environment
answered in its
environment field.Errors on this endpoint carry the banking partner’s own codes. The envelope is
the platform one, but
code and fields inside it are passed through from the
banking partner unchanged rather than mapped to the platform vocabulary - a
deliberate exception to the one-error-format story. Branch on the HTTP status
first; treat code as a string to log and show, not a fixed set to enumerate.Where money can come in
Permanent virtual accounts and one-off deposits do not cover the same set, so check the shape you intend to use rather than the currency alone.
Stablecoin collection is available alongside the fiat rails - USDC, USDT and EURC
on the networks listed in Coverage.
The incoming side is much narrower than the outgoing one. Roughly three times
as many currencies can be paid out as can be paid in. If a corridor matters to
your product, confirm the incoming leg first - it is the one more likely to be
missing.
Why a local transfer beats a cross-border one
The reason virtual accounts exist in the flow at all: a user sends money from an account in their own name to an account in their own name, in the same country and the same currency. That is a local wire - it executes faster and converts at a better rate than the same money crossing a border first. The conversion happens on our side of that hop, not the bank’s.Fees
Your fee is set on the account in basis points (applicationFeeBps on the
virtual account) and taken from the incoming amount; the banking partner’s fee
and the conversion come out of the same amount. What an on-ramp transfer returns is the two
figures you reconcile on: depositedAmount, what arrived in fiat, and
deliveredAmount, the stablecoin that settled to the wallet. The difference is
the cost of the transfer.
Fees come out of the amount, never added on top. A 100 EUR transfer with 1.40
in total fees settles the remainder - the user is not charged 101.40. Showing the
two figures side by side without saying so reads as a surcharge.
Following one
An on-ramp transfer passes through the partner’s own states before it is finished. Two of them are easy to misread:- A transfer appearing on the account does not mean the user received anything. It is listed while the money is still in flight. The delivered amount is the first moment anything true can be said about what arrived - poll for that, not for the record’s existence.
- The details expire, the money does not. A payment already on its way still
settles after
expiresAt; only new payments stop being accepted.