Get Transaction
curl --request GET \
--url https://api.stablepay.global/v2/transactions/{transactionId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"payout.rate": "<string>",
"payout.usdtEquivalent": "<string>",
"payout.allocations": [
{}
]
}
'import requests
url = "https://api.stablepay.global/v2/transactions/{transactionId}"
payload = {
"payout.rate": "<string>",
"payout.usdtEquivalent": "<string>",
"payout.allocations": [{}]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
'payout.rate': '<string>',
'payout.usdtEquivalent': '<string>',
'payout.allocations': [{}]
})
};
fetch('https://api.stablepay.global/v2/transactions/{transactionId}', 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://api.stablepay.global/v2/transactions/{transactionId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'payout.rate' => '<string>',
'payout.usdtEquivalent' => '<string>',
'payout.allocations' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.stablepay.global/v2/transactions/{transactionId}"
payload := strings.NewReader("{\n \"payout.rate\": \"<string>\",\n \"payout.usdtEquivalent\": \"<string>\",\n \"payout.allocations\": [\n {}\n ]\n}")
req, _ := http.NewRequest("GET", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.stablepay.global/v2/transactions/{transactionId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"payout.rate\": \"<string>\",\n \"payout.usdtEquivalent\": \"<string>\",\n \"payout.allocations\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stablepay.global/v2/transactions/{transactionId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"payout.rate\": \"<string>\",\n \"payout.usdtEquivalent\": \"<string>\",\n \"payout.allocations\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_bodyTransactions
Get Transaction
Get transaction details and status
GET
/
v2
/
transactions
/
{transactionId}
Get Transaction
curl --request GET \
--url https://api.stablepay.global/v2/transactions/{transactionId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"payout.rate": "<string>",
"payout.usdtEquivalent": "<string>",
"payout.allocations": [
{}
]
}
'import requests
url = "https://api.stablepay.global/v2/transactions/{transactionId}"
payload = {
"payout.rate": "<string>",
"payout.usdtEquivalent": "<string>",
"payout.allocations": [{}]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
'payout.rate': '<string>',
'payout.usdtEquivalent': '<string>',
'payout.allocations': [{}]
})
};
fetch('https://api.stablepay.global/v2/transactions/{transactionId}', 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://api.stablepay.global/v2/transactions/{transactionId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'payout.rate' => '<string>',
'payout.usdtEquivalent' => '<string>',
'payout.allocations' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.stablepay.global/v2/transactions/{transactionId}"
payload := strings.NewReader("{\n \"payout.rate\": \"<string>\",\n \"payout.usdtEquivalent\": \"<string>\",\n \"payout.allocations\": [\n {}\n ]\n}")
req, _ := http.NewRequest("GET", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.stablepay.global/v2/transactions/{transactionId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"payout.rate\": \"<string>\",\n \"payout.usdtEquivalent\": \"<string>\",\n \"payout.allocations\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stablepay.global/v2/transactions/{transactionId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"payout.rate\": \"<string>\",\n \"payout.usdtEquivalent\": \"<string>\",\n \"payout.allocations\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_bodyGet Transaction
Retrieves full transaction details including deposit and payout status.The
{transactionId} path parameter accepts either the StablePay transaction ID or your own partnerReference. If a create call timed out and you never received the transaction ID, look the transaction up by the reference you sent.Request
curl https://api.stablepay.global/v2/transactions/txn_xyz789 \
-H "Authorization: Bearer YOUR_API_KEY"
Response
{
"success": true,
"data": {
"transaction": {
"id": "txn_xyz789",
"status": "completed",
"partnerReference": "order_456",
"createdAt": "2025-06-15T10:30:00Z"
},
"deposit": {
"network": "polygon",
"asset": "USDC",
"address": "0x742d35Cc...",
"expectedAmount": "100",
"receivedAmount": "100",
"txHash": "0xabc123...",
"status": "confirmed",
"confirmations": 30,
"confirmedAt": "2025-06-15T10:35:00Z"
},
"quote": {
"exchangeRate": 84.50,
"grossInr": "8450.00",
"netInr": "8407.75"
},
"payout": {
"rail": "imps",
"amountInr": "8407.75",
"status": "completed",
"utr": "123456789012",
"completedAt": "2025-06-15T10:40:00Z"
}
}
}
Rate attribution (pool_settlement)
For payouts funded from your INR escrow balance, thepayout object also reports
which settled deal rate the payout drew against and how much USDT it consumed —
so you can verify the value passed on to your end user.
"payout": {
"rail": "imps",
"amountInr": "200000.00",
"status": "completed",
"rate": "92.6000",
"usdtEquivalent": "2159.827214",
"allocations": [
{
"dealId": "deal_3a0ad0cf3861",
"dealNumber": "DEAL-2026-0008",
"rate": "92.6",
"inrAmount": "200000.00",
"usdtAmount": "2159.827214"
}
]
}
string
Effective INR/USDT for this payout. Equals the deal rate when the payout sits
inside a single tranche; a blended rate when it spans more than one.
string
Total USDT this payout consumed — the sum of
allocations[].usdtAmount.array
The deal-rate tranches consumed, oldest first.
Allocation is FIFO. Payouts consume your oldest unspent settled deal first.
When a payout exhausts one tranche it spills into the next, and
allocations
returns one entry per tranche with rate reporting the blended figure. So for a
₹1.3 Cr payout crossing a boundary you would see two entries, and the USDT across
them always reconciles against what was actually loaded.These fields are absent on payouts made before attribution was introduced, and on
flows not funded from an INR escrow pool.They are also computed just after the payout is submitted, so they are not in
the response to POST /v2/transactions — poll this endpoint (or wait for the
transaction.payout_completed webhook) to read them. Attribution never delays or
blocks the payment itself.