Lifecycle overview
Prerequisites
Before creating Virtual Accounts through the API:- Complete the required onboarding and enable the Global Account product for the target account.
- Confirm that the requested currency and receiving method are available for that account. See Supported Regions and Currencies.
- Decide whether the Virtual Account belongs to the master account or a sub-account. For a sub-account, pass its
account_idin thex-on-behalf-ofheader. - Configure and test the Virtual Account Create / Update webhook before sending production create requests.
- Generate a unique
x-idempotency-keyfor each create request. If you also sendx-request-id, store it because it is returned asrequest_idin the Virtual Account webhook payload.
Step 1: Submit the create request
Call Create Virtual Account for the account that should receive the Virtual Account.
The API response contains
message = SUCCESS. This means the request was accepted for processing. It does not mean account details have been issued, and you should not show payment instructions to payers yet.
Step 2: Track provisioning status by webhook
Virtual Account creation is completed asynchronously through the Virtual Account Create / Update webhook.
The webhook payload includes identifiers you should store:
Step 3: Query active Virtual Accounts
Use List Virtual Accounts after the Active webhook, during service startup, and whenever you need to refresh your stored account details. You can filter bycurrency. When querying for a sub-account, pass the same x-on-behalf-of value you used when creating or operating on behalf of that sub-account.
Store the returned details in your system:
Webhook status values and List API status values use different casing. For example, the webhook can send
Active, while the List API can return ACTIVE. Normalize status values in your own system before applying business logic.Step 4: Use the receiving capability
Each returned Virtual Account bank detail record has a receiving capability. Use the payer instructions that match the expected payment rail.
If you request a currency that supports both local and SWIFT receiving methods, treat each returned bank detail record independently. A payer should receive instructions for the capability you intend them to use.
Step 5: Reconcile deposits against Virtual Accounts
A Virtual Account identifies where funds should be sent. A Deposit is the transaction record created when funds arrive and are processed. For reconciliation:- Store the Virtual Account mapping when the account becomes active.
- Listen for Deposit Status webhook events.
- Use the webhook
account_idasx-on-behalf-ofwhen retrieving the deposit for a sub-account. - Call Retrieve Deposit with the
deposit_id. - Match the deposit response back to your Virtual Account mapping using
receiver_account_number,currency, and the owningaccount_id. Use sender details anddeposit_referenceas additional reconciliation signals when available.

