1. Virtual Account
BPN OpenAPI
  • Get started
    • Introduction to BPN
    • Introduction to API
    • Architecture Overview
    • Authentication
    • Environments
    • Response envelope
    • Idempotency
  • Guides
    • Virtual Account
      • Virtual Account Overview
      • VA · Payin
      • VA · Statuses
      • VA · Payout
      • VA · RFI
      • VA · Currencies & limits
      • VA Opening
        • VND VA Opening
        • BRL VA Opening
    • Wallet
      • Wallet · Transfer
      • Wallet · Assets & limits
      • Wallet · Deposit whitelist
      • Wallet · PaymentLink
      • Wallet Overview
      • Wallet · Deposit
      • Wallet · Statuses
      • Wallet · Withdraw
    • Convert
      • Convert Overview
      • Convert · Quote & submit
      • Convert · Business types
      • Convert · Pairs & limits
      • Convert · Statuses
  • API Reference
    • Virtual Account
      • Virtual Account field notes
      • Inquiry Master VA Balance
      • List Primary Virtual Accounts
      • Create Virtual Account
      • Get Virtual Account Detail
      • List Virtual Account
      • List Virtual Account Orders
      • Get Virtual Account Order Detail
      • Refund Virtual Account Order
      • List RFI Sub Virtual Account
      • Get Sub Virtual Account RFI Template Info
      • Sub Virtual Account Submit RFI
      • Add Bank Account
      • List Bank Account
      • List Banks
      • Payout via Virtual Account
      • Send Email Verify Code
    • Wallet
      • Wallet field notes
      • Deposit Whitelist
        • Get Deposit Whitelist Options
        • Register Deposit Source Address
        • List Deposit Source Addresses
        • Get Deposit Source Address
        • Disable Deposit Source Address
        • Submit Payer Details for a Received Deposit
        • Save Sub-wallet Payer Profile
        • Update Sub-wallet Payer Profile
        • Get Sub-wallet Payer Profile
        • Get Deposit Whitelist Case
      • Get Asset Balance
      • Get Deposit Address
      • Add Deposit Sender
      • Add Withdraw Whitelist
      • Delete Withdraw Whiltelist
      • Request Withdraw
      • Query Wallet Internal Transfer Detail
      • List Wallet Internal Transfer order
      • Wallet Internal Transfer
      • Create Sub Account
      • Query Transaction History
      • List Wallets
      • List Sub Account
      • Get Transaction Detail
      • List Wallet Transactions
      • Get Wallet Transaction Detail
    • Payment Link
      • Abnormal fund
        • Abnormal funds
        • Matchable Payment links
        • Link Order(Abnormal fund)
        • Submit to platform
      • Create Payment Link
      • List Payment links
      • Get Curreny Network Config
    • Convert
      • Convert field notes
      • Inquery FX Rate
      • Get Stablecoin Quote
      • Create Stable Order
      • Get Order (Single) Detail
      • List Orders(Batch)
    • KYB
      • Share KYB/KYC Info For Sub User
      • Get KYB Sub User Status
    • Reconciliation
      • Get Reconciliation Order List By Page
    • External Provider
      • FE: Create stablecoin collection sub-account link
      • FE: Deposit Travel Rule
      • External Provider · Deposit whitelist
      • Create stablecoin collection sub-account link
      • Get sub wallet account
      • List sub wallet accounts
      • Change sub wallet status
      • Query stablecoin collection order list
      • Query stablecoin collection order status
      • Get quote
      • Accept stablecoin collection order
      • Reject stablecoin collection order
      • Query USD balance
      • USD Payout (withdrawal)
      • Query USD Payout order status
      • Query USD Payout order list
      • Create deposit Travel Rule link
      • Create deposit Travel Rule detail link
    • Mock
      • Mock Virtual account Payin Order
      • Mock wallet deposit transaction
      • Mock Payin Order Refund
      • Mock Payout Order Update Status
    • Pay Session
      • Request Pay Session
    • Files
      • Request File Upload URL
  • Webhooks
    • Webhooks Overview
    • KYB notifications
    • Event catalogue
    • Resend Fail Webhook
    • Open Virtual Account Status
    • Virtual Account Payment Status
    • Virtual Account Invoice update
    • Transaction Status Notification
    • KYB Status Notification
    • Deposit Sender Detail Required
    • Abnormal Fund Notification
    • WALLET_TRANSFER_ORDER_UPDATED
    • Sub Virtual Account RFI Required
    • Sub Wallet Update
    • wallet address whitelist Update
    • Crypto Deposit Order Notification
    • Collect Order Updated
    • Usd Payout Order Updated
    • onboard result
    • partner order status
    • PaymentLink Notification
    • Deposit Whitelist Notification
  • Partner Flow
    • Share KYB/KYC and open account directly
    • Get KYB/KYC submit + open account status
    • Get Stablecoin Quote
    • Create Stable Order
    • Get Order (Single) Detail
    • List Orders(Batch)
    • Submit hash
  • Appendix
    • Enums quick reference
    • Enum
    • Virtual Account(VA) Support List & KYB requirement
  • Release Notes & Changelog
  • Errors
    • Error codes catalogue
  • Change Log
    • 2026-09-21 Virtual Account independent refund orders
    • Wallet deposit source-address whitelist
  1. Virtual Account

VA · Statuses

Parent: Overview
Updated: 2026-08-27

Account VirtualAccountStatus#

Split into two main flows by account type (dynamic / static). APIs may still return review-related statuses (UNDER_REVIEW / RESUBMIT / REVIEW_SUCCESS / CLOSED, etc.) — treat the live response and webhooks as source of truth.
Related APIs: Get VA Detail · Open Virtual Account Status

Dynamic account#

One-time collection: after success the account moves to USED. It may also end as EXPIRED or REJECTED.
PathNotes
INIT → PROCESSING → SUCCESS → USEDCreated successfully and consumed once
INIT → PROCESSING → FAILCreation / provisioning failed
SUCCESS → EXPIREDCurrent VA expired before a successful collection
SUCCESS → REJECTEDVA payment was rejected; funds were returned to the original payer

Static account#

Reusable collection account: stays at SUCCESS after provisioning; does not move to USED.
PathNotes
INIT → PROCESSING → SUCCESSProvisioned successfully; can keep collecting
INIT → PROCESSING → FAILProvisioning failed

Enum quick reference#

StatusTerminal?Merchant action
INITNoWait
PROCESSINGNoWait
SUCCESSBusiness-dependentUsable for collection (static)
USEDBusiness-dependentDynamic account already used
EXPIREDYesDynamic VA expired; create a new VA if collection is still needed
REJECTEDYesPayment rejected; funds already returned to source — do not credit
FAILYesHandle failure
UNDER_REVIEW / RESUBMIT / REVIEW_SUCCESS / CLOSEDBusiness-dependentReview / close branch — follow webhooks

VirtualAccountRFIStatus#

Commonly returned as rfiStatus on Sub VA / RFI query results (public name VirtualAccountRFIStatus).
StatusMeaningMerchant action
NONENo remediation requiredNone
AWAITING_SUBMISSIONWaiting for submissionFetch template and submit-rfi
SUBMITTEDSubmitted, under reviewWait
RESUBMIT_REQUIREDResubmission requiredSubmit again as instructed
APPROVEDApprovedContinue business
REJECTEDRejectedHandle per business rules
Trigger and steps: rfi.md.

Order status (this release)#

Pay-in and Payout each keep an independent refund child order. Original orders stay on their own orderStatus; refund progress is on refundStatus and on the RE* child.
Related APIs: Get VA Order Detail · List VA Orders · Refund VA Order · Virtual Account Payment Status

Identifiers and businessType#

OrderorderId prefixbusinessTypeoriginalOrderIdrefundOrderId
Original pay-in / payoutVA*PAY_IN / CASH_OUTnullRE* child when a refund exists, else null
Refund childRE*PAYIN_REFUND / PAYOUT_REFUNDoriginal VA*null
JSON field names are camelCase: businessType, orderStatus, refundStatus, originalOrderId, refundOrderId. businessType, orderStatus, and refundStatus use uppercase enum names.

Original VA order (PAY_IN / CASH_OUT)#

The original order orderStatus stays SUCCESS after a successful credit/debit. It is not rewritten to REFUNDING / REFUNDED / REFUND_FAIL.
While a refund child is in flight, query the original as orderStatus=SUCCESS and refundStatus copied from the RE* child (for example REFUNDING). With no refund, refundStatus is null.
PathNotes
INIT → PROCESSING → SUCCESSOriginal pay-in / payout succeeded
INIT → PROCESSING → FAILOriginal failed
… → MANUAL_PROCESSING → SUCCESS/FAILManual handling
After SUCCESSRefunds do not change this orderStatus

Refund child (PAYIN_REFUND / PAYOUT_REFUND)#

StageorderStatusrefundStatus
Created / channel not terminalPROCESSINGREFUNDING
Funds confirmed and ledger postedREFUNDEDREFUNDED
Channel explicitly failedFAILREFUND_FAILED
Timeout or missing webhook must not be treated as success. Poll Get VA Order Detail for the RE* orderId.

Enum quick reference#

FieldValues (this release)
Original orderStatusINIT | PROCESSING | MANUAL_PROCESSING | SUCCESS | FAIL
Refund child orderStatusPROCESSING | REFUNDED | FAIL
refundStatusREFUNDING | REFUNDED | REFUND_FAILED | null
FAIL_OR_BLOCKED remains a query-only aggregate filter, not a transition state.

Booking rule#

Book the original pay-in / payout only on its own terminal orderStatus (SUCCESS / FAIL). Book a refund only from the RE* child reaching REFUNDED or FAIL. Do not infer refund success from timeout, missing callbacks, or the original order remaining SUCCESS.
Previous
VA · Payin
Next
VA · Payout
Built with