Money Out Operation — This webhook fires when an E-Wallet Top Up transaction is completed (success or failed), transferring funds from your SingaPay account to a customer’s e-wallet.
Information
POST request to your configured disbursement_notif_url when an E-Wallet Top Up transaction is completed (success or failed).
This webhook may share a callback URL with other event types. See Shared webhook endpoints for routing by
event value.Request Details
Headers
All signature-related headers (
X-Signature, X-Timestamp, Authorization) are always included when your merchant account has API credentials configured. Extract the access token from the Authorization header and use it as-is in the string to sign. See How to Validate Signature below.Body Parameters
string
required
Response code. See Appendix 01 — Response Codes. Example:
SP000string
required
Human-readable response message. Example:
Successfullystring
required
Transaction type identifier. Always
"ewallet-topup" for this webhook. Use this to distinguish from "disbursement" and "qris-issuer" on the shared URL.object
required
Response payload object.
Payload Examples
Security and responses
Return HTTP200 promptly after validating the request. For retry behavior, see Webhook retry mechanism.
Verify every webhook using Security and signature validation. Use your configured callback path when building StringToSign.
Handle duplicate deliveries idempotently using stable identifiers from the payload (for example transaction_id or reff_no).
E-Wallet Top Up specific notes
Idempotency
Eachreference_number can only be used once per account. If you retry with the same reference_number, you’ll receive the existing transaction status rather than creating a duplicate top up.
Detecting Duplicate Webhooks
Timestamp Formats
When validating signatures, always use the X-Timestamp header value (in seconds), not the timestamps from the request body (which are in milliseconds).
Converting millisecond timestamps
Balance Refund on Failure
When an E-Wallet Top Up fails, SingaPay automatically refunds the fullgross_amount (net + fee) back to your merchant balance. You do not need to request a manual refund — the balance is restored immediately upon failure detection. The balance_after field reflects the post-refund balance.
Balance Tracking
Thebalance_after field shows your account balance after the transaction:
- For successful transactions: remaining balance after deduction
- For failed transactions: balance after automatic refund (balance is restored)
- Use this to verify balance consistency with your system
- All amounts are in IDR (Indonesian Rupiah)
