Hosted Payment Webhooks
Example webhook bodies for hosted payments, hosted refunds and tracked QR payments.
See how to read the webhook examples. The values are made up, but every field, its order and its format match what Acme sends.
Hosted Payments
Successful hosted payment (hosted-payments.succeeded):
{
"id": "wbh_0RWF7FVVDY7FK",
"createdAt": "2026-10-08T06:51:58.806639732Z",
"mode": "LIVE",
"event": "hosted-payments.succeeded",
"object": {
"id": "hpymt_0RWF7FVT1Y6KQ",
"status": "SUCCEEDED",
"resultCode": null,
"underlyingErrorCode": null,
"underlyingErrorMessage": null,
"transactionReference": "20261008DBSSSGSGBRT7728204",
"amount": 1250,
"currency": "SGD",
"channel": "APP_ANDROID",
"method": "PAYNOW",
"returnUrl": "rocketshop://paid/12340001",
"redirectUrl": "https://api.tryacme.com/redirection/hosted-payments/hpymt_0RWF7FVT1Y6KQ/submit",
"referenceId": "12340001",
"tokenization": false,
"hostedPaymentMethodId": null,
"customerProxy": null,
"payer": null,
"paymentInformation": null,
"createdAt": "2026-10-08T06:51:27.967Z",
"updatedAt": "2026-10-08T06:51:58.800Z",
"expiredAt": "2026-10-08T07:11:57.967Z"
}
}payerandpaymentInformationare filled for FPX only. They arenullfor PayNow and PayLah!.referenceIdis alwaysnullfor FPX.hostedPaymentMethodIdis set for a tokenized PayLah! payment.
Failed hosted payment (hosted-payments.failed). underlyingErrorCode and underlyingErrorMessage
are the bank's code and description:
{
"id": "wbh_0RWF7FVY9Y6H8",
"createdAt": "2026-10-08T06:58:12.120558467Z",
"mode": "LIVE",
"event": "hosted-payments.failed",
"object": {
"id": "hpymt_0RWF7FVY1Y6XW",
"status": "FAILED",
"resultCode": "CUSTOMER_CANCELED_PAYMENT",
"underlyingErrorCode": "H202",
"underlyingErrorMessage": "Customer cancelled the transaction",
"transactionReference": "",
"amount": 1250,
"currency": "SGD",
"channel": "APP_ANDROID",
"method": "PAYNOW",
"returnUrl": "rocketshop://paid/12340002",
"redirectUrl": "https://api.tryacme.com/redirection/hosted-payments/hpymt_0RWF7FVY1Y6XW/submit",
"referenceId": "12340002",
"tokenization": false,
"hostedPaymentMethodId": null,
"customerProxy": null,
"payer": null,
"paymentInformation": null,
"createdAt": "2026-10-08T06:57:40.302Z",
"updatedAt": "2026-10-08T06:58:12.108Z",
"expiredAt": "2026-10-08T07:18:10.302Z"
}
}Hosted Refunds
Successful hosted refund (hosted-refunds.succeeded). A failed refund (hosted-refunds.failed) has
the same fields, with status set to FAILED:
{
"id": "wbh_0RWF7FW2HY70Y",
"createdAt": "2026-10-08T10:44:36.366190544Z",
"mode": "LIVE",
"event": "hosted-refunds.succeeded",
"object": {
"id": "hrfnd_0RWF7FW25Y6FQ",
"status": "SUCCEEDED",
"amount": 1250,
"currency": "SGD",
"hostedPaymentId": "hpymt_0RWF7FVT1Y6KQ",
"referenceId": "12340001-R1",
"createdAt": "2026-10-08T10:44:34.233Z",
"updatedAt": "2026-10-08T10:44:36.353Z"
}
}Tracked QR Payments
Successful tracked QR payment (qr-payments.succeeded):
{
"id": "wbh_0RWF7FXJXY47Z",
"createdAt": "2026-10-08T07:34:31.779284847Z",
"mode": "LIVE",
"event": "qr-payments.succeeded",
"object": {
"id": "qrpymt_0RWF7FXJHY7BT",
"status": "SUCCEEDED",
"type": "PAYNOW",
"proxyType": "UEN",
"proxyValue": "201912345K",
"amount": 2350,
"currency": "SGD",
"expirySeconds": 900,
"transactionReference": "ORDER-55821",
"amountEditable": false,
"qrCodeImageUrl": "https://acme-paynow-qr-code.s3.ap-southeast-1.amazonaws.com/qrpymt/ORDER-55821.png",
"bankReference": "1112127058552804C100000000000",
"statusSource": "BANK_LOOKUP",
"createdAt": "2026-10-08T07:21:19.281Z",
"updatedAt": "2026-10-08T07:34:31.767Z"
}
}Failed tracked QR payment (qr-payments.failed):
{
"id": "wbh_0RWF7FXKSY5GS",
"createdAt": "2026-10-08T07:52:03.118920445Z",
"mode": "LIVE",
"event": "qr-payments.failed",
"object": {
"id": "qrpymt_0RWF7FXKSY5GR",
"status": "FAILED",
"type": "PAYNOW",
"proxyType": "UEN",
"proxyValue": "201912345K",
"amount": 2350,
"currency": "SGD",
"expirySeconds": 900,
"transactionReference": "ORDER-55822",
"amountEditable": false,
"qrCodeImageUrl": "https://acme-paynow-qr-code.s3.ap-southeast-1.amazonaws.com/qrpymt/ORDER-55822.png",
"resultCode": "COLLECT_FAIL",
"underlyingResultCode": "8002",
"underlyingResultDescription": "Transaction failed",
"statusSource": "BANK_LOOKUP",
"createdAt": "2026-10-08T07:36:44.902Z",
"updatedAt": "2026-10-08T07:52:03.105Z"
}
}Fields without a value are left out of a tracked QR payment. bankAccount is sent when the payment is
linked to one of your bank accounts.