Appearance
Payment Status Codes
Status codes returned in the response body for transaction endpoints (e.g., v2/topup). To simulate an error, send a request with the provided "Test Account" number corresponding to the desired error type. This allows you to test your application's error handling in the staging environment.
INFO
This Test Account Number should only be used in staging environment and NOT production.
The status code is returned in data.statusCode in the response body. Every code belongs to one of three groups, and the group tells you what to do next:
| Group | Status codes | Send the same refid again? |
|---|---|---|
| Final | 20 and all other codes | No. The result never changes. Use a new refid for a new attempt. |
| In progress | 0, 1 | Yes. Check again with the same refid; the status changes on its own. |
| Not processed | 43, 44, 49, 58 (HTTP 400) | Yes, after fixing the cause. Nothing was charged; resending with the same refid processes the request. |
Final statuses
The transaction has finished. Sending the same refid again always returns this same status, whatever parameters you send. The only later change is a void or refund, which shows as status 53. To try again, use a new refid.
| Status Code | Status | Description | Test Account |
|---|---|---|---|
| 20 | Succesful | Transaction is successful | |
| 40, 52 | Failed | Invalid account number or mobile number (barred/terminated) | 60123450052 |
| 41 | Failed | Client's account has been suspended or an unauthorized access has occurred | 60123450041 |
| 43 | Failed | Insufficient credit (reported by the provider) | 60123450043 |
| 44 | Failed | Incorrect format or invalid product (reported by the provider) | 60123450044 |
| 45 | Failed | Product out of stock | 60123450045 |
| 47 | Failed | Service currently unavailable | 60123450047 |
| 48 | Failed | Transaction rejected by provider | 60123450048 |
| 53 | Failed | Transaction was voided/refunded (remarks is Refund) | |
| 54 | Failed | Duplicate transaction, or daily account transaction limit has been reached | 60123450464 |
| 55 | Failed | Transaction failed due to timeout | 60123450055 |
| 56 | Failed | Account blacklisted | 60123450056 |
| 57 | Failed | Customer's mobile number activated | 60123450057 |
| 58, 61 | Failed | Invalid denomination (reported by the provider) | 60123450861 |
| 62 | Failed | NRIC not eligible | 60123450062 |
43, 44 and 58 can mean two things
Usually these codes mean the request was not processed (see below). They are final only when the transaction went through and the provider then failed it. You can tell from the response: a final transaction always includes IIMMPACT's transaction ID in data.transaction_id; a request that was not processed never does.
In progress
| Status Code | Status | Description |
|---|---|---|
| 0 | Accepted | Transaction accepted and will be sent for processing |
| 1 | Processing | Transaction is still being processed |
Send the same request with the same refid to get the latest status (every 5–10 seconds), or wait for the callback. It always ends in a final status.
Not processed
These come back with HTTP 400. We did not process the request and did not charge your wallet. Fix the cause, then send the request again with the same refid: the status changes once the request can be processed.
| Status Code | Reason | What to do before resending with the same refid |
|---|---|---|
| 43 | Insufficient credit on your wallet | Top up your wallet |
| 44 | Incorrect format or invalid product | Correct the request parameters |
| 49 | Temporary system error | Wait a few seconds, then resend it unchanged |
| 58 | Invalid denomination | Use a valid amount |
If you decide not to retry, close the order on your side and never send that refid again: a later resend would be processed as a new purchase.
Plan codes for mobile data (status 44)
Mobile data products (for example Digi Internet, Celcom Internet, Hotlink Internet, U Mobile Internet) require a plan code. Select a plan from the Options API and send its code as extras.subproduct_code together with its denomination as amount (see Make Payment).
If the plan code is missing or does not match the selected plan, the request is rejected before a transaction is created: HTTP 400, statusCode 44, and one of the remarks below.
| Situation | remarks | What to do |
|---|---|---|
No extras.subproduct_code sent, and more than one plan has the requested amount | Multiple plans are available for this amount. Please provide a plan code. | Send the code of the plan the user selected |
extras.subproduct_code does not match any active plan for the product (codes are case-sensitive) | unknown or inactive option code '<code>'. Select an available plan and try again. | Refresh the plan list from /v2/options and send the exact code |
extras.subproduct_code is a valid plan, but its denomination is not equal to amount | option code '<code>' does not match amount <amount>. Select the plan for this amount and try again. | Send the plan's denomination as amount |
amount is not a denomination offered by the product | Invalid Denomination (status 58, not 44) | Use a denomination returned by /v2/options |
Nothing was processed, so resend with the same refid once the request is corrected.
Product-specific rules
The rules above apply to every product. The products below have extra rules on top of them.
Fund Disbursement (FD)
FD has a daily limit for each recipient account and bank. When an FD request is accepted for checking, its amount is reserved against that day's limit under your refid, until midnight Malaysia time.
- Not processed before the reservation (for example a 44 for a missing field): correct the request and resend with the same
refid, as above. - Not processed after the reservation (for example a 49): resend the exact same request with the same
refid. - Changing the amount: the same
refidwith a different amount for the same account and bank returns 44 until midnight. Use a newrefidfor a different amount. - 44 with remarks
FD daily capping limit exceeded: thatrefidkeeps returning 44 for the same account and bank until midnight. To try a smaller amount before then, use a newrefid; the daily limit still applies.
JomPAY Test Biller Codes
Use these dedicated JomPAY biller codes in the staging environment to simulate payment outcomes.
To simulate a real successful JomPAY scenario, use an actual account/reference number with its correct biller code instead of a test biller code.
INFO
These biller codes are for staging/testing only. Do not use them in production.
| Biller Code | Simulated Result |
|---|---|
9920 | Transaction Accepted |
9940 | Transaction Failed |
9941 | Account Suspended |
9943 | Insufficient Credit |
9944 | Incorrect Format |
9945 | Out of stock |
9947 | Network Error |
9948 | System Error |
9952 | Invalid Account No |
9954 | Duplicate. Try again later |
9955 | Timeout |
9956 | Number Blacklisted |
9958 | Invalid Denomination |
