Income Verification
Workforce & AssetsVerify declared income from tax filings and salary credits with the person's consent.
Establish income from the sources that cannot be doctored — filed income-tax returns, Form 26AS credits and salary inflows — and return an income band with the supporting evidence for lending and high-value hiring.
Endpoint
POST
https://app.emver.io/api/sandbox/v1/income-verification
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Accept: application/json
Request parameters
| Field | Type | Description |
|---|---|---|
pan_number
required
|
string | PAN |
mobile
required
|
phone | Mobile (for consent) |
declared_income
optional
|
number | Declared annual income |
Example request
cURL
curl -X POST https://app.emver.io/api/sandbox/v1/income-verification \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"pan_number": "string",
"mobile": "9999999999",
"declared_income": 0
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/income-verification",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"pan_number": "string",
"mobile": "9999999999",
"declared_income": 0
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/income-verification", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"pan_number": "string",
"mobile": "9999999999",
"declared_income": 0
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/income-verification', {
"pan_number": "string",
"mobile": "9999999999",
"declared_income": 0
});
$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": {
"estimated_income": NUMBER,
"income_band": STRING,
"sources": ARRAY,
"declared_match": BOOLEAN,
"confidence": NUMBER
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"estimated_income": 0,
"income_band": "string",
"sources": "string",
"declared_match": true,
"confidence": 0
}
}
Error · 4xx / 5xx
{
"status": INTEGER,
"message": STRING
}
See Errors & status codes for what each status means and which calls are billed.
About this API
With consent, the API pulls the last filed returns and TDS credits and, optionally, salary credits from consented bank data, then reconciles them into an annual income estimate and a confidence score.
Consent. The person consents to income data access through the OTP or Account Aggregator step that starts the flow.
Typical uses
- Unsecured lending. Income proof without document collection.
- Senior hiring. Verify previous compensation with consent.
Questions
- Does it work for the self-employed?
- Yes, through filed returns and consented bank inflows; the band reflects both.