Aadhaar Offline eKYC
Identity & KYCPaperless offline KYC: the person shares a UIDAI-signed XML and you get verified demographics and photo.
Accept the Aadhaar Paperless Offline e-KYC file the person downloads from UIDAI, verify its digital signature and return name, date of birth, gender, address and photo without touching the Aadhaar number.
Endpoint
Request parameters
| Field | Type | Description |
|---|---|---|
ekyc_file
required
|
file | Offline e-KYC ZIP file |
share_code
required
|
string | Share code |
Example request
curl -X POST https://app.emver.io/api/sandbox/v1/aadhaar-offline-ekyc \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"ekyc_file": "<base64>",
"share_code": "string"
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/aadhaar-offline-ekyc",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"ekyc_file": "<base64>",
"share_code": "string"
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/aadhaar-offline-ekyc", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"ekyc_file": "<base64>",
"share_code": "string"
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/aadhaar-offline-ekyc', {
"ekyc_file": "<base64>",
"share_code": "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": {
"signature_valid": BOOLEAN,
"reference_id": STRING,
"name": STRING,
"dob": DATE,
"gender": STRING,
"address": STRING,
"photo": STRING
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"signature_valid": true,
"reference_id": "string",
"name": "string",
"dob": "YYYY-MM-DD",
"gender": "string",
"address": "string",
"photo": "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 person downloads a password-protected e-KYC ZIP from the UIDAI portal and shares it with your app together with the share code. This API verifies the UIDAI signature, decrypts the payload and returns the demographic data and photo in a structured form.
It is the compliant route for full Aadhaar KYC when you are not an authorised KYC user agency — no OTP integration, no biometric device, and only a reference ID instead of the full number.
Typical uses
- Full KYC for lending and wallets. Address and photo in one consented step.
- Tenant and address verification. A signed address proof without a physical document.
Questions
- Do we need to be a UIDAI AUA or KUA?
- No. Offline e-KYC is designed for entities that are not authorised agencies; the person supplies the signed file.
- How long is the file valid?
- The file carries its generation timestamp; the response includes it so you can enforce your own freshness rule.