CKYC Upload
Module Description
The CKYC Upload module uploads the Know Your Customer (KYC) details of a user to the Central KYC Registry.
Prerequisites
-
You will have to register for Cersai testbed to test this flow. Any integration errors have to be solved on the testbed before going live. Click on the following link to get the details of the registration process.
-
You will have to whitelist HyperVerge IPs:
- Kindly contact HyperVerge to get access to the IPs to be whitelisted
- Testbed - HV UAT IP should be whitelisted on testbed
- Production - HV Production IP should be whitelisted on Production
- Click on the following link for the process document required for the whitelisting process.
-
Procuring SFTP Credentials:
- Clients will have to obtain SFTP access from CERSAI and provide the credentials to HV. Click on the following link for the Process document
- SFTP credentials to be shared with HyperVerge:
- Username or institution code and Password
- Domain name or IP address
-
You will have to create 2 Admin users on CKYC portal - The Maker and the Checker.
- example Public and Private keys of any one user to be shared with HyperVerge Webhook Creation
-
You will have to create a webhook to receive Cersai success or error response.
- Cersai email id: helpdesk@ckycindia.in
-
You need to provide the following details to set up a one-time configuration with us:
-
organisationName - Enter your organisation name as per CERSAI portal
-
fiCode - Enter your FI Code as per CERSAI portal
-
regionCode - Enter your region code as per CERSAI portal
-
webhookUrl - your API endpoint where you would receive the webhook
-
username - maker credentials that HyperVerge will use to upload
-
password - maker credentials that HyperVerge will use to upload
-
host - SFTP ip address shared by CERSAI to you
-
Module Inputs
Mandatory Inputs
All the mandatory fields required for the module are listed here.
The following table provides the details of the parameter required for the module.
| Parameter | Mandatory or Optional | Description |
|---|---|---|
image | Mandatory | The image that you want to upload to the CKYC database. |
metaData | Mandatory | A collection of granular information that you want to be uploaded to the CKYC database. You can find the samples of input expected under metadata in the following section. |
Sample Metadata
The KYC metadata for an individual is different from the KYC metadata for a legal entity. The following section provides a sample for each category.
The Error Response Details section provides more details on the nature of the keys present under the metadata label (mandatory or optional) and associated error values.
- Metadata for Individual
- Metadata for Legal Entity
{
"constitutionType": "01",
"branchCode": "IN1234BB",
"accountType": "01",
"applicantNamePrefix": "<Enter_the_applicant_name_prefix>",
"applicantFirstName": "<Enter_the_applicant_first_name>",
"applicantMiddleName": "<Enter_the_applicant_middle_name>",
"applicantLastName": "<Enter_the_applicant_last_name>",
"applicantMaidenNamePrefix": "<Enter_the_applicant_maiden_name_prefix>",
"applicantMaidenFirstName": "<Enter_the_applicant_maiden_first_name>",
"applicantMaidenMiddleName": "<Enter_the_applicant_maiden_middle_name>",
"applicantMaidenLastName": "<Enter_the_applicant_maiden_last_name>",
"fatherNamePrefix": "<Enter_the_father_name_prefix>",
"fatherFirstName": "<Enter_the_father_first_name>",
"fatherMiddleName": "<Enter_the_father_middle_name>",
"fatherLastName": "<Enter_the_father_last_name>",
"spouseNamePrefix": "<Enter_the_spouse_name_prefix>",
"spouseFirstName": "<Enter_the_spouse_first_name>",
"spouseMiddleName": "<Enter_the_spouse_middle_name>",
"spouseLastName": "<Enter_the_spouse_last_name>",
"motherNamePrefix": "<Enter_the_mother_name_prefix>",
"motherFirstName": "<Enter_the_mother_first_name>",
"motherMiddleName": "<Enter_the_mother_middle_name>",
"motherLastName": "<Enter_the_mother_last_name>",
"gender": "<Enter_the_gender>",
"dob": "<Enter_the_dob>",
"pan": "<Enter_the_pan>",
"permanentCurrentAddressMatch": "Y",
"address": {
"line1": "<Enter_the_address_line1>",
"line2": "<Enter_the_address_line2>",
"line3": "<Enter_the_address_line3>",
"city": "<Enter_the_city>",
"district": "<Enter_the_district>",
"state": "<Enter_the_state>",
"country": "<Enter_the_country>",
"pincode": "<Enter_the_pincode>",
"proof": "<Enter_the_proof>"
},
"currentAddress": {
"line1": "<Enter_the_current_address_line1>",
"line2": "<Enter_the_current_address_line2>",
"line3": "<Enter_the_current_address_line3>",
"city": "<Enter_the_current_city>",
"district": "<Enter_the_current_district>",
"state": "<Enter_the_current_state>",
"country": "<Enter_the_current_country>",
"pincode": "<Enter_the_current_pincode>",
"proof": "<Enter_the_current_proof>"
},
"contact": {
"residenceTelephoneStdCode": "<Enter_the_residence_telephone_std_code>",
"residenceTelephone": "<Enter_the_residence_telephone>",
"officeTelephoneStdCode": "<Enter_the_office_telephone_std_code>",
"officeTelephone": "<Enter_the_office_telephone>",
"mobileIsdCode": "<Enter_the_mobile_isd_code>",
"mobile": "<Enter_the_mobile>",
"email": "<Enter_the_email>"
},
"idDetails": [
{
"type": "<Enter_the_id_type>",
"number": "<Enter_the_id_number>"
}
],
"dateOfDeclaration": "<Enter_the_date_of_declaration>",
"placeOfDeclaration": "<Enter_the_place_of_declaration>",
"dateOfKYCVerification": "<Enter_the_date_of_kyc_verification>",
"typeOfDocumentSubmitted": "<Enter_the_type_of_document_submitted>",
"kycVerificationName": "<Enter_the_kyc_verification_name>",
"kycVerificationDesignation": "<Enter_the_kyc_verification_designation>",
"kycVerificationBranch": "<Enter_the_kyc_verification_branch>",
"kycVerificationEmpCode": "<Enter_the_kyc_verification_emp_code>"
}
{
"constitutionType": "D",
"branchCode": "IN1234BB",
"entityName": "<Enter_the_entity_name>",
"doi": "<Enter_the_doi>",
"placeOfIncorporation": "<Enter_the_place_of_incorporation>",
"doc": "<Enter_the_doc>",
"countryOfIncorporation": "IN",
"pan": "<Enter_the_pan>",
"permanentCurrentAddressMatch": "Y",
"address": {
"line1": "<Enter_the_address_line1>",
"line2": "<Enter_the_address_line2>",
"line3": "<Enter_the_address_line3>",
"city": "<Enter_the_city>",
"district": "<Enter_the_district>",
"state": "KA",
"country": "IN",
"pincode": "<Enter_the_pincode>",
"proof": "certificateOfIncorporation"
},
"currentAddress": {
"line1": "<Enter_the_current_address_line1>",
"line2": "<Enter_the_current_address_line2>",
"line3": "<Enter_the_current_address_line3>",
"city": "<Enter_the_current_city>",
"district": "<Enter_the_current_district>",
"state": "<Enter_the_state>",
"country": "IN",
"pincode": "<Enter_the_current_pincode>",
"proof": "certificateOfIncorporation"
},
"contact": {
"residenceTelephoneStdCode": "<Enter_the_residence_telephone_std_code>",
"residenceTelephone": "<Enter_the_residence_telephone>",
"officeTelephoneStdCode": "<Enter_the_office_telephone_std_code>",
"officeTelephone": "<Enter_the_office_telephone>",
"mobileIsdCode": "<Enter_the_mobile_isd_code>",
"mobile": "<Enter_the_mobile>",
"email": "<Enter_the_email>"
},
"relatedPersons": [
{
"typeOfRelation": "<Enter_the_type_of_relation>",
"applicantNamePrefix": "<Enter_the_applicant_name_prefix>",
"applicantFirstName": "<Enter_the_applicant_first_name>",
"applicantLastName": "<Enter_the_applicant_last_name>",
"fatherNamePrefix": "<Enter_the_father_name_prefix>",
"fatherFirstName": "<Enter_the_father_first_name>",
"fatherMiddleName": "<Enter_the_father_middle_name>",
"fatherLastName": "<Enter_the_father_last_name>",
"aadhaar": "<Enter_the_aadhaar>",
"gender": "<Enter_the_gender>",
"dob": "<Enter_the_dob>",
"pan": "<Enter_the_pan>",
"permanentCurrentAddressMatch": "Y",
"address": {
"line1": "<Enter_the_address_line1>",
"city": "<Enter_the_city>",
"district": "<Enter_the_district>",
"state": "<Enter_the_state>",
"country": "IN",
"pincode": "<Enter_the_pincode>",
"proof": "<Enter_the_proof>"
},
"idDetails": [
{
"type": "<Enter_the_id_type_such_as_aadhaar>",
"number": "<Enter_the_id_number>"
}
],
"dateOfDeclaration": "<Enter_the_date_of_declaration>",
"placeOfDeclaration": "<Enter_the_place_of_declaration>",
"dateOfKYCVerification": "<Enter_the_date_of_kyc_verification>",
"typeOfDocumentSubmitted": "<Enter_the_type_of_document_submitted>",
"kycVerificationName": "<Enter_the_kyc_verification_name>",
"kycVerificationDesignation": "<Enter_the_kyc_verification_designation>",
"kycVerificationBranch": "<Enter_the_kyc_verification_branch>",
"kycVerificationEmpCode": "<Enter_the_kyc_verification_emp_code>"
}
],
"idDetails": [
{
"type": "certificateOfIncorporation",
"number": "<Enter_the_certificateOfIncorporation_number>"
}
],
"dateOfDeclaration": "<Enter_the_date_of_declaration>",
"placeOfDeclaration": "<Enter_the_place_of_declaration>",
"dateOfKYCVerification": "<Enter_the_date_of_kyc_verification>",
"typeOfDocumentSubmitted": "<Enter_the_type_of_document_submitted>",
"kycVerificationName": "<Enter_the_kyc_verification_name>",
"kycVerificationDesignation": "<Enter_the_kyc_verification_designation>",
"kycVerificationBranch": "<Enter_the_kyc_verification_branch>",
"kycVerificationEmpCode": "<Enter_the_kyc_verification_emp_code>"
}
Details of the Parameters Used in Metadata
The following are the values of a few parameters which can accept multiple values.
-
imageValue:- For keys in the form <imageValue>Front and <imageValue>Back, when only <imageValue>Front is sent we'll be considering that as front and back. When both <imageValue>Front and <imageValue>Back are uploaded we'll be combining both the images and uploading. If <imageValue>Back is given without <imageValue>Front then user will receive 400 error.
- We can upload files (.jpg, .jpeg, .png) or urls as well for these keys
- Maximum file size: 6MB
- You can find the possible values of imageValue mentioned here
-
idDetails:- You can find the possible values of idDetails mentioned here
-
proof:- You can find the possible values of proof mentioned here
-
constitutionType:- You can find the possible values of constitutionType mentioned here
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
{
"status": "success",
"statusCode": "200",
"result": {
"transactionid": "d3026f106fcfdee73c321b9ce7f7",
"message": "Request for upload has been successfully registered"
}
}
Error Response Details
The following is a list of keys and related error codes you can encounter.
| Key | Mandatory or Optional | Error Message |
|---|---|---|
| constitutionType | Mandatory | constitutionType should not be null or undefined |
| constitutionType must be one of the following values: 01,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S | ||
| constitutionType must be a string | ||
| constitutionType should not be empty | ||
| branchCode | Mandatory | branchCode must be a string |
| branchCode should not be empty | ||
| branchCode must be of length between 1 to 15 | ||
| accountType | Optional | accountType should not be null or undefined |
| accountType must be one of the following values: 01,04,05 | ||
| accountType must be a string | ||
| accountType must be of length 2 | ||
| applicantNamePrefix | Mandatory | applicantNamePrefix should not be null or undefined |
| applicantNamePrefix must be a string | ||
| applicantNamePrefix must be in between 1 to 5 | ||
| applicantFirstName | Mandatory | applicantFirstName should not be null or undefined |
| applicantFirstName must be a string | ||
| applicantFirstName must be in between 1 to 50 | ||
| applicantMiddleName | Optional | applicantMiddleName should not be null or undefined |
| applicantMiddleName must be a string | ||
| applicantMiddleName must be in between 1 to 50 | ||
| applicantLastName | Mandatory | applicantLastName should not be null or undefined |
| applicantLastName must be a string | ||
| applicantLastName must be in between 1 to 50 | ||
| applicantMaidenNamePrefix | Optional | applicantMaidenNamePrefix should not be null or undefined |
| applicantMaidenNamePrefix must be a string | ||
| applicantMaidenNamePrefix must be in between 1 to 5 | ||
| applicantMaidenFirstName | Optional | applicantMaidenFirstName should not be null or undefined |
| applicantMaidenFirstName must be a string | ||
| applicantMaidenFirstName must be in between 1 to 50 | ||
| applicantMaidenMiddleName | Optional | applicantMaidenMiddleName should not be null or undefined |
| applicantMaidenMiddleName must be a string | ||
| applicantMaidenMiddleName must be in between 1 to 50 | ||
| applicantMaidenLastName | Optional | applicantMaidenLastName should not be null or undefined |
| applicantMaidenLastName must be a string | ||
| applicantMaidenLastName must be in between 1 to 50 | ||
| fatherNamePrefix | Not Applicable | Not Applicable |
| fatherFirstName | Not Applicable | Not Applicable |
| fatherMiddleName | Not Applicable | Not Applicable |
| fatherLastName | Not Applicable | Not Applicable |
| spouseNamePrefix | Not Applicable | Not Applicable |
| spouseFirstName | Not Applicable | Not Applicable |
| spouseMiddleName | Not Applicable | Not Applicable |
| spouseLastName | Not Applicable | Not Applicable |
| motherNamePrefix | Not Applicable | Not Applicable |
| motherFirstName | Not Applicable | Not Applicable |
| motherMiddleName | Not Applicable | Not Applicable |
| motherLastName | Not Applicable | Not Applicable |
| gender | Mandatory | gender should not be null or undefined |
| gender must be one of the following values: M, F, T | ||
| gender must be a string | ||
| gender should not be empty | ||
| dob | Mandatory | dob should not be null or undefined |
| dob must be a string | ||
| dob should not be empty | ||
| dob must be of length 10 | ||
| pan | Mandatory | pan should not be null or undefined |
| pan must be a string | ||
| pan should not be empty | ||
| pan must be of length 10 | ||
| permanentCurrentAddressMatch | Mandatory | permanentCurrentAddressMatch should not be null or undefined |
| permanentCurrentAddressMatch must be one of the following values: Y, N, T | ||
| permanentCurrentAddressMatch must be a string | ||
| Not Applicable | ||
| dateOfDeclaration | Mandatory | dateOfDeclaration should not be null or undefined |
| dateOfDeclaration must be a string | ||
| dateOfDeclaration should not be empty | ||
| dateOfDeclaration must be of length 10 | ||
| placeOfDeclaration | Mandatory | placeOfDeclaration should not be null or undefined |
| placeOfDeclaration must be a string | ||
| placeOfDeclaration should not be empty | ||
| placeOfDeclaration must be of length between 1 to 50 | ||
| dateOfKYCVerification | Mandatory | dateOfKYCVerification should not be null or undefined |
| dateOfKYCVerification must be a string | ||
| dateOfKYCVerification should not be empty | ||
| dateOfKYCVerification must be of length between 1 to 50 | ||
| typeOfDocumentSubmitted | Mandatory | typeOfDocumentSubmitted should not be null or undefined |
| typeOfDocumentSubmitted must be one of the following values: 01,02,03,04,05 | ||
| typeOfDocumentSubmitted must be a string | ||
| typeOfDocumentSubmitted must be of length 2 | ||
| kycVerificationName | Mandatory | kycVerificationName should not be null or undefined |
| kycVerificationName must be a string | ||
| kycVerificationName must be in between 1 to 50 | ||
| kycVerificationDesignation | Mandatory | kycVerificationDesignation should not be null or undefined |
| kycVerificationDesignation must be a string | ||
| kycVerificationDesignation must be in between 1 to 50 | ||
| kycVerificationBranch | Mandatory | kycVerificationBranch should not be null or undefined |
| kycVerificationBranch must be a string | ||
| kycVerificationBranch must be in between 1 to 50 | ||
| Not Applicable | ||
| kycVerificationEmpCode | Mandatory | kycVerificationEmpCode should not be null or undefined |
| kycVerificationEmpCode must be a string | ||
| kycVerificationEmpCode must be in between 1 to 50 | ||
| remarks | Optional | Not Applicable |
| address | Mandatory | total length of address cannot exceed length 165 |
| address.line1 | Optional | line1 must be a string |
| address.line2 | Optional | line2 must be a string |
| address.line3 | Mandatory | line3 must be a string |
| address.city | Mandatory | city should not be null or undefined |
| city must be a string | ||
| city must be in between 1 to 50 | ||
| address.district | Optional | district should not be null or undefined |
| district must be a string | ||
| district must be in between 1 to 50 | ||
| address.state | Optional | state should not be null or undefined |
| state must be a string | ||
| state must be of length 2 | ||
| address.country | Mandatory | country should not be null or undefined |
| country must be a string | ||
| country must be of length 2 | ||
| address.pincode | Mandatory | pincode should not be null or undefined |
| pincode must be a string | ||
| pincode currently not supported | ||
| address.proof | Mandatory | proof should not be null or undefined |
| proof must be a string | ||
| currentAddress | Mandatory only if permanentCurrentAddressMatch = N | Not Applicable |
| Not Applicable | ||
| currentAddress.line1 | M | Not Applicable |
| currentAddress.line2 | Optional | Not Applicable |
| currentAddress.line3 | Optional | Not Applicable |
| currentAddress.city | M | Not Applicable |
| currentAddress.district | Optional | Not Applicable |
| currentAddress.state | Optional | Not Applicable |
| currentAddress.country | M | Not Applicable |
| currentAddress.pincode | M | Not Applicable |
| currentAddress.proof | M | Not Applicable |
| contact | Optional | Not Applicable |
| contact.residenceTelephoneStdCode | Optional | residenceTelephoneStdCode must be a string |
| residenceTelephoneStdCode must be between length 1 to 4 | ||
| contact.residenceTelephone | Optional | residenceTelephone must be a string |
| residenceTelephone must be of length 10 | ||
| contact.officeTelephoneStdCode | Optional | officeTelephoneStdCode must be a string |
| officeTelephoneStdCode must be between length 1 to 4 | ||
| contact.officeTelephone | Optional | officeTelephone must be a string |
| officeTelephone must be of length 10 | ||
| contact.mobileIsdCode | Optional | mobileIsdCode must be a string |
| mobileIsdCode must be between length 1 to 3 | ||
| contact.mobile | Optional | mobile must be a string |
| mobile must be of length 10 | ||
| contact.email | Optional | email must be a string |
| email must be of length between 1 to 100 | ||
| contact.residenceTelephoneStdCode | Optional | residenceTelephoneStdCode must be a string |
| residenceTelephoneStdCode must be between length 1 to 4 | ||
| constitutionTypeOthers | Mandatory | constitutionTypeOthers should not be null or undefined |
| constitutionTypeOthers must be a string | ||
| constitutionTypeOthers must be of length 20 | ||
| entityName | Mandatory | entityName should not be null or undefined |
| entityName must be a string | ||
| entityName must be in between 1 to 150 | ||
| doi | Mandatory | doi should not be null or undefined |
| doi must be a string | ||
| doi must be of length 10 | ||
| placeOfIncorporation | Mandatory | placeOfIncorporation should not be null or undefined |
| placeOfIncorporation must be a string | ||
| placeOfIncorporation must be of length between 1 to 50 | ||
| doc | Mandatory | doc should not be null or undefined |
| doc must be a string | ||
| doc must be of length 10 | ||
| countryOfIncorporation | Mandatory | countryOfIncorporation should not be null or undefined |
| countryOfIncorporation must be a string | ||
| countryOfIncorporation must be of length 2 | ||
| tin | Optional | tin should not be null or undefined |
| tin must be a string | ||
| tin must be of length 20 | ||
| tinIssueCountry | Optional | tinIssueCountry should not be null or undefined |
| tinIssueCountry must be a string | ||
| tinIssueCountry must be of length 2 | ||
| address.proofOfAddressLegal | Mandatory/Optional | proofOfAddressLegal should not be null or undefined |
| proofOfAddressLegal must be a string | ||
| proofOfAddressLegal must be between length 1 and 75 | ||
| contact.faxStdCode | Optional | faxStdCode should not be null or undefined |
| faxStdCode must be a string | ||
| faxStdCode must be between length 1 to 4 | ||
| contact.fax | Optional | fax should not be null or undefined |
| fax must be a string | ||
| fax must be of length 10 | ||
| constitutionTypeOthers | Mandatory | constitutionTypeOthers should not be null or undefined |
| constitutionTypeOthers must be a string | ||
| constitutionTypeOthers must be of length 21 |
Webhook Payload
You will have to create a webhook to receive a response from Cersai. This is valid for both success and error responses.
- Webhook Payload Sample
{
"status": 200,
"message": "CKYC Uploaded Successfully",
"application_status": "short_reject"
"transactionid": "transaction_id",
"appid": "",
"ckyc_no": "",
"errors": [""]
}
Possible values of application_status
-
short_reject- As soon as the documents are uploaded after Admin's approval, Cersai rejects a few cases immediately(short response) because of basic errors . Those will be termed as "short_reject". -
short_confirmed_match- As soon as the documents are uploaded after Admin's approval, Cersai immediately (short response) flags a few cases which are already present in Cersai database. Those will be termed as " short_confirmed". We will get CKYC number of the matched record. -
insufficient_balance- If Client's Cersai wallet balance is not sufficient for upload. -
long_reject- Apart from short response, Cersai will also provide long response after 1-2 days of upload. Cases rejected in long response is termed as "long_reject" -
probable_match- In the long response, Cersai will match all the data uploaded by client in its own database and return the possible match where probability of matching is higher. We will get CKYC number of the matched records. -
long_confirmed_match- In the probable match cases where the probability is 100%, Cersai will reject those cases stating confirmed match. We will get CKYC number of the matched record. -
success- Successfully uploaded. We will get CKYC number of the uploaded record.