Sandbox Testing
Sandbox uses mocked bank rails. Outcomes are driven by the last 4 digits of the beneficiary account number.
Base URL
https://api.sandbox.blox.my
Magic Account Suffixes
| Account number ends with | Outcome |
|---|---|
| anything else | Settles (SETTLED) within about 20 seconds |
1111 | Reversed before settlement (REVERSED); funds return in full |
2222 | Settles, then returns (RETURNED) about 2–3 minutes later |
3333 | Stays INITIATED forever (pending; never settles) |
9999 | Inline beneficiary fails bank verification → 400 INVALID_REQUEST on the payout create |
The 9999 suffix only applies to an inline beneficiary, the only path that runs a bank enquiry. Registering the same account through POST /v1/payouts/beneficiaries succeeds; a later payout using its beneficiaryId settles like any other suffix.
Prefund Funding
Prefund funding auto-completes about 10 seconds after you create a top-up in the dashboard.
To simulate a failed FPX payment, use an amount whose sen value ends in 99 (e.g. RM100.99) — that deposit completes as failed and does not credit your balance.
End-to-end Test Script
1. Fund
Create a RM50,000 top-up in the dashboard (Payouts → Top up). Wait ~10s, then GET /v1/payout/prefund/balance — available should be "5000000".
2. Happy path
POST /v1/payouts to an account ending e.g. 0000.
- Expect
payout.created(INITIATED), thenpayout.updated(SETTLED) within ~20 seconds.
3. Reversal
POST /v1/payouts to an account ending 1111.
- Expect
payout.created(INITIATED), thenpayout.updated(REVERSED). - Everything that left your prefund comes back, fee included.
4. Return after settle
POST /v1/payouts to an account ending 2222.
- Expect
payout.created(INITIATED),payout.updated(SETTLED), then ~2 min laterpayout.updated(RETURNED). netAmountreturns; the fee is kept.
5. Stuck
POST /v1/payouts to an account ending 3333.
- Expect
payout.created(INITIATED) only; it never settles.
6. Failed funding
Create a dashboard top-up of RM100.99. After ~10s the balance is unchanged.