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
- The 26 uppercase Latin letters
-
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.
customerReferencemax length is 20 characters for RHB payments.paymentDetailsmax length is 20 characters for RHB payments.- Receiver's
residencyStatusis mandatory for MY IBG.
| field | pattern / charset | max length | mandatory/optional |
|---|---|---|---|
| payments[N].customerReference | SWIFT | 20 | M |
| payments[N].paymentDetails | SWIFT | 20 | O |
| payments[N].paymentAdviceEmails[N] | Valid email address Example: ["finance@company.com"] | 500 (combined) | O |
| payments[N].receiver.name | SWIFT | 70 | M |
| payments[N].receiver.bank | Alphanumeric (BIC/SWIFT code) | 11 | M |
| payments[N].receiver.bankAccountNumber | Numeric | 20 | M |
| payments[N].receiver.residencyStatus | RESIDENT or NON_RESIDENT | M |
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.
customerReferencemax length is 20 characters for RHB payments.paymentDetailsmax length is 20 characters for RHB payments.- Receiver's
residencyStatusis mandatory for MY DuitNow Account Transfer. - Receiver's
accountTypeis mandatory for MY DuitNow Account Transfer.
| field | pattern / charset | max length | mandatory/optional |
|---|---|---|---|
| payments[N].customerReference | SWIFT | 20 | M |
| payments[N].paymentDetails | SWIFT | 20 | O |
| payments[N].paymentAdviceEmails[N] | Valid email address Example: ["finance@company.com"] | 500 (combined) | O |
| payments[N].receiver.name | SWIFT | 60 | M |
| payments[N].receiver.bank | Alphanumeric (BIC/SWIFT code) | 11 | M |
| payments[N].receiver.bankAccountNumber | Numeric | 20 | M |
| payments[N].receiver.residencyStatus | RESIDENT or NON_RESIDENT | M | |
| payments[N].receiver.accountType | CHECKING or SAVINGS | M |
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
bankReferencefield. - The
underlyingErrorMessagefield 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:
| Status | Description |
|---|---|
PROCESSING | Status upon creation |
SUBMITTED | Payment submitted to RHB, awaiting final confirmation (polling in progress) |
COMPLETED | Payment posting successful |
FAILED | Payment unsuccessful or rejected by RHB. (check resultCode for details) |
Possible result Code for failed payments:
| resultCode | Description |
|---|---|
REQUEST_TIMEOUT | Payment posting timeout. |
PAYMENT_EXPIRED | Payment expired. |
PAYMENT_CANCELLED | Payment aborted or cancelled by user. |
PAYMENT_REJECTED | Payment rejected. |
REJECTED_BY_APPROVER | Payment rejected by authorizer. |
OTHERS | Default 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 as200218. It isn't a reference.
Good to know:
- A payment that RHB rejects after accepting it keeps
refNo. - Until RHB sends
ref_no,bankReferenceisnullandbankReferenceshas at mostpymtType.
A completed payment returns:
{
"bankReference": "260408894262",
"bankReferences": {
"refNo": "260408894262",
"pymtType": "200218"
}
}