Skip to main content

Overview

Virtual Accounts (VAs) allow customers to complete payments by making a bank transfer into a unique account number issued for their transaction.
This method is widely used across Asia because it is familiar, trusted, and supports large-value payments.
Monxa simplifies VA payments by:
  • Issuing dynamic or static VA numbers through integrated banks and providers.
  • Returning ready-to-display VA details (bank code, account number, expiry, instructions).
  • Listening for provider notifications when funds are credited.
  • Sending webhook events so your system always knows the real-time status.

Supported Channels

ChannelCodeCurrencyRefundSettlementMin AmountMax Amount
BCAva_bcaIDRN/AT+1150,000,000
BJBva_bjbIDRN/AT+11500,000,000
BNCva_bncIDRN/AT+11500,000,000
BNIva_bniIDRN/AT+1150,000,000
BRIva_briIDRN/AT+11500,000,000
BSIva_bsiIDRN/AT+11500,000,000
BSSva_bssIDRN/AT+11500,000,000
CIMBva_cimbIDRN/AT+11500,000,000
MANDIRIva_mandiriIDRN/AT+11500,000,000
MUALAMATva_mualamatIDRN/AT+11500,000,000
PERMATAva_permataIDRN/AT+11500,000,000

Payment Flow

Step 1: Create a Charge

Endpoint: POST v1/charges
curl -X POST https://api.monxa.co/v1/charges \
  -H "Authorization: Bearer sk_test_***" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 250000,
    "currency": "IDR",
    "payment_method": "virtual_account",
    "va": {
      "bank_code": "BCA",
      "account_type": "dynamic",
      "amount_type": "exact",
      "expires_at": "2025-10-15T23:59:59Z"
    },
    "metadata": { "invoice_id": "INV-10092" }
  }'
{
  "id": "ch_001",
  "object": "charge",
  "status": "PENDING",
  "amount": 250000,
  "currency": "IDR",
  "payment_method": "virtual_account",
  "va": {
    "bank_code": "BCA",
    "account_number": "1234567890123",
    "account_name": "MONXA COLLECTION",
    "expires_at": "2025-10-15T23:59:59Z",
    "instructions": [
      "Open BCA mobile app or ATM.",
      "Choose Virtual Account transfer.",
      "Enter account number: 1234567890123",
      "Confirm amount: 250,000 IDR"
    ]
  }
}

Step 2: Display VA Information

Once the charge is created, show the returned bank name, account number, expiry date, and instructions to the customer. This allows the customer to transfer funds using their preferred channel:
  • ATM
  • Mobile banking app
  • Internet banking
Make sure to clearly show the exact amount if you are using a closed/exact VA.

Step 3: Customer Transfers Funds

The customer proceeds to their banking channel and makes a transfer to the VA account number provided.
  • For dynamic/exact VAs, the amount must match exactly.
  • For static/open VAs, any incoming payment is accepted and must be reconciled against the customer/order.
The bank / VA provider will notify Monxa once funds are received.

Step 4: Handle Webhooks & Update Payment Status

When the VA provider confirms the credit, Monxa updates the charge status and sends a webhook notification to your server.
  • Typical webhook events:
    • charge.succeeded → funds received successfully
    • charge.expired → VA expired without payment
Your system should always rely on Monxa webhooks for final confirmation, then update the order / payment status shown to the customer.
ParameterDescriptionExample Value
payment_idUnique identifier of the payment.pay_1234567890
payment_request_idUnique identifier of the payment request.req_0987654321
phoneBuyer’s phone number.+6591234567
amountAmount related to the payment.100.00
currencyCurrency of the payment.SGD
statusPayment status (completed / failed).completed
reference_numberCustom reference number mapped during payment request creation.ORDER12345
hmacMessage Authentication Code (MAC) of this webhook request (used for validation).a1b2c3d4e5f67890abcdef123456

Refunds / Reversal

Unlike cards or wallets, Virtual Account payments are bank transfers. Because they are push-based payments initiated by the customer, refunds or reversals cannot be processed automatically through Monxa.
  • Once a customer transfers funds into the VA, the transaction is final and irreversible via the API.
  • If a refund is required (e.g., order cancellation, overpayment), the merchant must arrange a manual bank transfer back to the customer’s account outside of Monxa’s system.
  • Monxa will still provide full reporting, settlement, and reconciliation data to help you identify the payment, but no automated payout or refund request is available.
Important: Always inform customers clearly that payments made via Virtual Accounts are non-reversible. If you wish to offer refunds, set up an offline/manual refund policy (e.g., customer provides bank details and you process a transfer).