CollectionsHosted Payments

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"
  }
}
  • payer and paymentInformation are filled for FPX only. They are null for PayNow and PayLah!.
  • referenceId is always null for FPX.
  • hostedPaymentMethodId is 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.

On this page