This API supports withdrawals to bKash and Nagad wallets.

A successful synchronous response only confirms that the request has been accepted. Confirm the final transfer result using an asynchronous notification or an order inquiry.

Environment: The supplied withdrawal implementation currently uses a sandbox environment. Complete production configuration and integration verification before live use. Use the merchant endpoint and payment_code assigned for your environment.

Endpoint: https://{request-host}/Payment_AddOrder
Method: POST
Content-Type: application/x-www-form-urlencoded; charset=utf-8

Request Parameters

Parameter Required Type Description
mchid Yes string Merchant ID assigned by the payment platform.
applydate Yes string Withdrawal request time in yyyy-MM-dd HH:mm:ss format.
out_trade_no Yes string Unique merchant order ID. Avoid duplicate submissions.
payment_code Yes string Assigned BDT withdrawal product code. Contact support to obtain it.
money Yes string Amount in BDT with two decimal places and no thousands separators. Allowed amounts depend on the channel configuration.
bankname Yes string Recipient wallet code: "060" for bKash or "280" for Nagad. Send it as a string and preserve leading zeros.
accountnumber Yes string Recipient wallet account, maximum 16 characters. Preserve the original value and leading zeros.
userid Yes string Transaction user ID. If unavailable, use an alternative such as the player's mobile number.
notifyurl Yes string Merchant server URL for asynchronous notifications. See the Withdrawal callback documentation.
accountname Yes string Name of the recipient account holder.
pay_md5sign Yes string Merchant MD5 signature. The signature field itself is excluded from signing.

Wallet Codes

bankname Wallet
060 bKash Limited
280 Nagad Limited

Use the wallet codes listed above. Send both wallet codes and account numbers as strings to preserve leading zeros.

Signature Rules

  1. Include the non-empty request parameters, excluding pay_md5sign.
  2. Sort them by parameter name in ascending ASCII order. Parameter names are case-sensitive.
  3. Concatenate the parameters as key=value&key=value.
  4. Append &key={merchant-md5-key}.
  5. Calculate the MD5 digest of the complete string and convert it to uppercase.
  6. Send the resulting value as pay_md5sign.

Use the merchant MD5 key assigned in the merchant portal.

Request Example — bKash

The following JSON illustrates the fields only. Submit the actual request as form data.

Replace assigned values and recalculate the signature. For Nagad, change bankname to "280" and supply the corresponding wallet account.

{
  "mchid": "{merchant-id}",
  "applydate": "2026-10-13 12:00:00",
  "out_trade_no": "BDTOUT202610130001",
  "payment_code": "{assigned-withdrawal-product-code}",
  "money": "1000.00",
  "bankname": "060",
  "accountnumber": "01321123456",
  "userid": "USER0001",
  "notifyurl": "https://merchant.example.com/bdt/withdrawal-notify",
  "accountname": "Example User",
  "pay_md5sign": "{32-character-uppercase-md5-signature}"
}

Response Parameters

Parameter Type Description
success boolean true: request accepted. false: submission failed. This is not the final transfer status.
errCode string "0" when accepted. The submission failure response returns "-100".
errMsg string "Success" when accepted. The submission failure response returns the literal value "faild".

Accepted Response Example

{
  "success": true,
  "errCode": "0",
  "errMsg": "Success"
}

Submission Failure Example

{
  "success": false,
  "errCode": "-100",
  "errMsg": "faild"
}

Result Confirmation and Integration Notes

  • After receiving success=true, keep the order in a processing state. Do not mark it as paid immediately.
  • Confirm the final result using the Withdrawal callback notification or the Withdrawal inquiry API.
  • Verify notification signatures according to the callback documentation.
  • Process out_trade_no idempotently to prevent duplicate processing.
  • If a request times out or the result is unknown, inquire about the original order before deciding what to do next. Avoid creating a duplicate transfer.
  • Transfer fees are charged to the merchant balance under the current configuration. Actual fees and balance requirements depend on the merchant channel settings.