OCR
4 endpoints · Core API
OCR Document Extract & Verify
Extract and verify details from documents by uploading PDF files. OCR provides the following APIs:
1.OCR - Form 16 :
Extract employee details, employer details, PAN, assessment year, and salary details from Form 16 PDF.
2.OCR - GST Certificate :
Extract GSTIN, legal name, trade name, business address, registration date, and status from GST Certificate PDF.
3.OCR - Certificate of incorporation (COI) :
Extract company name, CIN, incorporation date, and registered office address from Certificate of Incorporation (COI).
OCR – Form-16 details
docs.signcare.io/core/api/ocr-pages/ocr/#post-api-v1-ocr-form-16-pdf
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
- file_namestringrequiredRequired. Name of the Form 16 file, for example form16.pdf.minLength 1default form16.pdf
- file_base64stringrequiredRequired. Base64-encoded content of the Form 16 PDF. Must be standard base64 with padding and no line breaks.minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default JVBERi0xLjQK
Sample request body
{
"consent": "Y",
"consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API",
"file_name": "form16.pdf",
"file_base64": "JVBERi0xLjQK"
}
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalResponse model containing extracted Form 16 data with Part A and Part B sections.
2 fields
- Part AobjectoptionalRepresents Part A of Form 16, containing TDS details and employer/employee information.
4 fields
- tdsarray<array>optionalGets or sets the TDS (Tax Deducted at Source) details as a list of records.nullable
- assessment_yearstringoptionalGets or sets the assessment year for the Form 16.nullable
- employerobjectoptionalRepresents employer details extracted from Form 16.
4 fields
- tanstringoptionalGets or sets the Tax Deduction and Collection Account Number (TAN) of the employer.nullable
- addressobjectoptionalRepresents an address extracted from Form 16.
3 fields
- areastringoptionalGets or sets the area or locality name.nullable
- streetstringoptionalGets or sets the street name.nullable
- postal_codestringoptionalGets or sets the postal code or PIN code.nullable
- namestringoptionalGets or sets the name of the employer.nullable
- panstringoptionalGets or sets the Permanent Account Number (PAN) of the employer.nullable
- employeeobjectoptionalRepresents employee details extracted from Form 16.
5 fields
- addressobjectoptionalRepresents an address extracted from Form 16.
3 fields
- areastringoptionalGets or sets the area or locality name.nullable
- streetstringoptionalGets or sets the street name.nullable
- postal_codestringoptionalGets or sets the postal code or PIN code.nullable
- first_namestringoptionalGets or sets the first name of the employee.nullable
- middle_namestringoptionalGets or sets the middle name of the employee.nullable
- last_namestringoptionalGets or sets the last name of the employee.nullable
- panstringoptionalGets or sets the Permanent Account Number (PAN) of the employee.nullable
- Part BobjectoptionalRepresents Part B of Form 16, containing salary, deduction, and tax computation details.
4 fields
- assessment_yearstringoptionalGets or sets the assessment year for Part B.nullable
- employerobjectoptionalRepresents employer details extracted from Form 16.
4 fields
- tanstringoptionalGets or sets the Tax Deduction and Collection Account Number (TAN) of the employer.nullable
- addressobjectoptionalRepresents an address extracted from Form 16.
3 fields
- areastringoptionalGets or sets the area or locality name.nullable
- streetstringoptionalGets or sets the street name.nullable
- postal_codestringoptionalGets or sets the postal code or PIN code.nullable
- namestringoptionalGets or sets the name of the employer.nullable
- panstringoptionalGets or sets the Permanent Account Number (PAN) of the employer.nullable
- employeeobjectoptionalRepresents employee details extracted from Form 16.
5 fields
- addressobjectoptionalRepresents an address extracted from Form 16.
3 fields
- areastringoptionalGets or sets the area or locality name.nullable
- streetstringoptionalGets or sets the street name.nullable
- postal_codestringoptionalGets or sets the postal code or PIN code.nullable
- first_namestringoptionalGets or sets the first name of the employee.nullable
- middle_namestringoptionalGets or sets the middle name of the employee.nullable
- last_namestringoptionalGets or sets the last name of the employee.nullable
- panstringoptionalGets or sets the Permanent Account Number (PAN) of the employee.nullable
- details_of_salary_paidobjectoptionalRepresents the detailed salary, deductions, and tax computation from Form 16 Part B.
20 fields
- surchargeinteger (int64)optionalGets or sets the surcharge amount.
- gross_salaryobjectoptionalRepresents the gross salary breakdown including salary, perquisites, and profits in lieu of salary.
4 fields
- reported_total_amount_of_salary_received_from_other_employerinteger (int64)optionalGets or sets the total salary received from other employer(s) as reported.
- profits_in_lieu_of_salary_us_17_3integer (int64)optionalGets or sets the profits in lieu of salary under Section 17(3).
- value_of_perquisites_us_17_2integer (int64)optionalGets or sets the value of perquisites under Section 17(2).
- salary_as_per_provisions_contained_in_section_17_1integer (int64)optionalGets or sets the salary as per provisions contained in Section 17(1).
- gross_total_incomeinteger (int64)optionalGets or sets the gross total income amount.
- tax_payableinteger (int64)optionalGets or sets the total tax payable amount.
- allowances_us_10objectoptionalRepresents allowances exempt under Section 10 of the Income Tax Act.
8 fields
- other_special_allowances_us_10_14integer (int64)optionalGets or sets other special allowances under Section 10(14).
- house_rent_allowance_us_10_13_ainteger (int64)optionalGets or sets the house rent allowance exempt under Section 10(13A).
- commuted_value_of_pension_us_10_10_ainteger (int64)optionalGets or sets the commuted value of pension under Section 10(10A).
- death_cum_retirement_gratuity_us_10_10integer (int64)optionalGets or sets the death-cum-retirement gratuity under Section 10(10).
- total_amount_of_any_other_exemption_us_10integer (int64)optionalGets or sets the total amount of any other exemption under Section 10.
- total_amount_of_exemption_claimed_us_10integer (int64)optionalGets or sets the total exemption amount claimed under Section 10.
- travel_concession_or_assistance_us_10_5integer (int64)optionalGets or sets the travel concession or assistance under Section 10(5).
- cash_equivalent_of_leave_salary_encashment_us_10_10_aainteger (int64)optionalGets or sets the cash equivalent of leave salary encashment under Section 10(10AA).
- total_amount_of_deductions_us_16integer (int64)optionalGets or sets the total deductions under Section 16.
- health_and_eduction_cessinteger (int64)optionalGets or sets the health and education cess amount.
- deduction_under_chapter_vi_aobjectoptionalRepresents deductions under Chapter VI-A of the Income Tax Act.
11 fields
- deduction_us_80_cccobjectoptionalGets or sets the deduction under Section 80CCC (pension fund contributions).nullable
- deduction_us_80_ttaobjectoptionalGets or sets the deduction under Section 80TTA (interest on savings account).nullable
- total_deduction_us_80_cceobjectoptionalGets or sets the total deduction under Section 80CCE (aggregate limit).nullable
- deduction_us_80_ccd_2objectoptionalRepresents a deduction amount with gross and deductible components.
2 fields
- gross_amountinteger (int64)optionalGets or sets the gross amount of the deduction.
- deductible_amountinteger (int64)optionalGets or sets the deductible amount eligible for tax benefit.
- deduction_us_80_ccd_1objectoptionalGets or sets the deduction under Section 80CCD(1) (employee's NPS contribution).nullable
- deduction_us_80_dobjectoptionalGets or sets the deduction under Section 80D (medical insurance premium).nullable
- deduction_us_80_ccd_1_bobjectoptionalGets or sets the deduction under Section 80CCD(1B) (additional NPS contribution).nullable
- deduction_us_80_eobjectoptionalGets or sets the deduction under Section 80E (education loan interest).nullable
- deduction_us_80_cchobjectoptionalGets or sets the deduction under Section 80CCH.nullable
- deduction_us_80_gobjectoptionalGets or sets the deduction under Section 80G (donations to charitable institutions).nullable
- deduction_us_80_cobjectoptionalGets or sets the deduction under Section 80C (investments and specified payments).nullable
- rebate_us_87_ainteger (int64)optionalGets or sets the rebate amount under Section 87A.
- relief_us_89integer (int64)optionalGets or sets the relief amount under Section 89.
- aggregate_deductible_amount_under_chapter_vi_ainteger (int64)optionalGets or sets the aggregate deductible amount under Chapter VI-A.
- tax_on_total_incomeinteger (int64)optionalGets or sets the tax computed on total income.
- total_amount_of_other_income_reported_by_employeeinteger (int64)optionalGets or sets the total amount of other income reported by the employee.
- other_income_reported_by_employee_us_192_2_bobjectoptionalRepresents other income reported by the employee under Section 192(2B).
2 fields
- income_under_the_head_other_sources_offered_for_tdsinteger (int64)optionalGets or sets the income under the head "Other Sources" offered for TDS.
- income_from_house_property_reported_by_employee_offered_for_tdsinteger (int64)optionalGets or sets the income from house property reported by employee for TDS.
- tax_deducted_or_collected_at_source_as_per_form_12_baainteger (int64)optionalGets or sets the tax deducted or collected at source as per Form 12BAA.
- income_chargeable_under_the_head_salariesinteger (int64)optionalGets or sets the income chargeable under the head "Salaries".
- total_amount_of_salary_received_from_current_employerinteger (int64)optionalGets or sets the total salary received from the current employer.
- opting_out_of_taxation_us_115_bac_1astringoptionalGets or sets the status of opting out of new tax regime under Section 115BAC(1A).nullable
- deduction_us_16objectoptionalRepresents deductions under Section 16 of the Income Tax Act.
3 fields
- entertainment_allowance_us_16_iiinteger (int64)optionalGets or sets the entertainment allowance under Section 16(ii).
- standard_deduction_us_16_iainteger (int64)optionalGets or sets the standard deduction under Section 16(ia).
- tax_on_employment_us_16_iiiinteger (int64)optionalGets or sets the tax on employment (professional tax) under Section 16(iii).
- total_taxable_incomeinteger (int64)optionalGets or sets the total taxable income after all deductions.
- 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": {
"Part A": {
"tds": [
[]
],
"assessment_year": "string",
"employer": {
"tan": "string",
"address": {
"area": "string",
"street": "string",
"postal_code": "string"
},
"name": "string",
"pan": "string"
},
"employee": {
"address": {
"area": "string",
"street": "string",
"postal_code": "string"
},
"first_name": "string",
"middle_name": "string",
"last_name": "string",
"pan": "string"
}
},
"Part B": {
"assessment_year": "string",
"employer": {
"tan": "string",
"address": {
"area": "string",
"street": "string",
"postal_code": "string"
},
"name": "string",
"pan": "string"
},
"employee": {
"address": {
"area": "string",
"street": "string",
"postal_code": "string"
},
"first_name": "string",
"middle_name": "string",
"last_name": "string",
"pan": "string"
},
"details_of_salary_paid": {
"surcharge": 0,
"gross_salary": {
"reported_total_amount_of_salary_received_from_other_employer": 0,
"profits_in_lieu_of_salary_us_17_3": 0,
"value_of_perquisites_us_17_2": 0,
"salary_as_per_provisions_contained_in_section_17_1": 0
},
"gross_total_income": 0,
"tax_payable": 0,
"allowances_us_10": {
"other_special_allowances_us_10_14": 0,
"house_rent_allowance_us_10_13_a": 0,
"commuted_value_of_pension_us_10_10_a": 0,
"death_cum_retirement_gratuity_us_10_10": 0,
"total_amount_of_any_other_exemption_us_10": 0,
"total_amount_of_exemption_claimed_us_10": 0,
"travel_concession_or_assistance_us_10_5": 0,
"cash_equivalent_of_leave_salary_encashment_us_10_10_aa": 0
},
"total_amount_of_deductions_us_16": 0,
"health_and_eduction_cess": 0,
"deduction_under_chapter_vi_a": {
"deduction_us_80_ccc": {},
"deduction_us_80_tta": {},
"total_deduction_us_80_cce": {},
"deduction_us_80_ccd_2": {
"gross_amount": 0,
"deductible_amount": 0
},
"deduction_us_80_ccd_1": {},
"deduction_us_80_d": {},
"deduction_us_80_ccd_1_b": {},
"deduction_us_80_e": {},
"deduction_us_80_cch": {},
"deduction_us_80_g": {},
"deduction_us_80_c": {}
},
"rebate_us_87_a": 0,
"relief_us_89": 0,
"aggregate_deductible_amount_under_chapter_vi_a": 0,
"tax_on_total_income": 0,
"total_amount_of_other_income_reported_by_employee": 0,
"other_income_reported_by_employee_us_192_2_b": {
"income_under_the_head_other_sources_offered_for_tds": 0,
"income_from_house_property_reported_by_employee_offered_for_tds": 0
},
"tax_deducted_or_collected_at_source_as_per_form_12_baa": 0,
"income_chargeable_under_the_head_salaries": 0,
"total_amount_of_salary_received_from_current_employer": 0,
"opting_out_of_taxation_us_115_bac_1a": "string",
"deduction_us_16": {
"entertainment_allowance_us_16_ii": 0,
"standard_deduction_us_16_ia": 0,
"tax_on_employment_us_16_iii": 0
},
"total_taxable_income": 0
}
}
},
"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/ocr/form-16/pdf' \
-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",
"file_name": "form16.pdf",
"file_base64": "JVBERi0xLjQK"
}'
OCR – GST Certificate details
docs.signcare.io/core/api/ocr-pages/ocr/#post-api-v1-ocr-gst-pdf
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
- file_namestringrequiredRequired. Name of the file to be processed, for example file.pdf.minLength 1default file.pdf
- file_base64stringrequiredRequired. Base64-encoded content of the file (PDF, or an image when input_type is image on gst/advance/pdf). Must be standard base64 with padding and no line breaks.minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default JVBERi0xLjQK
- page_numberinteger (int32)optionalOptional. 1-based page number of a PDF to analyze. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf. When omitted, all pages are analyzed.nullable
- text_onlybooleanoptionalOptional. Defaults to false. When true and page_number is set, runs a faster text-only extraction that returns limited fields: GSTIN, LegalName, TradeName, Directors. Has no effect without page_number. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf.default false
- input_typestringoptionalOptional. Allowed values: pdf (default) for multi-page PDF processing, or image for a single-page image (for example a PNG or JPEG of the Annexure B page with directors). Any value other than image is treated as pdf. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf.nullabledefault pdf
Sample request body
{
"consent": "Y",
"consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API",
"file_name": "file.pdf",
"file_base64": "JVBERi0xLjQK",
"text_only": false,
"input_type": "pdf"
}
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalResponse model containing OCR-extracted data from a GST certificate.
9 fields
- id_typestringoptionalType of the identified document.nullable
- id_gstinstringoptionalGSTIN extracted from the certificate.nullable
- id_legal_namestringoptionalLegal name extracted from the GST certificate.nullable
- id_registration_typestringoptionalType of GST registration extracted from the certificate.nullable
- id_registration_datestringoptionalRegistration date extracted from the GST certificate.nullable
- id_liability_datestringoptionalDate of liability to register under GST.nullable
- id_trade_namestringoptionalTrade name extracted from the GST certificate.nullable
- id_business_constitutionstringoptionalBusiness constitution type extracted from the certificate.nullable
- id_addressstringoptionalRegistered address extracted from the GST certificate.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": {
"id_type": "string",
"id_gstin": "string",
"id_legal_name": "string",
"id_registration_type": "string",
"id_registration_date": "string",
"id_liability_date": "string",
"id_trade_name": "string",
"id_business_constitution": "string",
"id_address": "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/ocr/gst/pdf' \
-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",
"file_name": "file.pdf",
"file_base64": "JVBERi0xLjQK",
"text_only": false,
"input_type": "pdf"
}'
OCR – GST Certificate Advanced - includes directors from Annexure B
docs.signcare.io/core/api/ocr-pages/ocr/#post-api-v1-ocr-gst-advance-pdf
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
- file_namestringrequiredRequired. Name of the file to be processed, for example file.pdf.minLength 1default file.pdf
- file_base64stringrequiredRequired. Base64-encoded content of the file (PDF, or an image when input_type is image on gst/advance/pdf). Must be standard base64 with padding and no line breaks.minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default JVBERi0xLjQK
- page_numberinteger (int32)optionalOptional. 1-based page number of a PDF to analyze. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf. When omitted, all pages are analyzed.nullable
- text_onlybooleanoptionalOptional. Defaults to false. When true and page_number is set, runs a faster text-only extraction that returns limited fields: GSTIN, LegalName, TradeName, Directors. Has no effect without page_number. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf.default false
- input_typestringoptionalOptional. Allowed values: pdf (default) for multi-page PDF processing, or image for a single-page image (for example a PNG or JPEG of the Annexure B page with directors). Any value other than image is treated as pdf. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf.nullabledefault pdf
Sample request body
{
"consent": "Y",
"consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API",
"file_name": "file.pdf",
"file_base64": "JVBERi0xLjQK",
"text_only": false,
"input_type": "pdf"
}
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalResponse model for advanced GST Certificate OCR. Field names match the GST Advance verification response, so both can be read the same way. OCR-only fields (directors) are appended at the end.
11 fields
- gstinstringoptionalNo description.nullable
- legal_namestringoptionalNo description.nullable
- trade_namestringoptionalNo description.nullable
- business_constitutionstringoptionalSame as GST Advance business_constitution (was constitution_of_business).nullable
- registered_addressstringoptionalNo description.nullable
- register_datestringoptionalSame as GST Advance register_date (was date_of_registration).nullable
- current_registration_statusstringoptionalNo description.nullable
- tax_payer_typestringoptionalNo description.nullable
- state_jurisdictionstringoptionalNo description.nullable
- authorized_signatoryarray<string>optionalNo description.nullable
- directorsarray<object>optionalOCR-specific: directors from Annexure B (not available in GST Advance).nullable
Each item: 3 fields
- namestringoptionalNo description.nullable
- designationstringoptionalNo description.nullable
- statestringoptionalNo 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": {
"gstin": "string",
"legal_name": "string",
"trade_name": "string",
"business_constitution": "string",
"registered_address": "string",
"register_date": "string",
"current_registration_status": "string",
"tax_payer_type": "string",
"state_jurisdiction": "string",
"authorized_signatory": [
"string"
],
"directors": [
{
"name": "string",
"designation": "string",
"state": "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/ocr/gst/advance/pdf' \
-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",
"file_name": "file.pdf",
"file_base64": "JVBERi0xLjQK",
"text_only": false,
"input_type": "pdf"
}'
OCR – GST Certificate Incorporation details
docs.signcare.io/core/api/ocr-pages/ocr/#post-api-v1-ocr-coi-pdf
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
- file_namestringrequiredRequired. Name of the file to be processed, for example file.pdf.minLength 1default file.pdf
- file_base64stringrequiredRequired. Base64-encoded content of the file (PDF, or an image when input_type is image on gst/advance/pdf). Must be standard base64 with padding and no line breaks.minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default JVBERi0xLjQK
- page_numberinteger (int32)optionalOptional. 1-based page number of a PDF to analyze. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf. When omitted, all pages are analyzed.nullable
- text_onlybooleanoptionalOptional. Defaults to false. When true and page_number is set, runs a faster text-only extraction that returns limited fields: GSTIN, LegalName, TradeName, Directors. Has no effect without page_number. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf.default false
- input_typestringoptionalOptional. Allowed values: pdf (default) for multi-page PDF processing, or image for a single-page image (for example a PNG or JPEG of the Annexure B page with directors). Any value other than image is treated as pdf. Used only by gst/advance/pdf; ignored by gst/pdf and coi/pdf.nullabledefault pdf
Sample request body
{
"consent": "Y",
"consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API",
"file_name": "file.pdf",
"file_base64": "JVBERi0xLjQK",
"text_only": false,
"input_type": "pdf"
}
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalResponse model containing OCR-extracted data from a certificate of incorporation.
7 fields
- id_typestringoptionalType of the identified document.nullable
- id_tanstringoptionalTax Account Number (TAN) extracted from the certificate.nullable
- id_company_namestringoptionalCompany name extracted from the certificate.nullable
- id_panstringoptionalPermanent Account Number (PAN) extracted from the certificate.nullable
- id_cinstringoptionalCorporate Identity Number (CIN) extracted from the certificate.nullable
- id_incorporation_datestring (date-time)optionalDate of incorporation extracted from the certificate.nullable
- id_addressstringoptionalRegistered address extracted from the certificate.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": {
"id_type": "string",
"id_tan": "string",
"id_company_name": "string",
"id_pan": "string",
"id_cin": "string",
"id_incorporation_date": "2026-01-01T00:00:00Z",
"id_address": "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/ocr/coi/pdf' \
-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",
"file_name": "file.pdf",
"file_base64": "JVBERi0xLjQK",
"text_only": false,
"input_type": "pdf"
}'