curl --request GET \
--url https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions \
--header 'authorization: <api-key>' \
--header 'x-access-id: <x-access-id>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-timestamp: <x-timestamp>'const options = {
method: 'GET',
headers: {
authorization: '<api-key>',
'x-timestamp': '<x-timestamp>',
'x-request-id': '<x-request-id>',
'x-access-id': '<x-access-id>'
}
};
fetch('https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions"
headers = {
"authorization": "<api-key>",
"x-timestamp": "<x-timestamp>",
"x-request-id": "<x-request-id>",
"x-access-id": "<x-access-id>"
}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions",
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: <api-key>",
"x-access-id: <x-access-id>",
"x-request-id: <x-request-id>",
"x-timestamp: <x-timestamp>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "success",
"message": "success",
"data": {
"data": [
{
"transaction_type": "inbound",
"txHash": "<string>",
"walletReference": "<string>",
"addressReference": "<string>",
"symbol": "USDT",
"amount": "50000000",
"address": "<string>",
"network": "EVM",
"chainId": "ethereum",
"confirmed": true,
"blockNumber": 123,
"createdAt": "2023-11-07T05:31:56Z"
}
],
"total": 2,
"pages": 1,
"page": 1,
"limit": 20
}
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Too many requests. Max 120 per 60s.",
"data": null
}List Wallet Transactions
Retrieve the deposits and outbound transfers of a subwallet
curl --request GET \
--url https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions \
--header 'authorization: <api-key>' \
--header 'x-access-id: <x-access-id>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-timestamp: <x-timestamp>'const options = {
method: 'GET',
headers: {
authorization: '<api-key>',
'x-timestamp': '<x-timestamp>',
'x-request-id': '<x-request-id>',
'x-access-id': '<x-access-id>'
}
};
fetch('https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions"
headers = {
"authorization": "<api-key>",
"x-timestamp": "<x-timestamp>",
"x-request-id": "<x-request-id>",
"x-access-id": "<x-access-id>"
}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://secureapi.tender.cash/v1/api/wallet/{walletReference}/transactions",
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: <api-key>",
"x-access-id: <x-access-id>",
"x-request-id: <x-request-id>",
"x-timestamp: <x-timestamp>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"status": "success",
"message": "success",
"data": {
"data": [
{
"transaction_type": "inbound",
"txHash": "<string>",
"walletReference": "<string>",
"addressReference": "<string>",
"symbol": "USDT",
"amount": "50000000",
"address": "<string>",
"network": "EVM",
"chainId": "ethereum",
"confirmed": true,
"blockNumber": 123,
"createdAt": "2023-11-07T05:31:56Z"
}
],
"total": 2,
"pages": 1,
"page": 1,
"limit": 20
}
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Too many requests. Max 120 per 60s.",
"data": null
}x-access-id, x-request-id, x-timestamp, and an HMAC-SHA256
authorization signature. See Authentication.inbound) and transfers (outbound) merged into a single list,
newest first. Pagination fields are nested inside data, next to the inner data array.
amount is in the token’s smallest unit (for example
50000000 for 50 USDT, which has 6 decimals; the deposit webhook carries decimals). Outbound
amount is in human-readable units, as you sent it to
Transfer Funds.Example
const res = await fetch(`${BASE}/wallet/acme-user-8821/transactions?page=1&limit=20`, {
headers: makeHeaders(),
});
const { data } = await res.json();
const { data: txs, total, pages, page, limit } = data;
for (const tx of txs) {
if (tx.transaction_type === 'inbound') {
// deposit: tx.amount is in base units
} else {
// transfer: tx.status is pending | confirmed | failed
}
}
res = requests.get(
f"{BASE}/wallet/acme-user-8821/transactions",
headers=make_headers(),
params={"page": 1, "limit": 20},
)
page = res.json()["data"]
txs, total = page["data"], page["total"]
Headers
{"timeStamp":"<x-timestamp>","requestId":"<x-request-id>","accessId":"<x-access-id>"}, signed with your access secret. The request body is not part of the signature.Example: "pV3n0o8kq0lK2mJ8bZ1yq3Yt6hR0cXK9u4mVJ2l9sE0=""2026-10-15T09:45:53.000Z""550e8400-e29b-41d4-a716-446655440000""your-access-id-here"Path Parameters
"acme-user-8821"Query Parameters
1. Defaults to 1.Example: 11 to 100. Defaults to 20.Example: 20Response
"success""success"Show data properties
Show data properties
Show inbound transaction
Show inbound transaction
"inbound""0x5e8d...""acme-user-8821""acme-user-8821-slot-2""USDT""50000000""0x1a2b3c..."EVM).Example: "EVM""ethereum"true21034567"2026-10-15T09:00:00.000Z"Show outbound transaction
Show outbound transaction
"outbound""7c1e9a...""acme-user-8821""acme-user-8821-slot-2""USDT""50""TLq9...""TABCef..."tron). Compare
case-insensitively.Example: "tron"pending, confirmed or failed.Example: "confirmed"payment_reference you sent with the transfer.Example: "payout-9922"66123456"2026-10-15T09:05:00.000Z"21120Example response
{
"status": "success",
"message": "success",
"data": {
"data": [
{
"transaction_type": "outbound",
"txHash": "7c1e9a...",
"walletReference": "acme-user-8821",
"addressReference": "acme-user-8821-slot-2",
"symbol": "USDT",
"amount": "50",
"sender": "TLq9...",
"receiver": "TABCef...",
"network": "tron",
"status": "confirmed",
"paymentReference": "payout-9922",
"blockNumber": 66123456,
"createdAt": "2026-10-15T09:05:00.000Z"
},
{
"transaction_type": "inbound",
"txHash": "5e8d...",
"walletReference": "acme-user-8821",
"addressReference": "acme-user-8821-slot-2",
"symbol": "USDT",
"amount": "50000000",
"address": "TLq9...",
"network": "TRON",
"chainId": "tron",
"confirmed": true,
"blockNumber": 66120001,
"createdAt": "2026-10-15T09:00:00.000Z"
}
],
"total": 2,
"pages": 1,
"page": 1,
"limit": 20
}
}
Authorizations
Signed (HMAC) authentication. Required headers: x-access-id, x-request-id (UUID v4), x-timestamp (ISO 8601, must be within 5 minutes of server time), and authorization: the Base64 HMAC-SHA256 of the JSON string {"timeStamp":"","requestId":"","accessId":""} (keys in that order, no whitespace) using your access secret. The request body, method and path are not signed. The API key must be linked to an outlet.
Headers
Base64-encoded HMAC-SHA256 signature of {"timeStamp":"","requestId":"","accessId":""}, signed with your access secret. The request body is not part of the signature.
ISO 8601 timestamp; must be within 5 minutes of server time
A unique UUID v4 per request
Path Parameters
The wallet's reference.
Query Parameters
Page number, starting at 1. Defaults to 1.
x >= 1Items per page, 1-100. Defaults to 20.
1 <= x <= 100