Aadhaar eKYC (OTP)
Identity & KYCFull Aadhaar eKYC with a one-time password on the registered mobile.
Run a complete, consent-based Aadhaar eKYC: the person enters the OTP sent to their Aadhaar-linked mobile, and you receive their verified name, date of birth, gender, address and photograph. The gold standard for regulated onboarding.
Endpoint
Request parameters
| Field | Type | Description |
|---|---|---|
aadhaar_number
required
|
string | Aadhaar number |
o_t_p_entered_by_the_person
required
|
string | OTP entered by the person |
Example request
curl -X POST https://app.emver.io/api/sandbox/v1/aadhaar-ekyc-otp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"aadhaar_number": "string",
"o_t_p_entered_by_the_person": "string"
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/aadhaar-ekyc-otp",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"aadhaar_number": "string",
"o_t_p_entered_by_the_person": "string"
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/aadhaar-ekyc-otp", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"aadhaar_number": "string",
"o_t_p_entered_by_the_person": "string"
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/aadhaar-ekyc-otp', {
"aadhaar_number": "string",
"o_t_p_entered_by_the_person": "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": {
"verified_name": STRING,
"date_of_birth": STRING,
"gender": STRING,
"full_address": STRING,
"photograph": STRING,
"masked_aadhaar": STRING,
"consent_reference": STRING
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"verified_name": "string",
"date_of_birth": "string",
"gender": "string",
"full_address": "string",
"photograph": "string",
"masked_aadhaar": "string",
"consent_reference": "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
Where demographic validation only confirms a number is genuine, OTP-based eKYC proves the person in front of you controls the Aadhaar and returns the full KYC record from the authority: name, date of birth, gender, full address and photo. It is the identity check regulators expect for accounts, lending and high-value onboarding.
The flow is two calls: generate the OTP against the Aadhaar number, then submit the OTP the person received. emver hosts the consent screen if you want it, captures the consent artefact and returns a masked Aadhaar with the KYC data.
Typical uses
- Account opening. Fully digital KYC for savings, current and demat accounts.
- Lending and insurance. Identity and address in one step before disbursal or policy issue.
- Employee onboarding. Verified identity and address for the personnel file.
- Age-gated platforms. Confirm date of birth for gaming, trading and other restricted services.
Questions
- What if the person does not have a mobile linked to Aadhaar?
- They cannot complete OTP eKYC. Fall back to DigiLocker, or to demographic Aadhaar validation combined with Face Match on an ID document.
- Do I need my own consent screen?
- No. emver can host the consent and OTP screens and hand the result back, or you can build your own and pass the consent record with the request.
- Is the full Aadhaar number stored?
- No. Responses carry a masked Aadhaar, and the raw number is not persisted.