> ## 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.

# Initiate Video KYC

> Initiates Video KYC for a user and generates a VKYC link.
This endpoint creates a VKYC verification request and sends the notification across
the requested channels.


Refer to the [Status and Status Code reference](/docs/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions#status-statuscode-mapping) page for a comprehensive list of status and status\_code combinations.


## OpenAPI

````yaml openapi/ppi/ppi.yaml post /ppi/kyc/vkyc
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: Users
    description: Operations related to PPI users.
  - name: User KYC
    description: Operations related to user KYC verification.
  - name: Wallets
    description: Operations related to PPI wallets.
  - name: Beneficiaries
    description: Operations related to user beneficiaries.
  - name: Transfers
    description: Operations related to transfers.
paths:
  /ppi/kyc/vkyc:
    post:
      tags:
        - User KYC
      summary: Initiate Video KYC
      description: >
        Initiates Video KYC for a user and generates a VKYC link.

        This endpoint creates a VKYC verification request and sends the
        notification across

        the requested channels.
      operationId: initiateVkyc
      parameters:
        - $ref: '#/components/parameters/global_x_api_version'
      requestBody:
        $ref: '#/components/requestBodies/VkycRequest'
      responses:
        '200':
          $ref: '#/components/responses/VkycResponse'
        '400':
          description: Bad request - Invalid input parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredErrorResponse'
              examples:
                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
                notification_modes_missing:
                  summary: Notification modes missing
                  value:
                    code: notification_modes_missing
                    type: validation_error
                    message: notification_modes parameter is missing
                invalid_notification_mode:
                  summary: Invalid notification mode
                  value:
                    code: notification_mode_invalid
                    type: validation_error
                    message: >-
                      Invalid notification mode. Supported modes are SMS and
                      WHATSAPP
                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 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
        '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: >-
                      VKYC verification with the same verification_id already
                      exists
        '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:
    VkycRequest:
      description: >-
        Request parameters to initiate Video KYC verification for a user and
        generate a VKYC link.
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/VkycRequest'
          examples:
            vkycInitiation:
              summary: Initiate Video KYC
              value:
                user_id: USER827364
                verification_id: TestVkycVerification
                notification_modes:
                  - SMS
                  - WHATSAPP
  responses:
    VkycResponse:
      description: Success response for initiating Video KYC verification.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/VkycResponse'
          examples:
            SUCCESS:
              summary: Successful VKYC initiation
              value:
                verification_id: TestVkycVerification
                cf_verification_id: '8901234567890123458'
                user_id: USER827364
                status: RECEIVED
                status_code: LINK_GENERATED
                link: https://vkyc.cashfree.com/session/abc123
                link_expiry: '2026-06-03'
                notification_modes:
                  - SMS
                  - WHATSAPP
                meeting_schedule: null
                auditor_remarks: null
                agent_remarks: null
    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
    VkycRequest:
      type: object
      required:
        - user_id
        - verification_id
        - notification_modes
      properties:
        user_id:
          type: string
          description: >-
            Unique identifier for the user, as provided by you during PPI user
            creation. Only alphanumeric characters, periods (.), hyphens (-),
            and underscores (_) are allowed.
          example: USER827364
          minLength: 1
          maxLength: 50
        verification_id:
          type: string
          description: >-
            Unique identifier that you create to identify the VKYC verification
            request in your system. Only alphanumeric characters, periods (.),
            hyphens (-), and underscores (_) are allowed.
          example: TestVkycVerification
          minLength: 1
          maxLength: 50
        notification_modes:
          type: array
          description: Notification channels on which VKYC link is sent.
          minItems: 1
          uniqueItems: true
          items:
            type: string
            enum:
              - SMS
              - WHATSAPP
          example:
            - SMS
            - WHATSAPP
    VkycResponse:
      type: object
      properties:
        verification_id:
          type: string
          description: >-
            Unique identifier for the VKYC verification request, as provided by
            you during the request.
          example: TestVkycVerification
        cf_verification_id:
          type: string
          description: >-
            Unique identifier for the VKYC verification request, generated by
            Cashfree.
          example: '8901234567890123458'
        user_id:
          type: string
          description: >-
            Unique identifier for the user, as provided by you during PPI user
            creation.
          example: USER827364
        status:
          type: string
          description: >
            Status of the VKYC verification process. Refer to [VKYC status and
            status-code
            mapping](/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions#status-statuscode-mapping)
            for all valid combinations.
          enum:
            - RECEIVED
            - FAILED
            - EXPIRED
            - AGENT_REVIEWED
            - PRE_VIDEO_CALL
            - VIDEO_CALL
            - AUDITOR_REVIEWED
          example: RECEIVED
        status_code:
          type: string
          description: >
            Status code for detailed tracking of the VKYC verification process.
            Refer to [VKYC status and status-code
            mapping](/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions#status-statuscode-mapping)
            for all valid combinations.
          enum:
            - LINK_GENERATED
            - VKYC_EXPIRED
            - AADHAAR_VERIFICATION_SUCCESS
            - AADHAAR_VERIFICATION_FAILED
            - AADHAAR_VERIFICATION_EXPIRED
            - USER_IP_VERIFICATION_SUCCESSFUL
            - USER_PROXY_DETECTED
            - TECHNICAL_FAILURE
            - USER_LOCATION_VERIFICATION_SUCCESS
            - USER_LOCATION_OUTSIDE_INDIA
            - USER_AUDIO_CHECK_FAILED
            - USER_VIDEO_CHECK_FAILED
            - USER_LOCATION_PERMISSION_DISABLED
            - USER_DEVICE_CHECK_SUCCESS
            - USER_QUEUED
            - SCHEDULED_USER_QUEUED
            - NO_AGENT_FOUND
            - AGENT_ASSIGNED_TO_USER
            - USER_MEETING_SCHEDULED
            - USER_MEETING_CANCELLED
            - USER_ACCEPTED_MEETING
            - USER_REJECTED_MEETING
            - USER_MISSED_MEETING
            - USER_DROPPED_OFF
            - AGENT_DROPPED_OFF
            - USER_ENDED_CALL
            - AGENT_ENDED_CALL
            - TECHNICAL_ERROR
            - AGENT_APPROVED
            - AGENT_REJECTED
            - AGENT_UNABLE_TO_VALIDATE
            - AUDITOR_APPROVED
            - AUDITOR_REJECTED
            - INITIATE_FAILED
          example: LINK_GENERATED
        link:
          type: string
          description: Generated VKYC session link for the user.
          example: https://vkyc.cashfree.com/session/abc123
        link_expiry:
          type: string
          description: The date on which the vKYC link will expire.
          example: '2026-06-03'
        notification_modes:
          type: array
          description: >-
            Notification channels used for sharing VKYC link, passed in the
            request.
          items:
            type: string
            enum:
              - SMS
              - WHATSAPP
        meeting_schedule:
          type: string
          nullable: true
          description: >-
            Scheduled UTC timestamp for the VKYC meeting. Returns `null` if no
            meeting is scheduled.
          example: '2026-06-04T10:15:30Z'
        auditor_remarks:
          type: string
          nullable: true
          description: >-
            Remarks provided by the auditor during the Video KYC process.
            Returns null if not yet reviewed.
          example: Verification completed successfully
        agent_remarks:
          type: string
          nullable: true
          description: >-
            Remarks provided by the agent during the Video KYC process. Returns
            null if the call is not completed.
          example: Pan not available during video call
  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).

````