Transfer Funds
curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet/transfer \
--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 '
{
"chain": "ethereum",
"currency": "usdt",
"sender": "0xabc123...",
"receiver": "0x999fff...",
"amount": 10.5,
"merchant_reference": "payout-9921",
"address_reference": "slot-2"
}
'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({
chain: 'ethereum',
currency: 'usdt',
sender: '0xabc123...',
receiver: '0x999fff...',
amount: 10.5,
merchant_reference: 'payout-9921',
address_reference: 'slot-2'
})
};
fetch('https://secureapi.tender.cash/v1/api/wallet/transfer', 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"
payload = {
"chain": "ethereum",
"currency": "usdt",
"sender": "0xabc123...",
"receiver": "0x999fff...",
"amount": 10.5,
"merchant_reference": "payout-9921",
"address_reference": "slot-2"
}
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",
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([
'chain' => 'ethereum',
'currency' => 'usdt',
'sender' => '0xabc123...',
'receiver' => '0x999fff...',
'amount' => 10.5,
'merchant_reference' => 'payout-9921',
'address_reference' => 'slot-2'
]),
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": "success",
"data": {
"tx_id": "0xabc123def456..."
}
}{
"status": "error",
"message": "Unsupported chain for subwallets"
}Subwallets
Transfer Funds
Send native coins or token assets from a subwallet address using a unified endpoint
POST
/
v1
/
api
/
wallet
/
transfer
Transfer Funds
curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet/transfer \
--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 '
{
"chain": "ethereum",
"currency": "usdt",
"sender": "0xabc123...",
"receiver": "0x999fff...",
"amount": 10.5,
"merchant_reference": "payout-9921",
"address_reference": "slot-2"
}
'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({
chain: 'ethereum',
currency: 'usdt',
sender: '0xabc123...',
receiver: '0x999fff...',
amount: 10.5,
merchant_reference: 'payout-9921',
address_reference: 'slot-2'
})
};
fetch('https://secureapi.tender.cash/v1/api/wallet/transfer', 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"
payload = {
"chain": "ethereum",
"currency": "usdt",
"sender": "0xabc123...",
"receiver": "0x999fff...",
"amount": 10.5,
"merchant_reference": "payout-9921",
"address_reference": "slot-2"
}
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",
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([
'chain' => 'ethereum',
'currency' => 'usdt',
'sender' => '0xabc123...',
'receiver' => '0x999fff...',
'amount' => 10.5,
'merchant_reference' => 'payout-9921',
'address_reference' => 'slot-2'
]),
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": "success",
"data": {
"tx_id": "0xabc123def456..."
}
}{
"status": "error",
"message": "Unsupported chain for subwallets"
}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.chain and currency.
The transfer is submitted on-chain asynchronously. When the transaction confirms, Tender fires a
SUB_USER_WALLET_TRANSFER_CONFIRMED webhook to your server.
Supported chains: ethereum, tron, bitcoin
Example
// Native coin transfer (e.g. ETH on Ethereum)
const res = await fetch(`${BASE}/wallet/transfer`, {
method: 'POST',
headers: makeHeaders(),
body: JSON.stringify({
chain: 'ethereum',
currency: 'ethereum',
sender: '0xabc123...',
receiver: '0x999fff...',
amount: 0.01,
merchant_reference: 'payout-9921',
address_reference: 'slot-2',
}),
});
const { data } = await res.json();
// data.tx_id → "0xabc123def456..."
// Token transfer (e.g. USDT on Tron)
const res2 = await fetch(`${BASE}/wallet/transfer`, {
method: 'POST',
headers: makeHeaders(),
body: JSON.stringify({
chain: 'tron',
currency: 'usdt',
sender: 'TXYZop...',
receiver: 'TABCef...',
amount: 50,
merchant_reference: 'payout-9922',
address_reference: 'slot-2',
}),
});
const { data: data2 } = await res2.json();
// data2.tx_id → "abc123def456..."
import requests, json
# Native coin transfer (e.g. ETH on Ethereum)
res = requests.post(
f"{BASE}/wallet/transfer",
headers=make_headers(),
json={
"chain": "ethereum",
"currency": "ethereum",
"sender": "0xabc123...",
"receiver": "0x999fff...",
"amount": 0.01,
"merchant_reference": "payout-9921",
"address_reference": "slot-2",
},
)
tx_id = res.json()["data"]["tx_id"]
# Token transfer (e.g. USDT on Tron)
res2 = requests.post(
f"{BASE}/wallet/transfer",
headers=make_headers(),
json={
"chain": "tron",
"currency": "usdt",
"sender": "TXYZop...",
"receiver": "TABCef...",
"amount": 50,
"merchant_reference": "payout-9922",
"address_reference": "slot-2",
},
)
tx_id2 = res2.json()["data"]["tx_id"]
Headers
string
required
Base64-encoded HMAC-SHA256 signature of the request payload using the API secretExample:
"5e73d044c44d733fcf819ad3409aaad..."string
required
Current timestamp in ISO 8601 formatExample:
"2025-03-15T09:45:53.000Z"string
required
Unique identifier for the request (UUID v4)Example:
"550e8400-e29b-41d4-a716-446655440000"string
required
Your API access ID provided by TenderExample:
"your-access-id-here"string
required
Example:
"application/json"Body
string
required
The chain to use for the transfer. Supported values:
ethereum, tron, bitcoin.Example: "ethereum"string
required
The currency to transfer (e.g.
ethereum, usdt, usdc, bitcoin). Must be supported on the
specified chain.Example: "usdt"string
required
The subwallet address to send from.Example:
"0xabc123..."string
required
The destination address.Example:
"0x999fff..."number | string
required
Amount to transfer in human-readable units (e.g.
0.01 ETH, 50 USDT).Example: 10.5string
required
Your own reference for this transfer, for idempotency and reconciliation.Example:
"payout-9921"string
required
The address reference label of the sender address.Example:
"slot-2"Response
string
required
Example:
"success"string
required
Example:
"success"object
required
Show data properties
Show data properties
string
The on-chain transaction hash.Example:
"0xabc123def456..."Error Responses
| Condition | Status | Message |
|---|---|---|
| Invalid chain | 400 | invalid chain: <chain> |
| Invalid currency | 400 | invalid currency: <currency> |
| Chain not supported for subwallets | 400 | Unsupported chain for subwallets |
| Currency not valid on that chain | 400 | Unsupported currency for chain <chain> |
| No contract address for token on chain | 400 | no contract address for <currency> on <chain> |
Authorizations
Signed (HMAC) authentication. Required headers: x-access-id, x-request-id (UUID v4), x-timestamp (ISO 8601), and authorization (Base64 HMAC-SHA256 signature of {timeStamp, requestId, accessId} using your access secret).
Headers
Body
application/json
Chain to use for the transfer.
Available options:
ethereum, tron, bitcoin Currency to transfer (e.g. ethereum, usdt, usdc, bitcoin). Must be supported on the specified chain.
Response
Transfer submitted