# Acme DBS Singapore Payments (API) (/guides/dbs-sg-api-payments)



This describes validations / allowed data formats for Acme payments going
through DBS Singapore. These will be validated by Acme and further validated by
the bank. These rules may be stricter than what the bank requires.

### Common Definitions [#common-definitions]

* SWIFT Character Set:
  * The 26 uppercase Latin letters `A`-`Z`
  * The 26 lowercase Latin letters `a`-`z`
  * The 10 digits `0`-`9`
  * Forward slash `/`
  * Hyphen `-`
  * Question mark `?`
  * Colon `:`
  * Left and right parentheses `(` `)`
  * Full stop `.`
  * Comma `,`
  * Single quote `'`
  * Plus sign `+`
  * Space ` `

* DBS G\_I3 String Character Set:
  * The 26 uppercase Latin letters `A`-`Z`
  * The 26 lowercase Latin letters `a`-`z`
  * The 10 digits `0`-`9`
  * Space ` `
  * Exclamation mark `!`
  * Hash `#`
  * Dollar sign `$`
  * Percent `%`
  * Ampersand `&`
  * Single quote `'`
  * Left and right parentheses `(` `)`
  * Asterisk `*`
  * Plus sign `+`
  * Comma `,`
  * Full stop `.`
  * Forward slash `/`
  * Colon `:`
  * Semicolon `;`
  * Equals sign `=`
  * Question mark `?`
  * At sign `@`
  * Left and right square brackets `[` `]`
  * Caret `^`
  * Underscore `_`
  * Backtick `` ` ``
  * Left and right curly braces `{` `}`
  * Pipe `|`
  * Tilde `~`
  * Hyphen `-`

## Payment details [#payment-details]

`paymentDetails` is an optional free-text field. Acme does not validate its charset or length. DBS validates it.

* For ACT, MEPS, and TT, `paymentDetails` is sent to the beneficiary bank but it is subject to the beneficiary to display it. It is also included in the email advice when an advice email is provided.
* For FAST and PAYNOW, `paymentDetails` is not sent to the beneficiary bank. It is included in the email advice only when an advice email is provided.

## Receiver name validation [#receiver-name-validation]

<Callout type="warn" title="Important">
  Migrating ACT, MEPS, or TT from the existing version (V4) to the new ISO 20022 Payment data changes version (V6) is a breaking change for `receiver.name`.

  * On V6, `receiver.name` is **enforced** as `SWIFT` up to 140 characters.
  * Names that were accepted before but contain characters outside the SWIFT set are **rejected** on V6.
  * Sanitize stored payee names before migrating. Characters outside the SWIFT set include `!`, `#`, `$`, `%`, `&`, `*`, `;`, `=`, `@`, `[`, `]`, `^`, `_`, `` ` ``, `{`, `}`, `|`, `~`.
</Callout>

## Bank charges (MEPS and TT) [#bank-charges-meps-and-tt]

`bankChargeBearer` and `chargeAccount` apply to MEPS and TT only.

* `bankChargeBearer` accepts `SENDER`, `RECEIVER`, or `SHARED`. When omitted, DBS applies its default charge bearer.
* `chargeAccount` is the account DBS debits for the bank charges. When omitted, DBS debits the originating account.

## FAST [#fast]

| field                      | pattern / charset | max length | mandatory/optional                      |
| -------------------------- | ----------------- | ---------- | --------------------------------------- |
| customerReference          | SWIFT             | 35         | O \* Acme auto-generate if not provided |
| paymentDetails             | SWIFT             | 140        | O                                       |
| receiver.name              | G\_I3             | 140        | M                                       |
| receiver.bank              | Alphanumeric      | 11         | M                                       |
| receiver.bankAccountNumber | Numeric           | 34         | M                                       |

* The `receiver.name` charset and length shown here are validated by DBS. Acme does not validate them upfront.
* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.

## PAYNOW [#paynow]

* `receiver.bankAccountNumber` and `receiver.bank` must not be provided

| field               | pattern / charset                    | max length   | mandatory/optional                      |
| ------------------- | ------------------------------------ | ------------ | --------------------------------------- |
| customerReference   | SWIFT                                | 35           | O \* Acme auto-generate if not provided |
| paymentDetails      | SWIFT                                | 140          | O                                       |
| receiver.name       | G\_I3                                | 140          | M                                       |
| receiver.proxyType  | `MOBILE` or `UEN` or `VPA` or `NRIC` |              | M                                       |
| receiver.proxyValue | SWIFT                                | 35           | M                                       |
| receiver.address    | SWIFT                                | 35 chars x 3 | O                                       |

* The `receiver.name` charset and length shown here are validated by DBS. Acme does not validate them upfront.
* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.

## ACT [#act]

* `receiver.bank` must be provided (Required by DBS)

| field                      | pattern / charset | max length | mandatory/optional                      |
| -------------------------- | ----------------- | ---------- | --------------------------------------- |
| customerReference          | SWIFT             | 16         | O \* Acme auto-generate if not provided |
| paymentDetails             | SWIFT             | 140        | O                                       |
| receiver.name              | SWIFT             | 35         | M                                       |
| receiver.bank              | Alphanumeric      | 11         | M                                       |
| receiver.bankAccountNumber | Numeric           | 34         | M                                       |

* The `receiver.name` charset and length shown here are validated by DBS. Acme does not validate them upfront.
* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.

## MEPS [#meps]

| field                       | pattern / charset                  | max length | mandatory/optional                      |
| --------------------------- | ---------------------------------- | ---------- | --------------------------------------- |
| customerReference           | SWIFT                              | 16         | O \* Acme auto-generate if not provided |
| paymentDetails              | SWIFT                              | 140        | O                                       |
| bankChargeBearer            | `SENDER` or `RECEIVER` or `SHARED` |            | O                                       |
| chargeAccount               | Alphanumeric                       | 35         | O \*Example: `0172948596`               |
| receiver.name               | SWIFT                              | 35         | M                                       |
| receiver.bank               | Alphanumeric                       | 11         | M                                       |
| receiver.bankAccountNumber  | Numeric                            | 34         | M                                       |
| receiver.address.line1      | SWIFT                              | 35         | M                                       |
| receiver.address.line2      | SWIFT                              | 35         | O                                       |
| receiver.address.city       | SWIFT                              | 35         | O                                       |
| receiver.address.country    | SWIFT                              | 35         | O                                       |
| receiver.address.state      | SWIFT                              | 35         | O                                       |
| receiver.address.postalCode | SWIFT                              | 35         | O                                       |

* The `receiver.name` charset and length shown here are validated by DBS. Acme does not validate them upfront.
* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.

## TT [#tt]

| field                       | pattern / charset                  | max length | mandatory/optional                      |
| --------------------------- | ---------------------------------- | ---------- | --------------------------------------- |
| customerReference           | SWIFT                              | 16         | O \* Acme auto-generate if not provided |
| paymentDetails              | SWIFT                              | 140        | O                                       |
| bankChargeBearer            | `SENDER` or `RECEIVER` or `SHARED` |            | O                                       |
| chargeAccount               | Alphanumeric                       | 35         | O                                       |
| receiver.name               | SWIFT                              | 35         | M                                       |
| receiver.bank               | Alphanumeric                       | 11         | M                                       |
| receiver.bankAccountNumber  | Numeric                            | 34         | M                                       |
| receiver.address.line1      | SWIFT                              | 35         | M                                       |
| receiver.address.line2      | SWIFT                              | 35         | O                                       |
| receiver.address.city       | SWIFT                              | 35         | O                                       |
| receiver.address.state      | SWIFT                              | 35         | O                                       |
| receiver.address.postalCode | SWIFT                              | 35         | O                                       |
| receiver.address.country    | SWIFT                              | 35         | O                                       |

* The `receiver.name` charset and length shown here are validated by DBS. Acme does not validate them upfront.
* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.

## MEPS and TT - SWIFT ISO20022 Payment data changes [#meps-and-tt---swift-iso20022-payment-data-changes]

<Callout type="warn" title="Important">
  * Only applicable to client migrated to DBS V6 Payment API.
  * The following are breaking changes for MEPS and TT clients migrating from V4 to V6.
    * `receiver.name` is **enforced** as `SWIFT` up to 140 characters. See [Receiver name validation](#receiver-name-validation) before migrating from V4.
    * `receiver.address.city` is now **required**. It was optional in V4.
    * `receiver.address.country` is now **required** and must be an ISO 3166-1 alpha-2 code, for example `SG`. In V4 it was optional free SWIFT text up to 35 characters.
    * `receiver.address.postalCode` max length is reduced from 35 to 16.
  * `receiver.address.line1` and `line2` max length increases from 35 to 70. This is not a breaking change.
  * `outgoingPurposeCode` applies to `TT` only and is **mandatory** when the payment currency or beneficiary country falls into the corridors below. Payments that omit a required code will be rejected by the bank. Applicable purpose code list should be obtained from DBS or the destination country's regulator.
    * **Currencies**: `MYR`, `CNH` / `CNY`, `INR`, `KWD`
    * **Beneficiary countries**: Myanmar (`MM`), United Arab Emirates (`AE`)
</Callout>

| field                       | pattern / charset                                                                                             | max length | mandatory/optional                                                               |
| --------------------------- | ------------------------------------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------------- |
| customerReference           | SWIFT                                                                                                         | 16         | O \* Acme auto-generate if not provided                                          |
| paymentDetails              | SWIFT                                                                                                         | 140        | O                                                                                |
| bankChargeBearer            | `SENDER` or `RECEIVER` or `SHARED`                                                                            |            | O                                                                                |
| chargeAccount               | Alphanumeric                                                                                                  | 35         | O                                                                                |
| outgoingPurposeCode         | Alphanumeric (ISO 20022 ExternalPurpose code or country-specific purpose code) <br /> Example: `SALA`, `GDDS` | 10         | Conditional (TT only) — M for specific beneficiary country/currency, otherwise O |
| receiver.name               | SWIFT                                                                                                         | 140        | M                                                                                |
| receiver.bank               | Alphanumeric                                                                                                  | 11         | M                                                                                |
| receiver.bankAccountNumber  | Numeric                                                                                                       | 34         | M                                                                                |
| receiver.address.line1      | SWIFT                                                                                                         | 70         | M                                                                                |
| receiver.address.line2      | SWIFT                                                                                                         | 70         | O                                                                                |
| receiver.address.city       | SWIFT                                                                                                         | 35         | M                                                                                |
| receiver.address.country    | SWIFT                                                                                                         | 2          | M                                                                                |
| receiver.address.state      | SWIFT                                                                                                         | 35         | O                                                                                |
| receiver.address.postalCode | SWIFT                                                                                                         | 16         | O                                                                                |

* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.

## ACT - SWIFT ISO20022 Payment data changes [#act---swift-iso20022-payment-data-changes]

<Callout type="warn" title="Important">
  * Only applicable to client migrated to DBS V6 Payment API.
  * `receiver.bank` must be provided (Required by DBS).
  * `receiver.name` is **enforced** as `SWIFT` up to **140** characters. See [Receiver name validation](#receiver-name-validation) before migrating from V4.
</Callout>

| field                      | pattern / charset | max length | mandatory/optional                      |
| -------------------------- | ----------------- | ---------- | --------------------------------------- |
| customerReference          | SWIFT             | 16         | O \* Acme auto-generate if not provided |
| paymentDetails             | SWIFT             | 140        | O                                       |
| receiver.name              | SWIFT             | 140        | M                                       |
| receiver.bank              | Alphanumeric      | 11         | M                                       |
| receiver.bankAccountNumber | Numeric           | 34         | M                                       |

* The `paymentDetails` charset and length shown here are validated by DBS. Acme does not validate them upfront.
