PAN Verification API
Verify PAN card details and status against Income Tax Department records.
What it verifies
Checks a PAN's validity and status and returns the name registered against it, in a single call with no document upload.
Who uses it
- Lenders and NBFCs validating PAN during KYC and underwriting
- Brokerage, wealth and mutual-fund platforms onboarding investors
- Payroll, HR and vendor-onboarding teams validating PAN before payouts
- Marketplaces and platforms that need a valid PAN on file for sellers and partners
Request and response
https://verification.techinnoverz.com/api/v1/identity-kyc/panVerify a PAN, fetch its status and registered name, and optionally compare a name you supply. 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.
namestringoptionalOptional. A name to compare with the name held against the PAN. English letters, spaces and . & / \ ^ ~ only, up to 85 characters. When you send it, the response says whether it matches.
nameMatchMethodstringoptionalOptional, used only with name. exact needs the same words; fuzzy (the default) tolerates spelling and word-order differences; enhanced also copes with abbreviations such as Md and Mohd and with missing common surnames.
Example requests
curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/pan" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCPE1234F",
"consent": "Y",
"referenceId": "app_20915",
"name": "Asha Sample",
"nameMatchMethod": "fuzzy"
}'const res = await fetch("https://verification.techinnoverz.com/api/v1/identity-kyc/pan", {
method: "POST",
headers: {
"x-api-key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"pan": "ABCPE1234F",
"consent": "Y",
"referenceId": "app_20915",
"name": "Asha Sample",
"nameMatchMethod": "fuzzy"
}),
});
const result = await res.json();import requests
res = requests.post(
"https://verification.techinnoverz.com/api/v1/identity-kyc/pan",
headers={"x-api-key": "YOUR_API_KEY"},
json={
"pan": "ABCPE1234F",
"consent": "Y",
"referenceId": "app_20915",
"name": "Asha Sample",
"nameMatchMethod": "fuzzy",
},
timeout=15,
)
result = res.json()200 response — status "found"
{
"status": "found",
"data": {
"pan": "ABCPE1234F",
"name": "Asha Sample",
"panStatus": "VALID",
"panDisplayName": "Asha Sample",
"aadhaarSeedingStatus": "OPERATIVE",
"nameMatch": true,
"nameMatchScore": 100
},
"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 verified.
namestringoptionalName registered against the PAN.
panStatusstringoptionalStatus of the PAN. VALID: the PAN exists and is active. A PAN that is not valid is answered with NO_DATA and not charged.
panDisplayNamestringoptionalThe name printed on the PAN card. null when the source does not hold it.
aadhaarSeedingStatusstringoptionalWhether the PAN is linked to Aadhaar: OPERATIVE, NOT_OPERATIVE, or NOT_APPLICABLE for a PAN that is not an individual's. null when the source did not say.
nameMatchbooleanoptionalWhether the name you sent matches the name held against the PAN (a score above 80). null when you sent no name.
nameMatchScoreintegeroptionalHow closely the name you sent matches, from 0 to 100. With nameMatchMethod exact it is 0 or 100. null when you sent no name.
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
- Aadhaar OTP Verification API — Consent-based Aadhaar verification with OTP delivered to the registered mobile number.
- PAN Advanced Verification API — Verify a PAN and also get its holder type and whether it is linked to Aadhaar.
- 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.
- Face Match API — Compare two photos and get a match score, for example a selfie against an ID photo.
- Face Match with Liveness API — Check that a selfie is of a live person and matches the photo on their ID, in one call.
- DigiLocker Verification API — Consent-based fetch of a person's verified documents from DigiLocker.
All API documentation · OpenAPI specification · Docs as plain text
