---
title: "Validate PAN API Reference"
description: "Validate the sender's PAN to complete PPI Levin KYC and return the updated wallet profile."
canonical: "https://eps.eko.in/docs/ppi-levin-validate-pan"
---


> **Canonical URL:** https://eps.eko.in/docs/ppi-levin-validate-pan
> 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 PAN API Reference

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

Validate the sender's PAN to complete PPI Levin KYC and return the updated wallet profile.

Submits the sender's PAN to finish PPI Levin onboarding KYC. On success the response returns the updated `customer_profile` (with the verified sender name and recalculated limits).

> 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. 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 |
| pan_number | string | no | The PAN number of the sender. e.g. ABCDE1234F |
| wallet_id | string | no | Wallet identifier, when applicable. e.g. |
| wallet_token | string | no | Wallet authentication token, when applicable. e.g. |

## 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 | Updated wallet profile with verified sender name and recalculated limits. |
| data.customer_profile.name ⭐ | string | Verified registered name of the sender. |
| data.customer_profile.next_allowed_limit ⭐ | string | Remaining transfer limit for the period (INR). |
| data.customer_profile.balance | string | Current wallet balance (INR). |
| data.sender_name ⭐ | string | Verified name of the sender. |
| data.next_allowed_limit | number | Remaining transfer limit at the top level (INR). |

## Example request

```json
{
  "initiator_id": "9962981729",
  "user_code": "20810200",
  "client_ref_id": "REQ-20260101-001",
  "pan_number": "ABCDE1234F",
  "wallet_id": "",
  "wallet_token": ""
}
```

## 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
}
```
