curl --request GET \
--url https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id} \
--header 'Authorization: Bearer <token>' \
--header 'X-PARTNER-ID: <api-key>'import requests
url = "https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}"
headers = {
"Authorization": "Bearer <token>",
"X-PARTNER-ID": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'X-PARTNER-ID': '<api-key>'}
};
fetch('https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-PARTNER-ID: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-PARTNER-ID", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}")
.header("Authorization", "Bearer <token>")
.header("X-PARTNER-ID", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-PARTNER-ID"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": 200,
"success": true,
"data": {
"transaction_id": "VA-20251024-0001H9X8ZK",
"merchant_reff_no": "INV/2025/10/0001",
"va_number": "88810012345678",
"account": {
"id": "01H9X8ZK3M7QF4N2VTB6RYJWPC",
"name": "Toko Sumber Rejeki",
"email": "finance@sumberrejeki.co.id",
"phone": "081234567890"
},
"bank": {
"short_name": "BRI",
"number": "002",
"swift_code": "BRINIDJA",
"bank_code": "BRI"
},
"notes": "Pembayaran order #1024",
"status": "paid",
"fees": {
"name": "BRI Virtual Account",
"amount": 4500,
"currency": "IDR"
},
"amount": {
"value": "1234.56",
"currency": "IDR"
},
"post_timestamp": "1729748679474",
"processed_timestamp": "1729748707000",
"has_settle": true,
"settle_at": 1729753200000
}
}{
"status": 401,
"success": false,
"error": {
"code": 401,
"message": "Unauthorized merchant, please sign in"
}
}{
"status": 403,
"success": false,
"error": {
"code": 403,
"message": "Access denied."
}
}{
"status": 404,
"success": false,
"error": {
"code": 404,
"message": "Account not found."
}
}{
"status": 422,
"success": false,
"error": {
"code": 422,
"message": "Validation error.",
"errors": {
"field": [
"error message"
]
}
},
"data": {
"errors": {
"field": [
"error message"
]
}
}
}Show
Retrieve a single Virtual Account money-in transaction by its business transaction id.
The transaction_id path parameter is the business identifier (va_transactions.transaction_id) returned by the List endpoints — not the numeric database primary key. The transaction must belong to a Virtual Account under the supplied account_id, and that account must belong to the authenticated merchant.
curl --request GET \
--url https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id} \
--header 'Authorization: Bearer <token>' \
--header 'X-PARTNER-ID: <api-key>'import requests
url = "https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}"
headers = {
"Authorization": "Bearer <token>",
"X-PARTNER-ID": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'X-PARTNER-ID': '<api-key>'}
};
fetch('https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-PARTNER-ID: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-PARTNER-ID", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}")
.header("Authorization", "Bearer <token>")
.header("X-PARTNER-ID", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-payment-b2b.singapay.id/api/v1.0/va-transactions/{account_id}/{transaction_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-PARTNER-ID"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": 200,
"success": true,
"data": {
"transaction_id": "VA-20251024-0001H9X8ZK",
"merchant_reff_no": "INV/2025/10/0001",
"va_number": "88810012345678",
"account": {
"id": "01H9X8ZK3M7QF4N2VTB6RYJWPC",
"name": "Toko Sumber Rejeki",
"email": "finance@sumberrejeki.co.id",
"phone": "081234567890"
},
"bank": {
"short_name": "BRI",
"number": "002",
"swift_code": "BRINIDJA",
"bank_code": "BRI"
},
"notes": "Pembayaran order #1024",
"status": "paid",
"fees": {
"name": "BRI Virtual Account",
"amount": 4500,
"currency": "IDR"
},
"amount": {
"value": "1234.56",
"currency": "IDR"
},
"post_timestamp": "1729748679474",
"processed_timestamp": "1729748707000",
"has_settle": true,
"settle_at": 1729753200000
}
}{
"status": 401,
"success": false,
"error": {
"code": 401,
"message": "Unauthorized merchant, please sign in"
}
}{
"status": 403,
"success": false,
"error": {
"code": 403,
"message": "Access denied."
}
}{
"status": 404,
"success": false,
"error": {
"code": 404,
"message": "Account not found."
}
}{
"status": 422,
"success": false,
"error": {
"code": 422,
"message": "Validation error.",
"errors": {
"field": [
"error message"
]
}
},
"data": {
"errors": {
"field": [
"error message"
]
}
}
}Authorizations
JWT issued by POST /api/v1.1/access-token/b2b. Send Authorization: Bearer <token>.
Merchant API key (Credential.api_key). Required on every request.
Path Parameters
ULID of the account that owns the Virtual Account. Must belong to the authenticated merchant. Account ULID
"01H9X8ZK3M7QF4N2VTB6RYJWPC"
Business transaction id of the VA transaction to retrieve (the transaction_id value from the List response).
VA transaction business id
"VA-20251024-0001H9X8ZK"
