---
title: "Verify Customer OTP API Reference"
description: "Verify the customer OTP to complete onboarding and return the customer profile."
canonical: "https://eps.eko.in/docs/verify-customer-otp"
---


> **Canonical URL:** https://eps.eko.in/docs/verify-customer-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 Customer OTP API Reference

`POST https://staging.eko.in/ekoapi/v3/customer/account/{customer_id}/otp/verify`

Verify the customer OTP to complete onboarding and return the customer profile.

Validates the OTP issued by Onboard Customer / Get Customer Information. For an existing customer the response returns the full `customer_profile` (limits, balance, KYC state). For a new customer the flow continues to Aadhaar validation and PAN.

> View product & pricing details: [Customer Management](https://eps.eko.in/products/customer-management-api.md)

## Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| customer_id | string | yes | Customer's 10-digit mobile number. e.g. 9444444444 |

## 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 from Onboard Customer, Get Customer Information, or Validate Aadhaar. e.g. 123456 |
| otp_ref_id | integer | yes | otp_ref_id received from Onboard Customer, Get Customer Information, or Validate Aadhaar. 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 | Customer's profile — limits, balance, KYC state, and usage chart. |
| data.customer_profile.name ⭐ | string | Registered name of the customer. |
| data.customer_profile.mobile | string | Customer's mobile number. |
| data.customer_profile.next_allowed_limit ⭐ | string | Remaining transfer limit for the period (INR). |
| data.customer_profile.balance ⭐ | string | Current balance (INR). |
| data.customer_profile.kyc_state | number | KYC completion state. |
| data.sender_name ⭐ | string | Registered name of the customer. |

## 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": "9444444444",
      "kyc_id": "",
      "ekyc_enabled": 0,
      "kyc_validity": "",
      "kyc_remark": "",
      "kyc_type": "",
      "balance": "0.00",
      "next_allowed_limit": "5287.0",
      "name": "Karan Garg",
      "digital_ekyc": 0,
      "chart": [
        {
          "data_type_id": 10,
          "data": {
            "unavailable": 0,
            "used": 44713,
            "remaining": 5287
          },
          "label": ""
        }
      ],
      "email": "",
      "kyc_state": 0
    },
    "id_proof_type_id": "",
    "is_registered": 0,
    "id_proof": "",
    "otpOptionalSum": "",
    "sender_name": "Karan Garg",
    "otpNotRequiredSum": "",
    "ekyc_enabled": "",
    "otpNotRequiredSumNeft": "",
    "next_allowed_limit": 5287,
    "account": "",
    "kyc_state": 0,
    "otpOptionalSumNeft": ""
  },
  "response_type_id": 309,
  "message": "Success!",
  "status": 0
}
```

## Error scenarios

| Status | Scenario |
| --- | --- |
| 200 | New customer — Aadhaar validation pending |
| 200 | Aadhaar validated — PAN required next |
