Skip to main content
A virtual account is a unique bank account number reserved exclusively for one customer. When a customer makes a transfer to their virtual account, Paylink captures the payment and notifies your server automatically. Virtual accounts are ideal for wallets, escrow flows, or any integration where customers pay on their own schedule via bank transfer.

Create a Virtual Account

Send a POST request to /virtual-accounts to reserve a dedicated account number for a customer.
Request
A successful response returns the reserved bank account details:
Response
Store both account_reference and reservation_reference in your database. You will use account_reference for lookups and reservation_reference to uniquely identify this reservation internally.

Look Up a Virtual Account

By Account Reference

To fetch the details of an existing virtual account, call GET /virtual-accounts/{account_reference}:
Request
This returns the same bank details and customer information as the creation response.

By Customer Email

If you only have a customer’s email address, use a POST request to /virtual-accounts/email:
Request
Response
If multiple virtual accounts share the same email address (for example, accounts created across different environments), the API returns the most recently created one.

Monitor Incoming Transactions

Retrieve a paginated list of all payments received into your virtual accounts at GET /merchants/virtual-accounts/transactions.
Example request
A typical entry in the transactions list looks like:
Single transaction (example)

Handle Webhook Events

When a customer completes a transfer to a virtual account, Paylink fires a va_charge_success webhook event to the URL you configured on your merchant dashboard.
Webhook payload (example)
Use the account_reference and any values you stored in metadata to identify which customer sent the payment and credit their account in your system. A va_charge_failure event is fired when an incoming transfer to a virtual account cannot be processed. Listen for this event to alert your team or notify the customer to retry.
Always include a metadata object containing your internal customer or account ID when creating a virtual account. This makes it straightforward to reconcile incoming va_charge_success events without an extra database lookup.
Confirm the payment amount in the webhook payload before crediting the customer. Customers can send any amount to a virtual account, so do not assume the transferred amount matches a specific invoice.