MAGICPAY INR API
पूरा मर्चेंट इंटीग्रेशन डॉक्यूमेंटेशन
सभी एंडपॉइंट के तहत लाइव https://gamio.site/api/v3. Request and response format, signing (MD5 UPPERCASE with mchKey / mchSecret) and callbacks follow the common v3 gateway specification, so an existing v3 integration works after changing the base URL, Merchant ID and keys. Every response contains our own hosted payment URL — your customer never sees a provider page address.
आपके API क्रेडेंशियल
इन्हें सुरक्षित रखें। पे-इन में API Key, पे-आउट में API Secret इस्तेमाल होता है।
उदाहरणों में अपना Merchant ID और keys देखने के लिए साइन इन करें। साइन इन
समर्थित भुगतान विधियां
INRUPI
Pay-in: tradeType INRUPI · Pay-out: payType upi
IMPS / NEFT
Pay-out: payType bank (account number + IFSC)
usdt
Pay-in: tradeType usdt (TRC20) · Pay-out: payType usdt
API संदर्भ
सभी एंडपॉइंट
ग्लोबल नियम
- Request method: JSON POST
- Header: Content-Type: application/json (form-encoded bodies are accepted too)
- Every request must include mchId (your Merchant ID) and sign
- Pay-in and Query Pay-in are signed with mchKey (API Key). Pay-out, Query Pay-out and Balance are signed with mchSecret (API Secret)
- Signature: MD5(sorted_params + &key=KEY).toUpperCase()
- Amounts are strings with two decimals, e.g. "500.00". Times are ISO-8601 in IST (UTC+05:30)
- Currency: INR (₹). USDT orders are priced in INR and paid in USDT (TRC20)
क्विक स्टार्ट
- Copy your Merchant ID, API Key (mchKey) and API Secret (mchSecret) from the box above.
- Save your callback URL in Basic Information and press "Test endpoint" — we send a signed test request.
- Create an order with POST /payin and send your customer to the returned pay_url.
- Wait for our callback (reply with the text success) and use /check-order-status as a fallback.
आपकी सीमाएँ
स्थिति मान
| स्थिति | अर्थ |
|---|---|
pending | Waiting for the customer. A payment made after expiry is still credited, and you get the success callback. |
success | Paid and credited to your wallet (netAmount). Final. |
failed | भुगतान विफल या अस्वीकार कर दिया गया। अंतिम जब तक ग्राहक बाद में भुगतान नहीं करता। |
expired | ग्राहक ने समय पर भुगतान नहीं किया (डिफ़ॉल्ट रूप से 30 मिनट)। |
processing | Payouts only: approved, the transfer is being made. |
रेट लिमिट और IP अनुमति-सूची
- 120 requests per minute per merchant and IP address (HTTP 429 with a Retry-After header). Repeated wrong signatures lock the IP address for a while.
- If you save an IP allow-list in Basic Information, only those server IPs may call the API (403 ip_not_allowed). Payouts through the API are only available with an allow-list.
- Always call the API from your server, never from a browser or app: the keys must stay secret.
परीक्षण चल रहा है
There is no separate sandbox. Create a real order with the smallest allowed amount and pay it yourself, or use the "Test endpoint" button in Basic Information to check your callback URL. Test payments created by our operators are not available to merchants.
चेंजलॉग
| वर्ज़न | बदलाव |
|---|---|
v3.0 | First release of the v3 API: /payin, /check-order-status, /payout, /check-gateway-balance. USDT (TRC20) pay-in and payout. Our hosted checkout URL in every response. Retrying signed callbacks. |
v1.x | Legacy payment-link API (/api/v1/create-link.php, /link-status.php) stays available and unchanged; optional currency / trade_type were added. |
Creates a deposit order. The response contains our hosted checkout address in pay_url: redirect the customer there (or open it in a new tab / iframe). The customer pays on our domain; you receive a callback when the payment is confirmed.
| Parameter | Type | Required | विवरण |
|---|---|---|---|
mchId | string | हाँ | Your Merchant ID (also accepted as merchant_id) |
mchOrderNo | string | हाँ | Your own unique order number (1–100 chars: letters, digits and _ - . : # /). Repeating it returns the same order (idempotent). Also accepted as merchant_order_no |
amount | string | हाँ | Order amount in INR, 2 decimals, e.g. "500.00". Limits: see Overview |
tradeType | string | नहीं | INRUPI (default) or usdt. Also accepted as trade_type |
notifyUrl | string | नहीं | URL that receives our callback. Falls back to the callback URL saved in your panel. Also accepted as callback_url |
returnUrl | string | नहीं | Where the customer is sent after paying (also return_url) |
extra | string | नहीं | Free text (max 255 chars) echoed back in queries and callbacks |
sign | string | हाँ | Signature, see the Signature tab |
- Idempotent: sending the same mchOrderNo again returns the same order (with "duplicate": true). A different amount for an existing mchOrderNo is answered with 409 duplicate_order.
- USDT: tradeType "usdt" needs USDT enabled for your account. amount is the INR value; the response adds usdtAmount (exact USDT to pay), rate, address and network TRC20 — the checkout page shows them to the customer.
- snake_case field names work too: merchant_id, merchant_order_no, trade_type, callback_url, return_url. For these requests the alternative signature md5(merchant_id + amount + merchant_order_no + api_key + callback_url) is also accepted.
<?php
function rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}
$base = 'https://gamio.site/api/v3';
$p = [
'mchId' => 'YOUR_MERCHANT_ID',
'mchOrderNo' => 'ORDER-1001', // your unique order number
'amount' => '500.00',
'tradeType' => 'INRUPI', // or 'usdt'
'notifyUrl' => 'https://merchant.example.com/webhook/reddypay',
'returnUrl' => 'https://merchant.example.com/thanks',
];
$p['sign'] = rp_sign($p, 'YOUR_API_KEY'); // mchKey
$ch = curl_init("$base/payin");
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($p)]);
$res = json_decode(curl_exec($ch), true);
if (!empty($res['success'])) {
header('Location: ' . $res['data']['pay_url']); // our hosted checkout: send the customer there
} else {
error_log($res['error'] . ': ' . $res['message']);
}const crypto = require('crypto');
function rpSign(p, key) {
const s = Object.keys(p)
.filter(k => k !== 'sign' && p[k] !== '' && p[k] != null) // empty values are not signed
.sort() // sort by parameter name
.map(k => `${k}=${p[k]}`).join('&');
return crypto.createHash('md5').update(`${s}&key=${key}`).digest('hex').toUpperCase();
}
const p = {
mchId: 'YOUR_MERCHANT_ID',
mchOrderNo: 'ORDER-1001', // your unique order number
amount: '500.00',
tradeType: 'INRUPI', // or 'usdt'
notifyUrl: 'https://merchant.example.com/webhook/reddypay',
returnUrl: 'https://merchant.example.com/thanks',
};
p.sign = rpSign(p, 'YOUR_API_KEY'); // mchKey
const res = await fetch('https://gamio.site/api/v3/payin', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(p),
}).then(r => r.json());
if (res.success) console.log('redirect the customer to', res.data.pay_url);
else console.error(res.error, res.message);import hashlib
def rp_sign(p, key):
s = '&'.join(f'{k}={p[k]}' for k in sorted(p)
if k != 'sign' and p[k] not in ('', None)) # sorted, empty values skipped
return hashlib.md5(f'{s}&key={key}'.encode()).hexdigest().upper()
import requests
p = {
'mchId': 'YOUR_MERCHANT_ID',
'mchOrderNo': 'ORDER-1001', # your unique order number
'amount': '500.00',
'tradeType': 'INRUPI', # or 'usdt'
'notifyUrl': 'https://merchant.example.com/webhook/reddypay',
'returnUrl': 'https://merchant.example.com/thanks',
}
p['sign'] = rp_sign(p, 'YOUR_API_KEY') # mchKey
res = requests.post('https://gamio.site/api/v3/payin', json=p, timeout=30).json()
if res.get('success'):
print('redirect the customer to', res['data']['pay_url'])
else:
print(res.get('error'), res.get('message'))# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; KEY='YOUR_API_KEY' # mchKey
SIGN=$(rp_sign "amount=500.00&mchId=$MCH_ID&mchOrderNo=ORDER-1001¬ifyUrl=https://merchant.example.com/webhook/reddypay&tradeType=INRUPI" "$KEY")
curl -sS -X POST 'https://gamio.site/api/v3/payin' -H 'Content-Type: application/json' -d "{
\"mchId\": \"$MCH_ID\", \"mchOrderNo\": \"ORDER-1001\", \"amount\": \"500.00\", \"tradeType\": \"INRUPI\",
\"notifyUrl\": \"https://merchant.example.com/webhook/reddypay\", \"sign\": \"$SIGN\"
}"{
"code": 200,
"success": true,
"message": "Success",
"data": {
"orderNo": "RP2610011449406340360",
"mchOrderNo": "ORDER-1001",
"amount": "500.00",
"fee": "55.00",
"netAmount": "445.00",
"paidAmount": null,
"tradeType": "INRUPI",
"status": "pending",
"utr": null,
"pay_url": "https://gamio.site/pay/48568a0be2cab05e6a49",
"payUrl": "https://gamio.site/pay/48568a0be2cab05e6a49",
"extra": "",
"createdAt": "2026-10-01T14:49:40+05:30",
"expiresAt": "2026-10-01T15:19:40+05:30",
"paidAt": null
}
}{
"code": 200,
"success": true,
"message": "Success",
"data": {
"tradeType": "usdt",
"usdtAmount": "5.640000",
"rate": "88.6500",
"address": "TXYZ…YourReceivingAddress",
"network": "TRC20",
"orderNo": "RP2610011449406340360",
"mchOrderNo": "ORDER-1001",
"amount": "500.00",
"fee": "55.00",
"netAmount": "445.00",
"paidAmount": null,
"status": "pending",
"utr": null,
"pay_url": "https://gamio.site/pay/48568a0be2cab05e6a49",
"payUrl": "https://gamio.site/pay/48568a0be2cab05e6a49",
"extra": "",
"createdAt": "2026-10-01T14:49:40+05:30",
"expiresAt": "2026-10-01T15:19:40+05:30",
"paidAt": null
}
}Returns the current state of a deposit order. Signed with mchKey it looks in your pay-in orders; signed with mchSecret the same endpoint queries withdrawals (see Query Pay-out). Poll this at most every few seconds and prefer the callback.
| Parameter | Type | Required | विवरण |
|---|---|---|---|
mchId | string | हाँ | Your Merchant ID (also accepted as merchant_id) |
mchOrderNo | string | नहीं | Your order number (one of mchOrderNo / orderNo is required) |
orderNo | string | नहीं | Our order number returned by /payin |
sign | string | हाँ | Signature, see the Signature tab |
<?php
function rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}
$p = ['mchId' => 'YOUR_MERCHANT_ID', 'mchOrderNo' => 'ORDER-1001']; // or 'orderNo' => our order number
$p['sign'] = rp_sign($p, 'YOUR_API_KEY'); // mchKey = pay-in order
$ch = curl_init('https://gamio.site/api/v3/check-order-status');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($p)]);
$res = json_decode(curl_exec($ch), true);
echo $res['data']['status'] ?? $res['message']; // pending | success | failed | expiredconst crypto = require('crypto');
function rpSign(p, key) {
const s = Object.keys(p)
.filter(k => k !== 'sign' && p[k] !== '' && p[k] != null) // empty values are not signed
.sort() // sort by parameter name
.map(k => `${k}=${p[k]}`).join('&');
return crypto.createHash('md5').update(`${s}&key=${key}`).digest('hex').toUpperCase();
}
const p = { mchId: 'YOUR_MERCHANT_ID', mchOrderNo: 'ORDER-1001' }; // or orderNo: our order number
p.sign = rpSign(p, 'YOUR_API_KEY'); // mchKey = pay-in order
const res = await fetch('https://gamio.site/api/v3/check-order-status', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(p),
}).then(r => r.json());
console.log(res.data ? res.data.status : res.message); // pending | success | failed | expiredimport hashlib
def rp_sign(p, key):
s = '&'.join(f'{k}={p[k]}' for k in sorted(p)
if k != 'sign' and p[k] not in ('', None)) # sorted, empty values skipped
return hashlib.md5(f'{s}&key={key}'.encode()).hexdigest().upper()
import requests
p = {'mchId': 'YOUR_MERCHANT_ID', 'mchOrderNo': 'ORDER-1001'} # or 'orderNo': our order number
p['sign'] = rp_sign(p, 'YOUR_API_KEY') # mchKey = pay-in order
res = requests.post('https://gamio.site/api/v3/check-order-status', json=p, timeout=30).json()
print(res['data']['status'] if res.get('success') else res.get('message')) # pending | success | failed | expired# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; KEY='YOUR_API_KEY' # mchKey = pay-in order
SIGN=$(rp_sign "mchId=$MCH_ID&mchOrderNo=ORDER-1001" "$KEY")
curl -sS -X POST 'https://gamio.site/api/v3/check-order-status' -H 'Content-Type: application/json' \
-d "{\"mchId\":\"$MCH_ID\",\"mchOrderNo\":\"ORDER-1001\",\"sign\":\"$SIGN\"}"{
"code": 200,
"success": true,
"message": "Success",
"data": {
"status": "success",
"paidAmount": "500.00",
"utr": "627412345678",
"paidAt": "2026-10-01T14:50:15+05:30",
"type": "payin",
"orderNo": "RP2610011449406340360",
"mchOrderNo": "ORDER-1001",
"amount": "500.00",
"fee": "55.00",
"netAmount": "445.00",
"tradeType": "INRUPI",
"pay_url": "https://gamio.site/pay/48568a0be2cab05e6a49",
"payUrl": "https://gamio.site/pay/48568a0be2cab05e6a49",
"extra": "",
"createdAt": "2026-10-01T14:49:40+05:30",
"expiresAt": "2026-10-01T15:19:40+05:30"
}
}| स्थिति | अर्थ |
|---|---|
pending | Waiting for the customer. A payment made after expiry is still credited, and you get the success callback. |
success | Paid and credited to your wallet (netAmount). Final. |
failed | भुगतान विफल या अस्वीकार कर दिया गया। अंतिम जब तक ग्राहक बाद में भुगतान नहीं करता। |
expired | ग्राहक ने समय पर भुगतान नहीं किया (डिफ़ॉल्ट रूप से 30 मिनट)। |
processing | Payouts only: approved, the transfer is being made. |
Creates a withdrawal. The beneficiary receives exactly amount; our pay-out fee is charged on top and debited together with the amount from your available balance (it is held until the payout is paid or rejected). Limits and your balance are checked as in the panel.
| Parameter | Type | Required | विवरण |
|---|---|---|---|
mchId | string | हाँ | Your Merchant ID (also accepted as merchant_id) |
mchOrderNo | string | हाँ | Your unique payout number (idempotent, same rules as pay-in) |
amount | string | हाँ | Amount the beneficiary receives, in INR with 2 decimals. Our fee is charged on top |
payType | string | नहीं | bank, upi or usdt. Detected from the destination fields when omitted |
bankCode | string | नहीं | Bank name exactly as in the Bank Codes tab (bank payouts) |
accountName | string | नहीं | खाता धारक का नाम (बैंक भुगतान) |
accountNumber | string | नहीं | Bank account number, 6–20 digits (bank payouts) |
ifsc | string | नहीं | IFSC code, e.g. HDFC0001234 (bank payouts) |
upiId | string | नहीं | UPI ID such as name@bank (UPI payouts) |
usdtAddress | string | नहीं | TRC20 address starting with T (USDT payouts, needs USDT enabled for your account) |
sign | string | हाँ | Signature, see the Signature tab |
- Destination: bank = bankCode + accountName + accountNumber + ifsc · upi = upiId · usdt = usdtAddress (TRC20).
- Idempotent on mchOrderNo. notifyUrl is not used for payouts: payout callbacks go to the callback URL saved in your panel.
- पे-आउट शुल्क: 4% + ₹10। राशि सीमा: प्रति अनुरोध ₹100.00 से ₹200,000.00, प्रति दिन ₹200,000.00।
<?php
function rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}
$p = [
'mchId' => 'YOUR_MERCHANT_ID',
'mchOrderNo' => 'PAYOUT-77',
'amount' => '1000.00', // the beneficiary receives exactly this; our fee is added on top
'payType' => 'bank', // bank | upi | usdt
'bankCode' => 'HDFC Bank', // see the Bank Codes tab
'accountName' => 'Test User',
'accountNumber' => '123456789012',
'ifsc' => 'HDFC0001234',
];
$p['sign'] = rp_sign($p, 'YOUR_API_SECRET'); // mchSecret (NOT mchKey); the call must come from an allow-listed IP
$ch = curl_init('https://gamio.site/api/v3/payout');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($p)]);
print_r(json_decode(curl_exec($ch), true));const crypto = require('crypto');
function rpSign(p, key) {
const s = Object.keys(p)
.filter(k => k !== 'sign' && p[k] !== '' && p[k] != null) // empty values are not signed
.sort() // sort by parameter name
.map(k => `${k}=${p[k]}`).join('&');
return crypto.createHash('md5').update(`${s}&key=${key}`).digest('hex').toUpperCase();
}
const p = {
mchId: 'YOUR_MERCHANT_ID', mchOrderNo: 'PAYOUT-77', amount: '1000.00', payType: 'bank',
bankCode: 'HDFC Bank', accountName: 'Test User', accountNumber: '123456789012', ifsc: 'HDFC0001234',
};
p.sign = rpSign(p, 'YOUR_API_SECRET'); // mchSecret (NOT mchKey); the call must come from an allow-listed IP
const res = await fetch('https://gamio.site/api/v3/payout', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(p),
}).then(r => r.json());
console.log(res);import hashlib
def rp_sign(p, key):
s = '&'.join(f'{k}={p[k]}' for k in sorted(p)
if k != 'sign' and p[k] not in ('', None)) # sorted, empty values skipped
return hashlib.md5(f'{s}&key={key}'.encode()).hexdigest().upper()
import requests
p = {'mchId': 'YOUR_MERCHANT_ID', 'mchOrderNo': 'PAYOUT-77', 'amount': '1000.00', 'payType': 'bank',
'bankCode': 'HDFC Bank', 'accountName': 'Test User', 'accountNumber': '123456789012', 'ifsc': 'HDFC0001234'}
p['sign'] = rp_sign(p, 'YOUR_API_SECRET') # mchSecret (NOT mchKey); the call must come from an allow-listed IP
print(requests.post('https://gamio.site/api/v3/payout', json=p, timeout=30).json())# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; SECRET='YOUR_API_SECRET' # mchSecret
SIGN=$(rp_sign "accountName=Test User&accountNumber=123456789012&amount=1000.00&bankCode=HDFC Bank&ifsc=HDFC0001234&mchId=$MCH_ID&mchOrderNo=PAYOUT-77&payType=bank" "$SECRET")
curl -sS -X POST 'https://gamio.site/api/v3/payout' -H 'Content-Type: application/json' -d "{
\"mchId\":\"$MCH_ID\",\"mchOrderNo\":\"PAYOUT-77\",\"amount\":\"1000.00\",\"payType\":\"bank\",\"bankCode\":\"HDFC Bank\",
\"accountName\":\"Test User\",\"accountNumber\":\"123456789012\",\"ifsc\":\"HDFC0001234\",\"sign\":\"$SIGN\"}"{
"code": 200,
"success": true,
"message": "Success",
"data": {
"orderNo": "WD26100112345678",
"mchOrderNo": "PAYOUT-77",
"amount": "1000.00",
"fee": "75.00",
"totalDebit": "1075.00",
"status": "pending",
"payType": "bank",
"txid": null,
"createdAt": "2026-10-01T15:01:02+05:30",
"paidAt": null
}
}Same endpoint as Query Pay-in, signed with mchSecret: the order is then looked up among your withdrawals by mchOrderNo (your payout number) or orderNo (our number).
| Parameter | Type | Required | विवरण |
|---|---|---|---|
mchId | string | हाँ | Your Merchant ID (also accepted as merchant_id) |
mchOrderNo | string | नहीं | Your order number (one of mchOrderNo / orderNo is required) |
orderNo | string | नहीं | Our order number returned by /payin |
sign | string | हाँ | Signature, see the Signature tab |
<?php
function rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}
$p = ['mchId' => 'YOUR_MERCHANT_ID', 'mchOrderNo' => 'PAYOUT-77']; // or 'orderNo' => our payout number (WD…)
$p['sign'] = rp_sign($p, 'YOUR_API_SECRET'); // mchSecret = withdrawal
$ch = curl_init('https://gamio.site/api/v3/check-order-status');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($p)]);
$res = json_decode(curl_exec($ch), true);
echo $res['data']['status'] ?? $res['message']; // pending | processing | success | failed# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; SECRET='YOUR_API_SECRET' # mchSecret = withdrawal
SIGN=$(rp_sign "mchId=$MCH_ID&mchOrderNo=PAYOUT-77" "$SECRET")
curl -sS -X POST 'https://gamio.site/api/v3/check-order-status' -H 'Content-Type: application/json' \
-d "{\"mchId\":\"$MCH_ID\",\"mchOrderNo\":\"PAYOUT-77\",\"sign\":\"$SIGN\"}"{
"code": 200,
"success": true,
"message": "Success",
"data": {
"orderNo": "WD26100112345678",
"mchOrderNo": "PAYOUT-77",
"amount": "1000.00",
"fee": "75.00",
"totalDebit": "1075.00",
"status": "success",
"payType": "bank",
"txid": null,
"createdAt": "2026-10-01T15:01:02+05:30",
"paidAt": "2026-10-01T15:20:11+05:30",
"type": "payout"
}
}| स्थिति | अर्थ |
|---|---|
pending | स्वीकृति की प्रतीक्षा में। |
processing | स्वीकृत, ट्रांसफ़र किया जा रहा है। |
success | लाभार्थी को भुगतान किया गया। अंतिम। |
failed | Rejected or cancelled, the held amount and fee went back to your balance. Final. |
Returns your wallet: balance (= available, what you can withdraw), frozen (held for pending withdrawals) and total.
| Parameter | Type | Required | विवरण |
|---|---|---|---|
mchId | string | हाँ | Your Merchant ID (also accepted as merchant_id) |
sign | string | हाँ | Signature, see the Signature tab |
<?php
function rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}
$p = ['mchId' => 'YOUR_MERCHANT_ID'];
$p['sign'] = rp_sign($p, 'YOUR_API_SECRET'); // mchSecret
$ch = curl_init('https://gamio.site/api/v3/check-gateway-balance');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode($p)]);
$res = json_decode(curl_exec($ch), true);
echo $res['data']['balance'] ?? $res['message'];const crypto = require('crypto');
function rpSign(p, key) {
const s = Object.keys(p)
.filter(k => k !== 'sign' && p[k] !== '' && p[k] != null) // empty values are not signed
.sort() // sort by parameter name
.map(k => `${k}=${p[k]}`).join('&');
return crypto.createHash('md5').update(`${s}&key=${key}`).digest('hex').toUpperCase();
}
const p = { mchId: 'YOUR_MERCHANT_ID' };
p.sign = rpSign(p, 'YOUR_API_SECRET'); // mchSecret
const res = await fetch('https://gamio.site/api/v3/check-gateway-balance', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(p),
}).then(r => r.json());
console.log(res.data ? res.data.balance : res.message);import hashlib
def rp_sign(p, key):
s = '&'.join(f'{k}={p[k]}' for k in sorted(p)
if k != 'sign' and p[k] not in ('', None)) # sorted, empty values skipped
return hashlib.md5(f'{s}&key={key}'.encode()).hexdigest().upper()
import requests
p = {'mchId': 'YOUR_MERCHANT_ID'}
p['sign'] = rp_sign(p, 'YOUR_API_SECRET') # mchSecret
res = requests.post('https://gamio.site/api/v3/check-gateway-balance', json=p, timeout=30).json()
print(res['data']['balance'] if res.get('success') else res.get('message'))# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; SECRET='YOUR_API_SECRET' # mchSecret
SIGN=$(rp_sign "mchId=$MCH_ID" "$SECRET")
curl -sS -X POST 'https://gamio.site/api/v3/check-gateway-balance' -H 'Content-Type: application/json' -d "{\"mchId\":\"$MCH_ID\",\"sign\":\"$SIGN\"}"{
"code": 200,
"success": true,
"message": "Success",
"data": {
"balance": "12450.00",
"available": "12450.00",
"frozen": "1075.00",
"total": "13525.00",
"currency": "INR"
}
}Every request and every callback carries a sign parameter: the MD5 hash of the sorted parameters followed by &key=KEY, in upper case.
- हस्ताक्षर को छोड़कर अनुरोध के सभी पैरामीटर लें। खाली मान वाले पैरामीटर छोड़ दिए जाते हैं।
- Sort them by parameter name, in plain byte order (mchId comes before mchOrderNo, upper-case letters before lower-case).
- Write each as name=value and join them with &. Values are not URL-encoded. Send amounts as strings with two decimals.
- Append &key= followed by your key: mchKey for pay-in and callbacks, mchSecret for pay-out and balance.
- उस पाठ का MD5 हैश लें और इसे बड़े अक्षर में लिखें। वह हस्ताक्षर है।
amount=500.00&mchId=123456789&mchOrderNo=ORDER-1001¬ifyUrl=https://merchant.example.com/webhook/reddypay&tradeType=INRUPI&key=TEST_KEY_0123456789abcdef
618EB8435DBA875EB138FF5657E8FA6Ffunction rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}const crypto = require('crypto');
function rpSign(p, key) {
const s = Object.keys(p)
.filter(k => k !== 'sign' && p[k] !== '' && p[k] != null) // empty values are not signed
.sort() // sort by parameter name
.map(k => `${k}=${p[k]}`).join('&');
return crypto.createHash('md5').update(`${s}&key=${key}`).digest('hex').toUpperCase();
}import hashlib
def rp_sign(p, key):
s = '&'.join(f'{k}={p[k]}' for k in sorted(p)
if k != 'sign' and p[k] not in ('', None)) # sorted, empty values skipped
return hashlib.md5(f'{s}&key={key}'.encode()).hexdigest().upper()import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
import java.util.*;
static String rpSign(Map<String, String> p, String key) throws Exception {
StringBuilder sb = new StringBuilder();
for (String k : new TreeMap<>(p).keySet()) { // sorted by name
String v = p.get(k);
if (k.equals("sign") || v == null || v.isEmpty()) continue;
sb.append(k).append('=').append(v).append('&');
}
sb.append("key=").append(key);
byte[] d = MessageDigest.getInstance("MD5").digest(sb.toString().getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : d) hex.append(String.format("%02X", b));
return hex.toString();
}# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -qसिग्नेचर कैलकुलेटर
Paste a request or a callback body and your key. Everything is calculated in your browser; nothing is sent to us.
When an order is paid (or fails) we POST the result to your notifyUrl — or to the callback URL saved in Basic Information. The body is JSON (default) or form-encoded, as detected when you press "Test endpoint". Every non-empty field is covered by sign.
| फ़ील्ड | विवरण |
|---|---|
mchId | Your Merchant ID (alias merchant_id) |
mchOrderNo | Your order number (alias merchant_order_no) |
orderNo | Our order number (alias gateway_order_no) |
amount | Order amount |
paidAmount | Amount actually paid |
fee | Our fee |
netAmount | Credited to your wallet (amount − fee) |
tradeType | INRUPI | usdt |
status | success | failed |
utr | Bank reference (UTR), when known |
payTime | Payment time, ISO-8601 IST |
extra | आपने भेजा गया अतिरिक्त मूल्य |
usdtAmount | USDT orders only: exact USDT amount |
sign | Signature (MD5, uppercase) made with your mchKey |
{
"mchId": "123456789",
"merchant_id": "123456789",
"mchOrderNo": "ORDER-1001",
"merchant_order_no": "ORDER-1001",
"orderNo": "RP2610011449406340360",
"gateway_order_no": "RP2610011449406340360",
"amount": "500.00",
"paidAmount": "500.00",
"fee": "55.00",
"netAmount": "445.00",
"tradeType": "INRUPI",
"status": "success",
"utr": "627412345678",
"payTime": "2026-10-01T14:50:15+05:30",
"extra": "",
"sign": "2B60E30809FDA5D9D5752EED2DAEB84E"
}जाँचें और स्वीकार करें
- Recalculate sign over all received fields except sign (see Signature) using your mchKey, and compare it in constant time. Reject the request when it differs.
- Be idempotent: the same callback can arrive again (retries, manual re-send). Use mchOrderNo / orderNo to find your order and ignore a status you already processed.
- Check status = success and that paidAmount matches what you expect before you deliver goods. If in doubt, confirm with /check-order-status.
- Answer HTTP 200 with the plain text success. Anything else — a timeout (8 s), a redirect, an error code or a body without "success" — counts as failed and is retried after 1 min, 5 min, 15 min, 1 h and 6 h; after the last attempt the delivery is marked failed (you will see it in your notifications).
<?php
function rp_sign(array $p, string $key): string {
unset($p['sign']);
$p = array_filter($p, fn($v) => $v !== '' && $v !== null); // empty values are not signed
ksort($p, SORT_STRING); // sort by parameter name
$pairs = [];
foreach ($p as $k => $v) $pairs[] = $k . '=' . $v;
return strtoupper(md5(implode('&', $pairs) . '&key=' . $key));
}
// Your notifyUrl endpoint. We send JSON or form fields (your choice in Basic Information).
$data = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$received = $data['sign'] ?? '';
if (!hash_equals(rp_sign($data, 'YOUR_API_KEY'), strtoupper($received))) { // mchKey; for payout callbacks use mchSecret
http_response_code(400); exit('invalid sign');
}
// Idempotent: the same callback can arrive more than once (retries, manual re-send).
if ($data['status'] === 'success' && !order_already_paid($data['mchOrderNo'])) {
mark_order_paid($data['mchOrderNo'], $data['paidAmount']);
}
echo 'success'; // plain text "success" with HTTP 200, otherwise we retryconst crypto = require('crypto');
function rpSign(p, key) {
const s = Object.keys(p)
.filter(k => k !== 'sign' && p[k] !== '' && p[k] != null) // empty values are not signed
.sort() // sort by parameter name
.map(k => `${k}=${p[k]}`).join('&');
return crypto.createHash('md5').update(`${s}&key=${key}`).digest('hex').toUpperCase();
}
const express = require('express');
const app = express();
app.use(express.json()); app.use(express.urlencoded({ extended: false }));
app.post('/webhook/reddypay', (req, res) => {
const d = req.body;
const ok = (d.sign || '').toUpperCase() === rpSign(d, 'YOUR_API_KEY'); // mchKey; payout callbacks: mchSecret
if (!ok) return res.status(400).send('invalid sign');
if (d.status === 'success' && !orderAlreadyPaid(d.mchOrderNo)) markOrderPaid(d.mchOrderNo, d.paidAmount); // idempotent
res.send('success'); // plain text "success" with HTTP 200, otherwise we retry
});import hashlib
def rp_sign(p, key):
s = '&'.join(f'{k}={p[k]}' for k in sorted(p)
if k != 'sign' and p[k] not in ('', None)) # sorted, empty values skipped
return hashlib.md5(f'{s}&key={key}'.encode()).hexdigest().upper()
from flask import Flask, request
app = Flask(__name__)
@app.post('/webhook/reddypay')
def webhook():
d = request.get_json(silent=True) or request.form.to_dict()
if d.get('sign', '').upper() != rp_sign(d, 'YOUR_API_KEY'): # mchKey; payout callbacks: mchSecret
return 'invalid sign', 400
if d.get('status') == 'success' and not order_already_paid(d['mchOrderNo']): # idempotent
mark_order_paid(d['mchOrderNo'], d['paidAmount'])
return 'success' # plain text "success" with HTTP 200, otherwise we retryimport java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
import java.util.*;
static String rpSign(Map<String, String> p, String key) throws Exception {
StringBuilder sb = new StringBuilder();
for (String k : new TreeMap<>(p).keySet()) { // sorted by name
String v = p.get(k);
if (k.equals("sign") || v == null || v.isEmpty()) continue;
sb.append(k).append('=').append(v).append('&');
}
sb.append("key=").append(key);
byte[] d = MessageDigest.getInstance("MD5").digest(sb.toString().getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : d) hex.append(String.format("%02X", b));
return hex.toString();
}
// Spring example: verify, then answer the text "success".
@PostMapping("/webhook/reddypay")
String webhook(@RequestBody Map<String, String> d) throws Exception {
if (!rpSign(d, "YOUR_API_KEY").equalsIgnoreCase(d.getOrDefault("sign", ""))) { // mchKey; payout callbacks: mchSecret
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "invalid sign");
}
if ("success".equals(d.get("status")) && !orderAlreadyPaid(d.get("mchOrderNo"))) markOrderPaid(d.get("mchOrderNo"), d.get("paidAmount"));
return "success";
}पे-आउट कॉलबैक
For withdrawals created through the API we send status processing (approved), success (paid) or failed (rejected). The body is signed with your mchSecret.
{
"mchId": "123456789",
"merchant_id": "123456789",
"mchOrderNo": "PAYOUT-77",
"merchant_order_no": "PAYOUT-77",
"orderNo": "WD26100112345678",
"gateway_order_no": "WD26100112345678",
"amount": "1000.00",
"fee": "75.00",
"totalDebit": "1075.00",
"status": "success",
"txid": "",
"payTime": "2026-10-01T15:20:11+05:30",
"message": "",
"sign": "…"
}Test it: in Basic Information press "Test endpoint". We send a signed test callback (test=true) both as JSON and as form data and remember the format your server accepts. A paid order can be sent again from the order list ("Resend webhook").
Copy-paste shell scripts (bash + curl + md5sum). Replace the placeholders with your own values.
# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; KEY='YOUR_API_KEY' # mchKey
SIGN=$(rp_sign "amount=500.00&mchId=$MCH_ID&mchOrderNo=ORDER-1001¬ifyUrl=https://merchant.example.com/webhook/reddypay&tradeType=INRUPI" "$KEY")
curl -sS -X POST 'https://gamio.site/api/v3/payin' -H 'Content-Type: application/json' -d "{
\"mchId\": \"$MCH_ID\", \"mchOrderNo\": \"ORDER-1001\", \"amount\": \"500.00\", \"tradeType\": \"INRUPI\",
\"notifyUrl\": \"https://merchant.example.com/webhook/reddypay\", \"sign\": \"$SIGN\"
}"# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; KEY='YOUR_API_KEY' # mchKey = pay-in order
SIGN=$(rp_sign "mchId=$MCH_ID&mchOrderNo=ORDER-1001" "$KEY")
curl -sS -X POST 'https://gamio.site/api/v3/check-order-status' -H 'Content-Type: application/json' \
-d "{\"mchId\":\"$MCH_ID\",\"mchOrderNo\":\"ORDER-1001\",\"sign\":\"$SIGN\"}"# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; SECRET='YOUR_API_SECRET' # mchSecret
SIGN=$(rp_sign "accountName=Test User&accountNumber=123456789012&amount=1000.00&bankCode=HDFC Bank&ifsc=HDFC0001234&mchId=$MCH_ID&mchOrderNo=PAYOUT-77&payType=bank" "$SECRET")
curl -sS -X POST 'https://gamio.site/api/v3/payout' -H 'Content-Type: application/json' -d "{
\"mchId\":\"$MCH_ID\",\"mchOrderNo\":\"PAYOUT-77\",\"amount\":\"1000.00\",\"payType\":\"bank\",\"bankCode\":\"HDFC Bank\",
\"accountName\":\"Test User\",\"accountNumber\":\"123456789012\",\"ifsc\":\"HDFC0001234\",\"sign\":\"$SIGN\"}"# sign: sorted "name=value" pairs joined with &, then &key=KEY -> MD5 -> upper case
rp_sign() { printf '%s' "$1&key=$2" | md5sum | cut -d' ' -f1 | tr 'a-f' 'A-F'; } # macOS: md5 -q
MCH_ID='YOUR_MERCHANT_ID'; SECRET='YOUR_API_SECRET' # mchSecret
SIGN=$(rp_sign "mchId=$MCH_ID" "$SECRET")
curl -sS -X POST 'https://gamio.site/api/v3/check-gateway-balance' -H 'Content-Type: application/json' -d "{\"mchId\":\"$MCH_ID\",\"sign\":\"$SIGN\"}"Use the bank name exactly as listed as bankCode in bank payouts (case does not matter). Any other text is accepted and shown to our operators as written.
| # | bankCode | |
|---|---|---|
| 1 | State Bank of India (SBI) | |
| 2 | Punjab National Bank (PNB) | |
| 3 | Bank of Baroda | |
| 4 | Canara Bank | |
| 5 | Union Bank of India | |
| 6 | Bank of India | |
| 7 | Indian Bank | |
| 8 | Central Bank of India | |
| 9 | Indian Overseas Bank | |
| 10 | UCO Bank | |
| 11 | Bank of Maharashtra | |
| 12 | Punjab & Sind Bank | |
| 13 | HDFC Bank | |
| 14 | ICICI Bank | |
| 15 | Axis Bank | |
| 16 | Kotak Mahindra Bank | |
| 17 | IndusInd Bank | |
| 18 | Yes Bank | |
| 19 | IDFC FIRST Bank | |
| 20 | Federal Bank | |
| 21 | South Indian Bank | |
| 22 | RBL Bank | |
| 23 | Karur Vysya Bank | |
| 24 | Karnataka Bank | |
| 25 | City Union Bank | |
| 26 | Tamilnad Mercantile Bank | |
| 27 | DCB Bank | |
| 28 | Bandhan Bank | |
| 29 | CSB Bank | |
| 30 | Dhanlaxmi Bank | |
| 31 | Jammu & Kashmir Bank | |
| 32 | AU Small Finance Bank | |
| 33 | Equitas Small Finance Bank | |
| 34 | Ujjivan Small Finance Bank | |
| 35 | ESAF Small Finance Bank | |
| 36 | Suryoday Small Finance Bank | |
| 37 | Jana Small Finance Bank | |
| 38 | North East Small Finance Bank | |
| 39 | Unity Small Finance Bank | |
| 40 | Utkarsh Small Finance Bank | |
| 41 | Airtel Payments Bank | |
| 42 | India Post Payments Bank | |
| 43 | Fino Payments Bank | |
| 44 | Paytm Payments Bank | |
| 45 | NSDL Payments Bank | |
| 46 | Standard Chartered Bank | |
| 47 | HSBC Bank | |
| 48 | Citibank | |
| 49 | Deutsche Bank | |
| 50 | Other / Not Listed |
Errors use the HTTP status code and the same envelope as successes. error is a stable machine-readable code, message is for humans.
{
"code": 401,
"success": false,
"message": "Invalid merchant ID or signature. Sign every parameter (except sign) with the right key — see the API documentation.",
"error": "invalid_signature"
}| HTTP | error | अर्थ |
|---|---|---|
| 400 | invalid_request | mchId or sign is missing, or the body could not be read |
| 401 | invalid_signature | Unknown merchant ID or wrong signature (the same answer for both, on purpose) |
| 401 | wrong_key_type | Signed with the wrong key: pay-in endpoints need mchKey, payout and balance need mchSecret |
| 403 | account_suspended | मर्चेंट खाता निलंबित है |
| 403 | ip_not_allowed | Your server IP is not on the IP allow-list of the account |
| 403 | ip_whitelist_required | Payouts through the API need an IP allow-list |
| 404 | order_not_found | No order with that mchOrderNo / orderNo on your account |
| 405 | use_post | Use POST |
| 409 | duplicate_order | This mchOrderNo was already used with a different amount or trade type |
| 413 | payload_too_large | Body larger than 64 KB |
| 422 | missing_param / invalid_amount / invalid_mch_order_no | एक पैरामीटर गायब है या गलत है, संदेश देखें |
| 422 | amount_range | Amount outside your limits |
| 422 | method_not_allowed | INR or USDT is not enabled for your account |
| 422 | invalid_trade_type / invalid_pay_type / invalid_url | Unsupported value |
| 422 | insufficient_balance / daily_limit / bank_invalid / ifsc_invalid / upi_invalid / address_invalid | Payout rejected, see message (nothing was debited) |
| 429 | rate_limited / too_many_failures | Too many requests or failed signatures. Wait for Retry-After seconds |
| 500 | server_error | Our side failed; retry with the same mchOrderNo (safe, idempotent) |
| 503 | provider_unavailable / maintenance / rate_unavailable | No payment channel (or USDT rate) available, or maintenance. Retry shortly |
A network error or HTTP 5xx on /payin does not mean the order was not created: repeat the request with the same mchOrderNo (safe) or query it.
The original payment-link API keeps working unchanged. It is signed with your API Secret (not mchKey) and answers with {"ok":true,"data":{…}}. New code should use API v3.
| Parameter | Type | Required | विवरण |
|---|---|---|---|
api_key | string | हाँ | आपकी API Key, या इसे X-Api-Key हेडर में भेजें |
amount | string | हाँ | दशमलव संख्या, अधिकतम 2 अंक, जैसे 500.00 |
note | string | नहीं | सादा टेक्स्ट, अधिकतम 255 अक्षर |
client_ref | string | नहीं | Your own order id, max 120 chars. Repeating it returns the same link (idempotent); echoed in status and webhook |
notify_url | string | नहीं | आपका वेबहुक URL |
return_url | string | नहीं | ग्राहक रिटर्न URL |
currency | string | नहीं | INR (डिफ़ॉल्ट) या USDT |
sign | string | हाँ | Uppercase MD5 of all params except sign, sorted by key, empty values skipped, + &key=<API Secret> |
curl -X POST https://gamio.site/api/v1/create-link.php \
-H "Content-Type: application/json" \
-d '{"api_key":"YOUR_API_KEY","amount":"500.00","client_ref":"ORDER-1042","notify_url":"https://merchant.example.com/hook","sign":"COMPUTED_SIGNATURE"}'{
"ok": true,
"data": {
"link_code": "48568a0be2cab05e6a49",
"client_ref": "ORDER-1042",
"amount": "500.00",
"currency": "INR",
"status": "pending",
"pay_url": "https://gamio.site/pay/48568a0be2cab05e6a49",
"created_at": "2026-10-01T14:49:40+05:30",
"expires_at": "2026-10-01T15:19:40+05:30"
}
}Returns link_code, client_ref, amount, currency, status (pending, success, failed, expired), pay_url, note, created_at and paid_at. Sign the query parameters the same way.
वेबहुक (notify_url)
When a link is paid we POST link_code, client_ref, amount, currency, status=success, paid_at and sign (same signing, API Secret) as JSON to notify_url. Any HTTP 2xx is accepted as received. Failed deliveries are retried like v3 callbacks.
| HTTP / त्रुटि | अर्थ |
|---|---|
401 missing_api_key / invalid_api_key / invalid_signature | प्रमाणीकरण विफल रहा |
403 account_suspended / ip_not_allowed | खाता निलंबित या IP की अनुमति नहीं है |
404 not_found | आपके अकाउंट पर ऐसा कोई लिंक नहीं है |
405 method_not_allowed | गलत HTTP मेथड |
409 duplicate_client_ref | client_ref पहले किसी दूसरी राशि के साथ इस्तेमाल हो चुका है |
422 invalid_amount / invalid_notify_url / method_not_allowed … | वैलिडेशन विफल, संदेश देखें |
502 gateway_error | कोई पेमेंट चैनल उपलब्ध नहीं |