CRYPTO_WITHDRAW_WEBHOOK endpoint. Verify the signature header and respond with {"callbackStatus": "SUCCESS"} to acknowledge receipt.
The event covers:
- Withdrawals to external addresses created with Create Crypto Withdrawal or in the VelaFi dashboard.
- Mass payout items sent to external addresses.
- Automatic withdrawals of on-ramp orders to the order’s destination address. These also trigger
ON_RAMP_WITHDRAW_WEBHOOKwhen they succeed, so if you subscribe to both event types you receive two notifications for the same transfer.
- Withdrawals to a VelaFi wallet address created with Create Crypto Withdrawal or in the dashboard. These are booked as internal transfers and appear in Crypto Transfer History.
- Stablecoin payment refunds, even though they appear in Get Crypto Withdrawal History.
- Withdrawals that are still in progress, waiting for approval, or under review. Only final statuses are sent.
Register this event type with Create Webhook using
"eventType": "CRYPTO_WITHDRAW_WEBHOOK". As with all event types, one webhook receives the event for every merchant under your account, and webhooks are not triggered in the sandbox.Request Headers
Payload Fields
All values are sent as JSON strings.string
The ID of the webhook the event was queued for.
string
Always
CRYPTO_WITHDRAW_WEBHOOK for this event type.string
Withdrawal record ID. It matches the
orderId returned by Create Crypto Withdrawal and by Get Crypto Withdrawal History.string
The
clientId of the withdrawal: the value you supplied in Create Crypto Withdrawal, or the on-ramp orderId for an automatic on-ramp withdrawal. All items of a mass payout share the same value, in the format masspayout:<id>. Empty if the withdrawal has none.string
Your VelaFi account (user) ID.
string
Merchant whose wallet was debited.
string
Token symbol, for example
USDT.string
Network of the withdrawal, for example
TRC20. This is the same value as chainType in Get Withdrawal Quota.string
Destination address.
string
Withdrawal amount (the same value as
cryptoAmount in Get Crypto Withdrawal History).string
Network fee, in the same token as
crypto. Always 0 for automatic on-ramp withdrawals.string
amount minus fee (the same value as arriveCryptoAmount in Get Crypto Withdrawal History).string
Final result of the withdrawal:
SUCCESS— the withdrawal was completed on-chain.FAILED— the withdrawal failed or was rejected by VelaFi, and the amount was returned to the wallet balance.REFUNDED— the funds had already left VelaFi’s wallet, came back, and were returned to the wallet balance. Handle it the same way asFAILED.CANCELLED— the withdrawal was cancelled in the VelaFi dashboard before it was sent, and the amount was returned to the wallet balance. The Open API has no cancel endpoint.
string
The matching
status code from Get Crypto Withdrawal History: 6 for SUCCESS, 7 for FAILED and REFUNDED, and 9 for CANCELLED.string
On-chain transaction hash. Only included when
status is SUCCESS.string
Time the withdrawal was created (Unix timestamp in milliseconds).
string
Time the withdrawal reached its final status (Unix timestamp in milliseconds).
string
Unix timestamp (milliseconds) at which this delivery attempt was signed.
Example Payloads
- SUCCESS
- FAILED
Incoming POST body
Required Response
Return an HTTP2xx status (for example 200) with the following JSON body to acknowledge receipt:
Your response
Handling Notes
- One final event per withdrawal. VelaFi sends the event once a withdrawal reaches a final status. Intermediate states, such as approval or review, are not sent. To check a withdrawal before it is final, use Get Crypto Withdrawal History.
- Duplicates. The same event can arrive more than once, so deduplicate on
withdrawIdandstatus. See Delivery and Retries. - Reconcile missed events. If your endpoint misses all delivery attempts, the event is not redelivered. Reconcile pending withdrawals against Get Crypto Withdrawal History, matching on
clientIdor, for mass payout items, onwithdrawId(orderIdin the history). Don’t keep a user’s balance locked on your side indefinitely. - Replacing a webhook. Unlike other event types, pending deliveries go only to the webhook they were queued for. If you create a new
CRYPTO_WITHDRAW_WEBHOOKwebhook after deleting or disabling the old one, events still queued for the old webhook are not delivered. To change where events go, update the URL of the existing webhook with Update Webhook instead. A disabled webhook’s pending events are delivered if you re-enable that same webhook without creating another one.