Loading...
Loading...
Integrate Paywize Payout API for instant IMPS, NEFT, and bulk disbursements.
Last updated: 2026-02-21
The Paywize Payout API enables businesses to send money instantly to bank accounts using IMPS, NEFT, and RTGS transfer methods. Built for high performance and reliability, our API handles everything from single transfers to bulk payouts with real-time status tracking and webhook notifications.
Version: 1.0.0
Release Date: November 5, 2025
Base URL: https://merchant.paywize.in/payout/v1/
All Payout API requests use shared authentication and encryption:
import crypto from 'crypto';
// Encryption/Decryption functions (shared across all APIs)
function encryptMerchantData(data, key, iv) {
if (typeof data === 'object') {
data = JSON.stringify(data);
}
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);
return encrypted.toString('base64');
}
function decryptMerchantData(data, key, iv) {
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
const decrypted = Buffer.concat([
decipher.update(Buffer.from(data, 'base64')),
decipher.final()
]);
return decrypted.toString('utf8');
}
// Your API credentials
const API_KEY = 'your_32_char_api_key_here_123456';
const SECRET_KEY = 'your_16_char_iv_12';
// Step 1: Generate access token
async function generateAccessToken() {
const credentials = {
apiKey: API_KEY,
secretKey: SECRET_KEY
};
const encryptedPayload = encryptMerchantData(credentials, API_KEY, SECRET_KEY);
const response = await fetch('https://merchant.paywize.in/v1/auth/clients/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ payload: encryptedPayload })
});
const result = await response.json();
if (result.respCode === 2000) {
const decryptedData = decryptMerchantData(result.data, API_KEY, SECRET_KEY);
return JSON.parse(decryptedData).token;
}
throw new Error(result.respMessage);
}
// Step 2: Initiate payout
async function initiatePayout(token) {
const payoutData = {
sender_id: "unique_transaction_id",
wallet_id: "PAYWIZE12345679",
payment_mode: "IMPS",
beneficiary_name: "John Doe",
beneficiary_acc_number: "123456789012",
beneficiary_ifsc: "HDFC0001234",
amount: 1000,
remarks: "Payment",
callback_url: "https://your-webhook-url.com/payout-webhook"
};
const encryptedPayload = encryptMerchantData(payoutData, API_KEY, SECRET_KEY);
const response = await fetch('https://merchant.paywize.in/payout/v1/initiate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ payload: encryptedPayload })
});
const result = await response.json();
if (result.respCode === 2000) {
const decryptedData = decryptMerchantData(result.data, API_KEY, SECRET_KEY);
return JSON.parse(decryptedData);
}
throw new Error(result.respMessage);
}
// Step 3: Check payout status
async function checkPayoutStatus(token, transactionId) {
const response = await fetch(
`https://merchant.paywize.in/payout/v1/status?transaction_id=${transactionId}`,
{
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}
}
);
const result = await response.json();
if (result.respCode === 2000) {
const decryptedData = decryptMerchantData(result.data, API_KEY, SECRET_KEY);
return JSON.parse(decryptedData);
}
throw new Error(result.respMessage);
}
// Step 4: Check wallet balance
async function checkWalletBalance(token, walletId) {
const response = await fetch(`https://merchant.paywize.in/payout/v1/balance?wallet_id=${walletId}`, {
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}
});
const result = await response.json();
if (result.respCode === 2000) {
const decryptedData = decryptMerchantData(result.data, API_KEY, SECRET_KEY);
return JSON.parse(decryptedData);
}
throw new Error(result.respMessage);
}
// Complete workflow
async function payoutWorkflow() {
try {
// Generate token
const token = await generateAccessToken();
console.log('✅ Token generated successfully');
// Check wallet balance
const balance = await checkWalletBalance(token, 'PAYWIZE12345679');
console.log('✅ Wallet balance:', balance);
// Initiate payout
const payout = await initiatePayout(token);
console.log('✅ Payout initiated:', payout);
// Check status
const status = await checkPayoutStatus(token, payout.transaction_id);
console.log('✅ Payout status:', status);
} catch (error) {
console.error('❌ Error:', error.message);
}
}
// Run the workflow
payoutWorkflow();
POST merchant.paywize.in/v1/auth/clients/token
Generate a JWT access token for authenticating API requests. Tokens expire after 5 minutes.
POST https://merchant.paywize.in/payout/v1/initiate
Initiate a payout transaction to transfer money to a beneficiary account.
GET https://merchant.paywize.in/payout/v1/status
Check the current status of a payout transaction.
GET https://merchant.paywize.in/payout/v1/balance
Check your current wallet balance.
Receive real-time payout status updates via webhooks (configured per transaction).
| Mode | Description | Processing Time | Min Amount | Max Amount |
|---|---|---|---|---|
| IMPS | Immediate Payment Service | Instant (24x7) | ₹1 | ₹5,00,000 |
| NEFT | National Electronic Funds Transfer | 30 minutes - 2 hours | ₹1 | ₹10,00,000 |
| RTGS | Real Time Gross Settlement | 30 minutes - 2 hours | ₹2,00,000 | ₹10,00,00,000 |
| Status | Description |
|---|---|
| INITIATED | Transaction has been initiated |
| PROCESSING | Transaction is being processed |
| SUCCESS | Transaction completed successfully |
| FAILED | Transaction failed |
| REFUNDED | Transaction amount refunded |
| Code | Message |
|---|---|
| 2000 | Access Token generated |
| 4001 | Unauthorized access |
| Code | Message |
|---|---|
| 2000 | Transaction initiated successfully |
| 4001 | Unauthorized - invalid or expired token |
| 4002 | Insufficient wallet balance |
| 4003 | Invalid beneficiary details |
| 4004 | Invalid amount format |
| 4005 | Amount below minimum limit |
| 4006 | Amount above maximum limit |
| 4007 | Invalid IFSC code |
| 4008 | Invalid account number |
| 4009 | Duplicate client reference ID |
| 4010 | Daily limit exceeded |
| 4011 | Monthly limit exceeded |
| 4012 | Invalid transfer mode |
| 4013 | Beneficiary account verification failed |
| 4014 | Bank down for maintenance |
| 4015 | Transaction not allowed to this bank |
| 5000 | Internal server error |
Use the sandbox environment for testing:
https://sandbox.merchant.paywize.in/payout/v1/For testing purposes, use these test bank account details:
| Bank | Account Number | IFSC Code | Expected Result |
|---|---|---|---|
| Test Bank | 1234567890 | TEST0001234 | Success |
| Test Bank | 9876543210 | TEST0001234 | Failed |
| Test Bank | 5555555555 | TEST0001234 | Pending |
npm install @paywize/payout-api
import { PaywizePayout } from '@paywize/payout-api';
const client = new PaywizePayout({
apiKey: 'your_api_key',
secretKey: 'your_secret_key',
environment: 'production' // or 'sandbox'
});
const payout = await client.initiate({
client_ref_id: 'TXN123456',
amount: '1000.00',
beneficiary: {
name: 'John Doe',
account_number: '1234567890',
ifsc: 'HDFC0001234'
}
});
pip install paywize-payout
from paywize_payout import PaywizePayout
client = PaywizePayout(
api_key='your_api_key',
secret_key='your_secret_key',
environment='production' # or 'sandbox'
)
payout = client.initiate({
'client_ref_id': 'TXN123456',
'amount': '1000.00',
'beneficiary': {
'name': 'John Doe',
'account_number': '1234567890',
'ifsc': 'HDFC0001234'
}
})
Get Started with API Credentials →
Version 1.0.0 | Last Updated: November 2025