Wallet Webhook Events
BLOX sends these webhook events for the token deposits and the fiat withdrawals on your account. To get them, register an endpoint of type WALLET in the dashboard (Devtools → Webhooks).
For automatic withdrawal on deposit, these webhook events are the only notification. You do not send a request to start the fiat withdrawal, so no response gives you its status.
For registration, signature verification, retries, and URL rules, refer to Webhooks.
Events
| Event | BLOX sends it when |
|---|---|
wallet.deposit.updated | A token deposit is confirmed on chain, BLOX credits the deposit, or the deposit is retried. |
wallet.withdrawal.updated | The status of a fiat withdrawal to your linked bank account changes. |
BLOX sends wallet.deposit.updated two times for each deposit. The status field of the payload shows which event it is:
status | When | result |
|---|---|---|
PROCESSING | The deposit transaction is confirmed on chain. The tokens are not in your wallet balance yet. | null |
COMPLETED | BLOX credited the tokens to your wallet balance. BLOX also decided the result of the fiat withdrawal that the deposit started. | The result of the fiat withdrawal, or null for an ordinary deposit address |
Only the COMPLETED status shows that the tokens are in your wallet balance. BLOX usually credits the tokens a few minutes after confirmation. On Ethereum, this takes longer when network fees are high.
After a retry, BLOX can send a PROCESSING event after the COMPLETED event for the same deposit. If a deposit has the status COMPLETED in your records, do not change it to a different status.
BLOX sends both events also for a deposit that does not start a fiat withdrawal. Examples are a deposit to an ordinary deposit address and a deposit from an address that is not an allowed sender.
BLOX sends these events for deposits on all networks. This also applies to Solana. On Solana, txHash is the transaction signature (base58) and chainId is 101.
Envelope
{
"eventId": "wallet.deposit.updated:5e9d0273-...:COMPLETED:COMPLETED",
"event": "wallet.deposit.updated",
"webhookType": "WALLET",
"timestamp": "2026-08-07T09:34:22.000Z",
"data": {}
}| Field | Description |
|---|---|
eventId | The unique identifier of the event. Use it to process each event one time. Treat it as an opaque string. |
event | The event name |
webhookType | WALLET for these events |
timestamp | The time of the event, in ISO 8601 format |
data | The payload of the event. Its fields change with the event. |
Each deposit status has its own event with its own eventId. A retried deposit has one more event. Use eventId as the key in your handler. If you get an eventId that you processed before, ignore the event.
Event data
wallet.deposit.updated
{
"id": "5e9d0273-8a41-4c62-b0f7-1d3e8c95a460",
"txHash": "0x5d5355...103ee3",
"logIndex": 12,
"chainId": 1,
"tokenId": "a71c4e08-2f96-4b3d-85ae-6c0f7d21b943",
"amount": "100000",
"from": "0x9a3f7c21b8e04d6f5a19c2e70b48d3f61a5e9d02",
"status": "COMPLETED",
"confirmations": 24,
"triggerAddress": "0x7c1a3e889d2b4f618a441f0b6d3c9a5588ab01cd",
"destination": { "type": "BANK_ACCOUNT", "id": "b21f4c77-...", "name": "ACME SDN BHD" },
"result": { "status": "FAILED", "statusReason": "sender_not_allowed", "withdrawal": null },
"createdAt": "2026-08-07T09:30:44.000Z",
"updatedAt": "2026-08-07T09:34:22.000Z"
}The fields are the same as the fields of the deposit that GET /v1/wallet/deposits/{id} returns. For the full table and the status reason values, refer to that endpoint.
To get the result, read result.status. If the deposit went to an ordinary deposit address, result is null.
wallet.withdrawal.updated
{
"withdrawalId": "c4a80f13-6d29-4e75-83b1-9f0c2a7e5d68",
"status": "COMPLETED",
"statusReason": null,
"amount": "100000",
"refId": "FW-20260807-0001",
"reference": "ACME payout",
"destination": { "type": "BANK_ACCOUNT", "id": "b21f4c77-...", "name": "ACME SDN BHD" },
"depositId": "5e9d0273-8a41-4c62-b0f7-1d3e8c95a460",
"createdAt": "2026-08-07T09:31:05.000Z",
"updatedAt": "2026-08-07T09:34:22.000Z"
}| Field | Type | Description |
|---|---|---|
withdrawalId | string (UUID) | The id of the fiat withdrawal in GET /v1/wallet/fiat/withdrawals/{id} |
status | string | PENDING, PROCESSING, COMPLETED, REJECTED, FAILED, CANCELLED |
statusReason | string | null | Has a value only for REJECTED, FAILED, and CANCELLED |
amount | string | The amount in sen |
refId | string | The bank reference |
reference | string | null | Your reference |
destination | object | null | The linked bank account that gets the money |
depositId | string | null | The deposit that started the fiat withdrawal, or null for a fiat withdrawal that you created |
Use depositId to connect the two events. Only this field shows the difference between a fiat withdrawal that a deposit started and a fiat withdrawal that you created with POST /v1/wallet/fiat/withdrawals.