> ## Documentation Index
> Fetch the complete documentation index at: https://www.cashfree.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Min KYC Verification

> Completes the minimum KYC verification process by validating user documents and OTP verification.
This endpoint processes document information (PAN card details) along with the OTP verification ID
to complete the minimum KYC requirements for the user.




## OpenAPI

````yaml /openapi/ppi/ppi.yaml post /ppi/kyc/min
openapi: 3.0.3
info:
  title: PPI Wallet API
  description: >-
    API for managing PPI (Prepaid Payment Instrument) wallets and sub-wallets,
    including credit and debit operations.
  version: 1.0.0
  contact:
    name: PPI Service Team
    email: support@cashfree.com
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0
servers:
  - url: https://api.cashfree.com
    description: Production server.
  - url: https://sandbox.cashfree.com
    description: Sandbox server.
security:
  - XClientID: []
    XClientSecret: []
tags:
  - name: Wallet Management
    description: Operations related to PPI wallet management.
  - name: User Management
    description: Operations related to user management within the PPI system.
  - name: Beneficiary Management
    description: Operations related to beneficiary management for users.
  - name: KYC Management
    description: Operations related to KYC (Know Your Customer) management.
  - name: Transfers
    description: Operations related to transfer.
paths:
  /ppi/kyc/min:
    post:
      tags:
        - User KYC
      summary: Min KYC Verification
      description: >
        Completes the minimum KYC verification process by validating user
        documents and OTP verification.

        This endpoint processes document information (PAN card details) along
        with the OTP verification ID

        to complete the minimum KYC requirements for the user.
      operationId: completeMinKyc
      parameters:
        - $ref: '#/components/parameters/global_x_api_version'
      requestBody:
        $ref: '#/components/requestBodies/MinKycRequest'
      responses:
        '200':
          $ref: '#/components/responses/MinKycResponse'
        '400':
          description: Bad request - Invalid input parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                otp_verification_id_missing:
                  summary: OTP verification ID missing
                  value:
                    code: otp_verification_id_missing
                    type: validation_error
                    message: otp_verification_id parameter is missing
                user_id_missing:
                  summary: User ID missing
                  value:
                    code: user_id_missing
                    type: validation_error
                    message: user_id parameter is missing
                verification_id_missing:
                  summary: Verification ID missing
                  value:
                    code: verification_id_missing
                    type: validation_error
                    message: verification_id parameter is missing
                document_missing:
                  summary: Document missing
                  value:
                    code: document_missing
                    type: validation_error
                    message: document parameter is missing
                document_type_missing:
                  summary: Document type missing
                  value:
                    code: document_type_missing
                    type: validation_error
                    message: document.type parameter is missing
                document_identifier_missing:
                  summary: Document identifier missing
                  value:
                    code: document_identifier_missing
                    type: validation_error
                    message: document.identifier parameter is missing
                document_name_missing:
                  summary: Document name missing
                  value:
                    code: document_name_missing
                    type: validation_error
                    message: document.name parameter is missing
                document_dob_missing:
                  summary: Document DOB missing
                  value:
                    code: document_dob_missing
                    type: validation_error
                    message: document.dob parameter is missing
                invalid_document_type:
                  summary: Invalid document type
                  value:
                    code: document_type_invalid
                    type: validation_error
                    message: Invalid document type. Currently only PAN is supported
                invalid_pan_format:
                  summary: Invalid PAN format
                  value:
                    code: document_identifier_invalid
                    type: validation_error
                    message: >-
                      Invalid PAN format. PAN should be 10 characters with
                      format ABCDE1234F
                invalid_dob_format:
                  summary: Invalid DOB format
                  value:
                    code: document_dob_invalid
                    type: validation_error
                    message: Invalid date of birth format. Use YYYY-MM-DD format
                missingClientId:
                  summary: Missing client ID
                  value:
                    message: x-client-id is missing in the request
                    code: x-client-id_missing
                    type: validation_error
                missingClientSecret:
                  summary: Missing client secret
                  value:
                    message: x-client-secret is missing in the request
                    code: x-client-secret_missing
                    type: validation_error
        '401':
          $ref: '#/components/responses/Response401'
        '403':
          description: Forbidden - Access denied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                ipNotWhitelisted:
                  summary: IP not whitelisted
                  value:
                    code: ip_not_whitelisted
                    type: authentication_error
                    message: Authentication error (IP not whitelisted)
        '404':
          description: Not found - User or OTP verification not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                userNotFound:
                  summary: User not found
                  value:
                    code: user_id_not_found
                    type: invalid_request_error
                    message: The specified user_id does not exist
                otpVerificationNotFound:
                  summary: OTP verification ID not found
                  value:
                    code: otp_verification_id_not_found
                    type: invalid_request_error
                    message: >-
                      The specified otp_verification_id does not exist or has
                      not been verified
        '409':
          description: Conflict - Duplicate verification request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                duplicateVerification:
                  summary: Verification ID already exists
                  value:
                    code: verification_id_already_exists
                    type: validation_error
                    message: >-
                      KYC verification with the same verification_id already
                      exists
                kycAlreadyCompleted:
                  summary: KYC already completed
                  value:
                    code: kyc_already_completed
                    type: validation_error
                    message: >-
                      Minimum KYC verification has already been completed for
                      this user
        '422':
          description: Unprocessable Entity - Document verification failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                otpNotVerified:
                  summary: OTP not verified
                  value:
                    code: otp_not_verified
                    type: validation_error
                    message: OTP verification must be completed before KYC verification
                documentVerificationFailed:
                  summary: Document verification failed
                  value:
                    code: document_verification_failed
                    type: validation_error
                    message: >-
                      Document verification failed. Please check the provided
                      details
                panNotFound:
                  summary: PAN not found
                  value:
                    code: pan_not_found
                    type: validation_error
                    message: >-
                      The provided PAN number was not found in government
                      records
                panNameMismatch:
                  summary: PAN name mismatch
                  value:
                    code: pan_name_mismatch
                    type: validation_error
                    message: The name on PAN does not match the provided name
                panDobMismatch:
                  summary: PAN DOB mismatch
                  value:
                    code: pan_dob_mismatch
                    type: validation_error
                    message: The date of birth does not match PAN records
        '429':
          description: Too Many Requests - Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                rateLimitExceeded:
                  summary: Rate limit exceeded
                  value:
                    code: rate_limit_exceeded
                    type: rate_limit_error
                    message: Rate limit exceeded. Please try again after some time
        '500':
          $ref: '#/components/responses/Response500'
components:
  parameters:
    global_x_api_version:
      description: API version to be used. Format is in YYYY-MM-DD.
      name: x-api-version
      in: header
      required: true
      schema:
        type: string
        default: '2025-11-01'
        example: '2025-11-01'
      example: '2025-11-01'
  requestBodies:
    MinKycRequest:
      description: Request parameters to complete minimum KYC verification for a user.
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/MinKycRequest'
          examples:
            minKycVerification:
              summary: Complete minimum KYC verification
              value:
                otp_verification_id: Test123
                user_id: USER827364
                verification_id: TestVerification
                document:
                  type: PAN
                  identifier: ABCDE1234F
                  name: SHAH RAMESH
                  dob: '1990-05-12'
  responses:
    MinKycResponse:
      description: Success response for completing minimum KYC verification.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/MinKycResponse'
          examples:
            SUCCESS:
              summary: Successful minimum KYC verification
              value:
                verification_id: TestVerification
                cf_verification_id: '8901234567890123452'
                otp_verification_id: Test123
                status: VERIFIED
                user_id: USER827364
    Response401:
      description: Unauthorised - Invalid or missing authentication.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/StructuredErrorResponse'
          examples:
            invalidCredentials:
              summary: Invalid client credentials
              value:
                code: authentication_failed
                type: authentication_error
                message: Invalid client ID and client secret combination
    Response500:
      description: Internal server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/StructuredErrorResponse'
          examples:
            internalError:
              summary: Internal server error
              value:
                code: internal_server_error
                type: internal_error
                message: An internal error occurred while processing the request
  schemas:
    StructuredErrorResponse:
      type: object
      properties:
        type:
          type: string
          description: A broad category of the error.
          example: internal_error
        code:
          type: string
          description: A machine-readable error code specific to the issue.
          example: internal_server_error
        message:
          type: string
          description: >-
            A message providing more details about the error, dynamic based on
            the specific issue.
          example: Internal server error
    MinKycRequest:
      type: object
      required:
        - otp_verification_id
        - user_id
        - verification_id
        - document
      properties:
        otp_verification_id:
          type: string
          description: >-
            Unique identifier for the OTP verification request that was
            previously verified.
          example: Test123
          minLength: 1
          maxLength: 50
        user_id:
          type: string
          description: >-
            Unique identifier for the user, as provided by you during PPI user
            creation.
          example: USER827364
          minLength: 1
          maxLength: 50
        verification_id:
          type: string
          description: >-
            Unique identifier that you create to identify the KYC verification
            request in your system. Maximum 50 characters. Only alphanumeric
            characters, periods (.), hyphens (-), and underscores (_) are
            allowed.
          example: TestVerification
          minLength: 1
          maxLength: 50
        document:
          type: object
          description: Document information for KYC verification.
          required:
            - type
            - identifier
            - name
            - dob
          properties:
            type:
              type: string
              description: >-
                Type of document for verification. Currently only PAN is
                supported.
              example: PAN
              enum:
                - PAN
            identifier:
              type: string
              description: >-
                Document identifier (PAN number). Must be 10 characters in
                format ABCDE1234F.
              example: ABCDE1234F
              pattern: ^[A-Z]{5}[0-9]{4}[A-Z]$
              minLength: 10
              maxLength: 10
            name:
              type: string
              description: Full name as per the document.
              example: SHAH RAMESH
              minLength: 1
              maxLength: 100
            dob:
              type: string
              format: date
              description: Date of birth in YYYY-MM-DD format.
              example: '1990-05-12'
    MinKycResponse:
      type: object
      properties:
        verification_id:
          type: string
          description: >-
            Unique identifier for the KYC verification request, as provided by
            you during the request.
          example: TestVerification
        cf_verification_id:
          type: string
          description: >-
            Unique identifier for the KYC verification request, generated by
            Cashfree.
          example: '8901234567890123452'
        otp_verification_id:
          type: string
          description: >-
            Unique identifier for the OTP verification request that was used in
            this KYC verification.
          example: Test123
        status:
          type: string
          description: Status of the KYC verification process.
          example: VERIFIED
          enum:
            - VERIFIED
            - FAILED
        user_id:
          type: string
          description: >-
            Unique identifier for the user, as provided by you during PPI user
            creation.
          example: USER827364
  securitySchemes:
    XClientID:
      type: apiKey
      in: header
      name: x-client-id
      description: >-
        Your unique client identifier issued by Cashfree. You can find this in
        your [Merchant
        Dashboard](https://merchant.cashfree.com/merchants/landing?env=prod).
    XClientSecret:
      type: apiKey
      in: header
      name: x-client-secret
      description: >-
        The secret key associated with your client ID. Use this to authenticate
        your API requests. You can find this in your [Merchant
        Dashboard](https://merchant.cashfree.com/merchants/landing?env=prod).

````