Skip to main content
Virtual accounts let you receive payments using the collection instructions returned by the API. There are two types: a partner account in Bolivia (BOB, QR payments) and client named accounts in currencies enabled by their endorsements. Every endpoint on this page requires a Bearer JWT.

Endpoints

clientId, subjectId, and id must be valid UUIDs. To create a client, use POST /v2/business-clients.

Partner account in Bolivia

The 201 response is a virtual account with owner.type: "business" and paymentMethods: ["qr"]:
Only one partner account per country is allowed. If one already exists, the API returns 409. Invalid input returns 400. Client accounts are created after endorsement approval, not through this POST.

List and retrieve accounts

With no filters, the list returns named client accounts only; it excludes the partner’s BOB account. Use ?currency=BOB to retrieve that account. Combining currency=BOB with clientId returns an empty list because the BOB account belongs to the partner. The response is always shaped as { "virtualAccounts": [...] }.
GET /v2/virtual-accounts/{id} returns the same object, but only supports partner accounts. It returns 404 if the UUID does not identify an account of the authenticated partner. Use the list with clientId for client accounts.

Account fields

Within coordinates, holder has name, type, and address. The optional bank object has name and address. Depending on the currency and rail, iban, accountNumber, swiftCode, taxId, and routingNumbers (ach, wire, rtp) may be present. Check status and the required fields before displaying payment instructions.

Named client accounts

  1. Create the client with POST /v2/business-clients. You may choose settlementNetwork (Ethereum or Polygon) and settlementAsset (USDC or USDT); the defaults are Polygon and USDC.
  2. Complete onboarding and request endorsements for the currencies the client needs.
  3. Issue a link for each subject with pending requirements. Once the endorsements are approved, the named account is created automatically.
  4. Query GET /v2/virtual-accounts?clientId={clientId} for payment instructions. In Sandbox, register a withdrawal address to test settlement.

Request and retrieve endorsements

The body is optional. Omitting it requests all available currencies: EUR, USD, AED, AUD, and GBP. To narrow the request, send a nonempty array:
The operation is idempotent and returns 200 with requested endorsements and currencies that could not be enabled:
GET /v2/business-clients/{clientId}/endorsements returns an array of endorsements with the same structure as endorsements. Endorsement statuses are pending, dataRequired, inProgress, inReview, approved, and rejected; subject statuses are pending, inReview, approved, and rejected. requestedAt, resolvedAt, rejectionReason, name, and linkIssuedAt may be null. Each subjects[].pending contains fields and documents arrays. Each item in failed has currencies and a reason: termsNotAccepted, verificationNotApproved, notAvailableForAccountType, alreadyRequested, or unavailable. Review the reason because that currency will not proceed automatically. Use the subject id returned by the endorsements endpoint:
Links expire after seven days. Each call issues a new link. Endorsement operations return 404 if the client does not exist or does not belong to the partner; the link operation also returns 404 when the subject is missing.

Withdrawal address in Sandbox

The address must be EVM formatted (0x followed by 40 hexadecimal characters). PUT replaces the active address and returns 200:
GET /v2/business-clients/{clientId}/withdrawal-address returns this object or null if there is no address yet. Both endpoints are available in Sandbox only. The returned network matches the network selected when creating the client. Check the address before registering it: format validation does not prove the client controls it. Both routes return 404 if the client does not exist or does not belong to the partner.

Collection notifications

Collections recorded through virtual accounts may create a transaction with transactionType: "deposit_virtual_account". Status changes are sent through the transaction webhook. In details, amount is a string and currency is the fiat currency. details.payer appears only when a payer detail is recorded; see Payer details.