curl --request POST \
--url https://api.cashfree.com/ppi/kyc/vkyc \
--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 '
{
"user_id": "USER827364",
"verification_id": "TestVkycVerification",
"notification_modes": [
"SMS",
"WHATSAPP"
]
}
'import requests
url = "https://api.cashfree.com/ppi/kyc/vkyc"
payload = {
"user_id": "USER827364",
"verification_id": "TestVkycVerification",
"notification_modes": ["SMS", "WHATSAPP"]
}
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({
user_id: 'USER827364',
verification_id: 'TestVkycVerification',
notification_modes: ['SMS', 'WHATSAPP']
})
};
fetch('https://api.cashfree.com/ppi/kyc/vkyc', 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/kyc/vkyc",
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([
'user_id' => 'USER827364',
'verification_id' => 'TestVkycVerification',
'notification_modes' => [
'SMS',
'WHATSAPP'
]
]),
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/kyc/vkyc"
payload := strings.NewReader("{\n \"user_id\": \"USER827364\",\n \"verification_id\": \"TestVkycVerification\",\n \"notification_modes\": [\n \"SMS\",\n \"WHATSAPP\"\n ]\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/kyc/vkyc")
.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 \"user_id\": \"USER827364\",\n \"verification_id\": \"TestVkycVerification\",\n \"notification_modes\": [\n \"SMS\",\n \"WHATSAPP\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cashfree.com/ppi/kyc/vkyc")
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 \"user_id\": \"USER827364\",\n \"verification_id\": \"TestVkycVerification\",\n \"notification_modes\": [\n \"SMS\",\n \"WHATSAPP\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "RECEIVED",
"status_code": "LINK_GENERATED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-03",
"notification_modes": [
"SMS",
"WHATSAPP"
],
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}Initiate Video KYC
Initiates Video KYC for a user and generates a VKYC link. This endpoint creates a VKYC verification request and sends the notification across the requested channels.
curl --request POST \
--url https://api.cashfree.com/ppi/kyc/vkyc \
--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 '
{
"user_id": "USER827364",
"verification_id": "TestVkycVerification",
"notification_modes": [
"SMS",
"WHATSAPP"
]
}
'import requests
url = "https://api.cashfree.com/ppi/kyc/vkyc"
payload = {
"user_id": "USER827364",
"verification_id": "TestVkycVerification",
"notification_modes": ["SMS", "WHATSAPP"]
}
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({
user_id: 'USER827364',
verification_id: 'TestVkycVerification',
notification_modes: ['SMS', 'WHATSAPP']
})
};
fetch('https://api.cashfree.com/ppi/kyc/vkyc', 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/kyc/vkyc",
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([
'user_id' => 'USER827364',
'verification_id' => 'TestVkycVerification',
'notification_modes' => [
'SMS',
'WHATSAPP'
]
]),
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/kyc/vkyc"
payload := strings.NewReader("{\n \"user_id\": \"USER827364\",\n \"verification_id\": \"TestVkycVerification\",\n \"notification_modes\": [\n \"SMS\",\n \"WHATSAPP\"\n ]\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/kyc/vkyc")
.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 \"user_id\": \"USER827364\",\n \"verification_id\": \"TestVkycVerification\",\n \"notification_modes\": [\n \"SMS\",\n \"WHATSAPP\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cashfree.com/ppi/kyc/vkyc")
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 \"user_id\": \"USER827364\",\n \"verification_id\": \"TestVkycVerification\",\n \"notification_modes\": [\n \"SMS\",\n \"WHATSAPP\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "RECEIVED",
"status_code": "LINK_GENERATED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-03",
"notification_modes": [
"SMS",
"WHATSAPP"
],
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": 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 initiate Video KYC verification for a user and generate a VKYC link.
Unique identifier for the user, as provided by you during PPI user creation. Only alphanumeric characters, periods (.), hyphens (-), and underscores (_) are allowed.
1 - 50"USER827364"
Unique identifier that you create to identify the VKYC verification request in your system. Only alphanumeric characters, periods (.), hyphens (-), and underscores (_) are allowed.
1 - 50"TestVkycVerification"
Notification channels on which VKYC link is sent.
1SMS, WHATSAPP ["SMS", "WHATSAPP"]
Response
Success response for initiating Video KYC verification.
Unique identifier for the VKYC verification request, as provided by you during the request.
"TestVkycVerification"
Unique identifier for the VKYC verification request, generated by Cashfree.
"8901234567890123458"
Unique identifier for the user, as provided by you during PPI user creation.
"USER827364"
Status of the VKYC verification process. Refer to VKYC status and status-code mapping for all valid combinations.
RECEIVED, FAILED, EXPIRED, AGENT_REVIEWED, PRE_VIDEO_CALL, VIDEO_CALL, AUDITOR_REVIEWED "RECEIVED"
Status code for detailed tracking of the VKYC verification process. Refer to VKYC status and status-code mapping for all valid combinations.
LINK_GENERATED, VKYC_EXPIRED, AADHAAR_VERIFICATION_SUCCESS, AADHAAR_VERIFICATION_FAILED, AADHAAR_VERIFICATION_EXPIRED, USER_IP_VERIFICATION_SUCCESSFUL, USER_PROXY_DETECTED, TECHNICAL_FAILURE, USER_LOCATION_VERIFICATION_SUCCESS, USER_LOCATION_OUTSIDE_INDIA, USER_AUDIO_CHECK_FAILED, USER_VIDEO_CHECK_FAILED, USER_LOCATION_PERMISSION_DISABLED, USER_DEVICE_CHECK_SUCCESS, USER_QUEUED, SCHEDULED_USER_QUEUED, NO_AGENT_FOUND, AGENT_ASSIGNED_TO_USER, USER_MEETING_SCHEDULED, USER_MEETING_CANCELLED, USER_ACCEPTED_MEETING, USER_REJECTED_MEETING, USER_MISSED_MEETING, USER_DROPPED_OFF, AGENT_DROPPED_OFF, USER_ENDED_CALL, AGENT_ENDED_CALL, TECHNICAL_ERROR, AGENT_APPROVED, AGENT_REJECTED, AGENT_UNABLE_TO_VALIDATE, AUDITOR_APPROVED, AUDITOR_REJECTED, INITIATE_FAILED "LINK_GENERATED"
Generated VKYC session link for the user.
"https://vkyc.cashfree.com/session/abc123"
The date on which the vKYC link will expire.
"2026-06-03"
Notification channels used for sharing VKYC link, passed in the request.
SMS, WHATSAPP Scheduled UTC timestamp for the VKYC meeting. Returns null if no meeting is scheduled.
"2026-06-04T10:15:30Z"
Remarks provided by the auditor during the Video KYC process. Returns null if not yet reviewed.
"Verification completed successfully"
Remarks provided by the agent during the Video KYC process. Returns null if the call is not completed.
"Pan not available during video call"
Was this page helpful?