Events
This page documents the events eSingPay can deliver, the HTTP request format, and the structure of the payload your endpoint receives. To configure an endpoint, see Setup.
Event Types
When you create a webhook subscription, you choose which of the following event types to receive. Each event corresponds to a status change on a deposit or a withdrawal intent.
| Event Key | Triggered When |
|---|---|
deposit.created | A deposit has been detected and is being prepared. |
deposit.completed | A deposit has completed and funds are credited. |
deposit.failed | A deposit has failed or is invalid. |
deposit.under_review | A deposit has entered review and is on hold pending the outcome. |
deposit.blocked | A deposit has been blocked. |
withdrawal.created | A withdrawal intent has been created and is being prepared. |
withdrawal.completed | A withdrawal intent has completed. |
withdrawal.failed | A withdrawal intent has failed. |
withdrawal.cancelled | A withdrawal intent has been cancelled. |
Request Format
eSingPay delivers each event as an HTTP request with the following characteristics:
- Method:
POST - Content-Type:
application/json - Body: the event payload as JSON.
Payload
Every event shares the same top-level envelope. The data field holds the resource that changed.
| Field | Type | Description |
|---|---|---|
id | string | Unique delivery ID, prefixed with WD_. Use it as an idempotency key. |
eventKey | string | The event type. See Event Types. |
occurredAt | IsoDateTimeUtc | Time the underlying status change occurred. |
deliveredAt | IsoDateTimeUtc | Time this delivery attempt was sent. |
merchantId | string | ID of the merchant the event belongs to. |
apiVersion | string | Payload schema version, currently 2026-06-29. |
data | object | The resource that changed. A Deposit for deposit.* events, or a Withdrawal Intent for withdrawal.* events. |
Deposit Event Example
For deposit.* events, data is a Deposit object.
{
"id": "WD_n3qafPOL",
"eventKey": "deposit.completed",
"occurredAt": "2026-05-21T15:24:36.468Z",
"deliveredAt": "2026-05-21T15:24:37.012Z",
"merchantId": "8f14e45f-ceea-467a-9c1e-3b2a7d5f0c41",
"apiVersion": "2026-06-29",
"data": {
"id": "DE_7Kd2mVQ1",
"wallet": {
"id": "k2pQ7mXd",
"type": "merchant_wallet"
},
"transaction": {
"type": "blockchain",
"provider": "tron",
"blockchain": null,
"legs": [
{ "type": "principal", "currencyCode": "USDT", "amount": "15.0000000000000000" },
{ "type": "network_fee", "currencyCode": "USDT", "amount": "1.1000000000000000" }
]
},
"source": {
"type": "crypto",
"rail": "tron",
"identifier": "TXk...aB9"
},
"status": "completed",
"currencyCode": "USDT",
"amount": "15.0000000000000000",
"amountFee": "1.1000000000000000",
"amountNet": "13.9000000000000000",
"finalizedAt": "2026-05-21T15:24:36.468Z",
"createdAt": "2026-05-21T15:23:10.001Z",
"updatedAt": "2026-05-21T15:24:36.468Z"
}
}
Withdrawal Event Example
For withdrawal.* events, data is a Withdrawal Intent object.
{
"id": "WD_pQ8rLm4T",
"eventKey": "withdrawal.completed",
"occurredAt": "2026-05-21T16:02:11.900Z",
"deliveredAt": "2026-05-21T16:02:12.334Z",
"merchantId": "8f14e45f-ceea-467a-9c1e-3b2a7d5f0c41",
"apiVersion": "2026-06-29",
"data": {
"id": "WI_3Fv9nHs2",
"wallet": {
"id": "k2pQ7mXd",
"type": "merchant_wallet"
},
"transaction": null,
"destination": {
"type": "crypto",
"rail": "tron",
"routingCode": "tron:nile",
"identifier": "TYm...cD4"
},
"status": "completed",
"amount": "50.0000000000000000",
"amountFee": "1.0000000000000000",
"amountNet": "49.0000000000000000",
"submittedAt": "2026-05-21T16:00:05.120Z",
"finalizedAt": "2026-05-21T16:02:11.900Z",
"createdAt": "2026-05-21T16:00:05.120Z",
"updatedAt": "2026-05-21T16:02:11.900Z"
}
}
:::note Blockchain transaction details
In the current release, transaction.blockchain on deposits and the transaction object on withdrawal intents are null. On-chain transaction details (chain ID, hash, addresses) will be populated in a future release. Retrieve the resource through the REST API for the most complete state.
:::