Webhook events
This page lists every event Aeses can deliver. Each event includes a full snapshot of the resource in data (see the payload shape) — you do not need to fetch the resource again, unless you need state that changed after the event was queued.
Deposit events
deposit.created
Fired when a new deposit address is generated. The customer has not paid yet.
{
"id": "evt_01j9x7m2p5rt",
"event": "deposit.created",
"created_at": 1731598200,
"data": {
"object": "deposit",
"id": "dep_3f2a9c1e7b8d4a6f9e0c1b2a3d4e5f60",
"status": "pending",
"asset": "USDC",
"chain": "ethereum",
"expected_amount": "99.50",
"received_amount": null,
"deposit_address": "0x8f3a...8A9",
"reference_id": "order_1042",
"webhook_url": "https://example.com/webhooks/aeses",
"metadata": null,
"tx_hash": null,
"confirmations": 0,
"expires_at": 1731600000,
"created_at": 1731598200
}
}deposit.confirming
The first on-chain confirmation has been seen. Funds are not yet credited to your balance — wait for deposit.completed. Useful for showing a "Payment received, awaiting confirmations" state in your UI.
deposit.completed
The deposit has reached the network-specific confirmation threshold and the amount has been credited to your internal balance. This is the canonical "money has arrived" event.
deposit.underpaid
The deposit completed, but the received amount was less than expected_amount. The funds are credited; reconcile the difference with the customer.
deposit.overpaid
The deposit completed with more than expected_amount. The full amount is credited; treat the overage according to your business rules.
deposit.expired
The deposit address window (30 minutes) passed without enough confirmations. Funds sent after expiry are still credited but may require manual reconciliation in the dashboard.
deposit.cancelled
The deposit was cancelled (by you via the API or by our operations team). Funds are not credited.
Withdrawal events
Withdrawal events are delivered to the webhook_url sent when the withdrawal was created. The body is:
{
"id": "evt_k3j9x0a1b2c3",
"event": "withdrawal.broadcasted",
"created_at": 1731600360,
"data": {
"object": "withdrawal",
"id": "wd_3f2a9c1e7b8d4a6f9e0c1b2a3d4e5f60",
"status": "broadcasted",
"asset": "USDT",
"chain": "ethereum",
"amount": "150.00000000",
"fee": "1.25000000",
"net_amount": null,
"address": "0xRecipient...",
"tx_hash": "0xabc123...",
"reference_id": "po_8821",
"webhook_url": "https://example.com/webhooks/aeses",
"metadata": null,
"fail_reason": null,
"created_at": 1731600300
}
}withdrawal.created
A new withdrawal has been accepted into the queue. The on-chain transaction has not yet been broadcast.
withdrawal.processing
The withdrawal was approved and is queued for signing. Only sent for withdrawals that required manual approval.
withdrawal.broadcasted
The transaction has been signed and broadcast to the network; data.tx_hash is set. The recipient has not been paid yet — the transaction still needs to be mined and confirmed, and can still be dropped or reverted. Show it as "processing" in your UI.
withdrawal.completed
The transaction was mined successfully and reached the network's confirmation threshold. This is the canonical "recipient was paid" event. Your balance was debited at creation time, not now.
withdrawal.failed
The withdrawal failed permanently (e.g. network rejection, reverted transaction, or a transaction dropped by the network). Your balance is refunded automatically. data.fail_reason explains why. This event can arrive after withdrawal.broadcasted.
withdrawal.cancelled
The withdrawal was cancelled before broadcast. Your balance is refunded.
Handling withdrawal events
- Treat a withdrawal as paid only on
withdrawal.completed. - Events can be retried and, exceptionally, re-sent (e.g. after a manual review by our operations team). Deduplicate by
data.id+eventand make your handler idempotent. - Apply status by precedence, not arrival order:
completed,failedandcancelledare final; never move a final withdrawal back tobroadcasted. - Use
data.tx_hashfrom the latest event — it can change betweenbroadcastedandcompletedin the rare case where the original transaction was dropped and the payout settled through another one. - If you need the current state, call
GET /v1/withdrawals/:id.
Event metadata
Beyond data, every event includes:
| Field | Description |
| ------------ | ------------------------------------------------------ |
| id | Unique event ID. |
| event | One of the values above. |
| created_at | Unix timestamp (seconds) when the event was generated. |
To deduplicate, use data.id + event (or the X-Webhook-Id header for retries of the same delivery).
Subscribing to specific events
By default, all events are delivered to all configured webhook endpoints. You can filter events per endpoint in Dashboard → Developers → Webhooks. Filtering is a server-side feature — your endpoint will simply not receive events it is not subscribed to.