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
| Type | Expiry | Use case |
|---|---|---|
| Temporary | Yes — based on expired_at | One-time invoices, orders with deadlines |
| Permanent | No | Recurring customers, standing payment instructions |
Amount types
| Type | Description |
|---|---|
closed | Fixed amount — only accepts the exact configured amount |
open | Any amount — customer can transfer any value |
Supported banks — comparison
| Bank Code | Min (IDR) | Max (IDR) | Settlement | Sharia |
|---|---|---|---|---|
| BCA | 10,000 | 20,000,000* | T+1 | — |
| BNI | 10,000 | 250,000,000* | T+1 | — |
| BRI | 10,000 | 250,000,000* | T+1 | — |
| MANDIRI | 10,000 | 100,000,000* | T+1 | — |
| PERMATA | 10,000 | 50,000,000* | T+1 | — |
| MAYBANK | 10,000 | 250,000,000* | T+1 | — |
| CIMB | 10,000 | 50,000,000* | T+1 | — |
| BSI | 10,000 | 50,000,000* | T+1 | ✓ Islamic |
| MUAMALAT | 10,000 | 50,000,000* | T+1 | ✓ Islamic |
| BNC | 10,000 | 50,000,000* | T+1 | — |
| OCBC | 10,000 | 50,000,000* | T+1 | — |
| DANAMON | 10,000 | 50,000,000* | T+1 | — |
Important notes
One VA, multiple transactions
One VA, multiple transactions
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 VA expiry and usage limit
Temporary VA expiry and usage limit
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 VA for recurring payments
Permanent VA for recurring payments
Permanent VAs never expire and are ideal for recurring payments from the same customer — subscriptions, monthly invoices, or standing transfer instructions.
Amount validation
Amount validation
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.Cannot delete a VA with transactions
Cannot delete a VA with transactions
Once a VA has received at least one payment, it cannot be deleted. This preserves the integrity of all linked VA Transaction records.
Tracking payments
Tracking payments
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.
