GET /v1/hot-wallet-address
Returns the address of your hot wallet for a given network. This is the address you (or your end-users) need to fund in order to enable withdrawals — the gateway broadcasts outgoing withdrawal transactions from this address, so it needs to hold both the asset and enough native currency for gas/fees.
| Method & path | GET /v1/hot-wallet-address |
| Required permission | request_withdrawal_funding_address |
| Auth | HMAC — see Authentication |
The hot wallet is allocated automatically the first time you enable any currency on a given network from the dashboard. There is exactly one hot wallet per (account, network).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
network | string | required | Network code (e.g. ETH, BSC, TRX). |
Response
{
"success": true,
"message": "OK",
"data": {
"network": "ETH",
"address": "0xhot...wallet"
}
}
| Field | Type | Description |
|---|---|---|
network | string | Echoes the requested network code, uppercased. |
address | string | Your hot wallet address for this network. Send funds here. |
Errors
| Status | Cause |
|---|---|
401 / 403 / 429 | Standard middleware — see Errors page. |
404 "Network not found" | The network query parameter doesn't match any active network. |
404 "Hot wallet has not been allocated for this network. Enable at least one currency first." | The network exists but you haven't enabled any currency on it yet, so no hot wallet was generated. Open the dashboard's Currencies page and enable one. |
Code samples
Examples assume sign_request(...) from the Authentication page.
- curl + bash
- Python
- Node.js
- PHP
METHOD="GET"
ENDPOINT="/v1/hot-wallet-address"
QUERY="network=ETH"
BODY=""
# ... sign as on the Authentication page ...
curl -sS "${BASE_URL}${ENDPOINT}?${QUERY}" \
-H "X-CPG-Key: ${API_KEY}" \
-H "X-CPG-Timestamp: ${TS}" \
-H "X-CPG-Signature: ${SIG}"
query = "network=ETH"
headers = sign_request("GET", "/v1/hot-wallet-address", query=query)
resp = requests.get(f"{BASE_URL}/v1/hot-wallet-address?{query}", headers=headers, timeout=10)
resp.raise_for_status()
print(resp.json())
const query = 'network=ETH';
const headers = signRequest('GET', '/v1/hot-wallet-address', '', query);
const resp = await fetch(`${BASE_URL}/v1/hot-wallet-address?${query}`, { headers });
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
console.log(await resp.json());
$query = 'network=ETH';
$headers = sign_request('GET', '/v1/hot-wallet-address', '', $query);
$ch = curl_init("$baseUrl/v1/hot-wallet-address?$query");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
echo curl_exec($ch);
curl_close($ch);
Notes
- Cache the response. The hot wallet address for a given
(account, network)is permanent — fetch once and store it. The endpoint is idempotent and safe to re-call, but you don't need to. - Funding requirement. A hot wallet that holds the token (e.g. USDT on ETH) still can't broadcast withdrawals if it lacks native currency for gas. For EVM networks, fund the hot wallet with both the token and enough ETH/BNB/MATIC to cover several transactions. The gateway will attempt automatic gas top-ups but never magic gas into existence.
- Hot vs receiving wallets. Don't confuse this with the receiving wallet — that's a separate address you configure (per network) where deposits are swept to from per-deposit addresses. The hot wallet is for outgoing funds; the receiving wallet is for incoming deposit sweeps. Use the dashboard's Receiving Wallets page to configure receiving wallets.