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

# Start KYC verification

> Starts the KYC process for a member. For manual KYC, returns upload instructions.
For Sumsub KYC (if configured), returns `sdkConfig`.




## OpenAPI

````yaml api/openapi.yaml post /api/v1/members/{userId}/kyc/start
openapi: 3.1.0
info:
  title: MLM Platform API
  version: 1.0.0
  description: >
    The MLM Platform API enables tenant developers to integrate commission
    tracking,

    member management, and referral systems into their applications.


    ## Authentication

    All API requests require a tenant API key passed in the `x-tenant-api-key`
    header.


    ## Environments

    - **LIVE**: Production environment with real data

    - **SANDBOX**: Test environment for development and testing


    API keys are scoped to specific environments. Use sandbox keys for testing.


    The environment is derived from the API key used for the request.

    The platform returns the selected environment in the response header
    `X-Environment`.

    If you send an `X-Environment` request header, it is treated as
    optional/debug-only.
  contact:
    name: MLM Platform Support
    email: support@mlm-platform.example.com
  license:
    name: Proprietary
    url: https://mlm-platform.example.com/terms
servers:
  - url: https://app.mlm-platform.com
    description: Production API
  - url: http://localhost:3000
    description: Local Development
security:
  - TenantApiKey: []
tags:
  - name: Auth
    description: Token exchange, validation, refresh, and revocation for OIDC federation
  - name: Events
    description: Purchase and commission events
  - name: Users
    description: Member management
  - name: Leads
    description: Lead capture and tracking
  - name: Referrals
    description: Referral links and codes
  - name: Payout
    description: Payout methods metadata for dynamic payout setup forms
  - name: Payout Accounts
    description: Member payout accounts (create/list/update/delete)
  - name: KYC
    description: Member KYC start, status, and document submission
  - name: Admin KYC
    description: Admin KYC review queue, details, and actions
  - name: Widget
    description: Embeddable widget authentication
  - name: Webhooks
    description: Webhook receivers for third-party providers (Sumsub)
paths:
  /api/v1/members/{userId}/kyc/start:
    post:
      tags:
        - KYC
      summary: Start KYC verification
      description: >
        Starts the KYC process for a member. For manual KYC, returns upload
        instructions.

        For Sumsub KYC (if configured), returns `sdkConfig`.
      operationId: startMemberKyc
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: KYC started
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KycStartResponse'
          headers:
            X-Environment:
              $ref: '#/components/headers/X-Environment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    KycStartResponse:
      type: object
      description: >
        Response returned when starting KYC verification for a member. The
        response structure

        varies based on the configured KYC provider (manual or sumsub).


        **Manual KYC**: Returns `uploadUrl` and `requiredDocuments` for document
        upload workflow.

        **Sumsub KYC**: Returns `sdkConfig` for initializing the Sumsub SDK
        widget.
      required:
        - kycRecordId
        - provider
        - status
      properties:
        kycRecordId:
          type: string
          format: uuid
          description: >-
            Unique identifier for this KYC verification record. Use this ID when
            uploading documents or checking status.
          example: 3c90c3cc-0d44-4b50-8888-8dd25736052a
        provider:
          type: string
          description: |
            The KYC provider configured for this tenant.
            - `manual`: Document upload with admin review
            - `sumsub`: Automated verification via Sumsub SDK
          enum:
            - manual
            - sumsub
          example: manual
        status:
          type: string
          description: |
            Current status of the KYC verification process.
            - `not_started`: KYC record created but no documents submitted
            - `pending`: Documents submitted, awaiting review
            - `approved`: KYC verification approved
            - `rejected`: KYC verification rejected
            - `resubmit_required`: Additional documents or corrections needed
          enum:
            - not_started
            - pending
            - approved
            - rejected
            - resubmit_required
          example: not_started
        uploadUrl:
          type: string
          description: >
            Base URL for document uploads (manual KYC only). Use the
            `/kyc/documents/upload-url` 

            endpoint to get a signed upload URL for each document.
          example: https://api.mlm-platform.com/api/v1/members/{userId}/kyc/documents
        requiredDocuments:
          type: array
          description: >
            List of documents required to complete KYC verification (manual KYC
            only). 

            Each document specifies a type that must be uploaded. The member
            should upload 

            one document for each item in this array.
          items:
            $ref: '#/components/schemas/KycRequiredDocument'
          example:
            - documentType: government_id_front
              label: Government ID (Front)
              description: >-
                Front side of your government-issued ID (driver's license,
                national ID, or state ID)
              required: true
              acceptedFormats:
                - image/jpeg
                - image/png
                - application/pdf
            - documentType: government_id_back
              label: Government ID (Back)
              description: Back side of your government-issued ID
              required: true
              acceptedFormats:
                - image/jpeg
                - image/png
                - application/pdf
            - documentType: selfie
              label: Selfie with ID
              description: A clear photo of yourself holding your ID next to your face
              required: true
              acceptedFormats:
                - image/jpeg
                - image/png
            - documentType: proof_of_address
              label: Proof of Address
              description: >-
                Utility bill, bank statement, or official letter dated within
                the last 3 months
              required: false
              acceptedFormats:
                - image/jpeg
                - image/png
                - application/pdf
        sdkConfig:
          type: object
          description: >
            Configuration object for initializing the Sumsub SDK widget (Sumsub
            KYC only).

            Pass this object to the Sumsub Web SDK or Mobile SDK to launch the
            verification flow.
          properties:
            accessToken:
              type: string
              description: Short-lived access token for Sumsub SDK authentication
            expiresAt:
              type: string
              format: date-time
              description: Token expiration timestamp
            flowName:
              type: string
              description: Name of the Sumsub verification flow to use
            applicantId:
              type: string
              description: Sumsub applicant identifier
          example:
            accessToken: sbx:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
            expiresAt: '2024-01-15T12:30:00Z'
            flowName: basic-kyc-flow
            applicantId: 65a1b2c3d4e5f6g7h8i9j0
        message:
          type: string
          description: >-
            Human-readable message providing additional context or instructions
            for the KYC process.
          example: >-
            Please upload the required documents to complete your identity
            verification.
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable error message
        code:
          type: string
          description: Machine-readable error code
        details:
          type: object
          additionalProperties: true
          description: Additional error details
    KycRequiredDocument:
      type: object
      description: Specification for a document required during KYC verification.
      required:
        - documentType
        - label
        - required
      properties:
        documentType:
          type: string
          description: >
            Machine-readable document type identifier. Use this value when
            uploading documents.

            Common types include:

            - `government_id_front`: Front of government-issued ID

            - `government_id_back`: Back of government-issued ID

            - `passport`: Passport photo page

            - `selfie`: Photo of the member holding their ID

            - `proof_of_address`: Utility bill, bank statement, or official
            correspondence
          enum:
            - government_id_front
            - government_id_back
            - passport
            - selfie
            - proof_of_address
          example: government_id_front
        label:
          type: string
          description: Human-readable label for display in the UI.
          example: Government ID (Front)
        description:
          type: string
          description: >-
            Detailed instructions explaining what document to upload and any
            requirements.
          example: >-
            Front side of your government-issued ID (driver's license, national
            ID, or state ID)
        required:
          type: boolean
          description: Whether this document is mandatory for KYC approval.
          example: true
        acceptedFormats:
          type: array
          description: List of accepted MIME types for this document.
          items:
            type: string
          example:
            - image/jpeg
            - image/png
            - application/pdf
  headers:
    X-Environment:
      description: >-
        Indicates the environment (LIVE or SANDBOX) the request was processed in
        (derived from API key)
      schema:
        type: string
        enum:
          - LIVE
          - SANDBOX
  responses:
    Unauthorized:
      description: Unauthorized - Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missing_api_key:
              summary: Missing API key
              value:
                error: Authentication required
                code: UNAUTHORIZED
            invalid_api_key:
              summary: Invalid API key
              value:
                error: Invalid API key
                code: INVALID_API_KEY
    InternalError:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: An unexpected error occurred
            code: INTERNAL_ERROR
  securitySchemes:
    TenantApiKey:
      type: apiKey
      in: header
      name: x-tenant-api-key
      description: >
        Tenant API key for authentication. Keys are scoped to specific
        environments

        (LIVE or SANDBOX). Obtain keys from the admin dashboard.

````