---
title: "Validate Aadhaar OTP API Reference"
description: "Verify the Aadhaar OTP to complete identity validation in the PPI Levin wallet onboarding flow."
canonical: "https://eps.eko.in/docs/aadhaar-ppi-levin-verify-otp"
---


> **Canonical URL:** https://eps.eko.in/docs/aadhaar-ppi-levin-verify-otp
> This is a machine-readable Markdown version of the page for AI agents and LLMs. The primary (HTML) version lives at the canonical URL above.

# Validate Aadhaar OTP API Reference

`POST https://staging.eko.in/ekoapi/v3/customer/payment/ppi-levin/sender/{customer_id}/aadhaar/otp/verify`

Verify the Aadhaar OTP to complete identity validation in the PPI Levin wallet onboarding flow.

Validates the OTP dispatched during the PPI Levin Aadhaar validation step. On success, the sender's Aadhaar identity is confirmed and their PPI Levin wallet profile is updated with verified KYC data. Wallet-level parameters `wallet_token` and `wallet_id` may be required.

> View product & pricing details: [PPI Wallet](https://eps.eko.in/products/ppi-api.md)

## Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| customer_id | string | yes | Sender's mobile number. e.g. 9876543210 |

## Body parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| initiator_id | string | yes | Registered mobile number of the API user (see Platform Credentials). e.g. 9962981729 |
| user_code | string | yes | User code of the retailer/agent the service is run for. e.g. 20810200 |
| client_ref_id | string | no | Unique reference id per API call, generated by your system. e.g. REQ-20260101-001 |
| otp | integer | no | OTP received on the Aadhaar-linked mobile number. e.g. 654321 |
| otp_ref_id | integer | yes | Reference ID from the PPI Levin Validate Aadhaar response. e.g. 66748392 |
| intent_id | string | no | Intent flag: "19" for sender onboarding, "20" for Aadhaar validation. e.g. 20 |
| wallet_token | string | no | Wallet token for authenticated context. e.g. wtkn_abc123xyz |
| wallet_id | string | no | Wallet identifier for the sender. e.g. wlt_0091234 |

## Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| developer_key | string | yes | Static API key issued to your account after KYC. |
| secret-key | string | yes | Dynamic per-request signature: base64(HMAC-SHA256(timestamp, base64(access_key))). |
| secret-key-timestamp | string | yes | Current time in milliseconds since UNIX epoch, used to compute secret-key. Must match server time. |
| content-type | string | yes | application/json e.g. application/json |

## Response

⭐ marks fields highlighted as verifiable.

| Field | Type | Description |
| --- | --- | --- |
| status | number | Primary success indicator (0 = success). |
| message | string | Human-readable response / error message. |
| response_status_id | number | Granular status id; see the shared error-codes table. |
| response_type_id | number | A unique id for every possible response shape (success or error) — useful for client logic branching and analytics. |
| data | object | API-specific response payload. |
| data.verified ⭐ | boolean | True if Aadhaar OTP verification was successful. |
| data.name ⭐ | string | Verified sender name from Aadhaar. |
| data.gender ⭐ | string | Gender from Aadhaar record: M, F, or T. |
| data.dob ⭐ | string | Date of birth as per Aadhaar. |
| data.masked_aadhaar ⭐ | string | Aadhaar number with first 8 digits masked. |

## Example request

```json
{
  "initiator_id": "9962981729",
  "user_code": "20810200",
  "client_ref_id": "REQ-20260101-001",
  "otp": 654321,
  "otp_ref_id": 66748392,
  "intent_id": "20",
  "wallet_token": "wtkn_abc123xyz",
  "wallet_id": "wlt_0091234"
}
```

## Example response

```json
{
  "status": 0,
  "response_status_id": 0,
  "message": "Aadhaar OTP verified successfully",
  "response_type_id": 1388,
  "data": {
    "verified": true,
    "name": "Sneha Patel",
    "gender": "F",
    "dob": "05-07-1992",
    "masked_aadhaar": "XXXX-XXXX-7890"
  }
}
```

## Error scenarios

| Status | Scenario |
| --- | --- |
| 200 | Wrong OTP |
