---
title: "Verify Sender OTP API Reference"
description: "Verify the sender OTP to authenticate the DigiKhata wallet and return the sender's profile and balance."
canonical: "https://eps.eko.in/docs/ppi-digikhata-verify-otp"
---


> **Canonical URL:** https://eps.eko.in/docs/ppi-digikhata-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.

# Verify Sender OTP API Reference

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

Verify the sender OTP to authenticate the DigiKhata wallet and return the sender's profile and balance.

Validates the OTP issued by Get Sender Information / Onboard Sender / Generate Sender OTP. For an existing sender the response returns the full wallet `customer_profile` (limits, balance, KYC state). For a new sender the flow continues to Aadhaar validation (Aadhar Validation Pending).

> 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 10-digit mobile number. e.g. 8617567988 |

## 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 | yes | OTP received from Get Sender Information, Onboard Sender, or Generate Sender OTP. e.g. 123456 |
| otp_ref_id | integer | yes | otp_ref_id received from Get Sender Information, Onboard Sender, or Generate Sender OTP. e.g. 66748392 |

## 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.customer_profile ⭐ | object | Sender's wallet profile — limits, balance, KYC state, and usage chart. |
| data.customer_profile.name ⭐ | string | Registered name of the sender. |
| data.customer_profile.mobile | string | Sender's mobile number. |
| data.customer_profile.total_monthly_limit | string | Total monthly transfer limit (INR). |
| data.customer_profile.next_allowed_limit ⭐ | string | Remaining transfer limit for the period (INR). |
| data.customer_profile.balance ⭐ | string | Current wallet balance (INR). |
| data.customer_profile.kyc_state | number | KYC completion state. |
| data.sender_name ⭐ | string | Registered name of the sender. |

## Example request

```json
{
  "initiator_id": "9962981729",
  "user_code": "20810200",
  "client_ref_id": "REQ-20260101-001",
  "otp": 123456,
  "otp_ref_id": 66748392
}
```

## Example response

```json
{
  "response_status_id": -1,
  "data": {
    "customer_profile": {
      "total_monthly_limit": "50000.0",
      "mobile": "8617567988",
      "kyc_id": "",
      "ekyc_enabled": 0,
      "kyc_validity": "",
      "kyc_remark": "",
      "kyc_type": "",
      "balance": "0.00",
      "next_allowed_limit": "50000.0",
      "name": "Yashwant Basnett",
      "digital_ekyc": 0,
      "chart": [
        {
          "data_type_id": 10,
          "data": {
            "unavailable": 0,
            "used": 0,
            "remaining": 50000
          },
          "label": ""
        }
      ],
      "email": "",
      "kyc_state": 1
    },
    "wallet_token": "",
    "id_proof_type_id": "",
    "is_registered": 0,
    "id_proof": "",
    "otpOptionalSum": "",
    "sender_name": "Yashwant Basnett",
    "otpNotRequiredSum": "",
    "ekyc_enabled": "",
    "wallet_id": "",
    "otpNotRequiredSumNeft": "",
    "next_allowed_limit": 50000,
    "account": "",
    "kyc_state": 0,
    "otpOptionalSumNeft": ""
  },
  "response_type_id": 309,
  "message": "Success!",
  "status": 0
}
```

## Error scenarios

| Status | Scenario |
| --- | --- |
| 200 | New sender — Aadhaar validation pending |
