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 |
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.
Payee field rules
| bankCode type | Primary field | Notes |
|---|---|---|
Wallet (JAZZCASH, EASYPAISA) | payee_mobile | payee_account may duplicate wallet number |
| Bank (all other codes) | payee_account | 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 |
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",
"bankCode": "JAZZCASH",
"payee_realname": "Ali Khan",
"payee_account": "03001234567",
"payee_mobile": "03001234567",
"payee_email": "pay@example.com",
"payee_id_no": "8220296123456",
"notifyUrl": "https://merchant.example.com/pk/payout/cb",
"remark": "payout",
"extJson": {}
}Request example (bank)
{
"merchantOrderNo": "PKPAYOUT20260622002",
"amount": "50000.00",
"bankCode": "HBL",
"payee_realname": "Ali Khan",
"payee_account": "0123456789012",
"payee_mobile": "03001234567",
"payee_email": "pay@example.com",
"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","bankCode":"JAZZCASH","payee_realname":"Ali Khan","payee_account":"03001234567","payee_mobile":"03001234567","payee_email":"pay@example.com","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",
"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 |
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 |
