Bank payment rules

Acme RHB Bank Malaysia Payments (API)

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

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
  • BIC11:

    • 11-character Bank Identifier Code

General notes

  • The format for BIC (used in receiver.bank) is strictly validated using [A-Z]{6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3})? (as specified in ISO20022 BICFIIdentifier).
  • RHB support both Pre-authorization (STP) flow and authorization flow via RHB Reflex, the configuration is done on RHB's backend.

MY_IBG

Malaysia Interbank GIRO — next-day settlement.

Important

  • Currency must be MYR only.
  • customerReference max length is 20 characters for RHB payments.
  • paymentDetails max length is 20 characters for RHB payments.
  • Receiver's residencyStatus is mandatory for MY IBG.
fieldpattern / charsetmax lengthmandatory/optional
payments[N].customerReferenceSWIFT20M
payments[N].paymentDetailsSWIFT20O
payments[N].paymentAdviceEmails[N]Valid email address
Example: ["finance@company.com"]
500 (combined)O
payments[N].receiver.nameSWIFT70M
payments[N].receiver.bankAlphanumeric (BIC/SWIFT code)11M
payments[N].receiver.bankAccountNumberNumeric20M
payments[N].receiver.residencyStatusRESIDENT or NON_RESIDENTM

Example Request:

{
  "type": "MY_IBG",
  "amount": 1000,
  "currency": "MYR",
  "senderAccountId": "intacc_0H3BQNTQGBW2W",
  "customerReference": "INV-001",
  "paymentDetails": "Payment for INV-001",
  "paymentAdviceEmails": ["finance@example.com"],
  "receiver": {
    "name": "Ahmad bin Ali",
    "bank": "PBBEMYKLXXX",
    "bankAccountNumber": "1234567890",
    "residencyStatus": "RESIDENT"
  }
}

MY_IBFT

Malaysia Instant Fund Transfer via DuitNow Bank Account Transfer.

Important

  • Currency must be MYR only.
  • customerReference max length is 20 characters for RHB payments.
  • paymentDetails max length is 20 characters for RHB payments.
  • Receiver's residencyStatus is mandatory for MY DuitNow Account Transfer.
  • Receiver's accountType is mandatory for MY DuitNow Account Transfer.
fieldpattern / charsetmax lengthmandatory/optional
payments[N].customerReferenceSWIFT20M
payments[N].paymentDetailsSWIFT20O
payments[N].paymentAdviceEmails[N]Valid email address
Example: ["finance@company.com"]
500 (combined)O
payments[N].receiver.nameSWIFT60M
payments[N].receiver.bankAlphanumeric (BIC/SWIFT code)11M
payments[N].receiver.bankAccountNumberNumeric20M
payments[N].receiver.residencyStatusRESIDENT or NON_RESIDENTM
payments[N].receiver.accountTypeCHECKING or SAVINGSM

Example Request:

{
  "type": "MY_IBFT",
  "amount": 1000,
  "currency": "MYR",
  "senderAccountId": "intacc_0H3BQNTQGBW2W",
  "customerReference": "INV-001",
  "paymentDetails": "Payment for INV-001",
  "paymentAdviceEmails": ["finance@example.com"],
  "receiver": {
    "name": "Ahmad bin Ali",
    "bank": "PBBEMYKLXXX",
    "bankAccountNumber": "1234567890",
    "residencyStatus": "RESIDENT",
    "accountType": "SAVINGS"
  }
}

Payment Response

  • RHB returns a reference Id upon payment created successfully, this is returned in the bankReference field.
  • The underlyingErrorMessage field should contains payment status code and error message returned by RHB (if any).

Example of underlyingErrorMessage from RHB:

"underlyingErrorMessage" : "N3: Invalid Account Number"

Payment status definition:

StatusDescription
PROCESSINGStatus upon creation
SUBMITTEDPayment submitted to RHB, awaiting final confirmation (polling in progress)
COMPLETEDPayment posting successful
FAILEDPayment unsuccessful or rejected by RHB. (check resultCode for details)

Possible result Code for failed payments:

resultCodeDescription
REQUEST_TIMEOUTPayment posting timeout.
PAYMENT_EXPIREDPayment expired.
PAYMENT_CANCELLEDPayment aborted or cancelled by user.
PAYMENT_REJECTEDPayment rejected.
REJECTED_BY_APPROVERPayment rejected by authorizer.
OTHERSDefault resultCode if status code return is not a known status code.

Example response:

{
  "id": "pymt_0Q0T6K4DZFRZT",
  "type": "MY_IBFT",
  "amount": 100,
  "currency": "MYR",
  "bankReference": "260408894262",
  "customerReference": "ACMELVIBG02",
  "senderAccountId": "intacc_0H3BQNTQGBW2W",
  "receiver": {
    "name": "John Doe",
    "bank": "PBBEMYKLXXX",
    "bankAccountNumber": "1234567890",
    "address": {},
    "residencyStatus": "RESIDENT",
    "accountType": "SAVINGS"
  },
  "paymentDetails": null,
  "currencyExchange": {
    "fxContractId": null
  },
  "senderAccountCurrency": "MYR",
  "status": "COMPLETED",
  "resultCode": null,
  "paymentAdviceEmails": ["finance@example.com"],
  "createdAt": "2026-04-08T05:12:14.447Z",
  "updatedAt": "2026-04-08T05:12:14.936Z"
}

Bank references

bankReference is RHB's reference for the payment, its ref_no. It's set when RHB accepts or completes the payment, and bankReferences has it under the key refNo.

Other keys in bankReferences:

  • pymtType: RHB's payment type code, from RHB's answer to the request, such as 200218. It isn't a reference.

Good to know:

  • A payment that RHB rejects after accepting it keeps refNo.
  • Until RHB sends ref_no, bankReference is null and bankReferences has at most pymtType.

A completed payment returns:

{
  "bankReference": "260408894262",
  "bankReferences": {
    "refNo": "260408894262",
    "pymtType": "200218"
  }
}

On this page