CKYC Validation
Module ID
| Name of the Module | Documents Supported |
|---|---|
module_ckyc_validation | CKYC record (XML file, a selfie image and officially valid documents) |
Description
This module extracts an end user's KYC details from the CKYC database and evaluates their identity.
The CKYC data extraction has the following two major steps:
- Search and download the CKYC record with PAN and Aadhaar inputs.
- Extract the end user's KYC details from the CKYC record to help you to evaluate the user's identity.
HyperVerge CKYC extractor API is used to act on part 2. The extractor API verifies the user's personally identifiable information (PII) against the data from the PDF files and classifies the response into three buckets based on an internal scoring mechanism summarized in the following sections.
- Approve
- Review
- Reject
Each CKYC record consists of user information in an XML file, selfie (photograph) and officially valid documents such as Aadhaar, voter ID, passport and driving licence in a PDF format. HyperVerge accepts any four of the officially valid documents types stated here. All other documents such as a rent agreement will be discarded.
You should parse the XML and send the data to the extractor API along with the selfie and the officially valid documents. The photograph of the applicant is matched against the photographs present in each of the documents in the request.
Module Inputs
The following table provides the details of the parameter required for the module:
| Parameter | Mandatory or Optional | Description | |
|---|---|---|---|
sample | Mandatory | The sample description. | |
action | - | approve, reject, manual_review |
|
validPOA | - | passport, driving_license, voter_id, aadhaar | Lists all the documents that have succeeded address validation. |
validPOI | - | passport, driving_license, voter_id, aadhaar | Lists all the documents that have succeeded identity validation such as name match and face match. |
invalidDocs | - | Contains a map of the document with the mismatch codes. Valid documents include Aadhaar, passport, driving_license and voter_id. | |
details | Object document, Object field, matchFound: boolean, score: number. |
| |
masked_aadhaar_url | String[] | images masked. First 8 digits will be masked. Valid for 15 mins. |
Module Configurations
This module does not support any additional configurations.
Module Outputs
The following section provides the sample and the corresponding details of the various responses you can expect from the module:
- Success Response Sample
- Failure Response Sample - Reject Channel
- Failure Response Sample - Manual Review Channel
{
"status": "success",
"statusCode": 200,
"result": {
"action": String,
"validPOA": String[],
"validPOI": String[],
"invalidDocs": Object<document,error[]>,
"details": Object<document, Object<field,
{
matchFound:boolean,
score: number
}>>,
"masked_aadhaar_url": String[]
}
}
Samples of Success Responses
- Success - Accept Channel
- Success - With Masked Aadhaar Parameter
- Success - With Aadhaar Type Parameter
{
"status":"success",
"statusCode":"200",
"result":{
"action":"approve",
"validPOA":[
"aadhaar"
],
"validPOI":[
"aadhaar"
],
"invalidDocs":{
},
"details":{
"aadhaar":{
"first_name":{
"matchFound":true,
"score":90
},
"last_name":{
"matchFound":true,
"score":100
},
"address1":{
"matchFound":true,
"score":95
},
"address2":{
"matchFound":true,
"score":96
},
"address3":{
"matchFound":true,
"score":100
},
"city":{
"matchFound":true,
"score":100
},
"dob":{
"matchFound":true,
"score":100
},
"aadhaar":{
"matchFound":true,
"score":100
},
"faceMatch":{
"matchFound":true,
"score":90
},
}
},
"aadhaar_type":"STANDARD"
}
}
Success Response Details
| Field | Description |
|---|---|
short_reject | CERSAI rejects a few cases immediately (short response) owing to basic errors. Such cases are categorised under the short_reject type. |
short_confirmed_match | CERSAI rejects (short response) a few cases which are already present in Cersai database. These cases are categorised as the short_confirmed type. You will also receive the CKYC number of the matched record. |
insufficient_balance | Your CERSAI wallet balance is not sufficient for the upload. |
long_reject | Besides the immediate short response, CERSAI also provides a long response with more details after 1-2 days of upload. Such cases are categorised under the long_reject type. |
probable_match | In the long response, Cersai will match all the data you have uploaded with its own database and return the possible match where probability of matching is higher. You will also get CKYC number of the matched record. |
long_confirmed_match | For the probable match cases where the probability is 100%, CERSAI will reject such cases stating a confirmed match. You will also receive CKYC number of the matched record. |
success | The record has been uploaded successfully. You receive the CKYC number of the uploaded record. |
{
"status":"success",
"statusCode":"200",
"result":{
"action":"approve",
"validPOA":[
"aadhaar"
],
"validPOI":[
"aadhaar"
],
"invalidDocs":{
},
"details":{
"aadhaar":{
"first_name":{
"matchFound":true,
"score":90
},
"last_name":{
"matchFound":true,
"score":100
},
"address1":{
"matchFound":true,
"score":95
},
"address2":{
"matchFound":true,
"score":96
},
"address3":{
"matchFound":true,
"score":100
},
"city":{
"matchFound":true,
"score":100
},
"dob":{
"matchFound":true,
"score":100
},
"aadhaar":{
"matchFound":true,
"score":100
},
"faceMatch":{
"matchFound":true,
"score":90
},
}
},
"aadhaar_type":"STANDARD",
"masked_aadhaar_url":["https://orion.com/1234/test.png"]
}
}
When mask aadhaar parameter is added, masked_aadhaar_urlthe URL of those page with masked aadhaar is returned.
{
"status":"success",
"statusCode":"200",
"result":{
"action":"approve",
"validPOA":[
"aadhaar"
],
"validPOI":[
"aadhaar"
],
"invalidDocs":{
},
"details":{
"aadhaar":{
"first_name":{
"matchFound":true,
"score":90
},
"last_name":{
"matchFound":true,
"score":100
},
"address1":{
"matchFound":true,
"score":95
},
"address2":{
"matchFound":true,
"score":96
},
"address3":{
"matchFound":true,
"score":100
},
"city":{
"matchFound":true,
"score":100
},
"dob":{
"matchFound":true,
"score":100
},
"aadhaar":{
"matchFound":true,
"score":100
},
"faceMatch":{
"matchFound":true,
"score":90
},
"doc_template": [
"aadhaar_front_bottom",
"aadhaar_back"
],
}
},
"aadhaar_type":"STANDARD"
}
}
{
"status":"success",
"statusCode":"200",
"result":{
"action":"reject",
"validPOA":[
],
"validPOI":[
],
"invalidDocs":{
"dl":[
"ER_FACE_NO_MATCH",
"ER_NAME"
]
},
"details":{
"dl":{
"first_name":{
"matchFound":false,
"score":40
},
"last_name":{
"matchFound":false,
"score":60
},
"dob":{
"matchFound":true,
"score":100
},
"address1":{
"matchFound":true,
"score":100
},
"address2":{
"matchFound":true,
"score":100
},
"address3":{
"matchFound":true,
"score":100
},
"city":{
"matchFound":true,
"score":100
},
"faceMatch":{
"matchFound":false,
"score":35
}
}
}
}
}
{
"status":"success",
"statusCode":"200",
"result":{
"action":"manual_review",
"validPOA":[
"aadhaar"
],
"validPOI":[
],
"invalidDocs":{
"aadhaar":[
"ER_FACE_NO_MATCH"
]
},
"details":{
"aadhaar":{
"first_name":{
"matchFound":true,
"score":100
},
"last_name":{
"matchFound":true,
"score":100
},
"address1":{
"matchFound":true,
"score":100
},
"address2":{
"matchFound":true,
"score":100
},
"address3":{
"matchFound":true,
"score":100
},
"city":{
"matchFound":true,
"score":100
},
"dob":{
"matchFound":true,
"score":100
},
"aadhaar":{
"matchFound":true,
"score":100
},
"faceMatch":{
"matchFound":false,
"score":37
}
}
},
"aadhaar_type":"STANDARD"
}
}
Error Response Details
Code property from error object | Category | Description |
|---|---|---|
| ER_BAD_DOC | Bad document | Document is not readable |
| ER_FACE_NO_MATCH | Face mismatch | Face Match not found |
| ER_FACE_MISSING | Face missing | |
| ER_NAME | Field mismatch | The name is a mismatch. |
| ER _ADDRESS | The address is a mismatch. | |
| ER_DOB | The date of birth is a mismatch. | |
| ER_ID | The ID is a mismatch. | |
| ER_PINCODE | The pin code does not match. | |
| ER_SERVER | File size exceeds the limit | File size exceeds 6MB. |
| ER_SERVER | Document length exceeds the limit | The document exceeds 5 pages. |
| Status Code | Error Message | Description |
|---|---|---|
| 401 | Missing/Invalid credentials | You have either missed to include the appid and appkey credentials in the request header or you have provided incorrect values. |
| 400 | first_name should not be null or undefined | You have missed to send the mandatory parameters in the request. |
| 400 | Selfie image not sent as part of the payload | You have missed to send the selfie image in the request. |
| 400 | pages exceeded the supported length of 5 | The number of pages in the request document exceeds 5 pages. |
| 413 | File too large | This status code is returned for requests with a file size exceeding 6MB. |
| 5xx | Internal server error | This status code is returned for server errors. Kindly reach out to HyperVerge. |
- Error 400 (a)
- Error 400 (b)
- Error 400 (c)
- Error 413
- Error 500
{
"status": "fail",
"statusCode": "400",
"error": {
"code": "ER_REQ_VALIDATE",
"message": "first_name should not be null or undefined"
}
}
{
"status": "failure",
"statusCode": "400",
"error": {
"code": "ER_REQ_VALIDATE",
"message": "Selfie image not sent as part of the payload"
}
}
{
"status": "failure",
"statusCode": "400",
"error": {
"code": "ER_PAGE",
"message": "pages exceeded the supported length of 5"
}
}
{
"status": "failure",
"statusCode": "413",
"error": {
"code": "ER_SERVER",
"message": "File too large"
}
}
{
"status": "failure",
"statusCode": "500",
"error": {
"code": "ER_SERVER",
"message": "Internal server error"
}
}