curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet \
--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 '
{
"reference": "acme-user-8821"
}
'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({reference: 'acme-user-8821'})
};
fetch('https://secureapi.tender.cash/v1/api/wallet', 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"
payload = { "reference": "acme-user-8821" }
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",
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([
'reference' => 'acme-user-8821'
]),
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": {
"reference": "acme-user-8821",
"addresses": [
{
"network": "EVM",
"address": "0x4f2a9b...",
"gasless_address": "0x9c1b7e...",
"address_reference": "3f6c1e9a-2b7d-4e8f-9a10-5c4b3a2d1e0f"
}
]
}
}{
"status": "error",
"message": "reference must be a string",
"data": null
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Wallet 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 Wallet
Provision a new subwallet for an end-user under your merchant account
curl --request POST \
--url https://secureapi.tender.cash/v1/api/wallet \
--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 '
{
"reference": "acme-user-8821"
}
'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({reference: 'acme-user-8821'})
};
fetch('https://secureapi.tender.cash/v1/api/wallet', 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"
payload = { "reference": "acme-user-8821" }
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",
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([
'reference' => 'acme-user-8821'
]),
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": {
"reference": "acme-user-8821",
"addresses": [
{
"network": "EVM",
"address": "0x4f2a9b...",
"gasless_address": "0x9c1b7e...",
"address_reference": "3f6c1e9a-2b7d-4e8f-9a10-5c4b3a2d1e0f"
}
]
}
}{
"status": "error",
"message": "reference must be a string",
"data": null
}{
"status": "error",
"message": "INVALID_REQUEST_SIGNATURE",
"data": null
}{
"status": "error",
"message": "Wallet 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. To add more addresses later, use
Create Address.
409. Prefix references with something
specific to your platform (for example acme-user-8821).Example
const res = await fetch(`${BASE}/wallet`, {
method: 'POST',
headers: makeHeaders(),
body: JSON.stringify({ reference: 'acme-user-8821' }),
});
const { data } = await res.json();
/*
{
reference: 'acme-user-8821',
addresses: [
{ network: 'EVM', address: '0x4f2a...', gasless_address: '0x9c1b...', address_reference: '3f6c1e9a-...' },
{ network: 'TRON', address: 'TQ7x...', gasless_address: 'TJm4...', address_reference: '8b2d47f0-...' },
{ network: 'BTC', address: 'bc1q...', gasless_address: '', address_reference: 'c90e5a12-...' }
]
}
*/
res = requests.post(
f"{BASE}/wallet",
headers=make_headers(),
json={"reference": "acme-user-8821"},
)
data = res.json()["data"]
# data["reference"] → "acme-user-8821"
# data["addresses"] → list of address objects
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
wallet_reference / merchant_reference in later calls.
Maximum 500 characters.Example: "acme-user-8821"Response
"success""success"Show data properties
Show data properties
"acme-user-8821"Show address object
Show address object
EVM, TRON or BTC. More
values can appear as networks are added; treat the value as an opaque label.Example: "EVM""0x4f2a9b...""0x9c1b7e..."address_reference when you
transfer from this address.Example: "3f6c1e9a-2b7d-4e8f-9a10-5c4b3a2d1e0f"Error responses
| Condition | Status | Message |
|---|---|---|
reference missing or invalid | 400 | Validation message, e.g. reference must be a string |
| Reference already exists | 409 | Wallet with this reference already exists |
| Wallet service unavailable | 503 | Wallet service is temporarily unavailable. Please try again. |
503 means the wallet was not created, or its state is unknown. Retry with the same reference;
if the wallet was created, the retry returns 409 and you can read it with
List Wallets.
This endpoint shares the subwallet rate limit of 120 requests per minute. See
Rate limits.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
Wallet reference. Globally unique across Tender.
500"acme-user-8821"