# Direct Debit Webhooks (https://docs.tryacme.com/reference/webhooks-direct-debit)

> For AI agents: the documentation index is at [llms.txt](https://docs.tryacme.com/llms.txt), with every page in one file at [llms-full.txt](https://docs.tryacme.com/llms-full.txt). Each page is also available as Markdown by appending `.md` to its URL.

Example webhook bodies for direct debit authorizations, payments and payment batches.

See [how to read the webhook examples](https://docs.tryacme.com/guides/webhook-examples). The values are made up, but every
field, its order and its format match what Acme sends.

## Direct Debit Authorizations [#direct-debit-authorizations]

Successful direct debit authorization (`direct-debit-authorizations.succeeded`):

<CodeBlockTabs defaultValue="Singapore (eGIRO)">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="Singapore (eGIRO)">
      Singapore (eGIRO)
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="Malaysia">
      Malaysia
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="Hong Kong">
      Hong Kong
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="Singapore (eGIRO)">
    ```json
    {
      "id": "wbh_0RWF7FWW5Y563",
      "createdAt": "2026-10-08T05:06:58.325593865Z",
      "mode": "LIVE",
      "event": "direct-debit-authorizations.succeeded",
      "object": {
        "id": "dda_0RWF7FW49Y7ZN",
        "billReferenceNumber": "ROCKETCUST10482",
        "payerSwiftBic": "OCBCSGSGXXX",
        "payerBankCode": null,
        "payerSegment": "RETAIL",
        "payerName": "TAN WEI MING",
        "payerBankAccountNumber": "5012846731",
        "payerIdHash": "9f2c4e81a6b03d57e1f4a8c26b9d0e73f5a1c84b2d6e09f7a3b5c18d4e2f6a90",
        "payerIdType": "NRIC",
        "status": "SUCCEEDED",
        "failureReason": null,
        "underlyingErrorMessage": null,
        "startDate": "2026-10-08",
        "precheckMinAmount": null,
        "precheckMaxAmount": 100000,
        "precheckCurrency": "SGD",
        "maxAmount": 100000,
        "maxAmountCurrency": "SGD",
        "payerAuthorizedMaxAmount": 50000,
        "endDate": null,
        "authorizeUrl": "https://api.tryacme.com/redirection/direct-debit-authorizations/dda_0RWF7FW49Y7ZN/authorize",
        "cancelUrl": null,
        "returnUrl": "https://rocketshop.com/egiro/return",
        "cancelReturnUrl": null,
        "transactionReference": "ROCKETSG0120261008130336065141",
        "createdAt": "2026-10-08T05:03:36.065Z",
        "updatedAt": "2026-10-08T05:06:58.318Z"
      }
    }
    ```
  </CodeBlockTab>

  <CodeBlockTab value="Malaysia">
    ```json
    {
      "id": "wbh_0RWF7FX0NY5BE",
      "createdAt": "2026-10-08T06:20:41.991203477Z",
      "mode": "LIVE",
      "event": "direct-debit-authorizations.succeeded",
      "object": {
        "id": "dda_0RWF7FX0HY76J",
        "billReferenceNumber": "RSMY-CUST-2291",
        "payerSwiftBic": "MBBEMYKLXXX",
        "payerBankCode": null,
        "payerSegment": "RETAIL",
        "payerName": "AHMAD BIN HASSAN",
        "payerBankAccountNumber": null,
        "payerIdHash": null,
        "payerIdType": null,
        "status": "SUCCEEDED",
        "failureReason": null,
        "underlyingErrorMessage": null,
        "startDate": "2026-10-08",
        "precheckMinAmount": 0,
        "precheckMaxAmount": 50000,
        "precheckCurrency": "MYR",
        "maxAmount": null,
        "maxAmountCurrency": null,
        "payerAuthorizedMaxAmount": 0,
        "endDate": null,
        "authorizeUrl": "https://bit.ly/3E1Lk0b",
        "cancelUrl": null,
        "returnUrl": "https://rocketshop.com.my/edda/return",
        "cancelReturnUrl": null,
        "transactionReference": "DDA0RWF7FX0HY76J",
        "createdAt": "2026-10-08T06:18:02.774Z",
        "updatedAt": "2026-10-08T06:20:41.980Z"
      }
    }
    ```
  </CodeBlockTab>

  <CodeBlockTab value="Hong Kong">
    ```json
    {
      "id": "wbh_0RWFS5YQ3AZKG",
      "createdAt": "2026-10-08T07:45:12.410388264Z",
      "mode": "LIVE",
      "event": "direct-debit-authorizations.succeeded",
      "object": {
        "id": "dda_0RWFS5YQ3AZKF",
        "billReferenceNumber": "RSHK000918",
        "payerSwiftBic": "HSBCHKHHHKH",
        "payerBankCode": "004",
        "payerSegment": null,
        "payerName": "CHAN TAI MAN",
        "payerBankAccountNumber": "004123456838",
        "payerIdHash": null,
        "payerIdType": null,
        "status": "SUCCEEDED",
        "failureReason": null,
        "underlyingErrorMessage": null,
        "startDate": "2026-10-08",
        "precheckMinAmount": 0,
        "precheckMaxAmount": 500000,
        "precheckCurrency": "HKD",
        "maxAmount": null,
        "maxAmountCurrency": null,
        "payerAuthorizedMaxAmount": 0,
        "endDate": null,
        "authorizeUrl": null,
        "cancelUrl": null,
        "returnUrl": null,
        "cancelReturnUrl": null,
        "transactionReference": null,
        "createdAt": "2026-10-08T07:44:58.302Z",
        "updatedAt": "2026-10-08T07:45:12.398Z"
      }
    }
    ```
  </CodeBlockTab>
</CodeBlockTabs>

Failed direct debit authorization (`direct-debit-authorizations.failed`). An authorization the payer
did not complete in time also arrives as this event, with `failureReason` set to
`PAYER_AUTHORIZATION_TIMEOUT`:

```json
{
  "id": "wbh_0RWF7FX0DY607",
  "createdAt": "2026-10-08T05:09:14.508116730Z",
  "mode": "LIVE",
  "event": "direct-debit-authorizations.failed",
  "object": {
    "id": "dda_0RWF7FX01Y43X",
    "billReferenceNumber": "ROCKETCUST10483",
    "payerSwiftBic": "OCBCSGSGXXX",
    "payerBankCode": null,
    "payerSegment": "RETAIL",
    "payerName": "TAN WEI MING",
    "payerBankAccountNumber": null,
    "payerIdHash": null,
    "payerIdType": null,
    "status": "FAILED",
    "failureReason": "PAYER_AUTHORIZATION_FAILED",
    "underlyingErrorMessage": "BA3002: Consent not given by applicant on bank website for eDDA creation. eDDA creation unsuccessful",
    "startDate": "2026-10-08",
    "precheckMinAmount": null,
    "precheckMaxAmount": 100000,
    "precheckCurrency": "SGD",
    "maxAmount": 100000,
    "maxAmountCurrency": "SGD",
    "payerAuthorizedMaxAmount": 0,
    "endDate": null,
    "authorizeUrl": "https://api.tryacme.com/redirection/direct-debit-authorizations/dda_0RWF7FX01Y43X/authorize",
    "cancelUrl": null,
    "returnUrl": "https://rocketshop.com/egiro/return",
    "cancelReturnUrl": null,
    "transactionReference": "ROCKETSG0120261008130840117302",
    "createdAt": "2026-10-08T05:08:40.117Z",
    "updatedAt": "2026-10-08T05:09:14.496Z"
  }
}
```

Canceled direct debit authorization (`direct-debit-authorizations.canceled`):

```json
{
  "id": "wbh_0RWFS5YQ7AXFQ",
  "createdAt": "2026-10-09T01:02:44.133720198Z",
  "mode": "LIVE",
  "event": "direct-debit-authorizations.canceled",
  "object": {
    "id": "dda_0RWFS5YQ3AZKF",
    "billReferenceNumber": "RSHK000918",
    "payerSwiftBic": "HSBCHKHHHKH",
    "payerBankCode": "004",
    "payerSegment": null,
    "payerName": "CHAN TAI MAN",
    "payerBankAccountNumber": "004123456838",
    "payerIdHash": null,
    "payerIdType": null,
    "status": "CANCELED",
    "failureReason": null,
    "underlyingErrorMessage": null,
    "startDate": "2026-10-08",
    "precheckMinAmount": 0,
    "precheckMaxAmount": 500000,
    "precheckCurrency": "HKD",
    "maxAmount": null,
    "maxAmountCurrency": null,
    "payerAuthorizedMaxAmount": 0,
    "endDate": null,
    "authorizeUrl": null,
    "cancelUrl": null,
    "returnUrl": null,
    "cancelReturnUrl": null,
    "transactionReference": null,
    "createdAt": "2026-10-08T07:44:58.302Z",
    "updatedAt": "2026-10-09T01:02:44.120Z"
  }
}
```

## Direct Debit Payments [#direct-debit-payments]

Successful direct debit payment (`direct-debit-payments.succeeded`):

<CodeBlockTabs defaultValue="Singapore FAST">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="Singapore FAST">
      Singapore FAST
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="Singapore GIRO (batch)">
      Singapore GIRO (batch)
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="Malaysia">
      Malaysia
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="Singapore FAST">
    ```json
    {
      "id": "wbh_0RWF7FX65Y4V3",
      "createdAt": "2026-10-08T05:49:56.143613113Z",
      "mode": "LIVE",
      "event": "direct-debit-payments.succeeded",
      "object": {
        "id": "dpymt_0RWF7FX59Y4W0",
        "type": "FAST",
        "amount": 1250,
        "currency": "SGD",
        "directDebitAuthorizationId": "dda_0RWF7FW49Y7ZN",
        "customerReference": "OCTSUBFEE10482",
        "receiver": {
          "bankAccountNumber": "0721845093"
        },
        "status": "SUCCEEDED",
        "resultCode": null,
        "underlyingErrorMessage": null,
        "createdAt": "2026-10-08T05:49:54.557Z",
        "updatedAt": "2026-10-08T05:49:56.135Z"
      }
    }
    ```
  </CodeBlockTab>

  <CodeBlockTab value="Singapore GIRO (batch)">
    ```json
    {
      "id": "wbh_0RWF7GYFMEPVG",
      "createdAt": "2026-10-10T02:31:18.702556120Z",
      "mode": "LIVE",
      "event": "direct-debit-payments.succeeded",
      "object": {
        "id": "dpymt_0RWF7GYDREPY1",
        "type": "GIRO",
        "amount": 8900,
        "currency": "SGD",
        "directDebitAuthorizationId": "dda_0QK6P9D2VF7WS",
        "customerReference": "SUB-OCT26-00187",
        "receiver": {
          "bankAccountNumber": "0721845093"
        },
        "status": "SUCCEEDED",
        "resultCode": null,
        "underlyingErrorMessage": null,
        "batchId": "bddp_0QK7P3R8CW2NA",
        "createdAt": "2026-10-08T08:47:05.902Z",
        "updatedAt": "2026-10-10T02:31:18.664Z",
        "metadata": {
          "fileName": "UFF1_ROCKETSG01_20261008_1652.txt"
        }
      }
    }
    ```
  </CodeBlockTab>

  <CodeBlockTab value="Malaysia">
    ```json
    {
      "id": "wbh_0RWF7GYACEP3H",
      "createdAt": "2026-10-08T01:00:19.889305127Z",
      "mode": "LIVE",
      "event": "direct-debit-payments.succeeded",
      "object": {
        "id": "dpymt_0RWF7GY9MENG0",
        "type": "MY_FPX",
        "amount": 9900,
        "currency": "MYR",
        "directDebitAuthorizationId": "dda_0QK6R4M8TB2XC",
        "customerReference": "RSMY-OCT26-2291",
        "receiver": {
          "bankAccountNumber": "2213018475"
        },
        "status": "SUCCEEDED",
        "resultCode": null,
        "underlyingErrorMessage": null,
        "createdAt": "2026-10-08T01:00:12.402Z",
        "updatedAt": "2026-10-08T01:00:19.877Z"
      }
    }
    ```
  </CodeBlockTab>
</CodeBlockTabs>

* `batchId` and `metadata` are sent only for a payment that is part of a
  [batch](#direct-debit-payment-batches).
* Payments in a batch can arrive several at a time, under `objects`.
* For a payment made with an authorization kept outside Acme, `directDebitAuthorizationId` is left
  out and `directDebitAuthorizationInformation` is sent instead.
* `previousPaymentStatus` is sent only when the bank reports the payment as a duplicate.

Failed direct debit payment (`direct-debit-payments.failed`). `underlyingErrorMessage` is the bank's
code and description:

<CodeBlockTabs defaultValue="Singapore FAST">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="Singapore FAST">
      Singapore FAST
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="Hong Kong">
      Hong Kong
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="Singapore FAST">
    ```json
    {
      "id": "wbh_0RWF7FXADY4H2",
      "createdAt": "2026-10-08T05:50:02.771904316Z",
      "mode": "LIVE",
      "event": "direct-debit-payments.failed",
      "object": {
        "id": "dpymt_0RWF7FXA9Y7VP",
        "type": "FAST",
        "amount": 1250,
        "currency": "SGD",
        "directDebitAuthorizationId": "dda_0RWF7FW49Y7ZN",
        "customerReference": "OCTSUBFEE10483",
        "receiver": {
          "bankAccountNumber": "0721845093"
        },
        "status": "FAILED",
        "resultCode": "INSUFFICIENT_FUNDS",
        "underlyingErrorMessage": "1209: Insufficient funds",
        "createdAt": "2026-10-08T05:50:00.204Z",
        "updatedAt": "2026-10-08T05:50:02.760Z"
      }
    }
    ```
  </CodeBlockTab>

  <CodeBlockTab value="Hong Kong">
    ```json
    {
      "id": "wbh_0RWF7GYD4EQCK",
      "createdAt": "2026-10-09T01:42:37.574812093Z",
      "mode": "LIVE",
      "event": "direct-debit-payments.failed",
      "object": {
        "id": "dpymt_0RWF7GYD4EQCJ",
        "type": "HK_DDI",
        "amount": 48000,
        "currency": "HKD",
        "directDebitAuthorizationId": "dda_0QK6S7B1HN4QE",
        "customerReference": "RSHK-OCT26-0918",
        "receiver": {
          "bankAccountNumber": "447120983561"
        },
        "status": "FAILED",
        "resultCode": "INSUFFICIENT_FUNDS",
        "underlyingErrorMessage": "AM04: Insufficient Funds",
        "createdAt": "2026-10-08T02:30:05.118Z",
        "updatedAt": "2026-10-09T01:42:37.560Z"
      }
    }
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Direct Debit Payment Batches [#direct-debit-payment-batches]

Direct debit payment batch submitted (`direct-debit-payment-batches.submitted`):

```json
{
  "id": "wbh_0RWF7FXFDY4TB",
  "createdAt": "2026-10-08T08:52:41.079452816Z",
  "mode": "LIVE",
  "event": "direct-debit-payment-batches.submitted",
  "object": {
    "id": "bddp_0QK7P3R8CW2NA",
    "type": "GIRO",
    "paymentDate": "2026-10-09",
    "currency": "SGD",
    "status": "SUBMITTED",
    "createdAt": "2026-10-08T08:47:02.318204Z",
    "updatedAt": "2026-10-08T08:52:41.067913Z"
  }
}
```

Direct debit payment batch rejected (`direct-debit-payment-batches.rejected`):

```json
{
  "id": "wbh_0RWF7FXHHY5V0",
  "createdAt": "2026-10-08T09:14:26.544190263Z",
  "mode": "LIVE",
  "event": "direct-debit-payment-batches.rejected",
  "object": {
    "id": "bddp_0QK7P5W1JD6TB",
    "type": "GIRO",
    "paymentDate": "2026-10-09",
    "currency": "SGD",
    "status": "FAILED",
    "createdAt": "2026-10-08T08:47:02.318204Z",
    "updatedAt": "2026-10-08T09:14:26.530718Z"
  }
}
```
