Form 16 Verification
Workforce & AssetsValidate a Form 16 against the TDS records it claims to reflect.
Read a Form 16, check its certificate number and TDS figures against the tax department's records for that PAN and TAN, and return whether the document is genuine and the salary figures it certifies.
Endpoint
POST
https://app.emver.io/api/sandbox/v1/form-16-verification
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Accept: application/json
Request parameters
| Field | Type | Description |
|---|---|---|
form16
required
|
file | Form 16 PDF |
pan_number
optional
|
string | Employee PAN |
Example request
cURL
curl -X POST https://app.emver.io/api/sandbox/v1/form-16-verification \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"form16": "<base64>",
"pan_number": "string"
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/form-16-verification",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"form16": "<base64>",
"pan_number": "string"
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/form-16-verification", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"form16": "<base64>",
"pan_number": "string"
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/form-16-verification', {
"form16": "<base64>",
"pan_number": "string"
});
$data = $response->json();
Replace YOUR_API_KEY and the placeholder values. Use the switch above to see production URLs.
Response
Structure · 200
{
"status": INTEGER,
"message": STRING,
"data": {
"genuine": BOOLEAN,
"employer_name": STRING,
"employer_tan": STRING,
"assessment_year": STRING,
"gross_salary": NUMBER,
"tds_deducted": NUMBER,
"discrepancies": ARRAY
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"genuine": true,
"employer_name": "string",
"employer_tan": "string",
"assessment_year": "string",
"gross_salary": 0,
"tds_deducted": 0,
"discrepancies": "string"
}
}
Error · 4xx / 5xx
{
"status": INTEGER,
"message": STRING
}
See Errors & status codes for what each status means and which calls are billed.
About this API
Upload the Form 16 PDF. The API extracts the employer TAN, employee PAN, assessment year and TDS amounts, then verifies the certificate against the TRACES record and reports discrepancies.
Typical uses
- Employment screening. Verify previous employer and salary claims.
- Salaried lending. Income proof with fraud control.
Questions
- Does it need the employee's consent?
- The employee supplies the document; the TRACES check uses the certificate number on it. No OTP is needed.