Fund Transfer
POST https://{pg_api_url}/v3/fundtransfer
Content-Type: application/x-www-form-urlencoded
{pg_api_url} is the payouts API host provided to you at onboarding.
Request parameters
api_keystring (36)requiredmerchant_reference_numberstring (30)requiredYour merchant reference. The PDF requires it to be unique for every fund transfer.
amountdecimal(10,2)requiredAmount to transfer.
transfer_typestring (4)requiredNEFT or IMPS. IMPS is capped at ₹2 lakh per transfer.
account_numberstring (50)requiredBeneficiary account number.
ifsc_codestring (50)requiredBeneficiary IFSC.
account_namestring (50)Beneficiary account holder name.
bank_namestring (50)bank_branchstring (50)hashstring (255)requiredSample request
- cURL
- PHP
- Node.js
curl -X POST https://{pg_api_url}/v3/fundtransfer \
-d "api_key=YOUR_API_KEY" \
-d "merchant_reference_number=PAY-124" \
-d "amount=1000" \
-d "transfer_type=NEFT" \
-d "account_name=John Doe" \
-d "account_number=000123456789" \
-d "ifsc_code=HDFC0000001" \
-d "hash=$HASH"
$params = [
"api_key" => $apiKey,
"merchant_reference_number" => "PAY-124",
"amount" => "1000",
"transfer_type" => "NEFT",
"account_name" => "John Doe",
"account_number" => "000123456789",
"ifsc_code" => "HDFC0000001",
];
$params["hash"] = generateHashKey($params, $salt);
$res = httpPost("https://{pg_api_url}/v3/fundtransfer", $params);
const params = {
api_key: apiKey,
merchant_reference_number: "PAY-124",
amount: "1000",
transfer_type: "NEFT",
account_name: "John Doe",
account_number: "000123456789",
ifsc_code: "HDFC0000001",
};
params.hash = generateHash(params, salt);
const res = await fetch(`https://${pgApiUrl}/v3/fundtransfer`, {
method: "POST",
body: new URLSearchParams(params),
}).then(r => r.json());
Response
{
"data": {
"status": "PROCESSING",
"merchant_reference_number": "PAY-124",
"transaction_id": "NEFT3057381244"
}
}
The status is initially PROCESSING. Poll Fund Transfer Status or wait for the S2S callback to learn the terminal state.
If the bank terminates the transfer (network or server issue at their end):
{
"error": {
"code": 1029,
"message": "Transaction terminated"
}
}
1029 is terminal failure — generate a new merchant_reference_number if you want to retry.
If a fund-transfer request times out, check Fund Transfer Status with the same merchant_reference_number before sending another transfer request. Retrying with a fresh number can create a second payout.
Rails
| Rail | Limits | Speed |
|---|---|---|
| IMPS | ≤ ₹2 lakh per txn | Near-instant, 24×7 |
| NEFT | No upper cap | Cleared in half-hour windows during banking hours |
For amounts above ₹2 lakh, set transfer_type=NEFT.