Singapay Home Page
Logo Icon
  1. Virtual Account
  2. Create

Information

MethodPathFormatAuthentication
POST/api/v1.0/virtual-accounts/{account_id}jsonOAuth 2.0 with Access Token

Request Details

Headers Structure

FieldValueTypeMandatoryLengthDescriptionExample
X-PARTNER-IDapi_keyAlphanumericMandatoryAPI key obtained from the merchant dashboard.b3ed7d4b-a96c-6c08-b3c7-12c3124242d9
Acceptapplication/jsonAlphabeticMandatorySpecifies JSON as the expected response format.application/json
AuthorizationBearer {bearerToken}AlphanumericMandatoryBearer token obtained from the get access token endpoint.Bearer eyJ0eXAiOiJKV1{…}

Body Structure

FieldTypeMandatoryLengthDescriptionExample
bank_codeStringYes-Bank code like BRI, BNI, DANAMON, MAYBANK, MANDIRIBRI
amount_typeEnumNo-open or closed. Defaults to closed. Open VA accepts flexible payment amount within min/max range.closed
min_amountNumericNo-Minimum payment amount for open VA. Optional — if not provided, defaults to merchant’s configured VA minimum limit.10000
max_amountNumericNo-Maximum payment amount for open VA. Optional — if not provided, defaults to merchant’s configured VA maximum limit. Must be >= min_amount.5000000
nameStringNo-virtual account name that show when inquiry & paymentDhany Nurdiansyah
merchant_reff_noStringNo255Merchant reference number for tracing. This value will be returned in webhook callback.INV-2026-001
amountNumericConditional-Amount of transaction. Required if amount_type is closed (default). Not used for open VA.1000000
kindEnumYes-temporary or permanenttemporary
expired_atTimestampConditional13Expired at in Unix timestamp millisecond format. Required if kind is temporary.1760643599000
max_usageNumericNo-Maximum number of times the VA can be used. Default is 255.255
currencyStringNo3Currency code (e.g., IDR). Defaults to IDR.IDR

Notes on kind field

Virtual Account Type (kind)expired_at Behavior
temporaryThe expiration is determined by the expired_at value.
permanentThe expired_at value can be null.

Body Example

{
    "bank_code":"BRI",
    "amount" : 1000000,
    "name" : "Dhany Nurdiansyah",
    "merchant_reff_no" : "INV-2026-001",
    "kind" : "temporary",
    "expired_at" : 1760643599000, //'required_if:kind,temporary|digits:13', // milisecond timestamp is 13 digits,
    "max_usage":255
}

Body Example (Open VA with custom limits)

{
    "bank_code":"BRI",
    "amount_type": "open",
    "min_amount": 10000,
    "max_amount": 5000000,
    "name": "Dhany Nurdiansyah",
    "kind": "permanent"
}

Body Example (Open VA with default merchant limits)

{
    "bank_code":"BRI",
    "amount_type": "open",
    "name": "Dhany Nurdiansyah",
    "kind": "permanent"
}

Response Details

Response Structure

FieldTypeMandatoryLengthDescriptionExample
statusNumericMandatory3HTTP status code of the response200
successBooleanMandatory1Indicates whether the request was successfultrue
dataObjectConditional-Contains details about the virtual account-
> idAlphanumericMandatory-Unique identifier for the virtual account01K6D34A9GNATKP76AQ1DGPQBG
> numberNumericMandatory16Virtual account number9090777158248126
> nameAlphabeticMandatory-Virtual account nameDhany
> merchant_reff_noStringOptional255Merchant reference number for tracingINV-2026-001
> codeAlphanumericMandatory-Virtual account bank code (e.g., VA_BRI)VA_BRI
> bankObjectMandatory-Contains bank details-
>> short_nameAlphabeticMandatory-Bank’s short nameBRI
>> numberAlphanumericMandatory-Bank’s internal numeric code002
>> swift_codeAlphanumericOptional-SWIFT code of the bank (if applicable)BRINIDJA
> amountObjectMandatory-Contains amount value and currency-
>> valueDecimalMandatory-Amount value in string format100000.00
>> currencyAlphabeticMandatory3Currency code in ISO 4217 formatIDR
> amount_typeEnumMandatory-Type of amount: open or closedclosed
> min_amountObject/NullConditional-Min amount details (only for open VA, null for closed)-
>> valueDecimalConditional-Min amount value10000.00
>> currencyAlphabeticConditional3Currency codeIDR
> max_amountObject/NullConditional-Max amount details (only for open VA, null for closed)-
>> valueDecimalConditional-Max amount value5000000.00
>> currencyAlphabeticConditional3Currency codeIDR
> statusEnumMandatory-Status of the virtual account (e.g., “active”, “expired”)active
> kindEnumMandatory-Type of virtual account (“permanent” or “temporary”)permanent
> current_usageNumericMandatory-Current number of times the VA has been used0

Response Example

Success: Here’s an example of a successful response.

{
    "status": 200,
    "success": true,
    "data": {
        "id": "01K6D34A9GNATKP76AQ1DGPQBG",
        "number": "9090777158248126",
        "name": "Dhany",
        "merchant_reff_no": "INV-2026-001",
        "code": "VA_BRI",
        "bank": {
            "short_name": "BRI",
            "number": "002",
            "swift_code": "BRINIDJA"
        },
        "amount": {
            "value": "100000.00",
            "currency": "IDR"
        },
        "amount_type": "closed",
        "min_amount": null,
        "max_amount": null,
        "status": "active",
        "kind": "permanent",
        "current_usage": 0
    }
}

Success (Open VA): Here’s an example of a successful response for an open virtual account.

{
    "status": 200,
    "success": true,
    "data": {
        "id": "01K6D34A9GNATKP76AQ1DGPQBG",
        "number": "9090777158248126",
        "name": "Dhany Nurdiansyah",
        "code": "VA_BRI",
        "bank": {
            "short_name": "BRI",
            "number": "002",
            "swift_code": "BRINIDJA"
        },
        "amount": {
            "value": "0.00",
            "currency": "IDR"
        },
        "amount_type": "open",
        "min_amount": {
            "value": "10000.00",
            "currency": "IDR"
        },
        "max_amount": {
            "value": "5000000.00",
            "currency": "IDR"
        },
        "status": "active",
        "kind": "permanent",
        "current_usage": 0
    }
}

Error: This is an example of an unsuccessful request.

{
    "status": 422,
    "success": false,
    "error": {
        "code": 422,
        "message": "Validation error",
        "errors": {
            "max_usage": [
                "Max Usage is 255"
            ]
        }
    }
}

List of Bank Codes Supported

bank_codeBank Name
BRIBank Rakyat Indonesia (BRI)
BNIBank Negara Indonesia (BNI)
DANAMONBank Danamon Indonesia
MAYBANKMaybank Indonesia
BCABank Central Asia (BCA)
MANDIRIBank Mandiri Indonesia (Soon)
PERMATABank Permata Indonesia (Soon)
BSIBank Syariah Indonesia (Soon)
CIMBBank CIMB Niaga (Soon)