GST Verification
4 endpoints · Core API
This API enables real-time validation of Goods and Services Tax Identification Numbers (GSTIN) issued by the Government of India. This API fetches GST registration details such as legal name, business address, registration status, and nature of business, helping ensure vendor legitimacy and tax compliance.
Benefits
- Tax ComplianceEnsures businesses are properly registered under GST law.
- Vendor TrustBuilds credibility by verifying GST numbers of suppliers or clients.
- Audit ReadinessSupports statutory audits by validating registration details.
- Process AutomationSimplifies GST verification during vendor onboarding or invoicing.
What you can do
Use this API to validate a GSTIN and retrieve details like business name, status, and jurisdiction, aiding in vendor verification, compliance checks, and financial reporting.
Get GST details
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_idstringoptionalNo description.nullable
- gst_nostringrequiredRequired. 15-character GSTIN in uppercase: 2-digit state code, 10-character PAN (AAAAA9999A), one entity code (1-9 or A-Z), the letter Z, and one check character (for example 27ABCDE1234F1Z0).length 15pattern ^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z…default 27ABCDE1234F1Z0
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
4 fields
- corporate_namestringoptionalNo description.nullable
- gstinstringoptionalNo description.nullable
- idstringoptionalNo description.nullable
- detailsobjectoptionalNo description.
10 fields
- lgnmstringoptionalNo description.nullable
- trade_namstringoptionalNo description.nullable
- stsstringoptionalNo description.nullable
- rgdtstringoptionalNo description.nullable
- ctbstringoptionalNo description.nullable
- dtystringoptionalNo description.nullable
- stj_cdstringoptionalNo description.nullable
- ctj_cdstringoptionalNo description.nullable
- ctjstringoptionalNo description.nullable
- pradrobjectoptionalNo description.
1 field
- addrobjectoptionalNo description.
8 fields
- bnmstringoptionalNo description.nullable
- bnostringoptionalNo description.nullable
- flnostringoptionalNo description.nullable
- locstringoptionalNo description.nullable
- ststringoptionalNo description.nullable
- dststringoptionalNo description.nullable
- stcdstringoptionalNo description.nullable
- pncdstringoptionalNo 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.
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
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
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
Code samplescurl · Node.js · Python
Request an OTP to start GST authentication.
Sends an OTP to the mobile number registered on the GST portal for the given username.
Keep the txn value (in data) and the request_id from the response; you need them on the OTP verify call.
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- gstinstringrequiredRequired. 15-character GSTIN in uppercase (for example 27ABCDE1234F1Z0). The first 2 digits are the state code.minLength 1pattern ^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z…
- usernamestringrequiredRequired. Username of the taxpayer's account on the GST portal.minLength 1
- consentstringrequiredRequired. Consent flag for fetching the taxpayer's data. Send "Y".minLength 1default Y
- consent_textstringrequiredRequired. Consent text shown to the taxpayer. Use the default text unless you have your own approved wording.minLength 1default I hear by declare my consent agreeme…
- request_idstringoptionalOptional. Ignored on this call: a new request id is always generated and returned in the response. On the OTP verify call, send this field only if you are not sending `otp` (see that endpoint).nullable
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalResponse model returned after initiating GST authentication.
1 field
- txnstringoptionalTransaction identifier for the authentication session.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.
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
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
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
Code samplescurl · Node.js · Python
Verify the GST authentication OTP and get the GST analysis report for a period range.
Call /auth/otp first and keep the txn value from its response.
- Send
transactionId(thetxnvalue),gstin,username,startPeriodandendPeriod(MMYYYY) on every call. - Send exactly one of
otporrequest_id. Sendotpthe first time. To fetch another period range without a new OTP, send therequest_idfrom the/auth/otpresponse instead (valid for 6 hours). Sending both, or neither, fails the request. startPeriodmust not be later thanendPeriod.
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- gstinstringrequiredRequired. 15-character GSTIN in uppercase (for example 27ABCDE1234F1Z0). The first 2 digits are the state code.minLength 1pattern ^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z…
- usernamestringrequiredRequired. Username of the taxpayer's account on the GST portal.minLength 1
- consentstringrequiredRequired. Consent flag for fetching the taxpayer's data. Send "Y".minLength 1default Y
- consent_textstringrequiredRequired. Consent text shown to the taxpayer. Use the default text unless you have your own approved wording.minLength 1default I hear by declare my consent agreeme…
- request_idstringoptionalOptional. Ignored on this call: a new request id is always generated and returned in the response. On the OTP verify call, send this field only if you are not sending `otp` (see that endpoint).nullable
- otpstringconditionalConditional: required when `request_id` is not sent. OTP received on the mobile number registered on the GST portal. Do not send it together with `request_id`; sending both, or neither, fails the request.nullable
- transactionIdstringrequiredRequired. The `txn` value from the response of the OTP request call (`/auth/otp`). A missing value returns 400.nullable
- startPeriodstringrequiredRequired. First return period to analyse, in MMYYYY format (for example 012025). Must not be later than `endPeriod`.minLength 1pattern ^(0[1-9]|1[0-2])[0-9]{4}$
- endPeriodstringrequiredRequired. Last return period to analyse, in MMYYYY format (for example 022025). Must not be earlier than `startPeriod`.minLength 1pattern ^(0[1-9]|1[0-2])[0-9]{4}$
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalFinal calculated GST report containing business details, summaries, and analysis.
7 fields
- gstBusinessDetailsobjectoptionalGST-registered business details extracted from the GST portal.
9 fields
- gstinstringoptionalGST Identification Number (GSTIN) of the business.nullable
- legalNamestringoptionalLegal name of the registered entity.nullable
- tradeNamestringoptionalTrade name of the business.nullable
- constitutionstringoptionalConstitutional type of the business (e.g., partnership, proprietorship).nullable
- registrationDatestring (date-time)optionalDate when the business was registered under GST.
- statusstringoptionalCurrent registration status (e.g., active, cancelled).nullable
- natureOfBusinessstringoptionalNature of business activities conducted.nullable
- filingFrequencystringoptionalGST return filing frequency (e.g., monthly, quarterly).nullable
- businessVintageMonthsinteger (int32)optionalNumber of months since the business was registered under GST.
- monthlySummaryarray<object>optionalMonthly summary of GST filings and turnover.nullable
Each item: 12 fields
- monthstringoptionalMonth identifier for the summary.nullable
- taxableTurnovernumber (double)optionalTaxable turnover for the month.
- zeroRatedSuppliesnumber (double)optionalValue of zero-rated supplies for the month.
- exemptSuppliesnumber (double)optionalValue of exempt supplies for the month.
- totalTurnovernumber (double)optionalTotal turnover for the month.
- outputTaxLiabilitynumber (double)optionalOutput tax liability for the month.
- itcAvailednumber (double)optionalITC availed for the month.
- itcUtilizednumber (double)optionalITC utilized against output tax for the month.
- gstPaidInCashnumber (double)optionalGST paid in cash for the month.
- lateFeenumber (double)optionalLate fee charged for the month.
- returnFilingDatestringoptionalDate when the return was filed for this month.nullable
- filedOnTimestringoptionalIndicates whether the return was filed on time.nullable
- trendAnalysisarray<object>optionalTrend analysis of turnover and growth over the reporting period.nullable
Each item: 6 fields
- periodstringoptionalReporting period identifier.nullable
- avgMonthlyTurnovernumber (double)optionalAverage monthly turnover for the period.
- growthPercentagenumber (double)optionalGrowth percentage compared to the previous period.
- turnoverStabilitystringoptionalAssessment of turnover stability (e.g., stable, volatile).nullable
- seasonalityObservedstringoptionalIndicates whether seasonal patterns were observed.nullable
- remarksstringoptionalAdditional remarks on the trend analysis.nullable
- itcAnalysisarray<object>optionalInput Tax Credit (ITC) analysis details.nullable
Each item: 6 fields
- periodstringoptionalReporting period identifier.nullable
- outputTaxnumber (double)optionalOutput tax liability for the period.
- itcUtilizednumber (double)optionalAmount of ITC utilized for the period.
- itcDependencyPercentnumber (double)optionalPercentage of tax liability offset by ITC.
- cashTaxRatioPercentnumber (double)optionalPercentage of tax paid in cash versus total tax liability.
- itcRiskLevelstringoptionalRisk level associated with ITC utilization patterns.nullable
- compliancearray<object>optionalGST filing compliance report results.nullable
Each item: 6 fields
- periodstringoptionalReporting period identifier.nullable
- returnFiledstringoptionalIndicates whether the return was filed for this period.nullable
- delayDaysinteger (int32)optionalNumber of days the filing was delayed beyond the due date.
- gstr3aIssuedstringoptionalIndicates whether a GSTR-3A notice was issued for non-filing.nullable
- outstandingGstDuesnumber (double)optionalOutstanding GST dues amount for the period.
- complianceRatingstringoptionalOverall compliance rating for the period (e.g., good, poor).nullable
- underwritingobjectoptionalUnderwriting assessment summary derived from GST data analysis.
8 fields
- avgMonthlyTurnovernumber (double)optionalAverage monthly turnover across the reporting period.
- annualizedTurnovernumber (double)optionalAnnualized turnover extrapolated from the reporting data.
- gstComplianceGradestringoptionalGST compliance grade assigned to the business.nullable
- businessStabilitystringoptionalAssessment of overall business stability.nullable
- gstRiskLevelstringoptionalRisk level based on GST compliance and filing behavior.nullable
- eligibleTurnoverCapnumber (double)optionalMaximum eligible turnover cap for underwriting purposes.
- keyRiskObservationsstringoptionalKey risk observations identified during analysis.nullable
- underwriterRemarksstringoptionalAdditional remarks from the underwriting assessment.nullable
- base64stringoptionalBase64-encoded content of the generated report document.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.
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
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
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
Code samplescurl · Node.js · Python
Get GST Advance details
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_idstringoptionalNo description.nullable
- gst_nostringrequiredRequired. 15-character GSTIN in uppercase: 2-digit state code, 10-character PAN (AAAAA9999A), one entity code (1-9 or A-Z), the letter Z, and one check character (for example 27ABCDE1234F1Z0).length 15pattern ^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z…default 27ABCDE1234F1Z0
- financial_yearstringoptionalOptional. Financial year to fetch GST filing details for, in the format YYYY-YY (for example 2023-24). Defaults to 2023-24 when omitted.nullabledefault 2023-24
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
40 fields
- aggregate_turn_overstringoptionalNo description.nullable
- aggregate_turn_over_detailsarray<object>optionalNo description.nullable
Each item: 4 fields
- pan_filed_tostringoptionalNo description.nullable
- pan_est_tostringoptionalNo description.nullable
- gstin_est_tostringoptionalNo description.nullable
- gstin_filed_tostringoptionalNo description.nullable
- authorized_signatoryarray<string>optionalNo description.nullable
- business_constitutionstringoptionalNo description.nullable
- business_detailsarray<object>optionalNo description.nullable
Each item: 2 fields
- saccdstringoptionalNo description.nullable
- sdesstringoptionalNo description.nullable
- business_naturearray<string>optionalNo description.nullable
- can_flagstringoptionalNo description.nullable
- central_jurisdictionstringoptionalNo description.nullable
- central_jurisdiction_codestringoptionalNo description.nullable
- compliance_ratingstringoptionalNo description.nullable
- contactobjectoptionalNo description.
2 fields
- emailanyoptionalNo description.nullable
- mobile_noanyoptionalNo description.nullable
- current_registration_statusstringoptionalNo description.nullable
- filing_statusarray<array>optionalNo description.nullable
- gstinstringoptionalNo description.nullable
- is_field_visit_conductedstringoptionalNo description.nullable
- last_updated_datestringoptionalNo description.nullable
- legal_namestringoptionalNo description.nullable
- mandate_e_invoicestringoptionalNo description.nullable
- other_business_addressarray<object>optionalNo description.nullable
Each item: 6 fields
- business_naturestringoptionalNo description.nullable
- detailed_addressstringoptionalNo description.nullable
- emailstringoptionalNo description.nullable
- last_updated_datestringoptionalNo description.nullable
- mobile_noanyoptionalNo description.nullable
- registered_addressstringoptionalNo description.nullable
- pprstringoptionalNo description.nullable
- primary_business_addressobjectoptionalNo description.
6 fields
- business_naturestringoptionalNo description.nullable
- detailed_addressstringoptionalNo description.nullable
- emailstringoptionalNo description.nullable
- last_updated_datestringoptionalNo description.nullable
- mobile_noanyoptionalNo description.nullable
- registered_addressstringoptionalNo description.nullable
- register_cancellation_datestringoptionalNo description.nullable
- register_datestringoptionalNo description.nullable
- state_jurisdictionstringoptionalNo description.nullable
- state_jurisdiction_codestringoptionalNo description.nullable
- tax_payer_typestringoptionalNo description.nullable
- trade_namestringoptionalNo description.nullable
- gross_total_incomestringoptionalNo description.nullable
- gross_total_income_financial_yearstringoptionalNo description.nullable
- percent_tax_payment_in_cashstringoptionalNo description.nullable
- compliance_detailsbooleanoptionalNo description.
- ekyc_verifiedstringoptionalNo description.nullable
- percent_tax_payment_in_cash_yearstringoptionalNo description.nullable
- aggregate_turn_over_yearstringoptionalNo description.nullable
- einvoice_statusstringoptionalNo description.nullable
- nature_core_businessstringoptionalNo description.nullable
- aadhaar_validated_datestringoptionalNo description.nullable
- aadhaar_verifiedstringoptionalNo description.nullable
- hsn_detailsarray<any>optionalNo description.nullable
- add_trade_namearray<string>optionalNo 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.
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
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
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