GET /v1/currencies
Returns the currencies this account has enabled for deposits or withdrawals, with per-currency limits and fees. Call this first when building a "choose a currency" picker — the response lists exactly what the user can deposit into or withdraw from on this account.
| Method & path | GET /v1/currencies |
| Required permission | list_currencies |
| Auth | HMAC — see Authentication |
Currencies are enabled per-account from the dashboard's Currencies page. A row appears in this response only if the merchant has toggled deposit_enabled or withdrawal_enabled (or both) for that currency, and the currency remains globally active on the gateway.
Query parameters
None. The response is always the full enabled set for the calling account.
Response
{
"success": true,
"message": "OK",
"data": [
{
"currency": "USDT",
"network": "ETH",
"name": "Tether USD",
"is_token": true,
"contract_address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"decimals": 6,
"deposit_enabled": true,
"withdrawal_enabled": true,
"min_deposit_amount": "0.000000000000000000",
"min_withdrawal_amount": "10.000000000000000000",
"withdrawal_fee_flat": "5.000000000000000000",
"withdrawal_fee_percent": "0.000000"
},
{
"currency": "ETH",
"network": "ETH",
"name": "Ether",
"is_token": false,
"contract_address": null,
"decimals": 18,
"deposit_enabled": true,
"withdrawal_enabled": false,
"min_deposit_amount": "0.000000000000000000",
"min_withdrawal_amount": "0.010000000000000000",
"withdrawal_fee_flat": "0.001000000000000000",
"withdrawal_fee_percent": "0.000000"
}
],
"data_count": 2
}
| Field | Type | Description |
|---|---|---|
currency | string | Currency symbol (e.g. USDT, ETH). Use this value verbatim as the currency field when calling POST /v1/deposit-addresses or POST /v1/withdrawals. |
network | string | Network code (e.g. ETH, BSC, TRX). Pair with currency to disambiguate same-symbol tokens across chains (USDT-ETH vs USDT-TRX). |
name | string | Display name. Safe to render in the user's currency picker. |
is_token | boolean | false for native chain currencies (ETH on Ethereum, BNB on BSC, TRX on Tron). true for ERC-20 / TRC-20 / BEP-20 tokens. |
contract_address | string | null | Token contract address. null for native currencies. |
decimals | integer | On-chain decimal precision. All amount fields on the API are in human units, not base units — you don't need this for arithmetic, only for display formatting. |
deposit_enabled | boolean | Whether the merchant has enabled deposits for this currency. When false, POST /v1/deposit-addresses will reject this currency + network pair. |
withdrawal_enabled | boolean | Whether the merchant has enabled withdrawals for this currency. When false, POST /v1/withdrawals will reject this currency + network pair. |
min_deposit_amount | string | Minimum deposit amount (decimal string, human units). Deposits below this are still credited but flagged in the dashboard. "0..." means no minimum. |
min_withdrawal_amount | string | Minimum withdrawal amount (decimal string, human units). POST /v1/withdrawals rejects amounts below this. |
withdrawal_fee_flat | string | Fixed fee deducted on withdrawal (decimal string, in the same currency as the withdrawal). |
withdrawal_fee_percent | string | Percentage fee deducted on withdrawal (decimal string; "0.5" means 0.5%). Applied on top of the flat fee. |
All decimal values are returned as strings to avoid float precision loss. Parse with decimal.Decimal (Python), BigNumber.js (Node), or similar.
Errors
Standard middleware errors only — no business-logic failures on this read endpoint.
| Status | Cause |
|---|---|
401 | Missing or invalid signature / timestamp / nonce. |
403 | Key lacks list_currencies, or source IP not whitelisted. |
429 | Rate limit exceeded. |
Code samples
Each sample assumes the sign_request(...) helper from the Authentication page is in scope.
- curl + bash
- Python
- Node.js
- PHP
METHOD="GET"
ENDPOINT="/v1/currencies"
QUERY=""
BODY=""
# ... sign exactly as on the Authentication page (same TS / BODY_HASH / CANONICAL / SIG block) ...
curl -sS "${BASE_URL}${ENDPOINT}" \
-H "X-CPG-Key: ${API_KEY}" \
-H "X-CPG-Timestamp: ${TS}" \
-H "X-CPG-Signature: ${SIG}"
headers = sign_request("GET", "/v1/currencies")
resp = requests.get(f"{BASE_URL}/v1/currencies", headers=headers, timeout=10)
resp.raise_for_status()
for row in resp.json()["data"]:
print(row["currency"], row["network"], row["deposit_enabled"], row["withdrawal_enabled"])
const headers = signRequest('GET', '/v1/currencies', '', '');
const resp = await fetch(`${BASE_URL}/v1/currencies`, { headers });
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const body = await resp.json();
for (const row of body.data) {
console.log(row.currency, row.network, row.deposit_enabled, row.withdrawal_enabled);
}
$headers = sign_request('GET', '/v1/currencies', '', '');
$ch = curl_init("$baseUrl/v1/currencies");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
echo curl_exec($ch);
curl_close($ch);
Notes
- Cache, but not for long. The list changes whenever the merchant toggles a currency in the dashboard. A 1–5 minute cache is reasonable; don't cache for a full session.
- Filter client-side. If you're rendering separate deposit and withdrawal pickers, filter on
deposit_enabled/withdrawal_enabledrather than calling the endpoint twice — the response already carries both flags per row. - Same-symbol tokens.
USDTexists on ETH, BSC, and TRX as three independent rows. Always paircurrencywithnetworkwhen calling subsequent write endpoints — passingcurrency=USDTalone is ambiguous. - Not paginated. Usually fewer than 20 rows; no
cursor/has_morefields.