Skip to main content

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 & pathGET /v1/withdrawals/{withdrawal_id}
Required permissionread_withdrawal_status
AuthHMAC — see Authentication

To submit a new withdrawal, see POST /v1/withdrawals.

Path parameters

NameTypeRequiredDescription
withdrawal_idintegerrequiredThe 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"
}
}
FieldTypeDescription
idintegerThe withdrawal's primary key. Matches the path parameter.
currencystringCurrency symbol.
networkstringNetwork code.
to_addressstringDestination address you supplied on submission.
amountstringWithdrawal amount (decimal string).
feestringFee charged on top of amount — see "Notes" below.
statusstringLifecycle state — see table below.
tx_hashstring | nullOn-chain transaction hash. null until broadcast succeeds.
error_messagestring | nullRaw error string when status='failed'. null otherwise.
requested_atISO-8601 UTCWhen you submitted the withdrawal.
broadcast_atISO-8601 UTC | nullWhen the chain microservice accepted the transaction. null until broadcast.
confirmed_atISO-8601 UTC | nullWhen confirmations crossed network.min_confirmations. null until confirmed.

status values

ValueMeaning
pendingSubmitted; balance is held; broadcast not yet attempted.
broadcastedSent to the chain; awaiting confirmations. tx_hash is set from this point on.
confirmedOn-chain confirmations met; balance debited; final state.
failedBroadcast was rejected or never confirmed. Hold is released. error_message carries the cause.
cancelledAdmin cancelled the withdrawal before broadcast. Hold is released.

Errors

StatusCause
401 / 403 / 429Standard middleware — see Errors page.
404withdrawal_id doesn't exist, or belongs to another account.

Code samples

Examples assume sign_request(...) from the Authentication page.

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}"

Notes

  • Prefer webhooks. Subscribe to withdrawal.broadcasted, withdrawal.confirmed, and withdrawal.failed instead of polling. Poll only as a fallback when a delivery is missed.
  • fee is calculated server-side as amount * withdrawal_fee_percent / 100 + withdrawal_fee_flat from the currency's admin-set fee config. It is debited from your balance in addition to amount when the withdrawal confirms.
  • held on /v1/balances reflects this withdrawal until it confirms or fails. The hold is amount + fee. On confirmed, both balance and held decrement by that total. On failed or cancelled, only held decrements (balance is unchanged).