Aadhaar Check (Without OTP)
Identity & KYCValidates an Aadhaar number against UIDAI records and returns demographic details of the holder (age range, gender, state, mobile-linkage status). Non-OTP — no consent/OTP flow required.
Validate a 12-digit Aadhaar number against the issuing authority and get back the demographic profile linked to it: age band, gender, state and whether a mobile is registered. No OTP, no biometric capture, no full Aadhaar stored.
Endpoint
Request parameters
consent: true (or "Y") with the call.
A call without it is refused with 422 consent_required before anything is billed.
consent: false is refused with consent_declined.
How to send it
Show the person the statement above, record their answer, then add one field to the JSON body alongside the request parameters. The statement, the purpose and the time of consent are recorded on our side with every call.
{
"...": "your request parameters",
"consent": true
}
| You send | Result |
|---|---|
consent: true or "Y" | The call runs; consent is recorded as given. |
consent: false or "N" | 422, code: consent_declined. Nothing is billed. |
| Field missing | 422, code: consent_required. Nothing is billed. |
| Any other value | 422, code: consent_invalid, with a field-level errors map. |
| Field | Type | Description |
|---|---|---|
aadhaar_api_without_otp_aadhaar_number
required
|
number | Aadhaar Number |
consent
required
|
boolean | Consent of the person true (or "Y") once the person being verified has agreed to: "I hereby provide consent for Aadhaar-based KYC verification as per UIDAI guidelines." false (or "N") if they declined — the call is then refused. Required: a call without it is refused with 422 code consent_required. |
Example request
curl -X POST https://app.emver.io/api/sandbox/v1/aadhaar-api-without-otp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"aadhaar_api_without_otp_aadhaar_number": 0,
"consent": true
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/aadhaar-api-without-otp",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"aadhaar_api_without_otp_aadhaar_number": 0,
"consent": true
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/aadhaar-api-without-otp", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"aadhaar_api_without_otp_aadhaar_number": 0,
"consent": true
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/aadhaar-api-without-otp', {
"aadhaar_api_without_otp_aadhaar_number": 0,
"consent": true
});
$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
}
Example · 200
{
"status": 200,
"message": "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
The Aadhaar Validation API checks whether a given Aadhaar number is genuine and returns the demographic details linked to it, cross-checked against UIDAI records. It is a non-OTP API — there is no OTP generated, no OTP entry step, and no consent-capture round trip with the Aadhaar holder. The full Aadhaar number, name, address and photograph are never returned. It is ideal as a fast, first-line check that an Aadhaar number is genuine and active before you rely on it downstream.
What you get
- age_range — the age band linked to the Aadhaar (e.g.
20-30). - gender —
Male,FemaleorOther. - state — the issuing state.
- last_digits — masked Aadhaar; only the last few digits are revealed.
- is_mobile — whether a mobile number is linked to the Aadhaar.
- remarks — the validation outcome (e.g. valid / invalid Aadhaar).
Why it's a non-OTP API
- No OTP is sent to, or collected from, the Aadhaar holder's registered mobile number.
- Nothing is required from the Aadhaar holder — the check runs on the Aadhaar number alone.
- Only demographic fields are returned, never the full Aadhaar number, name, address or photo.
- For full e-KYC (name, DOB, address, photo) use an OTP-based Aadhaar e-KYC API instead — this endpoint intentionally does not provide that.
Common use cases
- Validating an Aadhaar number is genuine and active during onboarding.
- Identity checks during employee background verification (BGV).
- KYC pre-checks for customer, vendor and gig-worker onboarding.
- Fraud prevention — catching fake, malformed or inactive Aadhaar numbers early.
How it works
Send the 12-digit aadhaar_number. On success you receive a 200 with the demographic data listed above; an invalid number returns a 422 with a message. Even though no OTP is involved, you must still capture the individual's consent for Aadhaar-based verification as per UIDAI guidelines before calling this API.