Pakistan Payout
Merchant API prefix: /api/v1/merchant. Auth: Signature.
Country & currency
countryCode and currency are inferred from your merchant account. Do not send them on create.
notifyUrl
notifyUrl is for platform → merchant notifications only. See Webhook guide.
Create payout
Creates a Pakistan payout. On success, freezes wallet netAmount (amount + fee).
Endpoint
| Item | Value |
|---|---|
| Method | POST |
| Path | /api/v1/merchant/payout/create |
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
merchantOrderNo | string | yes | Unique |
amount | string/number | yes | Beneficiary amount |
pay_type | string | no | Payout method: BANK_TRANSFER or EWALLET; defaults to BANK_TRANSFER when omitted |
bankCode | string | yes | Uppercase channel code; see payout bankCode enum |
payee_realname | string | yes | Payee name |
payee_account | string | yes | Bank account or wallet number |
payee_mobile | string | recommended | Payee mobile |
payee_email | string | recommended | Payee email |
payee_id_no | string | recommended | Payee ID (CNIC) |
notifyUrl | string | no | Completion webhook; falls back to default callbackUrl |
remark | string | no | Remark |
extJson | object | no | Extensions; do not use metadata |
Deprecated fields
Do not send countryCode, currency, metadata, or legacy receiverName, receiverAccount, receiverBankCode, receiverBankName, receiverPhone.
Compatibility
The legacy bankName field is still accepted for compatibility, but it is ignored for routing, fee matching, and upstream requests. New integrations should send bankCode only.
Wallet payouts require pay_type
For e-wallet payouts such as JAZZCASH and EASYPAISA, send "pay_type":"EWALLET". The platform matches bankCode against an enabled EWALLET payment tool that supports payouts. For bank transfers, omit pay_type or send "pay_type":"BANK_TRANSFER".
pay_type is part of the request JSON and must be included in the exact request body used to generate X-Sign.
Payee field rules
| bankCode type | Primary field | Notes |
|---|---|---|
Wallet (JAZZCASH, EASYPAISA) | payee_mobile | Must send pay_type=EWALLET; payee_account may duplicate wallet number |
| Bank (all other codes) | payee_account | Omit pay_type or send BANK_TRANSFER; payee_mobile still recommended |
Full bankCode list: Appendix.
Response data
| Field | Notes |
|---|---|
orderNo | Platform order id (PO prefix) |
merchantOrderNo | Your order id |
amount / feeAmount / netAmount | Amount strings |
payoutMethod | Actual payout method: BANK_TRANSFER or EWALLET |
payoutTaskId | Linked payout task (P2P mode) |
status | May be created, processing, market_available, etc. |
createdAt | Created time |
Request example (wallet)
{
"merchantOrderNo": "PKPAYOUT20260622001",
"amount": "500.00",
"pay_type": "EWALLET",
"bankCode": "JAZZCASH",
"payee_realname": "Ali Khan",
"payee_account": "03001234567",
"payee_mobile": "03001234567",
"payee_email": "[email protected]",
"payee_id_no": "8220296123456",
"notifyUrl": "https://merchant.example.com/pk/payout/cb",
"remark": "payout",
"extJson": {}
}Request example (bank)
{
"merchantOrderNo": "PKPAYOUT20260622002",
"amount": "50000.00",
"pay_type": "BANK_TRANSFER",
"bankCode": "HBL",
"payee_realname": "Ali Khan",
"payee_account": "0123456789012",
"payee_mobile": "03001234567",
"payee_email": "[email protected]",
"payee_id_no": "4220112345678",
"notifyUrl": "https://merchant.example.com/pk/payout/cb",
"extJson": {}
}cURL example
API_BASE="https://api.soranopro.com"
BODY='{"merchantOrderNo":"PKPAYOUT20260622001","amount":"500.00","pay_type":"EWALLET","bankCode":"JAZZCASH","payee_realname":"Ali Khan","payee_account":"03001234567","payee_mobile":"03001234567","payee_email":"[email protected]","payee_id_no":"8220296123456","notifyUrl":"https://merchant.example.com/pk/payout/cb","extJson":{}}'
curl -X POST "${API_BASE}/api/v1/merchant/payout/create" \
-H "Content-Type: application/json" \
-H "X-Merchant-No: M42" \
-H "X-Timestamp: 1718198400" \
-H "X-Nonce: $(uuidgen)" \
-H "X-Sign: ${SIGN}" \
-d "${BODY}"Response example
{
"code": 0,
"msg": "ok",
"data": {
"orderNo": "PO20260622120000999999",
"merchantOrderNo": "PKPAYOUT20260622001",
"amount": "500.00",
"feeAmount": "5.00",
"netAmount": "505.00",
"payoutMethod": "EWALLET",
"status": "processing",
"createdAt": "2026-06-22T14:00:00Z"
}
}Common errors
| msg (example) | Cause |
|---|---|
merchant balance insufficient | Insufficient wallet balance |
merchant order no already exists | Duplicate merchantOrderNo |
pay_type must be BANK_TRANSFER or EWALLET | Unsupported pay_type value |
bankCode is required when pay_type is EWALLET | Missing bankCode for an e-wallet payout |
EWALLET payment tool not found or payout is disabled for bankCode | No enabled payout-capable EWALLET tool matches bankCode |
upstream bank mapping not found | Unsupported bankCode |
Check merchant wallet before create: balance >= netAmount.
Query payout
| Item | Value |
|---|---|
| Method | GET |
| Path | /api/v1/merchant/payout/query |
Query: orderNo or merchantOrderNo.
Webhook (completed)
See Webhook guide.
On status=completed, platform POSTs to notifyUrl or default callbackUrl.
{
"orderType": "payout",
"orderNo": "PO20260622120000999999",
"merchantOrderNo": "PKPAYOUT20260622001",
"status": "completed",
"amount": "500.00",
"feeAmount": "5.00",
"netAmount": "505.00",
"completedAt": 1718198400
}Respond HTTP 200 + body OK.
Order status
| status | Notes |
|---|---|
created | Created |
market_available | Listed on task market (P2P) |
processing | In progress |
completed | Paid + webhook |
failed | Failed |
cancelled | Cancelled, freeze released |