curl --request POST \
--url https://api.cashfree.com/ppi/wallet/transfer/verify \
--header 'Content-Type: application/json' \
--header 'x-api-version: <x-api-version>' \
--header 'x-client-id: <api-key>' \
--header 'x-client-secret: <api-key>' \
--data '
{
"transfer_id": "TRANSFER123456",
"otp": "222113"
}
'import requests
url = "https://api.cashfree.com/ppi/wallet/transfer/verify"
payload = {
"transfer_id": "TRANSFER123456",
"otp": "222113"
}
headers = {
"x-api-version": "<x-api-version>",
"x-client-id": "<api-key>",
"x-client-secret": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-version': '<x-api-version>',
'x-client-id': '<api-key>',
'x-client-secret': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({transfer_id: 'TRANSFER123456', otp: '222113'})
};
fetch('https://api.cashfree.com/ppi/wallet/transfer/verify', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cashfree.com/ppi/wallet/transfer/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'transfer_id' => 'TRANSFER123456',
'otp' => '222113'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-version: <x-api-version>",
"x-client-id: <api-key>",
"x-client-secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cashfree.com/ppi/wallet/transfer/verify"
payload := strings.NewReader("{\n \"transfer_id\": \"TRANSFER123456\",\n \"otp\": \"222113\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("x-client-id", "<api-key>")
req.Header.Add("x-client-secret", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cashfree.com/ppi/wallet/transfer/verify")
.header("x-api-version", "<x-api-version>")
.header("x-client-id", "<api-key>")
.header("x-client-secret", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"transfer_id\": \"TRANSFER123456\",\n \"otp\": \"222113\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cashfree.com/ppi/wallet/transfer/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-version"] = '<x-api-version>'
request["x-client-id"] = '<api-key>'
request["x-client-secret"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"transfer_id\": \"TRANSFER123456\",\n \"otp\": \"222113\"\n}"
response = http.request(request)
puts response.read_body{
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_transfer_id": "8901234567890123456",
"transfer_id": "TRANSFER123456",
"amount": 500.75,
"transfer_mode": "NEFT",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "Cashfree payout Wallet",
"type": "FULL_KYC_PPI",
"status": "ACTIVE",
"balance": 9500.86,
"available_balance": 9500.86,
"funds_on_hold": 0
},
"status": "PENDING",
"status_code": "TRANSFER_INITIATED",
"bank_ref_no": null,
"bene_details": {
"bene_id": "BENE123",
"cf_bene_instrument_id": "35246543210987654323",
"instrument_details": {
"bank_account_number": "1234567890",
"ifsc": "HDFC0000123"
}
},
"purpose": "BUSINESS",
"remarks": "Vendor payment",
"notes": {
"example_key": "example_value"
},
"initiated_at": "2025-09-02T10:15:30Z",
"processed_at": null
}Verify Transfer
Submits the OTP for a wallet transfer that was initiated with mode OTP_VERIFICATION.
Use Get Transfer Details or webhooks for terminal status.
curl --request POST \
--url https://api.cashfree.com/ppi/wallet/transfer/verify \
--header 'Content-Type: application/json' \
--header 'x-api-version: <x-api-version>' \
--header 'x-client-id: <api-key>' \
--header 'x-client-secret: <api-key>' \
--data '
{
"transfer_id": "TRANSFER123456",
"otp": "222113"
}
'import requests
url = "https://api.cashfree.com/ppi/wallet/transfer/verify"
payload = {
"transfer_id": "TRANSFER123456",
"otp": "222113"
}
headers = {
"x-api-version": "<x-api-version>",
"x-client-id": "<api-key>",
"x-client-secret": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-version': '<x-api-version>',
'x-client-id': '<api-key>',
'x-client-secret': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({transfer_id: 'TRANSFER123456', otp: '222113'})
};
fetch('https://api.cashfree.com/ppi/wallet/transfer/verify', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cashfree.com/ppi/wallet/transfer/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'transfer_id' => 'TRANSFER123456',
'otp' => '222113'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-version: <x-api-version>",
"x-client-id: <api-key>",
"x-client-secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cashfree.com/ppi/wallet/transfer/verify"
payload := strings.NewReader("{\n \"transfer_id\": \"TRANSFER123456\",\n \"otp\": \"222113\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("x-client-id", "<api-key>")
req.Header.Add("x-client-secret", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cashfree.com/ppi/wallet/transfer/verify")
.header("x-api-version", "<x-api-version>")
.header("x-client-id", "<api-key>")
.header("x-client-secret", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"transfer_id\": \"TRANSFER123456\",\n \"otp\": \"222113\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cashfree.com/ppi/wallet/transfer/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-version"] = '<x-api-version>'
request["x-client-id"] = '<api-key>'
request["x-client-secret"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"transfer_id\": \"TRANSFER123456\",\n \"otp\": \"222113\"\n}"
response = http.request(request)
puts response.read_body{
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_transfer_id": "8901234567890123456",
"transfer_id": "TRANSFER123456",
"amount": 500.75,
"transfer_mode": "NEFT",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "Cashfree payout Wallet",
"type": "FULL_KYC_PPI",
"status": "ACTIVE",
"balance": 9500.86,
"available_balance": 9500.86,
"funds_on_hold": 0
},
"status": "PENDING",
"status_code": "TRANSFER_INITIATED",
"bank_ref_no": null,
"bene_details": {
"bene_id": "BENE123",
"cf_bene_instrument_id": "35246543210987654323",
"instrument_details": {
"bank_account_number": "1234567890",
"ifsc": "HDFC0000123"
}
},
"purpose": "BUSINESS",
"remarks": "Vendor payment",
"notes": {
"example_key": "example_value"
},
"initiated_at": "2025-09-02T10:15:30Z",
"processed_at": null
}Authorizations
Your unique client identifier issued by Cashfree. You can find this in your Merchant Dashboard.
The secret key associated with your client ID. Use this to authenticate your API requests. You can find this in your Merchant Dashboard.
Headers
API version to be used. Format is in YYYY-MM-DD.
"2025-11-01"
Body
Request parameters to verify the OTP for a wallet transfer request.
Transfer identifier from the initiate transfer request (transfer_id you supplied while initiating the transfer).
1 - 50"TRANSFER123456"
One-time password received by the end user on the configured notification channels.
4 - 10"222113"
Response
Success response for verifying a wallet transfer OTP.
Unique identifier for the user, as provided by you during PPI user creation.
"USER827364"
Unique identifier for the wallet, as provided by you during wallet creation.
"WALLET936721"
Unique identifier for the transfer transaction, generated by Cashfree.
"8901234567890123456"
Unique identifier for the transfer transaction, as provided by you during the transfer request.
"TRANSFER123456"
Amount that was transferred.
1250.5
Mode of transfer used.
RTGS, NEFT, IMPS, UPI "IMPS"
Show child attributes
Show child attributes
Status of the transfer operation.
RECEIVED, PENDING, SUCCESS, FAILED, REJECTED, VALIDATION_PENDING, REVERSED, APPROVAL_PENDING, QUEUED, MANUALLY_REJECTED "PENDING"
Bank reference number for the transfer. Will be null if transfer is not yet processed.
"BNK202502101530001"
Status code for detailed tracking of transfer progress.
"TRANSFER_INITIATED"
Beneficiary details used for the transfer.
Show child attributes
Show child attributes
Purpose of the transfer.
"SALARY"
Remarks for the transfer transaction.
"Monthly groceries transfer"
Optional key-value pairs for any extra information. Keys and values must be strings.
Show child attributes
Show child attributes
Timestamp when the transfer transaction was initiated.
"2025-09-02T10:15:30Z"
Timestamp when the transfer transaction was processed. Will be null if still pending.
"2025-09-02T10:17:45Z"
Was this page helpful?