curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet/address \
--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 '
{
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"networks": [
"EVM",
"TRON"
]
}
'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({
wallet_reference: 'acme-user-8821',
address_reference: 'acme-user-8821-slot-2',
networks: ['EVM', 'TRON']
})
};
fetch('https://secureapi.tender.cash/v1/api/wallet/address', 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/address"
payload = {
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"networks": ["EVM", "TRON"]
}
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/address",
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([
'wallet_reference' => 'acme-user-8821',
'address_reference' => 'acme-user-8821-slot-2',
'networks' => [
'EVM',
'TRON'
]
]),
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": {
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"addresses": [
{
"network": "EVM",
"address": "0x4f2a9b...",
"gasless_address": "0x9c1b7e...",
"address_reference": "3f6c1e9a-2b7d-4e8f-9a10-5c4b3a2d1e0f"
}
]
}
}{
"status": "error",
"message": "Wallet reference not found for this merchant",
"data": null
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Address with this reference already exists",
"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
}Create Address
Generate additional blockchain addresses on specific networks for an existing subwallet
curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet/address \
--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 '
{
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"networks": [
"EVM",
"TRON"
]
}
'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({
wallet_reference: 'acme-user-8821',
address_reference: 'acme-user-8821-slot-2',
networks: ['EVM', 'TRON']
})
};
fetch('https://secureapi.tender.cash/v1/api/wallet/address', 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/address"
payload = {
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"networks": ["EVM", "TRON"]
}
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/address",
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([
'wallet_reference' => 'acme-user-8821',
'address_reference' => 'acme-user-8821-slot-2',
'networks' => [
'EVM',
'TRON'
]
]),
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": {
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"addresses": [
{
"network": "EVM",
"address": "0x4f2a9b...",
"gasless_address": "0x9c1b7e...",
"address_reference": "3f6c1e9a-2b7d-4e8f-9a10-5c4b3a2d1e0f"
}
]
}
}{
"status": "error",
"message": "Wallet reference not found for this merchant",
"data": null
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Address with this reference already exists",
"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
}x-access-id, x-request-id, x-timestamp, and an HMAC-SHA256
authorization signature. See Authentication.address_reference.
address_reference values are globally unique across Tender. Reusing one, even in a
different wallet, fails with 409.Example
const res = await fetch(`${BASE}/wallet/address`, {
method: 'POST',
headers: makeHeaders(),
body: JSON.stringify({
wallet_reference: 'acme-user-8821',
address_reference: 'acme-user-8821-slot-2',
networks: ['EVM', 'TRON'],
}),
});
const { data } = await res.json();
/*
{
wallet_reference: 'acme-user-8821',
address_reference: 'acme-user-8821-slot-2',
addresses: [
{ network: 'EVM', address: '0x1a2b...', gasless_address: '0x7d8e...', address_reference: 'acme-user-8821-slot-2' },
{ network: 'TRON', address: 'TPx3...', gasless_address: 'TLq9...', address_reference: 'acme-user-8821-slot-2' }
]
}
*/
res = requests.post(
f"{BASE}/wallet/address",
headers=make_headers(),
json={
"wallet_reference": "acme-user-8821",
"address_reference": "acme-user-8821-slot-2",
"networks": ["EVM", "TRON"],
},
)
data = res.json()["data"]
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""application/json"Body
reference of a wallet you created with Create Wallet.Example: "acme-user-8821""acme-user-8821-slot-2"EVM, TRON or BTC. The aliases
ethereum, eth, trx and bitcoin are also accepted, but each returned network echoes the
value you sent, so use the canonical values to keep your records consistent with the rest of
the API.Example: ["EVM", "TRON"]Response
"success""success"Show data properties
Show data properties
"acme-user-8821""acme-user-8821-slot-2"Error responses
| Condition | Status | Message |
|---|---|---|
| Missing or invalid field | 400 | Validation message, e.g. networks must contain at least 1 elements |
address_reference already exists | 409 | Address with this reference already exists |
| Wallet belongs to another merchant | 400 | Wallet reference not found for this merchant |
| Wallet not found or network not supported | 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
500"acme-user-8821"
Globally unique across Tender.
500"acme-user-8821-slot-2"
EVM, TRON or BTC (aliases ethereum, eth, trx, bitcoin accepted).
1["EVM", "TRON"]