Skip to main content

Virtual Account (VA)

SNAP API

Virtual Account (VA) Integration

Virtual Account (VA) is an automatic bank transfer payment method from Winpay that is fully integrated through the national SNAP BI standard. Automate your payment reconciliation in real-time via callbacks.

Virtual Account Types

Winpay's Virtual Account service supports the following three transaction types:

ONE OFF (c)

A single-use VA that is automatically deactivated after one successful payment. Ideal for one-time invoice payments.

OPEN RECURRING (o)

A multi-use VA for installment or open payments, where customers are free to specify the transfer amount themselves.

CLOSE RECURRING (r)

A recurring VA where the payment amount is locked by the merchant (close payment). Customers cannot input their own amount.

Supported Payment Methods

The supported payment methods for each type of virtual account are as follows:

Channel CodeInstitutionOne Off (c)Open Recurring (o)Close Recurring (r)
BRIBank Rakyat Indonesia
BNIBank Negara Indonesia
MANDIRIBank Mandiri
PERMATABank Permata
BSIBank Syariah Indonesia
MUAMALATBank Muamalat
BCABank Central ASIA
CIMBBank CIMB NIAGA
SINARMASBank Sinarmas
BNCBank Neo Commerce

Virtual Account Transaction

1. Create VA

POST/v1.0/transfer-va/create-vaService Code: 27

This service is used to create a new virtual account (VA).

Payload Request

ParametersData TypeMandatoryDescription
customerNoStringCVirtual Account No (if applicable)
Mandatory if virtualAccountTrxType = o / r
Length: 3-14
Allowed Chars: numeric
If virtualAccountTrxType = c and VA Number is not available, the VA number will be randomly generated
virtualAccountNameStringYVirtual Account Name
Length: 5-24
Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_), hyphens (-), and spaces (\s)
trxIdStringYTransaction Number
Length: 5-50
Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-)
totalAmountObjectCTotal transaction amount
Mandatory if virtualAccountTrxType = c / r
valueStringYTransaction value
Length: 1-14
Allowed Chars: numeric
currencyStringYCurrency code
Length: 3
Allowed Value: IDR
virtualAccountTrxTypeStringYType of transaction VA
Allowed Value: c / o / r
expiredDateStringCTransaction expiration date
Format: YYYY-MM-DDTHH:mm:ss+07:00
Mandatory if virtualAccountTrxType = c / r
Must be more than 1 minute and a maximum of 3 months from the time of request
additionalInfoObjectYAdditional information
channelStringYChannel code
Allowed Value: BRI / BNI / MANDIRI / PERMATA / BSI / MUAMALAT / BCA / CIMB / SINARMAS / BNC
{
"customerNo": "000003212",
"virtualAccountName": "Chus Pandi",
"trxId": "INV-000000023212x2221",
"totalAmount": {
"value": "25000.00",
"currency": "IDR"
},
"virtualAccountTrxType": "c",
"expiredDate": "2023-09-05T19:30:14+07:00",
"additionalInfo": {
"channel": "CIMB"
}
}

Response Payload

ParametersData TypeDescription
responseCodeStringResponse Code
responseMessageStringMessage response
virtualAccountDataObjectData that has been created
partnerServiceIdStringBank's BIN code
customerNoStringCustomer Number
virtualAccountNoStringVirtual Account Number
virtualAccountNameStringVirtual Account Name
trxIdStringMerchant transaction number
totalAmountObjectTotal transaction amount
valueStringThe transaction value paid by the customer
currencyStringCurrency code
virtualAccountTrxTypeStringType of VA transaction
expiredDateStringTransaction expiration date
additionalInfoObjectAdditional information
channelStringCode channel
contractIdStringTransaction reference generated by Winpay
{
"responseCode": "2002700",
"responseMessage": "Success",
"virtualAccountData": {
"partnerServiceId": " 22691",
"customerNo": "41693898987",
"virtualAccountNo": " 2269141693898987",
"virtualAccountName": "Chus Pandi",
"trxId": "INV-000000023212x2221",
"totalAmount": {
"value": "25000.00",
"currency": "IDR"
},
"virtualAccountTrxType": "c",
"expiredDate": "2023-09-05T19:30:14+07:00",
"additionalInfo": {
"channel": "CIMB",
"contractId": "cia80bff69-1073-4811-b1e1-13b738784d8b"
}
}
}

List Response Codes

Response CodeResponse MessageDescription
2002700Success
4002700Bad RequestGeneral request failed error, including message parsing failed.
4002701Invalid field format { field name }
4002702Invalid mandatory field {field name}
4012700Invalid signatureX-Signature wrong
4042716Partner not foundX-Partner-ID not registered
4092700Cannot use same X-EXTERNAL-ID in same dayX-External-ID has already been used on the same day
4092701Duplicate trxIdtrxId has been used before
5002700General ErrorGeneral Error
5002701Internal Server ErrorUnknown Internal Server Failure, Please retry the process again.

2. Inquiry VA

POST/v1.0/transfer-va/inquiry-vaService Code: 30

This service is used to check the status of active / inactive virtual accounts.

Payload Request

ParametersData TypeMandatoryDescription
trxIdStringYTransaction Number
Length: 5-50
Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-)
additionalInfoObjectYAdditional information
contractIdstringYcontractId from create VA
{
"trxId": "INV-000000023212x22",
"additionalInfo": {
"contractId": "ci302a21c9-bb4b-40c5-880d-e99691ed0af9"
}
}

Response Payload

ParametersData TypeDescription
responseCodeStringResponse code
responseMessageStringMessage response
virtualAccountDataObjectData VA that has been created
partnerServiceIdStringBank's BIN code
customerNoStringCustomer Number
virtualAccountNoStringVirtual Account Number
virtualAccountNameStringVirtual Account Name
trxIdStringTransaction merchant number
totalAmountObjectTotal transaction amount
valueStringThe transaction value paid by the customer
currencyStringCurrency code
virtualAccountTrxTypeStringType of VA transaction
expiredDateStringTransaction expiration date
additionalInfoObjectAdditional information
channelStringChannel code
contractIdStringTransaction reference generated by Winpay
{
"responseCode": "2003000",
"responseMessage": "Success",
"virtualAccountData": {
"virtualAccountNo": "2269186000003212",
"virtualAccountName": "Mas Nchus",
"trxId": "INV-000000023212x22",
"totalAmount": {
"value": "25000.00",
"currency": "IDR"
},
"expiredDate": "2023-09-01T19:30:14+00:00",
"additionalInfo": {
"channel": "CIMB",
"contractId": "ci302a21c9-bb4b-40c5-880d-e99691ed0af9"
}
}
}

List Response Codes

Response CodeResponse MessageDescription
2003000Success
4003000Bad RequestGeneral request failed error, including message parsing failed.
4003001Invalid field format { field name }
4003002Invalid mandatory field {field name}
4013000Invalid signatureX-Signature wrong
4043001Transaction not foundtrxId and contractId not found
4043016Partner not foundX-Partner-ID not registered
4093000Cannot use same X-EXTERNAL-ID in same dayX-External-ID has already been used on the same day
4093001Duplicate trxIdtrxId already used
5003000General ErrorGeneral Error
5003001Internal Server ErrorUnknown Internal Server Failure, Please retry the process again.
5003002reqbill not foundcontractId not found

3. Inquiry Status

POST/v1.0/transfer-va/statusService Code: 26

This service is used to check the transaction status of virtual accounts.

Payload Request

ParametersData TypeMandatoryDescription
virtualAccountNoStringYVirtual Account Number
trxIdStringYTransaction Number
Length: 5-50
Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-)
additionalInfoObjectYAdditional information
contractIdstringYcontractId from create VA
{
"virtualAccountNo": " 2269141708949044",
"additionalInfo": {
"contractId": "ciaf1b982a-9d06-4e27-ba39-a6aefd9e813d",
"channel": "CIMB",
"trxId": "xxxxxxxxxxx13"
}
}

Response Payload

ParametersData TypeDescription
responseCodeStringResponse code
responseMessageStringMessage response
virtualAccountDataObjectData VA that has been created
virtualAccountNoStringVirtual Account Number
virtualAccountNameStringVirtual Account Name
paymentFlagStatusStringTransaction Status VA (00 - paid, 01 - unpaid, 02 - check)
transactionDateStringTransaction date
referenceNoStringPayment reference number
totalAmountObjectTotal transaction amount
valueStringThe transaction value paid by the customer
currencyStringCurrency code
additionalInfoObjectAdditional information
channelStringCode channel
contractIdStringWinpay generated transaction reference
trxIdStringMerchant transaction number
{
"responseCode": "2002600",
"responseMessage": "Successful",
"virtualAccountData": {
"virtualAccountNo": "2269141708949044",
"virtualAccountName": "Valid 14",
"paymentFlagStatus": "00",
"transactionDate": "2024-02-26T19:04:51+00:00",
"referenceNo": "50966",
"totalAmount": {
"value": "15000.00",
"currency": "IDR"
}
},
"additionalInfo": {
"contractId": "ciaf1b982a-9d06-4e27-ba39-a6aefd9e813d",
"channel": "CIMB",
"trxId": "xxxxxxxxxxx13"
}
}

List Response Codes

Response CodeResponse MessageDescription
2002600Success
4002600Bad RequestGeneral request failed error, including message parsing failed.
4002601Invalid field format { field name }
4002602Invalid mandatory field {field name}
4012600Invalid signatureX-Signature wrong
4042601Transaction not foundtrxId and contractId not found
4042616Partner not foundX-Partner-ID not registered
4092600Cannot use same X-EXTERNAL-ID in same dayX-External-ID has already been used on the same day
4092601Duplicate trxIdtrxId has been used before
5002600General ErrorGeneral Error
5002601Internal Server ErrorUnknown Internal Server Failure, Please retry the process again.
5002602reqbill not foundcontractId not found

4. Delete VA

DELETE/v1.0/transfer-va/delete-vaService Code: 31

This service is used to cancel virtual accounts with unpaid status.

Payload Request

ParametersData TypeMandatoryDescription
virtualAccountNoStringYVirtual Account Number
trxIdStringYTransaction Number
Length: 5-50
Allowed Characters: letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-)
additionalInfoObjectYAdditional information
contractIdstringYcontractId from create VA
channelStringChannel Code
{
"virtualAccountNo": " 2269131710748503",
"trxId": "XINV-000000170104",
"additionalInfo": {
"contractId": "ci067a0336-4ddf-4001-9cef-3eb107c331f4",
"channel": "CIMB"
}
}

Response Payload

ParametersData TypeDescription
responseCodeStringResponse code
responseMessageStringMessage response
virtualAccountDataObjectData VA that has been created
trxIdStringMerchant transaction number
additionalInfoObjectAdditional information
contractIdStringWinpay generated transaction reference
channelStringCode channel
{
"responseCode": "2003100",
"responseMessage": "Success",
"virtualAccountData": {
"trxId": "xxxxxxxxxxx20"
},
"additionalInfo": {
"contractId": "si4390d6cb-5e9f-41fb-bfa3-51f6e7c9e4b4",
"channel": "BSI"
}
}

List Response Codes

Response CodeResponse MessageDescription
2003100Success
4003100Bad RequestGeneral request failed error, including message parsing failed.
4003101Invalid field format { field name }
4003102Invalid mandatory field {field name}
4013100Invalid signatureX-Signature wrong
4043101Transaction not foundtrxId and contractId not found
4043116Partner not foundX-Partner-ID not registered
4093100Cannot use same X-EXTERNAL-ID in same dayX-External-ID have been used on the same day
4093101Duplicate trxIdtrxId already used
5003100General ErrorGeneral Error
5003101Internal Server ErrorUnknown Internal Server Failure, Please retry the process again.
5003102reqbill not foundcontractId not found

Handle Payment Callback

After the customer makes a payment, Winpay will send a callback to the merchant to notify the payment status. The merchant must implement a service to receive callbacks from Winpay.

Retries Policy

We will send a callback to the merchant 3x until the merchant responds with the expected response. However, if the first callback attempt is successful, we will not send another callback.

Callback Info

POST{yoururl}/v1.0/transfer-va/paymentService Code: 25

Payment callback service requested by Winpay systems to the Merchant server.

Header Structure

HeaderValueDescription
Content-Typeapplication/json
X-Timestamp2023-08-24T17:07:05+07:00ISO8601 String
X-Partner-ID{partnerId}
X-Signature{signature}
X-External-ID{externalId}
Channel-ID{channelId}

Callback Payload

ParametersData TypeDescription
partnerServiceIdStringBank's BIN code
customerNoStringCustomer Number
virtualAccountNoStringVirtual Account Number
virtualAccountNameStringVirtual Account Name
trxIdStringMerchant transaction number
paymentRequestIdStringPayment transaction number
PaidAmountObjectTotal transaction amount
valueStringThe value of the transaction paid by the customer
currencyStringCurrency code
trxDateTimeStringTransaction date
referenceNoStringPayment reference number
additionalInfoObjectAdditional information
channelStringChannel code
contractIdStringWinpay generated transaction reference
feeAmountStringWinpay admin fee
nettAmountStringTotal value received by merchants
{
"partnerServiceId": " 22691",
"customerNo": "41693903614",
"virtualAccountNo": " 2269141693903614",
"virtualAccountName": "Bayar 2269141693903614",
"trxId": "INV-000000023212x2224",
"paymentRequestId": "88889123",
"paidAmount": {
"value": "10000",
"currency": "IDR"
},
"trxDateTime": "2023-09-05T22:47:00+07:00",
"referenceNo": 36238,
"additionalInfo": {
"channel": "CIMB",
"contractId": "ci71a51730-2373-455f-b538-3f9912fefb73"
}
}

Expected Response

{
"responseCode": "2002500",
"responseMessage": "Successful"
}