PAN Plus Verification API
Everything in PAN Advanced plus the PAN status, allotment date, authorised signatory of a company PAN and whether the holder is a sole proprietor, director or salaried.
What it verifies
Everything PAN Advanced returns (holder type, name parts, date of birth, gender, Aadhaar link status and masked Aadhaar, address and contact details), plus the PAN status (operative or not), the allotment date, the authorised signatory of a company PAN, and whether an individual is a sole proprietor, a director or salaried. A value the source could not get on this call is null and named in unavailableFields, so it is never mistaken for a no.
Who uses it
- Lenders and NBFCs that need a PAN that is operative and who the person behind it is
- Business onboarding teams that need the signatory behind a company PAN
- Underwriting teams checking whether an applicant is salaried, a director or a sole proprietor
Request and response
https://verification.techinnoverz.com/api/v1/identity-kyc/pan-plusVerify a PAN and get its status, allotment date, signatory and the holder's roles. This call is billed when it returns a successful result.
Request body
panstringrequired10-character PAN.
consentstringrequiredMust be "Y". Records that the end customer consented to this check; logged against the transaction.
referenceIdstringoptionalYour own id, echoed back in the response for reconciliation.
Example requests
curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/pan-plus" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCPE1234F",
"consent": "Y",
"referenceId": "app_20915"
}'const res = await fetch("https://verification.techinnoverz.com/api/v1/identity-kyc/pan-plus", {
method: "POST",
headers: {
"x-api-key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"pan": "ABCPE1234F",
"consent": "Y",
"referenceId": "app_20915"
}),
});
const result = await res.json();import requests
res = requests.post(
"https://verification.techinnoverz.com/api/v1/identity-kyc/pan-plus",
headers={"x-api-key": "YOUR_API_KEY"},
json={
"pan": "ABCPE1234F",
"consent": "Y",
"referenceId": "app_20915",
},
timeout=15,
)
result = res.json()200 response — status "found"
{
"status": "found",
"data": {
"pan": "ABCPE1234F",
"name": "Asha Sample",
"firstName": "Asha",
"middleName": null,
"lastName": "Sample",
"holderType": "Individual",
"gender": "female",
"dateOfBirth": "17/04/1991",
"aadhaarLinked": true,
"aadhaarNumber": "XXXXXXXX1234",
"mobile": null,
"email": null,
"address": {
"buildingName": null,
"locality": null,
"streetName": null,
"pincode": "560001",
"city": "Bengaluru",
"state": "Karnataka",
"country": "INDIA"
},
"signatory": null,
"isSoleProprietor": false,
"isDirector": false,
"isSalaried": true,
"panStatus": "ACTIVE_OPERATIVE",
"panAllotmentDate": "20/07/2010",
"unavailableFields": []
},
"source": "provider",
"dataAsOf": "2026-11-03T09:30:00.000Z",
"referenceId": "app_20915",
"billing": {
"charged": true,
"walletBalance": "12450.00"
},
"txnId": "txn_8c31ba90",
"livemode": true
}Fields returned in data
panstringoptionalThe PAN that was looked up.
namestringoptionalFull name as per government records.
firstNamestringoptionalFirst name. null when not held.
middleNamestringoptionalMiddle name. null when not held.
lastNamestringoptionalLast name. null when not held.
holderTypestringoptionalType of PAN: Individual, Company, Hindu Undivided Family (HUF), Association of Persons (AOP), Body of Individuals (BOI), Government Agency, Artificial Juridical Person, Local Authority, Firm/Limited Liability Partnership or Trust.
genderstringoptionalGender as per the PAN (male, female or transgender), for an individual PAN. null for other holders.
dateOfBirthstringoptionalDate of birth, or of incorporation for an entity, as DD/MM/YYYY.
aadhaarLinkedbooleanoptionalWhether the PAN is linked to an Aadhaar number. null when not known.
aadhaarNumberstringoptionalThe linked Aadhaar number, masked: either the last 4 digits or the first 2 and last 2 digits shown. null when none is linked.
mobilestringoptionalMobile number registered against the PAN, when held. null otherwise.
emailstringoptionalEmail address registered against the PAN, when held. null otherwise.
addressobjectoptionalAddress held against the PAN: buildingName, locality, streetName, pincode, city, state and country. null when none is held.
signatoryobjectoptionalFor a non-individual PAN, the authorised signatory: pan, name, firstName, middleName, lastName, gender, dateOfBirth and din. null for an individual PAN.
isSoleProprietorbooleanoptionalFor an individual PAN, whether the holder is a sole proprietor. null when not applicable (a non-individual PAN) or when the source could not say; see unavailableFields.
isDirectorbooleanoptionalFor an individual PAN, whether the holder is a director of a company. null when not applicable or when the source could not say; see unavailableFields.
isSalariedbooleanoptionalFor an individual PAN, whether the holder is salaried. null when not applicable or when the source could not say; see unavailableFields.
panStatusstringoptionalACTIVE_OPERATIVE, ACTIVE_INOPERATIVE or INVALID. null when the source could not say; see unavailableFields.
panAllotmentDatestringoptionalThe date the PAN was allotted, as DD/MM/YYYY. null when the source could not say; see unavailableFields.
unavailableFieldsarrayoptionalNames of the fields above the source could not get this time, so a missing answer is not mistaken for no. Empty when everything was available.
Error codes
Errors return a non-200 HTTP status and the same envelope, so your retry logic and your reconciliation agree.
400 INVALID_INPUTA field is missing or malformed. The details list each problem. Not charged.
401 INVALID_KEYThe key is missing, revoked, or not a key we issued.
402 WALLET_EMPTYYour available balance is below the price of this call. Top up and retry. Not charged.
403 PRODUCTION_NOT_ENABLEDA live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access.
403 TEST_NOT_ENABLEDA test key was used before test (UAT) access was enabled for your account. Ask us to enable it.
403 API_NOT_ENABLEDThis check is switched off for your account, or is not available for live use yet.
403 IP_NOT_ALLOWEDThe key is restricted to certain IP addresses and this call came from another.
403 ACCOUNT_SUSPENDEDThe account is suspended. Contact support.
404 NO_DATAA valid request, but no record was found. Not charged.
404 ROUTE_NOT_FOUNDThere is no endpoint at that path.
405 METHOD_NOT_ALLOWEDUse the method shown in the Allow header.
409 IDEMPOTENCY_IN_PROGRESSA call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After.
413 PAYLOAD_TOO_LARGEThe request body is too large. Not charged.
415 UNSUPPORTED_MEDIA_TYPESend the request with Content-Type: application/json.
422 IDEMPOTENCY_KEY_REUSEDThis Idempotency-Key was already used with a different request body. Use a new key for a new request.
429 RATE_LIMITEDToo many requests or too many at once. Wait for the Retry-After delay.
500 INTERNAL_ERRORSomething went wrong on our side. Not charged. Quote the txnId if you contact support.
502 SOURCE_ERRORThe data source returned an error. Not charged.
503 SOURCE_DOWNThe data source is unavailable right now. Not charged. Retry after the delay in Retry-After.
504 SOURCE_TIMEOUTThe data source did not answer in time. Not charged.
{
"status": "error",
"error": {
"code": "NO_DATA",
"message": "No record found for the given input. Not charged."
},
"billing": {
"charged": false
},
"txnId": "txn_8c31ba91",
"livemode": true
}Billing
You are charged only on successful hits. Failed, no-data and error calls are free.
Every response carries billing.charged and your remaining billing.walletBalance. Per-hit pricing is set on your rate card; book a demo to get yours.
Related checks
- PAN Verification API — Verify PAN card details and status against Income Tax Department records.
- PAN Advanced Verification API — Verify a PAN and also get its holder type and whether it is linked to Aadhaar.
- ITR Verification API — Check the income tax return filing history of a PAN: the acknowledgement number for each recent assessment year.
- Voter ID Verification API — Verify EPIC (Voter ID) details against Election Commission of India records.
- Driving Licence Verification API — Verify driving licence number, validity and vehicle class against Parivahan records.
- Driving Licence Advanced Verification API — Verify a driving licence and also get split addresses, vehicle category dates, blood group and endorsement details.
- Passport Verification API — Validate a passport file number and date of birth and get the holder's name, passport number and application dates.
- DigiLocker Verification API — Start a DigiLocker consent flow, then fetch the person's verified documents and demographics once they approve.
- Face Liveness Verification API — Check whether a selfie shows a live person, with quality signals such as blur, mask, alignment and occlusion.
- Face Match Verification API — Compare a live selfie with a face on an identity document and return whether they match, with confidence and quality signals.
All API documentation · OpenAPI specification · Docs as plain text
