One API for EasyPaisa and JazzCash — collections and payouts. No bank integration, no paperwork stack, no waiting months for approval. Get your keys today and take a real payment this afternoon.
Your server creates a payment, we host the checkout, the customer pays from their wallet, and we tell your server the moment the money lands.
POST an amount and your own order ID. You get back a hosted checkout URL, ready to open.
A clean PAKPAY page takes them to EasyPaisa or JazzCash. Nothing sensitive touches your server.
A signed JSON webhook hits your endpoint the instant it confirms. Retried for six hours if you are down.
Your balance builds up in the panel. Send it to your own wallet number — automatically.
No SDK to install, no OAuth dance, no sandbox that behaves differently from production. Sign your parameters, POST them, redirect the customer. That is the whole integration.
curl -X POST https://pakpay.org/api/v1/create.php \
-d api_key=pk_live_xxx \
-d order_id=INV-10428 \
-d amount=2500.00 \
-d return_url=https://yourstore.pk/thanks \
-d sign=$SIGN
# { "status": true,
# "payment_url": "https://pakpay.org/pay/?t=…",
# "fee": 87.50, "net_amount": 2,412.50 }
$p = [
'api_key' => PAKPAY_PUBLIC,
'order_id' => 'INV-10428',
'amount' => '2500.00',
'return_url' => 'https://yourstore.pk/thanks',
];
ksort($p);
$q = [];
foreach ($p as $k => $v) $q[] = "$k=$v";
$p['sign'] = hash_hmac('sha256', implode('&', $q), PAKPAY_SECRET);
$r = json_decode(file_get_contents(
'https://pakpay.org/api/v1/create.php', false,
stream_context_create(['http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query($p),
]])
), true);
header('Location: ' . $r['payment_url']);
import crypto from 'node:crypto';
const p = {
api_key: process.env.PAKPAY_PUBLIC,
order_id: 'INV-10428',
amount: '2500.00',
return_url: 'https://yourstore.pk/thanks',
};
const base = Object.keys(p).sort().map(k => `${k}=${p[k]}`).join('&');
p.sign = crypto.createHmac('sha256', process.env.PAKPAY_SECRET)
.update(base).digest('hex');
const res = await fetch('https://pakpay.org/api/v1/create.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams(p),
});
const { payment_url } = await res.json();
import hmac, hashlib, requests
p = {
"api_key": PAKPAY_PUBLIC,
"order_id": "INV-10428",
"amount": "2500.00",
"return_url": "https://yourstore.pk/thanks",
}
base = "&".join(f"{k}={p[k]}" for k in sorted(p))
p["sign"] = hmac.new(
PAKPAY_SECRET.encode(), base.encode(), hashlib.sha256
).hexdigest()
r = requests.post("https://pakpay.org/api/v1/create.php", data=p).json()
redirect(r["payment_url"])
No setup fee, no monthly fee, no minimum volume. Drag the slider — these are our real rates.
Doing serious volume? Rates are set per merchant and we will review yours before you launch.
Not a thin wrapper. A real gateway with a real ledger behind it.
Every request you send is HMAC-SHA256 signed with your secret, and so is every webhook we send back. Optional IP whitelisting locks it down further.
Every rupee in and out is a ledger line with a running balance. Nothing about your money is a black box you have to email us about.
If your endpoint is down we retry after 1m, 5m, 15m, 1h and 6h — and you can replay any delivery by hand from the panel.
If a withdrawal is rejected by the network, the full amount goes straight back to your balance. You are never left short.
Volume, success rate, fees and settlement in one screen — filterable by date, wallet, status or customer number.
Rotate your secret key whenever you want. Nothing is emailed in plain text and nothing is stored where we can read it back.
Included free with every account. No extra dashboard fee, no per-seat pricing.
| Order | Method | Amount | Net | Status |
|---|---|---|---|---|
| INV-10428 | EasyPaisa | 2,500.00 | 2,412.50 | Success |
| INV-10427 | JazzCash | 7,900.00 | 7,623.50 | Success |
| INV-10426 | EasyPaisa | 1,200.00 | — | Pending |
| INV-10425 | JazzCash | 15,000.00 | 14,475.00 | Success |
Free account, no setup fee, and you keep your own wallet numbers.