Skip to main content
Virtual Account (VA) is a bank transfer payment method where each customer or transaction gets a unique account number to pay into. One Virtual Account can receive multiple payments over time, with each payment recorded as a separate VA Transaction.

Unique per transaction

Each VA has its own number — no payment collisions between customers or orders.

Temporary or permanent

Create one-time VAs that expire, or permanent VAs for recurring customers.

Multi-bank support

BRI, BNI, BCA, Maybank, Danamon, and more — customers pay via ATM or mobile banking.

Payment flow


Virtual Account vs VA Transaction

Virtual Account (Parent)

The payment instrument. Defines how and where to pay.
  • Unique VA number per account/transaction
  • Configured with fixed or open amount
  • Can be temporary (with expiry) or permanent
  • Controls max usage and validity period

VA Transaction (Child)

The payment record. Created every time a customer pays.
  • Individual payment records per transfer
  • Linked to one Virtual Account
  • Tracks status and settlement
  • One VA → multiple transactions
Example: VA 8890-1234-5678 receives 3 bank transfers on different days → 3 separate VA Transaction records are created, each with its own status, amount, and settlement data.

VA types

TypeExpiryUse case
TemporaryYes — based on expired_atOne-time invoices, orders with deadlines
PermanentNoRecurring customers, standing payment instructions
Use temporary VAs for order-based payments where you want the VA to stop accepting payment after a deadline. Use permanent VAs for customers who pay regularly on the same account number.

Amount types

TypeDescription
closedFixed amount — only accepts the exact configured amount
openAny amount — customer can transfer any value

Supported banks — comparison

Bank CodeMin (IDR)Max (IDR)SettlementSharia
BCA10,00020,000,000*T+1
BNI10,000250,000,000*T+1
BRI10,000250,000,000*T+1
MANDIRI10,000100,000,000*T+1
PERMATA10,00050,000,000*T+1
MAYBANK10,000250,000,000*T+1
CIMB10,00050,000,000*T+1
BSI10,00050,000,000*T+1✓ Islamic
MUAMALAT10,00050,000,000*T+1✓ Islamic
BNC10,00050,000,000*T+1
OCBC10,00050,000,000*T+1
DANAMON10,00050,000,000*T+1
* Maximum limits are configurable per merchant tier. Contact your account manager or customer service to discuss higher limits.

Important notes

A single Virtual Account can receive multiple payments over its lifetime. Each transfer is independently recorded as a VA Transaction — with its own timestamp, amount, and settlement status.
Temporary VAs expire based on your expired_at setting. You can also set max_usage to limit how many times a VA can be paid — useful for one-time invoices or limited-slot registrations.
Permanent VAs never expire and are ideal for recurring payments from the same customer — subscriptions, monthly invoices, or standing transfer instructions.
For closed VAs, Singapay validates that the transfer amount exactly matches the configured amount. Mismatched amounts are rejected by the bank network before reaching Singapay.
Once a VA has received at least one payment, it cannot be deleted. This preserves the integrity of all linked VA Transaction records.
Use the VA Transaction API to list all payments received by a VA, filter by status or date range, and retrieve settlement details per transaction.

Available endpoints

List Virtual Accounts

Paginated list of VAs for an account.

Show Virtual Account

Retrieve a single VA by ULID.

Create Virtual Account

Generate a new VA with bank, amount type, and expiry configuration.

Update Virtual Account

Update mutable fields on an existing VA.

Delete Virtual Account

Delete a VA that has no transactions.
All endpoints require authentication. See Authentication.