Changes at a glance
The Create path remains
POST /v1/virtual/accounts.
1. Update the Create request
Keep sending the requiredx-idempotency-key. Change your request builder to:
- Add the required two-letter
country. - Send one three-letter
currencyvalue. - Send
payment_methodasLOCALorSWIFT, or omit it to evaluate both methods. Do not sendALLorAUTO. - Treat
nicknameas optional. - Remove logic that uses
x-request-idfor this endpoint.
x-on-behalf-of. See Create Virtual Account for the request schema and supported combinations for valid values.
When retrying after a network failure, send the same request for the same account with the same x-idempotency-key. Use a new key when any application input changes.
2. Replace the Create success response
Parse HTTP200 as an accepted application. It does not mean bank details are ready.
Remove parsing of message and request_id. Instead:
- Store
data.account_idanddata.direct_idwith the application. - Store
data.application_id. - Store
data.public_version. - Process every entry in
data.results[]and identify it bypayment_method. - Use bank details only when the result is
COMPLETEDand the individual record isACTIVE.
payment_method is omitted, one result can be SKIPPED while another is SUBMITTED. Do not treat the top-level application status as the status of every method.
3. Add application queries
Add these endpoints to your integration:- List Virtual Account Applications discovers and reconciles applications.
page_numberandpage_sizeare required. - Retrieve Virtual Account Application returns the latest full details for one
application_id.
4. Update the webhook consumer
Handle all three application event types:
Keep your existing signature verification and acknowledgement flow. Change correlation and ordering logic to:
- Deduplicate deliveries by
event_id. - Associate the event with the account in
data.account_id; usedata.direct_idto identify its main account when applicable. - Locate the application by
data.application_id. - Apply only a higher
data.public_version. - Process every result after applying the event.
- Call Retrieve when a version is missing or delivery appears out of order.
5. Separate request errors from later failures
A synchronous Create400 means no application was created and no application webhook will follow. Correct the request or account setup before trying again.
After HTTP 200, a receiving method can later become FAILED. In that case, process the virtual.account.update event and use results[].error.code to decide the next action. See Integrate Virtual Accounts with the API for error codes and actions.
Sandbox checklist
Before Production rollout, verify that your integration can:- Send one supported
countryandcurrency, with an optionalpayment_method. - Retry an identical request with the same
x-idempotency-keyand retain oneapplication_id. - Reject reuse of the key for different application input.
- Parse HTTP
200and process every entry inresults[]. - Handle
SKIPPEDandSUBMITTEDresults in the same application. - Store and compare
application_id + public_version. - List applications and retrieve the latest details.
- Accept
virtual.account.createbefore or after the Create response. - Associate application events with the correct account using
account_idanddirect_id. - Apply
COMPLETED,FAILED, andCLOSEDdata without relying on delivery order. - Use only
ACTIVEbank details and stop usingCLOSEDrecords, even whenclose_reasonis empty. - Stop waiting for a webhook after a synchronous Create error.

