---
title: "Check KYC PAN Status"
method: POST
path: "/v1/kyc/pan/status"
tags: ["KYC"]
---

# Check KYC PAN Status

`POST /v1/kyc/pan/status`

Query KYC registration status for a PAN number across all five SEBI-registered KRAs
(CVL, NDML, CAMS, Karvy, KFin) via the CVL KRA portal.

Raw portal status strings are normalized into clean enums (see `kyc_status`).

**`kyc_compliant`** is `true` only when `kyc_status` is `validated` or `registered`.
Use this for quick onboarding gate decisions.

**`remarks`** on a KRA object is only actionable when `status` is `on_hold` —
it contains the reason (e.g. `"APPLICANT PHOTO MISMATCH"`). For `validated` KRAs,
remarks like `"FATCA NOT APPLICABLE"` can be safely ignored.

**Note:** This endpoint may take up to 60 seconds. Set your client timeout accordingly.

**Credits:** 0.25 per successful lookup. Failed lookups are not billed.

## Request body

- object
  - `pan_no` string, required — PAN number to look up (10 characters, uppercase)

## Response `200`

KYC status retrieved successfully

- KycPanStatusResponse — Normalized KYC status response for a PAN number
  - `status` 'success'
  - `pan` string — The PAN number that was queried (uppercase)
  - `kyc_compliant` boolean — `true` if the investor has a `validated` or `registered` KYC record. Use this as the primary onboarding gate signal.
  - `kyc_status` 'validated' | 'registered' | 'under_process' | 'on_hold' | 'rejected' | 'legacy' | 'not_available' | 'unknown' — Normalized KYC status from the active KRA. Possible values: - `validated` — KYC complete, investor can onboard and transact freely - `registered` — KYC registered; some restrictions may apply depending on your platform's onboarding policy - `under_process` — Recently submitted KYC, still being processed by KRA - `on_hold` — KYC on hold due to discrepancy; check `remarks` on the KRA object - `rejected` — KYC rejected; investor must submit fresh KYC - `legacy` — Old/incomplete record; re-KYC recommended - `not_available` — No KYC record found at any KRA - `unknown` — Portal returned an unrecognized string; `raw_status` preserved
  - `kyc_mode` 'normal' | 'digilocker' | 'ekyc' | 'paper' | 'unknown', nullable — How the KYC was completed. Possible values: - `normal` — Physical/paper KYC - `digilocker` — DigiLocker-backed digital KYC - `ekyc` — Aadhaar eKYC (OTP-based) - `paper` — Offline paper submission - `unknown` — Mode string not recognized
  - `active_kra` 'cvl' | 'ndml' | 'cams' | 'karvy' | 'kfin', nullable — Short key of the KRA where the active KYC record was found
  - `registered_on` string, date, nullable — Date the KYC was first registered at the active KRA (ISO 8601)
  - `last_updated_on` string, date, nullable — Date the KYC record was last updated at the active KRA (ISO 8601)
  - `kras` object — Per-KRA status breakdown. All five KRA keys are always present.
    - `cvl` KycKraStatus, required — KYC status at a single KRA. All six keys are always present (never omitted). For `not_checked` and `not_available` KRAs, date/mode/remarks fields are `null`.
      - `status` 'validated' | 'registered' | 'under_process' | 'on_hold' | 'rejected' | 'legacy' | 'not_available' | 'not_checked' | 'unknown', required — Normalized status for this KRA
      - `registered_on` string, date, nullable, required — Date KYC was first registered at this KRA
      - `last_updated_on` string, date, nullable, required — Date KYC was last updated at this KRA
      - `kyc_mode` 'normal' | 'digilocker' | 'ekyc' | 'paper' | 'unknown', nullable, required — KYC completion mode at this KRA
      - `remarks` string, nullable, required — Remarks from the KRA. Only actionable when `status` is `on_hold` (e.g. `"APPLICANT PHOTO MISMATCH"`). For `validated` KRAs, remarks like `"FATCA NOT APPLICABLE"` can be safely ignored. Multiple remarks are comma-separated.
      - `raw_status` string, nullable, required — The original status string from the CVL portal. `null` for exact-matched statuses. Non-null when a fuzzy match or unknown string was encountered — preserve this for debugging and to help us expand coverage.
    - `ndml` KycKraStatus, required — KYC status at a single KRA. All six keys are always present (never omitted). For `not_checked` and `not_available` KRAs, date/mode/remarks fields are `null`.
      - `status` 'validated' | 'registered' | 'under_process' | 'on_hold' | 'rejected' | 'legacy' | 'not_available' | 'not_checked' | 'unknown', required — Normalized status for this KRA
      - `registered_on` string, date, nullable, required — Date KYC was first registered at this KRA
      - `last_updated_on` string, date, nullable, required — Date KYC was last updated at this KRA
      - `kyc_mode` 'normal' | 'digilocker' | 'ekyc' | 'paper' | 'unknown', nullable, required — KYC completion mode at this KRA
      - `remarks` string, nullable, required — Remarks from the KRA. Only actionable when `status` is `on_hold` (e.g. `"APPLICANT PHOTO MISMATCH"`). For `validated` KRAs, remarks like `"FATCA NOT APPLICABLE"` can be safely ignored. Multiple remarks are comma-separated.
      - `raw_status` string, nullable, required — The original status string from the CVL portal. `null` for exact-matched statuses. Non-null when a fuzzy match or unknown string was encountered — preserve this for debugging and to help us expand coverage.
    - `cams` KycKraStatus, required — KYC status at a single KRA. All six keys are always present (never omitted). For `not_checked` and `not_available` KRAs, date/mode/remarks fields are `null`.
      - `status` 'validated' | 'registered' | 'under_process' | 'on_hold' | 'rejected' | 'legacy' | 'not_available' | 'not_checked' | 'unknown', required — Normalized status for this KRA
      - `registered_on` string, date, nullable, required — Date KYC was first registered at this KRA
      - `last_updated_on` string, date, nullable, required — Date KYC was last updated at this KRA
      - `kyc_mode` 'normal' | 'digilocker' | 'ekyc' | 'paper' | 'unknown', nullable, required — KYC completion mode at this KRA
      - `remarks` string, nullable, required — Remarks from the KRA. Only actionable when `status` is `on_hold` (e.g. `"APPLICANT PHOTO MISMATCH"`). For `validated` KRAs, remarks like `"FATCA NOT APPLICABLE"` can be safely ignored. Multiple remarks are comma-separated.
      - `raw_status` string, nullable, required — The original status string from the CVL portal. `null` for exact-matched statuses. Non-null when a fuzzy match or unknown string was encountered — preserve this for debugging and to help us expand coverage.
    - `karvy` KycKraStatus, required — KYC status at a single KRA. All six keys are always present (never omitted). For `not_checked` and `not_available` KRAs, date/mode/remarks fields are `null`.
      - `status` 'validated' | 'registered' | 'under_process' | 'on_hold' | 'rejected' | 'legacy' | 'not_available' | 'not_checked' | 'unknown', required — Normalized status for this KRA
      - `registered_on` string, date, nullable, required — Date KYC was first registered at this KRA
      - `last_updated_on` string, date, nullable, required — Date KYC was last updated at this KRA
      - `kyc_mode` 'normal' | 'digilocker' | 'ekyc' | 'paper' | 'unknown', nullable, required — KYC completion mode at this KRA
      - `remarks` string, nullable, required — Remarks from the KRA. Only actionable when `status` is `on_hold` (e.g. `"APPLICANT PHOTO MISMATCH"`). For `validated` KRAs, remarks like `"FATCA NOT APPLICABLE"` can be safely ignored. Multiple remarks are comma-separated.
      - `raw_status` string, nullable, required — The original status string from the CVL portal. `null` for exact-matched statuses. Non-null when a fuzzy match or unknown string was encountered — preserve this for debugging and to help us expand coverage.
    - `kfin` KycKraStatus, required — KYC status at a single KRA. All six keys are always present (never omitted). For `not_checked` and `not_available` KRAs, date/mode/remarks fields are `null`.
      - `status` 'validated' | 'registered' | 'under_process' | 'on_hold' | 'rejected' | 'legacy' | 'not_available' | 'not_checked' | 'unknown', required — Normalized status for this KRA
      - `registered_on` string, date, nullable, required — Date KYC was first registered at this KRA
      - `last_updated_on` string, date, nullable, required — Date KYC was last updated at this KRA
      - `kyc_mode` 'normal' | 'digilocker' | 'ekyc' | 'paper' | 'unknown', nullable, required — KYC completion mode at this KRA
      - `remarks` string, nullable, required — Remarks from the KRA. Only actionable when `status` is `on_hold` (e.g. `"APPLICANT PHOTO MISMATCH"`). For `validated` KRAs, remarks like `"FATCA NOT APPLICABLE"` can be safely ignored. Multiple remarks are comma-separated.
      - `raw_status` string, nullable, required — The original status string from the CVL portal. `null` for exact-matched statuses. Non-null when a fuzzy match or unknown string was encountered — preserve this for debugging and to help us expand coverage.

## Other responses

- `400` — Missing or invalid pan_no
- `401` — Unauthorized. This can happen if the `x-api-key` header is missing.
- `503` — KYC service unavailable
- `504` — KYC service timed out (CVL portal slow/unresponsive)

---

[API](https://skmtc.net/casparser/apis/cas-parser-track-portfolios-from-cdsl-nsdl-cams-kfintech-2.md) · [All operations](https://skmtc.net/casparser/apis/cas-parser-track-portfolios-from-cdsl-nsdl-cams-kfintech-2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/casparser/cas-parser-track-portfolios-from-cdsl-nsdl-cams-kfintech-2/revisions/c9918aebb2de/schema)
