Get Transfer Status
curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet/transfer/status \
--header 'Content-Type: <content-type>' \
--header 'authorization: <api-key>' \
--header 'x-access-id: <x-access-id>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-timestamp: <x-timestamp>' \
--data '
{
"network": "TRON",
"operation_id": "f3b0c2d1e4a5..."
}
'const options = {
method: 'POST',
headers: {
authorization: '<api-key>',
'x-timestamp': '<x-timestamp>',
'x-request-id': '<x-request-id>',
'x-access-id': '<x-access-id>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({network: 'TRON', operation_id: 'f3b0c2d1e4a5...'})
};
fetch('https://secureapi.tender.cash/v1/api/wallet/transfer/status', 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/transfer/status"
payload = {
"network": "TRON",
"operation_id": "f3b0c2d1e4a5..."
}
headers = {
"authorization": "<api-key>",
"x-timestamp": "<x-timestamp>",
"x-request-id": "<x-request-id>",
"x-access-id": "<x-access-id>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://secureapi.tender.cash/v1/api/wallet/transfer/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'network' => 'TRON',
'operation_id' => 'f3b0c2d1e4a5...'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"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": "transfer status retrieved",
"data": {
"operation_id": "f3b0c2d1e4a5...",
"status": "succeed",
"transaction_hash": "7c1e9a...",
"message": "",
"confirmation_count": 1,
"provider": "gasfree"
}
}{
"status": "success",
"message": "transfer status retrieved",
"data": {
"operation_id": "f3b0c2d1e4a5...",
"status": "inprogress",
"transaction_hash": "",
"message": "",
"confirmation_count": 0,
"provider": "gasfree"
}
}{
"status": "error",
"message": "operation_id must be a string",
"data": null
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Transfer operation not found",
"data": null
}{
"status": "error",
"message": "Too many requests. Max 120 per 60s.",
"data": null
}{
"status": "error",
"message": "Wallet service is temporarily unavailable. Please try again.",
"data": null
}Subwallets
Get Transfer Status
Check the status of a gasless subwallet transfer by its operation ID
POST
/
v1
/
api
/
wallet
/
transfer
/
status
Get Transfer Status
curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet/transfer/status \
--header 'Content-Type: <content-type>' \
--header 'authorization: <api-key>' \
--header 'x-access-id: <x-access-id>' \
--header 'x-request-id: <x-request-id>' \
--header 'x-timestamp: <x-timestamp>' \
--data '
{
"network": "TRON",
"operation_id": "f3b0c2d1e4a5..."
}
'const options = {
method: 'POST',
headers: {
authorization: '<api-key>',
'x-timestamp': '<x-timestamp>',
'x-request-id': '<x-request-id>',
'x-access-id': '<x-access-id>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({network: 'TRON', operation_id: 'f3b0c2d1e4a5...'})
};
fetch('https://secureapi.tender.cash/v1/api/wallet/transfer/status', 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/transfer/status"
payload = {
"network": "TRON",
"operation_id": "f3b0c2d1e4a5..."
}
headers = {
"authorization": "<api-key>",
"x-timestamp": "<x-timestamp>",
"x-request-id": "<x-request-id>",
"x-access-id": "<x-access-id>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://secureapi.tender.cash/v1/api/wallet/transfer/status",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'network' => 'TRON',
'operation_id' => 'f3b0c2d1e4a5...'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"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": "transfer status retrieved",
"data": {
"operation_id": "f3b0c2d1e4a5...",
"status": "succeed",
"transaction_hash": "7c1e9a...",
"message": "",
"confirmation_count": 1,
"provider": "gasfree"
}
}{
"status": "success",
"message": "transfer status retrieved",
"data": {
"operation_id": "f3b0c2d1e4a5...",
"status": "inprogress",
"transaction_hash": "",
"message": "",
"confirmation_count": 0,
"provider": "gasfree"
}
}{
"status": "error",
"message": "operation_id must be a string",
"data": null
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Transfer operation not found",
"data": null
}{
"status": "error",
"message": "Too many requests. Max 120 per 60s.",
"data": null
}{
"status": "error",
"message": "Wallet service is temporarily unavailable. Please try again.",
"data": null
}Auth method: Signed (HMAC) — this endpoint requires the full set of signed
headers:
x-access-id, x-request-id, x-timestamp, and an HMAC-SHA256
authorization signature. See Authentication.202 with an
operation_id. You can only look up operations created by your own merchant account.
The HTTP status tells you whether the operation is final:
200: the operation has settled (succeeded or failed).202: the operation is still in progress. Poll again later.
sub_user_wallet_transfer_confirmed or
sub_user_wallet_transfer_failed when the operation settles. If you poll, keep the interval at
10 seconds or more; this endpoint counts against the subwallet rate limit.
Status values
status is returned as-is from the gasless network and depends on the chain:
| Chain | In progress (202) | Succeeded (200) | Failed (200) |
|---|---|---|---|
EVM | pending | succeeded | failed |
TRON | waiting, inprogress, confirming | succeed | failed |
succeeded, succeed or failed as in progress.
Example
const res = await fetch(`${BASE}/wallet/transfer/status`, {
method: 'POST',
headers: makeHeaders(),
body: JSON.stringify({
network: 'TRON',
operation_id: 'f3b0c2d1e4a5...',
}),
});
const { data } = await res.json();
if (res.status === 202) {
// still in progress — data.status e.g. "inprogress"
} else if (data.status === 'failed') {
// data.message explains why
} else {
// settled — data.transaction_hash is the on-chain hash
}
res = requests.post(
f"{BASE}/wallet/transfer/status",
headers=make_headers(),
json={"network": "TRON", "operation_id": "f3b0c2d1e4a5..."},
)
data = res.json()["data"]
final = res.status_code == 200
Headers
string
required
Base64-encoded HMAC-SHA256 signature of
{"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="string
required
ISO 8601 timestamp; must be within 5 minutes of server timeExample:
"2026-10-15T09:45:53.000Z"string
required
A unique UUID v4 per requestExample:
"550e8400-e29b-41d4-a716-446655440000"string
required
Your API access IDExample:
"your-access-id-here"string
required
Example:
"application/json"Body
string
required
Network of the transfer:
EVM for ethereum transfers or TRON for tron transfers. The
aliases ethereum, eth and trx are also accepted, case-insensitively. Bitcoin transfers are
never gasless.Example: "TRON"string
required
The
operation_id returned by Transfer Funds.Example: "f3b0c2d1e4a5..."Response
string
required
Example:
"success"string
required
Example:
"transfer status retrieved"object
required
Show data properties
Show data properties
string
Example:
"f3b0c2d1e4a5..."string
Operation status. See Status values.Example:
"succeed"string
On-chain transaction hash once known; empty string before that.Example:
"7c1e9a..."string
Extra detail, mainly the failure reason. Often an empty string.Example:
""integer
On-chain confirmations recorded so far.
0 until the transaction is confirmed.Example: 1string
Identifier of the gasless service that ran the transfer, returned as-is.Example:
"gasfree"Error responses
| Condition | Status | Message |
|---|---|---|
| Missing or invalid field | 400 | Validation message, e.g. operation_id must be a string |
| Unknown operation, or one created by another merchant | 404 | Transfer operation not found |
| Network not supported for status lookups | 400 | Message describing the problem |
| Wallet service unavailable | 503 | Wallet service is temporarily unavailable. Please try again. |
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
Body
application/json