Pakistan Payin
Merchant API prefix: /api/v1/merchant. Auth headers: Signature.
Country & currency
countryCode and currency are inferred from your merchant account (PK / PKR). Do not send them in the create request body.
notifyUrl
notifyUrl is used only for platform → merchant notifications. It is not forwarded to upstream channels. See Webhook guide.
Create payin
Create a Pakistan payin order. merchantOrderNo must be unique per merchant.
Endpoint
| Item | Value |
|---|---|
| Method | POST |
| Path | /api/v1/merchant/payin/create |
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
merchantOrderNo | string | yes | Unique merchant order id |
amount | string/number | yes | Amount > 0, max 2 decimals |
bankCode | string | recommended | Channel code; see payin bankCode enum |
notifyUrl | string | no | Completion webhook; no push if empty |
remark | string | no | Remark |
payer_mobile | string | yes | Required. Payer's real Pakistan mobile: 11 digits starting with 03 (e.g. 03001234567). Platform validates format before routing; do not use placeholders or fake numbers |
payer_realname | string | recommended | Payer name |
payer_email | string | recommended | Payer email |
payer_id_no | string | no | Payer ID (e.g. CNIC) |
extJson | object | no | Extension object; do not use deprecated metadata |
Deprecated fields
Do not send countryCode, currency, or metadata. Use payer_* for payer info and extJson for extensions.
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.
PKR payin · payer_mobile
For Pakistan PKR payin, payer_mobile is required and must be the payer's real, active Pakistan mobile number (03 + 9 digits, 11 digits total). Invalid format or fake numbers may cause create failures or channel rejection.
Response data
| Field | Notes |
|---|---|
orderNo | Platform order id (PI prefix) |
merchantOrderNo | Your order id |
amount / feeAmount / netAmount | Amount strings |
status | Often created or processing initially |
payUrl | Checkout URL (when routed upstream) |
payQr | QR code (some channels) |
createdAt | Created time |
Request example
{
"merchantOrderNo": "PKPAYIN20260622001",
"amount": "1000.00",
"bankCode": "QRANDLAUNCH",
"notifyUrl": "https://merchant.example.com/pk/payin/cb",
"remark": "pay",
"payer_mobile": "03001234567",
"payer_realname": "Jack",
"payer_email": "pay@example.com",
"payer_id_no": "4220112345678",
"extJson": {}
}cURL example
API_BASE="https://api.soranopro.com"
BODY='{"merchantOrderNo":"PKPAYIN20260622001","amount":"1000.00","bankCode":"QRANDLAUNCH","notifyUrl":"https://merchant.example.com/pk/payin/cb","payer_mobile":"03001234567","payer_realname":"Jack","payer_email":"pay@example.com","extJson":{}}'
curl -X POST "${API_BASE}/api/v1/merchant/payin/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": "PI20260622140000888888",
"merchantOrderNo": "PKPAYIN20260622001",
"amount": "1000.00",
"feeAmount": "10.00",
"netAmount": "990.00",
"status": "processing",
"payUrl": "https://checkout.example.com/pay/xxx",
"createdAt": "2026-06-22T14:00:00Z"
}
}Credits netAmount = amount - fee on completed.
Query payin
| Item | Value |
|---|---|
| Method | GET |
| Path | /api/v1/merchant/payin/query |
Query (one of): orderNo or merchantOrderNo.
GET signing uses query parameters plus header timestamp and nonce.
Webhook (completed)
Full checklist: Webhook guide.
Platform POSTs to your notifyUrl when status=completed.
Headers: Content-Type: application/json, X-Merchant-No, X-Timestamp, X-Nonce, X-Sign (platform RSA2).
{
"orderType": "payin",
"orderNo": "PI20260622140000888888",
"merchantOrderNo": "PKPAYIN20260622001",
"status": "completed",
"amount": "1000.00",
"feeAmount": "10.00",
"netAmount": "990.00",
"completedAt": 1718202000
}Respond HTTP 200 with body OK.
- Only
completedtriggers webhooks - Handle duplicates idempotently by
merchantOrderNo/orderNo - Verify signature before updating order state
Order status
| status | Notes |
|---|---|
created | Created |
processing | In progress (incl. checkout) |
completed | Settled + webhook |
failed | Failed |
cancelled | Cancelled |
