Skip to main content

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.
  • Receiver's residencyStatus is mandatory for MY IBG.
fieldpattern / charsetmax lengthmandatory/optional
payments[N].customerReferenceSWIFT20M
payments[N].paymentDetailsSWIFT140O
payments[N].paymentAdviceEmailsValid 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 invoice 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.
  • 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].paymentDetailsSWIFT140O
payments[N].paymentAdviceEmailsValid 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 invoice 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"
}