Skip to content

Init withdrawal ​

Send money from your balance to a customer's bank account or e-wallet.

POST/api/v2/transfer-out/initBearer token + signature

Signed endpoint

The fields below are the inner payload. JSON-encode them, base64 them into {"data": "…"} and sign the request — see Request signing.

Payload ​

FieldTypeRequiredDescription
account_holderstringrequiredBeneficiary's name as registered with the bank
to_bankstringrequiredBeneficiary bank — see values
to_bank_account_nostringrequiredBeneficiary account number, digits only
amountstringrequiredAmount as a decimal string. See limits
invoice_nostringrequiredYour unique reference for this withdrawal
currencystringoptionalOnly MYR is supported. Defaults to MYR
user_idstringoptionalCustomer / player name
json
{
  "account_holder": "John Doe",
  "to_bank": "MAYBANK",
  "to_bank_account_no": "172839812321",
  "amount": "100.00",
  "currency": "MYR",
  "invoice_no": "WD-2026-0001",
  "user_id": "John"
}

Bank values ​

ValueBank
MAYBANKMaybank
CIMBCIMB Bank
PUBLIC_BANKPublic Bank
RHBRHB Bank
HLBHong Leong Bank
AMBANKAmBank
AFFIN_BANKAffin Bank
ALLIANCEAlliance Bank
BANK_ISLAMBank Islam
BANK_MUAMALATBank Muamalat
BANK_RAKYATBank Rakyat
BSNBank Simpanan Nasional
AGRO_BANKAgrobank
MBSBMBSB Bank
OCBCOCBC Bank
UOB_MALAYSIAUOB Malaysia
HSBC_BANK_MALAYSIAHSBC Bank Malaysia
STANDARD_CHARTEREDStandard Chartered
CITICitibank
BANK_OF_CHINABank of China
GXGXBank
BOOST_BANKBoost Bank
TNG, TNG_EWALLETTouch 'n Go eWallet
BOOST_EWALLETBoost eWallet
BIG_PAYBigPay
SHOPEE_PAYShopeePay

Not supported: AEON Bank, Ryt Bank. Availability of an individual bank can change — an unsupported bank returns 400/403.

Amount limits ​

Min (MYR)Max (MYR)
505,000

Limits can differ per account. The withdrawal amount plus withdrawal fees must be covered by your balance. Large withdrawals may be held for manual approval (status: "UNVERIFIED").

Response ​

200 OK

A 200 means the withdrawal was accepted, not completed. The final outcome is delivered to your withdrawal postback URL.

json
{
  "message": "Transfer out request accepted",
  "code": "success",
  "data": {
    "transaction_id": "9b3a1e44-7bce-4a85-9f12-d3ac82610e44",
    "status": "VERIFIED",
    "reference_number": "TO-20260512-000045",
    "amount": 100.00,
    "currency": "MYR",
    "created_at": "2026-05-12T17:48:35+08:00"
  }
}
FieldTypeDescription
data.transaction_idstringOur ID for this withdrawal (matches id in the postback)
data.statusstringVERIFIED (queued for payout) or UNVERIFIED (awaiting manual approval)
data.reference_numberstringOur reference number
data.amountnumberAmount (note: a JSON number here, not a string)
data.currencystringCurrency
data.created_atstringCreation time (RFC 3339)

Errors ​

HTTPWhen
400Body can't be parsed, amount outside limits, or bank not supported
401Access token or signature problem — see error codes
403Bank not supported
422A field failed validation (e.g. non-numeric to_bank_account_no)
500Insufficient balance, duplicate invoice_no, or a server error
503Withdrawals are temporarily unavailable
json
{
  "error": "amount should at least be 50.00",
  "code": "unknown_error",
  "message": "amount should at least be 50.00"
}

Don't blindly retry a 500

A 500 can mean the withdrawal was rejected for insufficient balance or a duplicate invoice_no. Retrying with the same invoice_no is safe — a duplicate will never be paid out twice.

Need help? Contact your DMC Pay account manager.