Skip to content

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

ItemValue
MethodPOST
Path/api/v1/merchant/payin/create

Request body

FieldTypeRequiredNotes
merchantOrderNostringyesUnique merchant order id
amountstring/numberyesAmount > 0, max 2 decimals
bankCodestringrecommendedChannel code; see payin bankCode enum
notifyUrlstringnoCompletion webhook; no push if empty
remarkstringnoRemark
payer_mobilestringyesRequired. 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_realnamestringrecommendedPayer name
payer_emailstringrecommendedPayer email
payer_id_nostringnoPayer ID (e.g. CNIC)
extJsonobjectnoExtension 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

FieldNotes
orderNoPlatform order id (PI prefix)
merchantOrderNoYour order id
amount / feeAmount / netAmountAmount strings
statusOften created or processing initially
payUrlCheckout URL (when routed upstream)
payQrQR code (some channels)
createdAtCreated time

Request example

json
{
  "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

bash
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

json
{
  "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

ItemValue
MethodGET
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).

json
{
  "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.

  1. Only completed triggers webhooks
  2. Handle duplicates idempotently by merchantOrderNo / orderNo
  3. Verify signature before updating order state

Order status

statusNotes
createdCreated
processingIn progress (incl. checkout)
completedSettled + webhook
failedFailed
cancelledCancelled

Released under the MIT License.

2-1-2 Nihonbashi-Hongokucho,Chuo-ku,Tokyo