Video KYC
Description
The Video KYC module verifies the user authenticity using a video verification process led by an agent.
| Module Name | Input | Output |
|---|---|---|
video_kyc | The user's verification video and additional identity details. | The complete details of the Video KYC journey of the user with the agent and the auditor details involved in the verification process. |
Prerequisites
Ensure collection and verification of the user's PAN and Aadhaar details.
This helps with the following checks.
- Verification of the PAN details against the information extracted from the user's PAN card with the help of HyperVerge's Optical Character Recognition (OCR) product during the video KYC process.
- Verification of the face captured from the video during the Video KYC process against the face captured from the PAN card and Aadhaar.
Module Inputs
The following table provides the details of the parameter required for the module.
| Parameter | Mandatory or Optional | Description |
|---|---|---|
aadhaarCreatedDate | Mandatory | The date of issue for the user's Aadhaar. |
aadhaarName | Mandatory | The name of the user as mentioned on their Aadhaar. |
panNumber | Mandatory | The Permanent Account Number(PAN) of the user. |
aadhaarImage | Mandatory | The image of the user's Aadhaar card. |
Module Configurations
Kindly contact the HyperVerge team for the configuration details.
Module Outputs
The following section provides the sample and the corresponding details of the various responses you can expect from the module.
- Success Response
- Failure Response Sample
- Error Response Sample
The following code is a sample success response with the status code of 200. A success response has the agentDecision value as "VERIFIED" at each step of the verification process (categorized by the stepType field in the videoCallSteps array).
{
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "<Request_Identifier>",
"transactionId": "<Transaction_Identifier>"
},
"result": {
"workflowDetails": {
"workflowId": "vkyc_flow",
"version": 1
},
"applicationStatus": "auto_approved",
"results": [
{
"module": "Video Kyc User Generation",
"moduleId": "module_videoKycUserGeneration",
"vkycaadhaarImageUrl": "<VKYC_AADHAAR_IMAGE_URL>",
"apiResponse": {
"url": "?params=xwOShvA",
"status": "success",
"statusCode": 200
},
"attempts": "1",
"previousAttempts": []
},
{
"module": "Video Kyc Verification Info",
"moduleId": "module_verificationInfo",
"apiResponse": {
"status": "success",
"statusCode": 201
},
"attempts": "1",
"previousAttempts": []
},
{
"module": "",
"moduleId": "videokyc",
"vkycrecordingImageUrl": "<VKYC_RECORDING_IMAGE_URL>",
"vkycaadhaarfrontImageUrl": "<VKYC_AADHAAR_FRONT_IMAGE_URL>",
"vkycaddressproofpage1ImageUrl": "<VKYC_ADDRESS_PROOF_PAGE1_IMAGE_URL>",
"vkycaddressproofpage2ImageUrl": "<VKYC_ADDRESS_PROOF_PAGE2_IMAGE_URL>",
"vkycfaceImageUrl": "<VKYC_FACE_IMAGE_URL>",
"vkycpanImageUrl": "<VKYC_PAN_IMAGE_URL>",
"apiResponse": {
"consent": {
"consentedAt": 1708692862999,
"customerConsent": true
},
"location": {
"isCustomerLocationCompliant": true,
"originalLatitude": "<Customer_Latitude>",
"originalLongitude": "<Customer_Longitude>"
},
"videoCallSteps": [
{
"stepType": "otp",
"details": {
"otp": "<OTP>"
},
"agentDecision": "VERIFIED",
"decisionedAt": 1708693022172
},
{
"stepType": "verificationInfo",
"details": {
"category": "personal",
"questions": [
{
"text": "Am I speaking to Mr. <Customer_Name>",
"originalValue": "<Customer_Name>",
"updatedValue": "<Customer_Name>",
"isEdited": false
},
{
"text": "Have you applied for a personal loan from <Bank_Name>?",
"originalValue": "<Yes_or_No>",
"updatedValue": "<Yes_or_No>",
"isEdited": false
},
{
"text": "What is your DOB?",
"originalValue": "<Customer_DOB>",
"updatedValue": "<Customer_DOB>",
"isEdited": false
},
{
"text": "What is your current address Pincode?",
"originalValue": "<Customer_Pincode>",
"updatedValue": "<Customer_Pincode>",
"isEdited": false
},
{
"text": "Are you salaried/self-employed?",
"originalValue": "<Salaried_or_Self_Employed>",
"updatedValue": "<Salaried_or_Self_Employed>",
"isEdited": false
}
]
},
"agentDecision": "VERIFIED",
"decisionedAt": 1708693075064
},
{
"stepType": "pan",
"details": {
"vkycPan": "<VKYC_PAN_IMAGE_URL>",
"ocr": {
"status": "success",
"statusCode": 200,
"result": {
"idType": "pan",
"fieldsExtracted": {
"firstName": {
"value": "<Customer_FirstName>"
},
"middleName": {
"value": "<Customer_MiddleName>"
},
"lastName": {
"value": "<Customer_LastName>"
},
"fullName": {
"value": "<Customer_FullName>"
},
"dateOfBirth": {
"value": "<Customer_DateOfBirth>"
},
"dateOfIssue": {
"value": "<Date_Of_Issue>"
},
"dateOfExpiry": {
"value": "<Date_Of_Expiry>"
},
"countryCode": {
"value": "<Country_Code>"
},
"type": {
"value": "<Type>"
},
"address": {
"value": "<Address>",
"houseNumber": "<House_Number>",
"additionalInfo": "<Additional_Info>",
"province": "<Province>",
"district": "<District>",
"street": "<Street>",
"zipCode": "<Zip_Code>"
},
"gender": {
"value": "<Gender>"
},
"idNumber": {
"value": "<ID_Number>"
},
"placeOfBirth": {
"value": "<Place_Of_Birth>"
},
"placeOfIssue": {
"value": "<Place_Of_Issue>"
},
"yearOfBirth": {
"value": "<Year_Of_Birth>"
},
"age": {
"value": "<Age>"
},
"fatherName": {
"value": "<Father_Name>"
},
"motherName": {
"value": "<Mother_Name>"
},
"husbandName": {
"value": "<Husband_Name>"
},
"spouseName": {
"value": "<Spouse_Name>"
},
"nationality": {
"value": "<Nationality>"
},
"mrzString": {
"value": "<MRZ_String>",
"idNumber": "<ID_Number>",
"fullName": "<Full_Name>",
"dateOfBirth": "<Date_Of_Birth>",
"dateOfExpiry": "<Date_Of_Expiry>",
"gender": "<Gender>",
"nationality": "<Nationality>"
},
"homeTown": {
"value": "<Home_Town>"
}
}
}
},
"faceMatch": [
{
"sourceImageType": "pan",
"match": "yes",
"matchScore": "95.5"
},
{
"sourceImageType": "aadhaar",
"match": "yes",
"matchScore": "92.3"
}
],
"nameMatch": {
"name1": "<Customer_Name_From_PAN>",
"name2": "<Customer_Name_From_Aadhaar>",
"name1Type": "pan",
"name2Type": "aadhaar",
"match": "yes",
"matchScore": "100"
},
"liveness": {
"isLive": "yes",
"livenessScore": "98.7"
}
},
"agentDecision": "VERIFIED",
"decisionedAt": 1708693150000
},
{
"stepType": "aadhaar",
"details": {
"vkycAadhaar": "<VKYC_AADHAAR_IMAGE_URL>",
"ocr": {
"status": "success",
"statusCode": 200,
"result": {
"idType": "aadhaar",
"fieldsExtracted": {
"firstName": {
"value": "<Customer_FirstName>"
},
"middleName": {
"value": "<Customer_MiddleName>"
},
"lastName": {
"value": "<Customer_LastName>"
},
"fullName": {
"value": "<Customer_FullName>"
},
"dateOfBirth": {
"value": "<Customer_DateOfBirth>"
},
"dateOfIssue": {
"value": "<Date_Of_Issue>"
},
"dateOfExpiry": {
"value": "<Date_Of_Expiry>"
},
"countryCode": {
"value": "<Country_Code>"
},
"type": {
"value": "<Type>"
},
"address": {
"value": "<Address>",
"houseNumber": "<House_Number>",
"additionalInfo": "<Additional_Info>",
"province": "<Province>",
"district": "<District>",
"street": "<Street>",
"zipCode": "<Zip_Code>"
},
"gender": {
"value": "<Gender>"
},
"idNumber": {
"value": "<ID_Number>"
},
"placeOfBirth": {
"value": "<Place_Of_Birth>"
},
"placeOfIssue": {
"value": "<Place_Of_Issue>"
},
"yearOfBirth": {
"value": "<Year_Of_Birth>"
},
"age": {
"value": "<Age>"
},
"fatherName": {
"value": "<Father_Name>"
},
"motherName": {
"value": "<Mother_Name>"
},
"husbandName": {
"value": "<Husband_Name>"
},
"spouseName": {
"value": "<Spouse_Name>"
},
"nationality": {
"value": "<Nationality>"
},
"mrzString": {
"value": "<MRZ_String>",
"idNumber": "<ID_Number>",
"fullName": "<Full_Name>",
"dateOfBirth": "<Date_Of_Birth>",
"dateOfExpiry": "<Date_Of_Expiry>",
"gender": "<Gender>",
"nationality": "<Nationality>"
},
"homeTown": {
"value": "<Home_Town>"
}
}
}
},
"faceMatch": [
{
"sourceImageType": "pan",
"match": "yes",
"matchScore": "95.5"
},
{
"sourceImageType": "aadhaar",
"match": "yes",
"matchScore": "92.3"
}
],
"nameMatch": {
"name1": "<Customer_Name_From_PAN>",
"name2": "<Customer_Name_From_Aadhaar>",
"name1Type": "pan",
"name2Type": "aadhaar",
"match": "yes",
"matchScore": "100"
},
"liveness": {
"isLive": "yes",
"livenessScore": "98.7"
}
},
"agentDecision": "VERIFIED",
"decisionedAt": 1708693200000
},
{
"stepType": "face",
"details": {
"vkycFace": "<VKYC_FACE_IMAGE_URL>",
"faceMatch": [
{
"sourceImageType": "pan",
"match": "yes",
"matchScore": "95.5"
},
{
"sourceImageType": "aadhaar",
"match": "yes",
"matchScore": "92.3"
}
],
"nameMatch": {
"name1": "<Customer_Name_From_PAN>",
"name2": "<Customer_Name_From_Aadhaar>",
"name1Type": "pan",
"name2Type": "aadhaar",
"match": "yes",
"matchScore": "100"
},
"liveness": {
"isLive": "yes",
"livenessScore": "98.7"
}
},
"agentDecision": "VERIFIED",
"decisionedAt": 1708693250000
}
],
"videoRecording": "<VKYC_VIDEO_RECORDING_URL>",
"vkycDetails": {
"agentDecision": "approved",
"agentDetails": {
"email": "<Agent_Email>"
},
"comments": ""
},
"auditDetails": {
"auditorDecision": "approved",
"auditorDetails": {
"email": "<Auditor_Email>"
},
"comments": ""
}
}
}
],
"previousAttempts": []
}
}
The following response structure is for reference only and has undergone minor changes. Please contact the HyperVerge team for the latest format.
You will receive a failure response similar to the following code sample if the agent or auditor declines the application.
If you receive a failure response, it should be reflected in the declined status of the kycDetails.agentDetails or auditDetails.auditorDecision.
{
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "",
"transactionId": ""
},
"result": {
"workflowDetails": {
"workflowId": "",
"version": 1
},
"applicationStatus": "",
"results": [
{
"attempts": "1",
"moduleId": "videokyc",
"imageUrl": "",
"videoImageUrl": "",
"apiResponse": {
"userDetails": {
"aadhaar": {
"createdDate": "<Format: YYYYMMDDHHmmsszzz>",
"name": "",
"image": "<Base64 Image>"
}
},
"consent": {
"consentStatus": true,
"consentedAt": "<Timestamp in ms. Type: Integer>"
},
"location": {
"latitude": 12.9076772,
"longitude": 77.6983156,
"isCustomerLocationCompliant": true
},
"videoCallSteps": [
{
"stepType": "otp",
"details": {
"otp": ""
},
"agentDecision": "declined",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
},
{
"stepType": "infoVerification",
"details": {
"category": "<string>",
"questions": [
{
"questionText": "",
"originalValue": "",
"updatedValue": "",
"isEdited": true
}
]
},
"agentDecision": "declined",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
},
{
"stepType": "pan",
"details": {
"image": "<URL for captured PAN image>",
"ocrResults": {
"firstName": {
"value": "",
"score": 0
},
"middleName": {
"value": "",
"score": 0
},
"lastName": {
"value": "",
"score": 0
},
"fullName": {
"value": "",
"score": 0
},
"dateOfBirth": {
"value": "",
"score": 0
},
"dateOfIssue": {
"value": "",
"score": 0
},
"dateOfExpiry": {
"value": "",
"score": 0
},
"countryCode": {
"value": "",
"score": 0
},
"type": {
"value": "",
"score": 0
},
"address": {
"value": "",
"houseNumber": "",
"additionalInfo": "",
"province": "",
"district": "",
"street": "",
"zipCode": "",
"score": 0
},
"gender": {
"value": "",
"score": 0
},
"idNumber": {
"value": "",
"score": 0
},
"placeOfBirth": {
"value": "",
"score": 0
},
"placeOfIssue": {
"value": "",
"score": 0
},
"yearOfBirth": {
"value": "",
"score": 0
},
"age": {
"value": "",
"score": 0
},
"fatherName": {
"value": "",
"score": 0
},
"motherName": {
"value": "",
"score": 0
},
"husbandName": {
"value": "",
"score": 0
},
"spouseName": {
"value": "",
"score": 0
},
"nationality": {
"value": "",
"score": 0
},
"mrzString": {
"value": "",
"idNumber": "",
"fullName": "",
"dateOfBirth": "",
"dateOfExpiry": "",
"gender": "",
"nationality": "",
"score": 0
},
"homeTown": {
"value": "",
"score": 0
}
},
"ocrError?": {
"reason": "<Text>"
}
},
"agentDecision": "declined",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
},
{
"stepType": "face",
"details": {
"image": "<URL for captured Selfie image>",
"nameMatch?": {
"name1": "",
"name2": "",
"name1Type": "pan",
"name2Type": "aadhaar"
},
"liveness?": {
"isLive": "yes|no",
"livenessScore": "<A value between 0-100>"
},
"faceMatch?": [
{
"sourceImageType": "pan",
"match": "yes|no",
"matchScore": "<A value between 0-100>"
},
{
"sourceImageType": "aadhaar",
"match": "yes|no",
"matchScore": "<A value between 0-100>"
}
]
},
"agentDecision": "declined",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
}
],
"videoRecording": "<URL for recorded video>",
"vkycDetails": {
"agentDecision": "declined",
"agentDetails": {
"email": "<Agent's email>"
},
"comments": ""
},
"auditDetails": {
"auditorDecision": "declined",
"auditorDetails": {
"email": "<Auditor's email>"
},
"comments": ""
}
}
}
],
"previousAttempts": []
}
}
The following response structure is for reference only and has undergone minor changes. Please contact the HyperVerge team for the latest format.
You will see an error response similar to the following code sample if the verification process encounters an error in any of its underlying checks. This can be under the ocrResults, the faceMatch, the nameMatch or the liveness section of the response.
{
"status": "success",
"statusCode": 200,
"metadata": {
"requestId": "",
"transactionId": ""
},
"result": {
"workflowDetails": {
"workflowId": "",
"version": 1
},
"applicationStatus": "",
"results": [
{
"attempts": "1",
"moduleId": "videokyc",
"imageUrl": "",
"videoImageUrl": "",
"apiResponse": {
"userDetails": {
"aadhaar": {
"createdDate": "<Format: YYYYMMDDHHmmsszzz>",
"name": "",
"image": "<Base64 Image>"
}
},
"consent": {
"consentStatus": true,
"consentedAt": "<Timestamp in ms. Type: Integer>"
},
"location": {
"latitude": 12.9076772,
"longitude": 77.6983156,
"isCustomerLocationCompliant": true
},
"videoCallSteps": [
{
"stepType": "otp",
"details": {
"otp": ""
},
"agentDecision": "verified",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
},
{
"stepType": "infoVerification",
"details": {
"category": "<string>",
"questions": [
{
"questionText": "",
"originalValue": "",
"updatedValue": "",
"isEdited": true
}
]
},
"agentDecision": "verified",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
},
{
"stepType": "pan",
"details": {
"image": "<URL for captured PAN image>",
"ocrResults": {
"firstName": {
"value": "",
"score": 0
},
"middleName": {
"value": "",
"score": 0
},
"lastName": {
"value": "",
"score": 0
},
"fullName": {
"value": "",
"score": 0
},
"dateOfBirth": {
"value": "",
"score": 0
},
"dateOfIssue": {
"value": "",
"score": 0
},
"dateOfExpiry": {
"value": "",
"score": 0
},
"countryCode": {
"value": "",
"score": 0
},
"type": {
"value": "",
"score": 0
},
"address": {
"value": "",
"houseNumber": "",
"additionalInfo": "",
"province": "",
"district": "",
"street": "",
"zipCode": "",
"score": 0
},
"gender": {
"value": "",
"score": 0
},
"idNumber": {
"value": "",
"score": 0
},
"placeOfBirth": {
"value": "",
"score": 0
},
"placeOfIssue": {
"value": "",
"score": 0
},
"yearOfBirth": {
"value": "",
"score": 0
},
"age": {
"value": "",
"score": 0
},
"fatherName": {
"value": "",
"score": 0
},
"motherName": {
"value": "",
"score": 0
},
"husbandName": {
"value": "",
"score": 0
},
"spouseName": {
"value": "",
"score": 0
},
"nationality": {
"value": "",
"score": 0
},
"mrzString": {
"value": "",
"idNumber": "",
"fullName": "",
"dateOfBirth": "",
"dateOfExpiry": "",
"gender": "",
"nationality": "",
"score": 0
},
"homeTown": {
"value": "",
"score": 0
}
},
"ocrError": {
"reason": "Complete ID not captured"
}
},
"agentDecision": "verified",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
},
{
"stepType": "face",
"details": {
"image": "<URL for captured Selfie image>",
"nameMatch?": {
"name1": "",
"name2": "",
"name1Type": "pan",
"name2Type": "aadhaar",
"nameMatchError": "Internal Server Error"
},
"liveness?": {
"isLive": "yes|no",
"livenessScore": "<A value between 0-100>",
"livenessError": {
"reason": "Multiple faces detected"
}
},
"faceMatch?": [
{
"sourceImageType": "pan",
"match": "yes|no",
"matchScore": "<A value between 0-100>",
"faceMatchError": {
"reason": "Face not detected in Selfie image"
}
},
{
"sourceImageType": "aadhaar",
"match": "yes|no",
"matchScore": "<A value between 0-100>",
"faceMatchError": {
"reason": "Face not detected in Selfie image"
}
}
]
},
"agentDecision": "verified",
"decisionedAt": "<Timestamp in ms. Type: Integer>"
}
],
"videoRecording": "<URL for recorded video>",
"vkycDetails": {
"agentDecision": "approved",
"agentDetails": {
"email": "<Agent's email>"
},
"comments": ""
},
"auditDetails?": {
"auditorDecision": "approved",
"auditorDetails?": {
"email": "<Auditor's email>"
},
"comments": ""
}
}
}
],
"previousAttempts": []
}
}
Response Details
| Object | Field | Description |
|---|---|---|
| vkycDetails | agentDecision | The field has the "VERIFIED" value in case of successful verification. |
| vkycDetails | comments | The comments from the agent. |
| vkycDetails.agentDetails | name | The name of the agent responsible for the user's verification process. |
| vkycDetails.agentDetails | The email ID of the agent responsible for the user's verification process. |
Product Change Log
- February, 2024 - We have updated the response structure for the module.