Payment Method : Bank Transfer

This section will explain how merchants can initiate bank transfer (virtual account) transactions using BI-SNAP-based CoreAPI specification.

Creating bank transfer (virtual account) transaction

Path/{version}/transfer-va/create-va
HTTP MethodPOST
Versionv1.0
SNAP version code27

Request Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e. application/json
X-TIMESTAMPStringMClient’s current local time in ISO-8601 format
AuthorizationStringMRepresents access_token of a request; string starts with keyword “Bearer ” followed by access_token. Can get this from Access Token B2B API response.
X-SIGNATUREStringMCreated using symmetric signature HMAC_SHA512 algorithm
X-PARTNER-IDStringMUnique identifier for caller (merchant_id)
CHANNEL-IDStringMMandatory field from Bank Indonesia that can take any value with correct format 5 digits numeric string
X-EXTERNAL-IDStringMAlphanumeric string. We suggest merchant to use UUID format. The value should be unique. In case of timeout, merchant can do:

1. Use this value in get status API to get status transaction
2. Retry this request with the same X-EXTERNAL-ID and request body to avoid creating duplicate transaction

The value should also be the same as request_body.trxId
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00
X-SIGNATURE:da1fa417c72d6b91c257e01e54fac824
Authorization:Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CupvIJbU1Mmu4a11MNDZ7Sg5u9a
X-PARTNER-ID:G12345678
X-EXTERNAL-ID:midtrans-testing-001
CHANNEL-ID:12345

Request Body

Field Name Field Type Mandatory Field Description
partnerServiceId String(8) M This field will be shared by Midtrans during the onboarding process. This will be associated with the bank's company code.

The value should be left-padded with spaces until it’s 8 characters long.

customerNo String(20) M Merchant-defined number. The value will be used to generate the VA number.
virtualAccountNo String(28) M This field will be the combination of partnerServiceId + customerNo

Please refer to the "Custom VA Number" below this section if you're looking to define your own VA number for your customers.

If you want to randomize your VA number, please refer to the additionalInfo.flags.shouldRandomizeVaNumber field

virtualAccountName String(255) M The customer name
virtualAccountEmail String(255) O The customer’s email
virtualAccountPhone String(30) O The customer’s phone number
trxId String(36) M Alphanumeric string. Preferably UUID. Reference number that should be unique across 3 months. This value should be filled with the same value as X-EXTERNAL-ID
totalAmount Object M For Multi-use VA with flexible amount, merchant should fill the totalAmount field with a totalAmount.value of at least 1.00
totalAmount.value String (16, 2) M The numeric string of the amount up to two decimal places
totalAmount.currency String (3) M The currency of the value paid. Should be IDR
expiredDate String (25) O Indicate the deadline the virtual account should be paid at the latest. Beyond the specified time it will be marked as expired.


The default expiry time is 24 hours.

For Multi-use VA, this value will be ignored and the expiry time will always be 6 months after creation for the first payment and indefinite for the next payments

additionalInfo Object M
additionalInfo.bank String M Indicates the bank chosen to create the VA at. The banks that can be used will differ based on the banks chosen by the merchant during the onboarding process. Possible values are

  • Permata
  • BCA
  • Mandiri
  • CIMB
  • BNI
    FieldTypeAttributeDescription
    AuthorizationStringMandatoryBasic Base64Encode(partnerServerKey:)
    X-PARTNER-IDStringMandatoryUnique identifier for partner. Provided by Midtrans.
    X-MERCHANT-IDStringMandatoryUnique identifier for each merchant under the partner. Provided by Midtrans.
    AcceptStringMandatoryapplication/json
    Content-TypeStringMandatoryapplication/json
    FieldTypeAttributeDescription
    AuthorizationStringMandatoryBasic Base64Encode(partnerServerKey:)
    X-PARTNER-IDStringMandatoryUnique identifier for partner. Provided by Midtrans.
    X-MERCHANT-IDStringMandatoryUnique identifier for each merchant under the partner. Provided by Midtrans.
    AcceptStringMandatoryapplication/json
    Content-TypeStringMandatoryapplication/json
    FieldTypeAttributeDescription
    AuthorizationStringMandatoryBasic Base64Encode(partnerServerKey:)
    X-PARTNER-IDStringMandatoryUnique identifier for partner. Provided by Midtrans.
    X-MERCHANT-IDStringMandatoryUnique identifier for each merchant under the partner. Provided by Midtrans.
    AcceptStringMandatoryapplication/json
    Content-TypeStringMandatoryapplication/json
  • BRI
additionalInfo.merchantId String(10) M This will be the merchantId shared during the onboarding process
additionalInfo.subCompanyCode String O This field can be used if the VA being created is BCA. It can filled with BCA’s sub company code value

Note: Default is 00000.

additionalInfo.freeText Array of Objects O Will be used by the bank to show to the consumer in the bank app

Note: Right now only used for BCA VA.

additionalInfo.freeText.inquiry Object O Will be used by the bank to show to the consumer at the inquiry process
additionalInfo.freeText.inquiry.english String O English description of the inquiry text
additionalInfo.freeText.inquiry.indonesia String O Bahasa Indonesia version of the inquiry text
additionalInfo.freeText.payment Object O Will be used by the bank to show to the consumer after the payment process
additionalInfo.freeText.payment.english String O English description of the payment text
additionalInfo.freeText.payment.indonesia String O Bahasa Indonesia version of the payment text
additionalInfo.mandiri Array of Objects C Array of Mandiri bill description.
(this will become mandatory , if Mandiri is chosen as the VA method - additionalInfo.bank = "mandiri")
additionalInfo.mandiri.billInfo1 String (10) C Label 1. Mandiri allows only 10 characters. Exceeding characters will be truncated.
(this will become mandatory , if Mandiri is chosen as the VA method - additionalInfo.bank = "mandiri")
additionalInfo.mandiri.billInfo2 String (30) C Value for Label 1. Mandiri allows only 30 characters. Exceeding characters will be truncated.
(this will become mandatory , if Mandiri is chosen as the VA method - additionalInfo.bank = "mandiri")
additionalInfo.mandiri.billInfo3 String (10) O Label 2. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo4 String (30) O Value for Label 2. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo5 String (10) O Label 3. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo6 String (30) O Value for Label 3. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo7 String (10) O Label 4. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo8 String (30) O Value for Label 4. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.customField Object O A collection of up to three fields that can be customized by the merchant. These fields will be sent by Midtrans on the HTTP notification. It will also be displayed on the Dashboard under “order detail”
additionalInfo.customField1 String(255) O First field that contains the custom data set by the merchant
additionalInfo.customField2 String(255) O Second field that contains the custom data set by the merchant
additionalInfo.customField3 String(255) O Third field that contains the custom data set by the merchant
additionalInfo.customerDetails Object O Customer Detail Information
additionalInfo.customerDetails.phone String(15) O Customer Phone number
additionalInfo.customerDetails.email String(255) O Customer email
additionalInfo.customerDetails.firstName String(255) O Customer First Name

Will be shown to user during inquiry

additionalInfo.customerDetails.lastName String(255) O Customer Last Name

Will be shown to user during inquiry

additionalInfo.customerDetails.billingAddress Object O Customer billing address
additionalInfo.customerDetails.billingAddress.firstName String(255) O Billing address first name
additionalInfo.customerDetails.billingAddress.lastName String(255) O Billing address last name
additionalInfo.customerDetails.billingAddress.phone String(15) O Billing address phone
additionalInfo.customerDetails.billingAddress.address String(255) O Billing address detail
additionalInfo.customerDetails.billingAddress.city String(255) O Billing address city
additionalInfo.customerDetails.billingAddress.postalCode String(255) O Billing address postal code
additionalInfo.customerDetails.billingAddress.countryCode String(15) O Billing address country code
additionalInfo.customerDetails.shippingAddress Object O Customer shipping address
additionalInfo.customerDetails.shippingAddress.firstName String(255) O Shipping address first name
additionalInfo.customerDetails.shippingAddress.lastName String(255) O Shipping address last name
additionalInfo.customerDetails.shippingAddress.phone String(15) O Shipping address phone
additionalInfo.customerDetails.shippingAddress.address String(255) O Shipping address detail
additionalInfo.customerDetails.shippingAddress.city String(255) O Shipping address city
additionalInfo.customerDetails.shippingAddress.postalCode String(255) O Shipping address postal code
additionalInfo.customerDetails.shippingAddress.countryCode String(15) O Shipping address country code

Note: Currently only IDN is supported.

additionalInfo.items Array Of Object C Item Details

Mandatory for Mandiri B2B VA only

additionalInfo.items[x].id String(32) O Item ID
additionalInfo.items[x].price Object M Price of the item in IDR.
additionalInfo.items[x].price.value String (16,2) M The numeric string of the amount up to two decimal places
additionalInfo.items[x].price.currency String(3) M Item Price currency. Should be IDR.
additionalInfo.items[x].quantity Number M Quantity of the item purchased by the customer.
additionalInfo.items[x].name String(64) O Name of the item.
additionalInfo.items[x].merchantName String(64) O Name of the merchant selling the item.
additionalInfo.items[x].brand String(64) O Brand name of the item.
additionalInfo.items[x].category String(64) O Category of the item.
additionalInfo.items[x].url String(64) O HTTP URL of the item in the merchant site
additionalInfo.flags Object O
additionalInfo.flags.shouldRandomizeVaNumber Boolean O

When this field is set to true, then the VA number suffix (customerNo) will be randomized.

We also suggest to fill customerNo with "0000000000" and virtualAccountNo with partnerServiceId + "0000000000".

If this value is not sent, Midtrans will acknowledge that merchant do not want to randomize the VA number.

🚧

Note: this is an exhaustive list, please read the API specification above on how to use it.

📘

Custom VA Number

As per mentioned above, this field will be the combination of partnerServiceId + customerNo , there's some rules that needs to be followed if we want to define our own VA number for our customer :

General Rules

  • Only digits are allowed.
  • Different banks have different specs on their custom VA numbers. (Please refer to the "Additional Rules" below this section)
  • If the number provided is already utilized for another order, then a different unique number will be used instead.
  • If the number provided is longer than the maximum character (MaxChar), then the unnecessary digits in the end will be trimmed.
  • If the number provided is shorter than the minimum character (MinChar), then customerNo will be prefixed with zeros.

Additional Rules

These additional rules need to be implemented because each bank have their own accepted format and some of them have unique logic that we need to follow, so the VA number that we create could be accepted by the respective banks.

  • CIMB : MaxChar = 16 ; MinChar = 16
  • BCA : MaxChar = 23 ; MinChar = partnerServiceId + 6
  • BRI : MaxChar = 18 ; MinChar = 18
  • Mandiri : MaxChar = partnerServiceId + 12 ; MinChar = partnerServiceId + 6
  • Permata : MaxChar = 16 ; MinChar = 16 ; partnerServiceId will always be suffixed with 2 random char sequence number.

BNI VA Unique rules

For BNI, partnerServiceId will be altered first, and then MinChar & MaxChar logic will be adjusted using the result of altered partnerServiceId

If partnerServiceId == 3 char, partnerServiceId will prefixed by "8", other than that, it'll be prefixed with "988"

For

Prefix = "8" , then MaxChar = partnerServiceId + 12 ; MinChar = partnerServiceId + 12

Prefix = "988" , then MaxChar = parterServiceId + 8 ; MinChar = partnerServiceId + 8

*When you see MaxChar having an equals value with MinChar, that means any exceeding number will be trimmed, and any deficient number will be left padded with 0.

{
    "partnerServiceId": "   70012",
    "customerNo": "6280123456",
    "virtualAccountNo": "   700126280123456",
    "virtualAccountName": "Jokul Doe",
    "virtualAccountEmail": "[email protected]",
    "virtualAccountPhone": "6281828384858",
    "trxId": "midtrans-testing-001",
    "totalAmount": {
        "value": "10000.00",
        "currency": "IDR"
    },
    "additionalInfo": {
        "merchantId": "G059876677",
        "bank": "mandiri",
        "flags": {
                "shouldRandomizeVaNumber": false
            },
        "mandiri": {
            "billInfo1": "bank_name",
            "billInfo2": "mandiri",
            "billInfo3": "Name:",
            "billInfo4": "Budi Utomo",
            "billInfo5": "Class:",
            "billInfo6": "Computer Science",
            "billInfo7": "ID:",
            "billInfo8": "VT-12345"
        },
        "customerDetails": {
            "firstName": "Jokul",
            "lastName": "Doe",
            "email": "[email protected]",
            "phone": "+6281828384858",
            "billingAddress": {
                "firstName": "Jukul",
                "lastName": "Doe",
                "address": "Kalibata",
                "city": "Jakarta",
                "postalCode": "12190",
                "phone": "+6281828384858",
                "countryCode": "IDN"
            },
            "shippingAddress": {
                "firstName": "Jukul",
                "lastName": "Doe",
                "address": "Kalibata",
                "city": "Jakarta",
                "postalCode": "12190",
                "phone": "+6281828384858",
                "countryCode": "IDN"
            }
        },
        "customField": {
            "1": "custom-field-1",
            "2": "custom-field-2",
            "3": "custom-field-3"
        },
        "items": [
            {
                "id": "a1",
                "price": {
                    "value": "1000.00",
                    "currency": "IDR"
                },
                "quantity": 3,
                "name": "Apel",
                "brand": "Fuji Apple",
                "category": "Fruit",
                "merchantName": "Fruit-store"

            },
            {
                "id": "a2",
                "price": {
                    "value": "1000.00",
                    "currency": "IDR"
                },
                "quantity": 7,
                "name": "Apel Malang",
                "brand": "Fuji Apple",
                "category": "Fruit",
                "merchantName": "Fruit-store"
            }
        ]
    }
}

Response Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e application/json
X-TIMESTAMPStringMClient's current local time in ISO-8601
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00

Response Body

Field Name Field Type Mandatory Field Description
responseCode String(7) M Status code of transaction charge result.
responseMessage String(150) M Description of transaction charge result.
virtualAccountData M Object
virtualAccountData.partnerServiceId M String(8) Company code - will be shared by Midtrans during the onboarding process. Will be left-padded up to 8 characters long
virtualAccountData.customerNo M String(20) Suffix of the VA number. The value will either be randomized or contains the customerNo sent in the request as a substring. Maximum length depends on the bank.
virtualAccountData.virtualAccountNo M String(28) Number generated using the partnerServiceId and the given customerNo in the request.

Note: The VA number generated will not always be the request.partnerServiceid + request.customerNo. Please use this field as the source of truth for VA number.

virtualAccountData.virtualAccountName M String (255) The customer name
virtualAccountData.virtualAccountEmail String(255) O The customer’s email
virtualAccountData.virtualAccountPhone String(30) O The customer’s phone number
virtualAccountData.trxId String(36) M The identifier for the merchant to use for inquiryRequestId in Inquiry Status API.

This value will be the same as the request’s trxId and X-EXTERNAL-ID

virtualAccountData.totalAmount O Object
virtualAccountData.totalAmount.value M String (16,2) Total Amount up to 2 decimal places based with ISO 4217 format
virtualAccountData.totalAmount.currency M String(3) Currency of amount based on ISO 4217
virtualAccountData.expiryDate O String(25) ISO 8601 Datetime when the VA will be expired if not paid

Notes: Multi Use VA will not have this field

additionalInfo Object M
additionalInfo.bank String M Indicates the bank chosen to create the VA at. The banks that can be used will differ based on the banks chosen by the merchant during the onboarding process. Possible values are
  • Permata
  • BCA
  • Mandiri
  • CIMB
  • BNI
  • BRI
additionalInfo.merchantId String(10) M This will be the merchantId shared during the onboarding process
additionalInfo.subCompanyCode String O This field can be used if the VA being created is BCA. It can filled with BCA’s sub company code value
additionalInfo.freeText Array of Objects O Will be used by the bank to show to the consumer in the bank app
additionalInfo.freeText[x].inquiry Object O Will be used by the bank to show to the consumer after the inquiry process
additionalInfo.freeText[x].inquiry.english String O English description of the inquiry text
additionalInfo.freeText[x].inquiry.indonesia String O Bahasa Indonesia version of the inquiry text
additionalInfo.freeText[x].payment Object O Will be used by the bank to show to the consumer after the payment process
additionalInfo.freeText[x].payment.english String O English description of the payment text
additionalInfo.freeText[x].payment.indonesia String O Bahasa Indonesia version of the payment text
additionalInfo.mandiri Object O Array of Mandiri bill description
additionalInfo.mandiri.billInfo1 String O Label 1. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo2 String O Value for Label 1. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo3 String O Label 2. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo4 String O Value for Label 2. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo5 String O Label 3. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo6 String O Value for Label 3. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo7 String O Label 4. Mandiri allows only 10 characters. Exceeding characters will be truncated.
additionalInfo.mandiri.billInfo8 String O Value for Label 4. Mandiri allows only 30 characters. Exceeding characters will be truncated.
additionalInfo.customerDetails Object O Customer Detail Information
additionalInfo.customerDetails.phone String(15) O Customer Phone number
additionalInfo.customerDetails.email String(255) O Customer email
additionalInfo.customerDetails.firstName String(255) O Customer First Name
additionalInfo.customerDetails.lastName String(255) O Customer Last Name
additionalInfo.customerDetails.billingAddress Object O Customer billing address
additionalInfo.customerDetails.billingAddress.firstName String(255) O Billing address first name
additionalInfo.customerDetails.billingAddress.lastName String(255) O Billing address last name
additionalInfo.customerDetails.billingAddress.phone String(15) O Billing address phone
additionalInfo.customerDetails.billingAddress.address String(255) O Billing address detail
additionalInfo.customerDetails.billingAddress.city String(255) O Billing address city
additionalInfo.customerDetails.billingAddress.postalCode String(255) O Billing address postal code
additionalInfo.customerDetails.billingAddress.countryCode String(15) O Billing address country code
additionalInfo.customerDetails.shippingAddress Object O Customer shipping address
additionalInfo.customerDetails.shippingAddress.firstName String(255) O Shipping address first name
additionalInfo.customerDetails.shippingAddress.lastName String(255) O Shipping address last name
additionalInfo.customerDetails.shippingAddress.phone String(15) O Shipping address phone
additionalInfo.customerDetails.shippingAddress.address String(255) O Shipping address detail
additionalInfo.customerDetails.shippingAddress.city String(255) O Shipping address city
additionalInfo.customerDetails.shippingAddress.postalCode String(255) O Shipping address postal code
additionalInfo.customerDetails.shippingAddress.countryCode String(15) O Shipping address country code
additionalInfo.items Array Of Object O Item Details
additionalInfo.items[x].id String(32) O Item ID
additionalInfo.items[x].price Object M Price of the item in IDR.
additionalInfo.items[x].price.value String (ISO4217) M Item Price value
additionalInfo.items[x].price.currency String(3) M Item Price currency
additionalInfo.items[x].quantity String(16) M Quantity of the item purchased by the customer.
additionalInfo.items[x].name String(64) O Name of the item.
additionalInfo.items[x].merchantName String(64) O Name of the merchant selling the item.
additionalInfo.items[x].brand String(64) O Brand name of the item.
additionalInfo.items[x].category String(64) O Category of the item.
additionalInfo.items[x].url String(64) O HTTP URL of the item in the merchant site
{
    "responseMessage": "Successful",
    "virtualAccountData": {
        "partnerServiceId": "   70012",
        "customerNo": "6280123456",
        "virtualAccountNo": "   700126280123456",
        "expiryDate": "2024-01-27T14:04:54+07:00",
        "virtualAccountEmail": "[email protected]",
        "totalAmount": {
            "value": "10000.00",
            "currency": "IDR"
        },
        "virtualAccountPhone": "6281828384858",
        "additionalInfo": {
            "merchantId": "G059876677",
            "bank": "mandiri",
            "mandiri": {
                "billInfo1": "bank_name",
                "billInfo2": "mandiri",
                "billInfo3": "Name:",
                "billInfo4": "Budi Utomo",
                "billInfo5": "Class:",
                "billInfo6": "Computer Science",
                "billInfo7": "ID:",
                "billInfo8": "VT-12345"
            },
            "customerDetails": {
                "firstName": "Jokul",
                "lastName": "Doe",
                "email": "[email protected]",
                "phone": "+6281828384858",
                "billingAddress": {
                    "firstName": "Jukul",
                    "lastName": "Doe",
                    "address": "Kalibata",
                    "city": "Jakarta",
                    "postalCode": "12190",
                    "phone": "+6281828384858",
                    "countryCode": "IDN"
                },
                "shippingAddress": {
                    "firstName": "Jukul",
                    "lastName": "Doe",
                    "address": "Kalibata",
                    "city": "Jakarta",
                    "postalCode": "12190",
                    "phone": "+6281828384858",
                    "countryCode": "IDN"
                }
            },
            "customField": {
                "1": "custom-field-1",
                "2": "custom-field-2",
                "3": "custom-field-3"
            },
            "items": [
                {
                    "id": "a1",
                    "price": {
                        "value": "1000.00",
                        "currency": "IDR"
                    },
                    "quantity": 3,
                    "name": "Apel",
                    "brand": "Fuji Apple",
                    "category": "Fruit",
                    "merchantName": "Fruit-store",
                    "url": "https://www.google.com/search?q=apel"
                },
                {
                    "id": "a2",
                    "price": {
                        "value": "1000.00",
                        "currency": "IDR"
                    },
                    "quantity": 7,
                    "name": "Apel Malang",
                    "brand": "Fuji Apple",
                    "category": "Fruit",
                    "merchantName": "Fruit-store",
                    "url": "https://www.google.com/search?q=apel-malang"
                }
            ]
        },
        "virtualAccountName": "Jokul Doe",
        "trxId": "midtrans-testing-001"
    },
    "responseCode": "2002700"
}

List Response Code

Response Code HTTP Status Code Response Message
2002700 200 Success
4012700 401 Unauthorized. Signature
5002700 500 Internal Server Error
4002700 400 Bad Request
4042713 404 Invalid Amount
4002701 400 Invalid Field Format X-TIMESTAMP
4092700 409 Conflict


Inquiry Status - Single Use VA

Path/{version}/transfer-va/status
HTTP MethodPOST
Versionv1.0
SNAP version code26

Request Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e. application/json
X-TIMESTAMPStringMClient’s current local time in ISO-8601 format
AuthorizationStringMRepresents access_token of a request; string starts with keyword “Bearer ” followed by access_token. Can get this from Access Token B2B API response.
X-SIGNATUREStringMCreated using symmetric signature HMAC_SHA512 algorithm
X-PARTNER-IDStringMUnique identifier for caller (merchant_id)
CHANNEL-IDStringMMandatory field from Bank Indonesia that can take any value with correct format 5 digits numeric string
X-EXTERNAL-IDStringMAlphanumeric string. Preferably UUID. Reference number that should be unique across 3 months. The value should also be the same as request_body.trxId

It’s recommended that the merchant appends the said value with their client_id (client_key)
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00
X-SIGNATURE:da1fa417c72d6b91c257e01e54fac824
Authorization:Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CupvIJbU1Mmu4a11MNDZ7Sg5u9a
X-PARTNER-ID:G12345678
X-EXTERNAL-ID:midtrans-testing-001
CHANNEL-ID:12345

Request Body

Field Name Field Type Mandatory Field Description
partnerServiceId M String(8) partnerServiceId from Create VA Response
customerNo M String(20) customerNo from Create VA Response
virtualAccountNo M String(28) virtualAccountNo from Create VA Response
inquiryRequestId M String(128) The trxId from createVA response.
additionalInfo Object
additionalInfo.merchantId String(10) M This is the merchantId shared by Midtrans during the onboarding process
{
   "inquiryRequestId": "midtrans-testing-001",
   "partnerServiceId": "   70012",
   "customerNo": "6280123456",
   "virtualAccountNo": "   700126280123456",
   "additionalInfo": {
       "merchantId": "G059876677"
   }
}

Response Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e application/json
X-TIMESTAMPStringMClient's current local time in ISO-8601
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00

Response Body

Field Name Field Type Mandatory Field Description
responseCode String(7) M Status code of transaction charge result.
responseMessage String(150) M Description of transaction charge result.
virtualAccountData M Object
virtualAccountData.paymentFlagReason O Object
virtualAccountData.paymentFlagReason.english O String(200) Reason for Payment Status in English
virtualAccountData.partnerServiceId M String(8) customerNo from Create VA Response
virtualAccountData.customerNo M String(20) virtualAccountNo from Create VA Response
virtualAccountData.virtualAccountNo M String(28) The trxId from createVA response
virtualAccountData.inquiryRequestId M String(128) Identifier to be used for performing inquiry

This will be the same value as the request.inquiryRequestId

virtualAccountData.paymentRequestId C String(128) Unique identifier for this Payment from Midtrans.

This value will exist if the payment has been completed

virtualAccountData.totalAmount O Object
virtualAccountData.totalAmount.value M String (16,2) Total Amount up to 2 decimal places based with ISO 4217 format
virtualAccountData.totalAmount.currency M String(3) Currency of amount based on ISO 4217
virtualAccountData.trxDateTime O Date(25) ISO-8601 datetime in GMT+7 when the VA is created
virtualAccountData.transactionDate O Date(25) ISO-8601 datetime in GMT+7 when the VA was paid

This field will exist if the VA has been paid

virtualAccountData.paymentFlagStatus O String(2) Status for Payment Flag

00 - Success

01 - Initiated

02 - Paying

03 - Pending

04 - Refunded

05 - Canceled

06 - Failed

07 - Not found

08 - Expired

09 - Denied

virtualAccountData.paymentFlagReason O Object Contains explanation for the payment flag status in different languages
virtualAccountData.paymentFlagReason.english O String Explanation for payment flag status in English
additionalInfo O Object
additionalInfo.merchantId M String (10) This is the merchantId shared by Midtrans during the onboarding process
{
    "additionalInfo": {
        "merchantId": "G059876677"
    },
    "responseMessage": "Successful",
    "virtualAccountData": {
        "partnerServiceId": "   70012",
        "customerNo": "6280123456",
        "virtualAccountNo": "   700126280123456",
        "totalAmount": {
            "currency": "IDR",
            "value": "10000.00"
        },
        "paymentFlagReason": {
            "english": "settlement"
        },
        "paymentFlagStatus": "00",
        "trxDateTime": "2024-04-19T15:18:13+07:00",
        "transactionDate": "2024-04-19T15:19:09+07:00",
        "inquiryRequestId": "midtrans-testing-001",
        "paymentRequestId": "A120240419081813bceyKQUK3iID"
    },
    "responseCode": "2002600"
}

List Response Code

Response Code HTTP Status Code Response Message
2002600 200 Success
4012600 401 Unauthorized. Signature
4012600 401 Unauthorized. Merchant does not have access
4042601 404 Transaction Not Found
4002602 400 Invalid Mandatory Field
5002600 500 Internal Server Error


Inquiry Status - Multi Use VA

Path/{version}/transfer-va/status
HTTP MethodPOST
Versionv1.0
SNAP version code26

Request Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e. application/json
X-TIMESTAMPStringMClient’s current local time in ISO-8601 format
AuthorizationStringMRepresents access_token of a request; string starts with keyword “Bearer ” followed by access_token. Can get this from Access Token B2B API response.
X-SIGNATUREStringMCreated using symmetric signature HMAC_SHA512 algorithm
X-PARTNER-IDStringMUnique identifier for caller (merchant_id)
CHANNEL-IDStringMMandatory field from Bank Indonesia that can take any value with correct format 5 digits numeric string
X-EXTERNAL-IDStringMAlphanumeric string. Preferably UUID. Reference number that should be unique across 3 months. The value should also be the same as request_body.trxId

It’s recommended that the merchant appends the said value with their client_id (client_key)
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00
X-SIGNATURE:da1fa417c72d6b91c257e01e54fac824
Authorization:Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CupvIJbU1Mmu4a11MNDZ7Sg5u9a
X-PARTNER-ID:G12345678
X-EXTERNAL-ID:midtrans-testing-001
CHANNEL-ID:12345

Request Body

partnerServiceId String(8) M partnerServiceId from Create VA Response
customerNo String(20) M customerNo from Create VA Response
virtualAccountNo String(28) M virtualAccountNo from Create VA Response
inquiryRequestId String(128) M The trxId from createVA response.
additionalInfo Object
additionalInfo.merchantId String(10) M This is the merchantId shared by Midtrans during the onboarding process
additionalInfo.page String O Index of the search. Default is 0. Min page is 0.
additionalInfo.pageSize String O Number of transactions displayed per page. Default is 10. Max page_size is 15. Min page_size is 1.

Example : Merchant has five transactions created under a certain order_id. The transactions are A, B, C, D, E, F (ordered to the latest).

Below are the examples on how merchants can use page and pageSize parameters.

pageSize is not set, page is not set: Merchant gets F, E, D, C, B, A

pageSize is set 2, page is not set: Merchant gets F, E

pageSize is set 2, page is set 1: Merchant gets D, C

pageSize is set 3, page is set 1: Merchant gets C, B, A

{
   "inquiryRequestId": "midtrans-testing-001",
   "partnerServiceId": "   70012",
   "customerNo": "6280123456",
   "virtualAccountNo": "   700126280123456",
   "additionalInfo": {
       "merchantId": "G059876677",
       "page": "0",
       "pageSize": "2"
   }
}

Response Body

Field Name Field Type Mandatory Field Description
responseCode String(7) M Status code of transaction charge result.
responseMessage String(150) M Description of transaction charge result.
virtualAccountData Object M
virtualAccountData.partnerServiceId String(8) M Derivative of X- PARTNER- ID, similar to company code, 8 digit left padding space.
virtualAccountData.customerNo String(20) M Unique number (up to 20 digits).
virtualAccountData.virtualAccountNo String(28) M partnerServiceId (8 digit left padding 0) + customerNo (up to 20 digits).
virtualAccountData.inquiryRequestId String(128) M trxId sent in Create VA
additionalInfo
additionalInfo.merchantId String M This is the merchantId shared by Midtrans during the onboarding process
additionalInfo.recurringPaymentDetail Object O
additionalInfo.recurringPaymentDetail.recurringOrders Array of Objects M All payments related to the parent order trxId
additionalInfo.recurringPaymentDetail.recurringOrders[0].totalAmount Object M
additionalInfo.recurringPaymentDetail.recurringOrders[0].totalAmount.value String(ISO 4217) (16,2) M Total Amount with 2 decimal
additionalInfo.recurringPaymentDetail.recurringOrders[0].totalAmount.currency String(3) M Currency of amount based on ISO 4217
additionalInfo.recurringPaymentDetail.recurringOrders[0].paymentFlagReason Object M
additionalInfo.recurringPaymentDetail.recurringOrders[0].paymentFlagReason.english String M Reason for Payment Status in English
additionalInfo.recurringPaymentDetail.recurringOrders[0].paymentRequestId String M Midtrans order id
additionalInfo.recurringPaymentDetail.recurringOrders[0].paymentFlagStatus String M Status for Payment Flag

00 - Success

01 - Initiated

02 - Paying

03 - Pending

04 - Refunded

05 - Canceled

06 - Failed

07 - Not found

08 - Expired

09 - Denied

additionalInfo.recurringPaymentDetail.recurringOrders[0].trxDateTime String M Datetime when the order created in GMT+7. ISO-8601
additionalInfo.recurringPaymentDetail.recurringOrders[0].transactionDate String M Datetime when the payment happened in GMT+7. ISO-8601
additionalInfo.recurringPaymentDetail.recurringOrders[0].trxId String M trxId, appended with randomly generated identifier for second payment and so on

Sample first payment: merchant_order_id

Sample: merchant_order_id-030424072903549oVvY

additionalInfo.recurringPaymentDetail.paginationMetadata Object M Pagination of the orders
additionalInfo.recurringPaymentDetail.paginationMetadata.total String M Total orders related to the trxId
additionalInfo.recurringPaymentDetail.paginationMetadata.pageSize String M Number of transactions displayed per page.
additionalInfo.recurringPaymentDetail.paginationMetadata.page String M Index of the search.
{
    "responseCode": "2002600",
    "responseMessage": "Successful"
    "virtualAccountData": {
        "partnerServiceId": "   70012",
        "customerNo": "6280123456",
        "virtualAccountNo": "   700126280123456"
    },
    "additionalInfo": {
        "merchantId": "G12345463",
        "recurringPaymentDetail": {
            "recurringOrders": [
                {
                    "totalAmount": {
                        "currency": "IDR",
                        "value": "150000.00"
                    },
                    "paymentFlagReason": {
                        "english": "settlement"
                    },
                    "paymentRequestId": "A120240403072903E6HgHZoE3bID",
                    "paymentFlagStatus": "00",
                    "trxDateTime": "2024-04-03T14:29:03+07:00",
                    "transactionDate": "2024-04-03T14:29:03+07:00",
                    "trxId": "midtrans-testing-001-030424072903549oVvY"
                },
                {
                    "totalAmount": {
                        "currency": "IDR",
                        "value": "5000.00"
                    },
                    "paymentFlagReason": {
                        "english": "settlement"
                    },
                    "paymentRequestId": "A120240403072821jJ3pwMIFEyID",
                    "paymentFlagStatus": "00",
                    "trxDateTime": "2024-04-03T14:28:21+07:00",
                    "transactionDate": "2024-04-03T14:28:49+07:00",
                    "trxId": "midtrans-testing-001"
                }
            ],
            "paginationMetadata": {
                "total": "4",
                "pageSize": "2",
                "page": "1"
            }
        }
    }



Delete VA

Path/{version}/transfer-va/delete-va
HTTP MethodPOST
Versionv1.0
SNAP version code31

Request Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e. application/json
X-TIMESTAMPStringMClient’s current local time in ISO-8601 format
AuthorizationStringMRepresents access_token of a request; string starts with keyword “Bearer ” followed by access_token. Can get this from Access Token B2B API response.
X-SIGNATUREStringMCreated using symmetric signature HMAC_SHA512 algorithm
X-PARTNER-IDStringMUnique identifier for caller (merchant_id)
CHANNEL-IDStringMMandatory field from Bank Indonesia that can take any value with correct format 5 digits numeric string
X-EXTERNAL-IDStringMAlphanumeric string. Preferably UUID. Reference number that should be unique across 3 months
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00
X-SIGNATURE:da1fa417c72d6b91c257e01e54fac824
Authorization:Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CupvIJbU1Mmu4a11MNDZ7Sg5u9a
X-PARTNER-ID:G12345678
X-EXTERNAL-ID:12345678901234567890
CHANNEL-ID:12345

Request Body

Field Name Field Type Mandatory Field Description
partnerServiceId String(8) M partnerServiceId from Create VA Response
customerNo String(20) M customerNo from Create VA Response
virtualAccountNo String(28) M virtualAccountNo from Create VA Response
trxId String(64) M This value will be the trxId used in the create VA request.
additionalInfo Object O
additionalInfo.merchantId String(10) M This is the merchantId shared by Midtrans during the onboarding process
{
    "partnerServiceId": "   70012",
    "customerNo": "6280123456",
    "virtualAccountNo": "   700126280123456",
    "trxId": "midtrans-testing-001",
    "additionalInfo": {
        "merchantId": "G059876677"
    }
}

Response Header

Field NameField TypeMandatoryField Description
Content-TypeStringMMedia type of the resource, i.e application/json
X-TIMESTAMPStringMClient's current local time in ISO-8601
Content-type:application/json
X-TIMESTAMP:2020-01-01T00:00:00+07:00

Response Body

Field Name Field Type Mandatory Field Description
responseCode String(7) M Response code
responseMessage String(150) M Response description
virtualAccountData Object M
virtualAccountData.partnerServiceId String(8) M partnerServiceId from Create VA Response
virtualAccountData.customerNo String(29) M customerNo from Create VA Response
virtualAccountData.virtualAccountNo String (28) M virtualAccountNo from Create VA Response
virtualAccountData.trxId String(64) M The identifier used by the merchant during create VA. This will be the same as the trxId in the create VA process
additionalInfo.merchantId String(10) M This is the merchantId shared by Midtrans during the onboarding process
{
    "responseMessage": "Successful",
    "virtualAccountData": {
        "partnerServiceId": "   70012",
        "customerNo": "6280123456",
        "virtualAccountNo": "   700126280123456",
        "additionalInfo": {
            "merchantId": "G059876677"
        },
        "trxId": "midtrans-testing-001"
    },
    "responseCode": "2003100"
}

List Response Code

Response Code HTTP Status Code Response Message
2003100 200 Success
4003102 400 Invalid Mandatory Field
4013100 401 Unauthorized.
5003101 500 Internal Server Error
5043100 504 Timeout

Additional APIs

  1. Get transaction status API
  2. Cancel API