GET /v1/withdrawals/{withdrawal_id}
Returns the current status of a withdrawal — its on-chain hash (once broadcast), confirmation timestamps, and failure reason if anything went wrong.
| Method & path | GET /v1/withdrawals/{withdrawal_id} |
| Required permission | read_withdrawal_status |
| Auth | HMAC — see Authentication |
To submit a new withdrawal, see POST /v1/withdrawals.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
withdrawal_id | integer | required | The withdrawal_id returned by POST /v1/withdrawals. |
Cross-account requests return 404.
Response
{
"success": true,
"message": "OK",
"data": {
"id": 17,
"currency": "USDT",
"network": "ETH",
"to_address": "0xrecipient...",
"amount": "50.000000",
"fee": "0.500000",
"status": "confirmed",
"tx_hash": "0xwd...",
"error_message": null,
"requested_at": "2026-05-16T22:00:00+00:00",
"broadcast_at": "2026-05-16T22:00:05+00:00",
"confirmed_at": "2026-05-16T22:05:30+00:00"
}
}
| Field | Type | Description |
|---|---|---|
id | integer | The withdrawal's primary key. Matches the path parameter. |
currency | string | Currency symbol. |
network | string | Network code. |
to_address | string | Destination address you supplied on submission. |
amount | string | Withdrawal amount (decimal string). |
fee | string | Fee charged on top of amount — see "Notes" below. |
status | string | Lifecycle state — see table below. |
tx_hash | string | null | On-chain transaction hash. null until broadcast succeeds. |
error_message | string | null | Raw error string when status='failed'. null otherwise. |
requested_at | ISO-8601 UTC | When you submitted the withdrawal. |
broadcast_at | ISO-8601 UTC | null | When the chain microservice accepted the transaction. null until broadcast. |
confirmed_at | ISO-8601 UTC | null | When confirmations crossed network.min_confirmations. null until confirmed. |
status values
| Value | Meaning |
|---|---|
pending | Submitted; balance is held; broadcast not yet attempted. |
broadcasted | Sent to the chain; awaiting confirmations. tx_hash is set from this point on. |
confirmed | On-chain confirmations met; balance debited; final state. |
failed | Broadcast was rejected or never confirmed. Hold is released. error_message carries the cause. |
cancelled | Admin cancelled the withdrawal before broadcast. Hold is released. |
Errors
| Status | Cause |
|---|---|
401 / 403 / 429 | Standard middleware — see Errors page. |
404 | withdrawal_id doesn't exist, or belongs to another account. |
Code samples
Examples assume sign_request(...) from the Authentication page.
- curl + bash
- Python
- Node.js
- PHP
WITHDRAWAL_ID="17"
METHOD="GET"
ENDPOINT="/v1/withdrawals/${WITHDRAWAL_ID}"
QUERY=""
BODY=""
# ... sign as on the Authentication page ...
curl -sS "${BASE_URL}${ENDPOINT}" \
-H "X-CPG-Key: ${API_KEY}" \
-H "X-CPG-Timestamp: ${TS}" \
-H "X-CPG-Signature: ${SIG}"
withdrawal_id = 17
path = f"/v1/withdrawals/{withdrawal_id}"
headers = sign_request("GET", path)
resp = requests.get(f"{BASE_URL}{path}", headers=headers, timeout=10)
resp.raise_for_status()
print(resp.json())
const withdrawalId = 17;
const path = `/v1/withdrawals/${withdrawalId}`;
const headers = signRequest('GET', path);
const resp = await fetch(`${BASE_URL}${path}`, { headers });
if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
console.log(await resp.json());
$withdrawalId = 17;
$path = "/v1/withdrawals/$withdrawalId";
$headers = sign_request('GET', $path);
$ch = curl_init("$baseUrl$path");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
echo curl_exec($ch);
curl_close($ch);
Notes
- Prefer webhooks. Subscribe to
withdrawal.broadcasted,withdrawal.confirmed, andwithdrawal.failedinstead of polling. Poll only as a fallback when a delivery is missed. feeis calculated server-side asamount * withdrawal_fee_percent / 100 + withdrawal_fee_flatfrom the currency's admin-set fee config. It is debited from your balance in addition toamountwhen the withdrawal confirms.heldon/v1/balancesreflects this withdrawal until it confirms or fails. The hold isamount + fee. Onconfirmed, bothbalanceandhelddecrement by that total. Onfailedorcancelled, onlyhelddecrements (balance is unchanged).