KYC OCR (Plus)
1 endpoint · Core API
This API allows validation of Permanent Account Numbers (PAN) issued by the Income Tax Department of India. It is designed to confirm the identity of individuals or entities by checking their PAN details against authoritative databases. This API plays a vital role in KYC processes, financial onboarding, and fraud prevention.
Benefits
- Identity ValidationConfirms the authenticity of PANs submitted by users or businesses.
- Regulatory ComplianceEnsures compliance with income tax and financial regulations.
- Fraud DetectionHelps detect and prevent use of fake or invalid PANs.
- Seamless IntegrationEasily integrates into onboarding and KYC workflows.
What you can do
You can verify an individual's or entity's PAN number in real-time, retrieve associated details (like name or status), and ensure the PAN is valid and active.
KYC OCR details
docs.signcare.io/core/api/kyc-ocr/kyc-ocr-plus/#post-api-v1-kycocr
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Body parameters
application/json- consentstringrequiredRequired. The end user's consent to this verification. Send `Y`.minLength 1default Y
- consent_textstringrequiredRequired. The consent statement shown to the end user. Send the default text from the sample.minLength 1default I hear by declare my consent agreeme…
- request_idstringoptionalOptional. Your own id to correlate this call in your logs. A unique id is generated if you leave it out.nullable
- fileBase64stringrequiredRequired. Base64-encoded content of the document to read: an image of the card, or a PDF (for example a downloaded eAadhaar). Send the raw Base64 string without a data: prefix.minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default SGVsbG8gV29ybGQ=
- pdfPasswordstringrequiredRequired. The field must be present and not empty, so send "N". Password-protected PDFs are not opened: this value is accepted but not used.minLength 1default N
- requiredConfidencebooleanoptionalOptional. Accepted but not used. Each extracted field is always returned with a confidence value.default true
- requiredOcrbooleanrequiredRequired. Boolean. Send true. Accepted but not used: text is always extracted.default true
- returnQualityChecksarray<string>requiredRequired. List with at least one value, for example ["ALL"]. Accepted but not used: the requested checks are not applied.default ["ALL"]
- maskAadhaarImagestringoptionalOptional. Pass "EIGHT_DIGITS" to receive a base64-encoded masked Aadhaar image in additionalDetails.maskAadhaarImage, with the first 8 digits painted over. Omit or leave empty for no image masking.nullabledefault EIGHT_DIGITS
- maskAadhaarTextstringoptionalOptional. Pass "EIGHT_DIGITS" to mask the first 8 digits of the extracted Aadhaar number in ocrData.aadhaar.value (e.g. "XXXX XXXX 9012") and set additionalDetails.outputMaskStatus = true. Omit or leave empty for no text masking.nullabledefault EIGHT_DIGITS
- responseFormatstringoptionalOptional. Accepted but not used.nullabledefault DOCUMENT
- responseTypestringrequiredRequired. The field must be present and not empty, so send "URL". Accepted but not used.minLength 1default URL
- docTypesarray<string>requiredRequired. List with at least one document type: DL, AADHAAR or PAN (not case-sensitive). Only the first value is processed, so send one document type per request. Allowed values: DL, AADHAAR, PAN.default ["DL"]
Sample request body
{
"consent": "Y",
"consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API",
"fileBase64": "SGVsbG8gV29ybGQ=",
"pdfPassword": "N",
"requiredConfidence": true,
"requiredOcr": true,
"returnQualityChecks": [
"ALL"
],
"maskAadhaarImage": "EIGHT_DIGITS",
"maskAadhaarText": "EIGHT_DIGITS",
"responseFormat": "DOCUMENT",
"responseType": "URL",
"docTypes": [
"DL"
]
}
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataarray<object>optionalNo description.nullable
Each item: 6 fields
- documentTypestringoptionalGets or sets the type of document detected (e.g., "DL", "AADHAAR").nullable
- subTypestringoptionalGets or sets the sub-type of the document, if applicable.nullable
- pageNointeger (int32)optionalGets or sets the page number of the document that was processed.nullable
- ocrDataobjectoptionalContains all OCR-extracted data fields from a KYC document.
14 fields
- aadhaarobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- yobobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- fatherobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- panobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- vidobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- phoneobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- dlNoobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- nameobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- dobobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- doiobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- doeobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- relationNameobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- addressobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- pinobjectoptionalRepresents an OCR-extracted field with its value and confidence score.
2 fields
- valuestringoptionalGets or sets the extracted text value.nullable
- confidencenumber (double)optionalGets or sets the confidence score of the OCR extraction.nullable
- additionalDetailsobjectoptionalResponse model containing additional details from the OCR processing.
9 fields
- inputMaskStatusobjectoptionalNo description.
3 fields
- isMaskedbooleanoptionalNo description.nullable
- maskedBystringoptionalNo description.nullable
- confidencestringoptionalNo description.nullable
- outputMaskStatusbooleanoptionalGets or sets whether the output masking was successfully applied.nullable
- verhoeffCheckbooleanoptionalGets or sets the Verhoeff algorithm check result for Aadhaar number validation.nullable
- qrstringoptionalGets or sets the QR code data extracted from the document.nullable
- barcodestringoptionalGets or sets the barcode data extracted from the document.nullable
- addressSplitobjectoptionalRepresents a split/parsed address with individual components.
12 fields
- buildingstringoptionalGets or sets the building name.nullable
- citystringoptionalGets or sets the city name.nullable
- districtstringoptionalGets or sets the district name.nullable
- pinstringoptionalGets or sets the PIN code.nullable
- floorstringoptionalGets or sets the floor number or description.nullable
- housestringoptionalGets or sets the house number.nullable
- localitystringoptionalGets or sets the locality name.nullable
- statestringoptionalGets or sets the state name.nullable
- streetstringoptionalGets or sets the street name.nullable
- complexstringoptionalGets or sets the complex or apartment name.nullable
- landmarkstringoptionalGets or sets the landmark description.nullable
- untaggedstringoptionalGets or sets any untagged or unclassified address text.nullable
- careOfDetailsobjectoptionalNo description.
2 fields
- relationstringoptionalNo description.nullable
- namestringoptionalNo description.nullable
- documentLinkstringoptionalGets or sets the link to the processed document.nullable
- maskAadhaarImagestringoptionalMasked Aadhaar image as a Base64-encoded string, when available. Null for non-Aadhaar documents.nullable
- qualityChecksarray<object>optionalGets or sets the list of quality check results performed on the document.nullable
Each item: 3 fields
- scorenumber (double)optionalNo description.nullable
- flagbooleanoptionalNo description.nullable
- typestringoptionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
Example
{
"success": false,
"statusCode": 200,
"message": "XXXXX",
"data": [
{
"documentType": "string",
"subType": "string",
"pageNo": 0,
"ocrData": {
"aadhaar": {
"value": "string",
"confidence": 0
},
"yob": {
"value": "string",
"confidence": 0
},
"father": {
"value": "string",
"confidence": 0
},
"pan": {
"value": "string",
"confidence": 0
},
"vid": {
"value": "string",
"confidence": 0
},
"phone": {
"value": "string",
"confidence": 0
},
"dlNo": {
"value": "string",
"confidence": 0
},
"name": {
"value": "string",
"confidence": 0
},
"dob": {
"value": "string",
"confidence": 0
},
"doi": {
"value": "string",
"confidence": 0
},
"doe": {
"value": "string",
"confidence": 0
},
"relationName": {
"value": "string",
"confidence": 0
},
"address": {
"value": "string",
"confidence": 0
},
"pin": {
"value": "string",
"confidence": 0
}
},
"additionalDetails": {
"inputMaskStatus": {
"isMasked": false,
"maskedBy": "string",
"confidence": "string"
},
"outputMaskStatus": false,
"verhoeffCheck": false,
"qr": "string",
"barcode": "string",
"addressSplit": {
"building": "string",
"city": "string",
"district": "string",
"pin": "string",
"floor": "string",
"house": "string",
"locality": "string",
"state": "string",
"street": "string",
"complex": "string",
"landmark": "string",
"untagged": "string"
},
"careOfDetails": {
"relation": "string",
"name": "string"
},
"documentLink": "string",
"maskAadhaarImage": "string"
},
"qualityChecks": [
{
"score": 0,
"flag": false,
"type": "string"
}
]
}
],
"messages": [
"string"
],
"request_id": "string",
"isBillable": false
}
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
Example
{
"data": {},
"messages": [
"string"
],
"request_id": "string",
"success": false,
"message": "XXXXX",
"isBillable": false,
"statusCode": 400
}
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
Example
{
"data": {},
"messages": [
"string"
],
"request_id": "string",
"success": false,
"message": "XXXXX",
"isBillable": false,
"statusCode": 401
}
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Example
{
"data": {},
"messages": [
"string"
],
"request_id": "string",
"success": false,
"message": "XXXXX",
"isBillable": false,
"statusCode": 500
}
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/KycOCR' \
-H 'X-API-KEY: YOUR_API_KEY' \
-H 'X-API-APP-ID: YOUR_APP_ID' \
-H 'Content-Type: application/json' \
-d '{
"consent": "Y",
"consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API",
"fileBase64": "SGVsbG8gV29ybGQ=",
"pdfPassword": "N",
"requiredConfidence": true,
"requiredOcr": true,
"returnQualityChecks": [
"ALL"
],
"maskAadhaarImage": "EIGHT_DIGITS",
"maskAadhaarText": "EIGHT_DIGITS",
"responseFormat": "DOCUMENT",
"responseType": "URL",
"docTypes": [
"DL"
]
}'