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

# Update customer due diligence

> Update the customer due diligence process for a user.

export const RestEndpointSubjects = ({subjects = []}) => {
  const subjectToIconMap = {
    'client': 'browser',
    'user:individual': 'user',
    'user:business': 'briefcase'
  };
  if (subjects.length === 0) {
    return null;
  }
  return <>
      {subjects.map(subject => <a key={subject} href="/rest-apis/authentication#subjects" className="border-0 opacity-85 hover:opacity-100 transition-opacity">
          <Badge stroke size="lg" icon={subjectToIconMap[subject]} color="gray" className="mr-1">
            {subject}
          </Badge>
        </a>)}
    </>;
};

<RestEndpointSubjects subjects={["user:individual"]} />

**Update customer due diligence** is the endpoint used to submit the form that collects financial information and determines the user's risk level.

When calling [`GET /core/kyc?detailed=customerDueDiligence`](./get-overview), you will get a `hint` property which includes a [dynamic form](/developer-guides/resources/dynamic-forms/introduction) schema and UI schema.
The `hint` property will also be available in responses of this endpoint, in case there are still questions to be answered.

For more information about forms, refer to the [form-based processes](./introduction#form-based-processes) section.


## OpenAPI

````yaml _media/specs/core-openapi.mintlify.json patch /core/kyc/processes/customer-due-diligence
openapi: 3.1.0
info:
  version: 0.1.0
  title: Core API
  description: >-
    The Core API provides essential building blocks that empower businesses to
    embed financial services into their applications.
  contact:
    name: Uphold API Team
    email: developers@uphold.com
    url: https://developer.uphold.com
servers:
  - url: https://api.enterprise.sandbox.uphold.com
    description: Sandbox
  - url: https://api.enterprise.uphold.com
    description: Production
security:
  - OAuth2: []
tags:
  - name: Authentication
    description: Authentication.
  - name: Countries
    description: Countries.
  - name: Users
    description: Users.
  - name: KYC
    description: Individual User's KYC.
  - name: KYB
    description: Business User's KYB.
  - name: Capabilities
    description: User capabilities.
  - name: Terms of service
    description: User terms of service.
  - name: Files
    description: Files.
  - name: Assets
    description: Assets, networks and rails.
  - name: Accounts
    description: Accounts.
  - name: External accounts
    description: External accounts.
  - name: Transactions
    description: Transactions.
  - name: Portfolio
    description: Portfolio.
  - name: Statements
    description: Statements.
  - name: Metadata
    description: Metadata.
  - name: Webhooks
    description: Webhooks.
paths:
  /core/kyc/processes/customer-due-diligence:
    patch:
      tags:
        - KYC
      summary: Update customer due diligence
      description: Update the customer due diligence process for a user.
      operationId: core.update-kyc-customer-due-diligence
      parameters:
        - $ref: '#/components/parameters/accept-language'
      requestBody:
        $ref: >-
          #/components/requestBodies/update-kyc-customer-due-diligence-request-body
      responses:
        '200':
          $ref: '#/components/responses/update-kyc-customer-due-diligence-response'
        '404':
          $ref: >-
            #/components/responses/update-kyc-customer-due-diligence-not-found-response
        '409':
          $ref: >-
            #/components/responses/update-kyc-customer-due-diligence-conflict-response
      security:
        - OAuth2:
            - core.kyc.customer-due-diligence:update
components:
  parameters:
    accept-language:
      name: Accept-Language
      description: The natural language and locale that the client prefers.
      in: header
      schema:
        type: string
      examples:
        English (UK):
          value: en-GB
  requestBodies:
    update-kyc-customer-due-diligence-request-body:
      content:
        application/json:
          schema:
            type: object
            properties:
              input:
                $ref: '#/components/schemas/kyc-process-input-form-for-request'
              output:
                description: Output of the KYC process.
                type: object
                properties:
                  score:
                    type: string
                    enum:
                      - low
                      - medium
                      - high
                    description: The score of the verification.
                  expiresAt:
                    type: string
                    format: date-time
                    description: The date and time when the verification expires.
                  verifiedAt:
                    description: The date and time of the verification.
                    type: string
                    format: date-time
                required:
                  - score
                  - expiresAt
                  - verifiedAt
            required:
              - input
          examples:
            Update Process - Uphold-verified:
              value:
                input:
                  formId: ae80271a-a3f0-453b-8dc6-36b777817217
                  answers:
                    intent:
                      expected-activities:
                        - cryptocurrency_investing
                        - deposit_withdraw_crypto
            Update Process - Partner-verified:
              value:
                input:
                  answers:
                    financial-profile:
                      expected-activities:
                        - cryptocurrency_investing
                      source-of-funds: salary
                      annual-income-range: 40000-60000-GBP
                      savings-and-investments-range: 0-5000-GBP
                      employment-status: employed
                      employment-industry: Engineering
                      employment-occupation: Galactic Vibe Curator
                output:
                  score: low
                  expiresAt: '2026-01-01T00:00:00.000Z'
                  verifiedAt: '2023-01-01T00:00:00.000Z'
  responses:
    update-kyc-customer-due-diligence-response:
      description: KYC customer due diligence process updated.
      content:
        application/json:
          schema:
            type: object
            properties:
              customerDueDiligence:
                $ref: '#/components/schemas/kyc-customer-due-diligence'
            required:
              - customerDueDiligence
          examples:
            Process Updated - Uphold-verified:
              value:
                customerDueDiligence:
                  code: customer-due-diligence
                  status: pending
                  verification:
                    model: uphold-verified
                    method: manual
                    dependencies: []
                  input:
                    formId: ae80271a-a3f0-453b-8dc6-36b777817217
                    answers:
                      intent:
                        expected-activities:
                          - cryptocurrency_investing
                          - deposit_withdraw_crypto
                  hint:
                    type: form
                    formId: ae80271a-a3f0-453b-8dc6-36b777817217
                    schema:
                      type: object
                      properties:
                        intent:
                          type: object
                          title: How will you use Uphold?
                          description: >-
                            Please be careful with your selection to avoid
                            unnecessary account opening delays
                          unevaluatedProperties: false
                          properties:
                            expected-activities:
                              type: array
                              uniqueItems: true
                              minItems: 1
                              maxItems: 4
                              items:
                                type: string
                                oneOf:
                                  - const: cryptocurrency_investing
                                    title: Trade cryptocurrencies
                                  - const: foreign_exchange_trading
                                    title: Currency conversion
                                  - const: deposit_withdraw_crypto
                                    title: Deposit or withdraw cryptocurrencies
                                  - const: international_payments_transfers
                                    title: Transfers between users
                          required:
                            - expected-activities
                        financial-information:
                          type: object
                          title: Financial Information
                          unevaluatedProperties: false
                          properties:
                            source-of-funds:
                              title: Main source of income
                              type: string
                              oneOf:
                                - const: salary
                                  title: Salary
                                - const: profits_own_business
                                  title: Profits from owned business
                                - const: inheritance
                                  title: Inheritance
                                - const: other
                                  title: Other
                            annual-income-range:
                              title: Annual income
                              type: string
                              oneOf:
                                - const: 0-20000-GBP
                                  title: < £ 20,000
                                - const: 20000-30000-GBP
                                  title: £ 20,000 to £ 30,000
                                - const: 30000-40000-GBP
                                  title: £ 30,000 to £ 40,000
                                - const: 40000-60000-GBP
                                  title: £ 40,000 to £ 60,000
                                - const: 60000-80000-GBP
                                  title: £ 60,000 to £ 80,000
                                - const: 80000-130000-GBP
                                  title: £ 80,000 to £ 130,000
                                - const: 130000-210000-GBP
                                  title: £ 130,000 to £ 210,000
                                - const: 210000-7636308099580000-GBP
                                  title: £ 210,000 or more
                            expected-annual-deposits-range:
                              title: Expected annual deposits
                              type: string
                              oneOf:
                                - const: 0-5000-GBP
                                  title: < £ 5,000
                                - const: 5000-15000-GBP
                                  title: £ 5,000 to £ 15,000
                                - const: 15000-20000-GBP
                                  title: £ 15,000 to £ 20,000
                                - const: 20000-40000-GBP
                                  title: £ 20,000 to £ 40,000
                                - const: 40000-80000-GBP
                                  title: £ 40,000 to £ 80,000
                                - const: 80000-95000-GBP
                                  title: £ 80,000 to £ 95,000
                                - const: 95000-7636308099578000-GBP
                                  title: £ 95,000 or more
                          required:
                            - source-of-funds
                            - annual-income-range
                            - expected-annual-deposits-range
                          allOf:
                            - if:
                                properties:
                                  source-of-funds:
                                    const: other
                                required:
                                  - source-of-funds
                              then:
                                properties:
                                  other-source-of-funds:
                                    type: string
                                    title: Enter your other source of income
                                    pattern: ^\\S.*\\S$|^\\S$
                                    minLength: 1
                                    maxLength: 50
                                required:
                                  - other-source-of-funds
                    uiSchema:
                      type: Categorization
                      elements:
                        - type: Category
                          label: How will you use Uphold?
                          elements:
                            - type: Control
                              scope: >-
                                #/properties/intent/properties/expected-activities
                        - type: Category
                          label: Financial Information
                          elements:
                            - type: Control
                              scope: >-
                                #/properties/financial-information/properties/source-of-funds
                            - type: Control
                              scope: >-
                                #/properties/financial-information/properties/other-source-of-funds
                              rule:
                                effect: SHOW
                                condition:
                                  scope: >-
                                    #/properties/financial-information/properties/source-of-funds
                                  schema:
                                    const: other
                            - type: Control
                              scope: >-
                                #/properties/financial-information/properties/annual-income-range
                            - type: Control
                              scope: >-
                                #/properties/financial-information/properties/expected-annual-deposits-range
            Process Updated - Partner-verified:
              value:
                customerDueDiligence:
                  code: customer-due-diligence
                  status: ok
                  verification:
                    model: partner-verified
                    method: manual
                    dependencies: []
                  input:
                    formId: ae80271a-a3f0-453b-8dc6-36b777817217
                    answers:
                      financial-profile:
                        expected-activities:
                          - cryptocurrency_investing
                        source-of-funds: salary
                        annual-income-range: 40000-60000-GBP
                        savings-and-investments-range: 0-5000-GBP
                        employment-status: employed
                        employment-industry: Engineering
                        employment-occupation: Galactic Vibe Curator
                  output:
                    score: low
                    expiresAt: '2026-01-01T00:00:00.000Z'
                    verifiedAt: '2023-01-01T00:00:00.000Z'
      headers:
        x-uphold-request-id:
          description: >-
            A unique identifier for the request that can be shared with Uphold
            for troubleshooting purposes.
          required: true
          schema:
            type: string
            format: uuid
          examples:
            Request ID:
              value: 9092ee4d-f0fb-42e9-8787-b668dbcec531
    update-kyc-customer-due-diligence-not-found-response:
      description: Resource not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          examples:
            Form Not Found:
              value:
                code: entity_not_found
                message: The form cannot be found or has already been completed
                details:
                  entity: form
      headers:
        x-uphold-request-id:
          description: >-
            A unique identifier for the request that can be shared with Uphold
            for troubleshooting purposes.
          required: true
          schema:
            type: string
            format: uuid
          examples:
            Request ID:
              value: 9092ee4d-f0fb-42e9-8787-b668dbcec531
    update-kyc-customer-due-diligence-conflict-response:
      description: Business logic error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          examples:
            Form Already Completed:
              value:
                code: operation_not_allowed
                message: The form has already been completed
                details:
                  reasons:
                    - form-already-completed
            Invalid Locale:
              value:
                code: locale_invalid
                message: The locale is invalid
                details:
                  context: headers
                  property: accept-language
            Expiration Date Invalid:
              value:
                code: date_invalid
                message: The date must be in the future
                details:
                  rule: difference-less-than-threshold
                  threshold:
                    limit: 0
                    unit: milliseconds
                  context: body
                  property: output.expiresAt
            Verified Date Invalid:
              value:
                code: date_invalid
                message: The date must be in the past
                details:
                  rule: difference-greater-than-threshold
                  threshold:
                    limit: 0
                    unit: milliseconds
                  context: body
                  property: output.verifiedAt
      headers:
        x-uphold-request-id:
          description: >-
            A unique identifier for the request that can be shared with Uphold
            for troubleshooting purposes.
          required: true
          schema:
            type: string
            format: uuid
          examples:
            Request ID:
              value: 9092ee4d-f0fb-42e9-8787-b668dbcec531
  schemas:
    kyc-process-input-form-for-request:
      description: Input of the KYC process.
      type: object
      properties:
        formId:
          description: >
            The form identifier returned in the `formId` property of the KYC
            process hint. Include this value when you need to persist or resume
            the current form state over an extended period (for example, across
            user sessions or long-running saves).
          type: string
          format: uuid
        answers:
          description: >
            The `answers` property follows the [JSON
            Forms](https://jsonforms.io/) specification for data objects and has
            two key behaviors:

            1. **Partial or Complete Answers Submission**:
              - It accepts the answers to the questions of the current step (identified by UI Schema 'Category'). This allows the submission of the responses incrementally, either answering all questions in the current step or just a subset of them.

            2. **Form Reset by Answering Previous Questions**:
              - It also allows for a form reset by accepting one or more answers from a previous step (identified by UI Schema 'Category'). This enables the modification of previous answers, ensuring that the form is flexible and can handle dynamic user interactions.

            The KYC process starts its evaluation once the last question has
            been answered, ensuring that all necessary information has been
            provided before proceeding with the assessment.
          type: object
          additionalProperties: true
          minProperties: 1
          maxProperties: 1
      required:
        - answers
    kyc-customer-due-diligence:
      type: object
      properties:
        code:
          description: The code of the KYC process.
          type: string
        status:
          $ref: '#/components/schemas/kyc-process-status'
        verification:
          $ref: '#/components/schemas/kyc-process-verification'
        input:
          $ref: '#/components/schemas/kyc-process-input-form'
        output:
          description: Output of the KYC process.
          type: object
          properties:
            score:
              type: string
              enum:
                - low
                - medium
                - high
              description: The score of the verification.
            expiresAt:
              type: string
              format: date-time
              description: The date and time when the verification expires.
            verifiedAt:
              description: The date and time of the verification.
              type: string
              format: date-time
        hint:
          $ref: '#/components/schemas/kyc-process-hint-form'
      required:
        - code
        - status
    error:
      description: The error information.
      type: object
      properties:
        code:
          description: >-
            A short string with a brief explanation about the error code
            reported.
          type: string
        message:
          description: A human-readable message providing more details about the error.
          type: string
        details:
          description: Additional information about the error reported.
          type: object
          additionalProperties: true
      required:
        - code
        - message
    kyc-process-status:
      description: Status of the KYC process.
      type: string
      enum:
        - ok
        - failed
        - running
        - pending
        - exempt
    kyc-process-verification:
      description: Configuration of this process.
      type: object
      properties:
        model:
          description: The verification model to complete this process.
          type: string
          enum:
            - none
            - partner-verified
            - uphold-verified
        method:
          description: >-
            Whether this process is verified automatically in the background or
            requires user action.
          type: string
          enum:
            - automatic
            - manual
        triggers:
          description: >-
            Other processes that, once updated, trigger this process to run
            automatically. Only present when `method` is `automatic`.
          type: array
          items:
            type: string
            enum:
              - profile
              - identity
        dependencies:
          $ref: '#/components/schemas/kyc-process-dependencies'
      required:
        - model
        - method
        - dependencies
    kyc-process-input-form:
      description: Input of the KYC process.
      type: object
      properties:
        formId:
          description: The id of the form.
          type: string
        answers:
          description: The answers of the form.
          type: object
          additionalProperties: true
      required:
        - answers
    kyc-process-hint-form:
      description: Hints for the KYC process.
      type: object
      properties:
        type:
          description: The type of the hint.
          type: string
          enum:
            - form
        formId:
          description: The id of the form.
          type: string
          format: uuid
        schema:
          description: >-
            The definition of the structure and validation rules for this KYC
            process form.


            It follows the [JSON Schema](https://json-schema.org/) specification
            with the power of [JSON Forms](https://jsonforms.io/).


            The schema is iterative, meaning that new questions and properties
            can be added dynamically as the KYC process evolves. This allows for
            a flexible and adaptive form structure that can accommodate changes
            and new requirements over time.
          type: object
          additionalProperties: true
        uiSchema:
          description: >-
            The `uiSchema` property defines the general layout and presentation
            of the form by means of different UI schema elements.


            It follows the [JSON Forms](https://jsonforms.io/) specification and
            is used to customize the appearance and behavior of the form fields.


            The `uiSchema` includes the following elements:


            - `Layouts`: Used to structure the form layout. It includes
            properties like `type` to define the layout type (e.g.,
            `Categorization`) and `elements` to define the child elements.

            - `Controls`: Used to define the form controls. It includes
            properties like `scope` to point to the corresponding schema
            property and `label` to define the control's label.

            - `Rules`: Used to define conditional visibility rules for form
            controls. It includes properties like `effect` to define the rule
            effect (e.g., `SHOW`) and `condition` to define the rule condition.


            The `uiSchema` is iterative, meaning that new controls and layout
            elements can be added dynamically as the KYC process evolves. This
            allows for a flexible and dynamic form layout, enhancing the user
            experience by providing a structured and intuitive form design that
            can adapt to new requirements and changes over time.
          type: object
          additionalProperties: true
      required:
        - type
        - schema
        - uiSchema
    kyc-process-dependencies:
      description: The processes that must be updated before you can update this one.
      type: array
      items:
        type: string
        enum:
          - profile
          - address
          - email
          - phone
          - identity
          - proof-of-address
          - customer-due-diligence
          - enhanced-due-diligence
          - crypto-risk-assessment
          - self-categorization-statement
          - tax-details
  securitySchemes:
    OAuth2:
      type: oauth2
      description: OAuth 2.0 authentication.
      flows:
        clientCredentials:
          tokenUrl: /core/oauth2/token
          scopes:
            core.users:act-on-behalf-of: Grants access to act on behalf of a user
            core.users:create: Grants access to create users
            core.users:read: Grants access to view users
            core.users:delete: Grants access to delete users
            core.users.metadata:read: Grants access to view user metadata
            core.users.metadata:write: Grants access to modify user metadata
            core.kyc:read: Grants access to view KYC processes
            core.kyc.profile:update: Grants access to update profile KYC process
            core.kyc.address:update: Grants access to update address KYC process
            core.kyc.email:update: Grants access to update email KYC process
            core.kyc.phone:update: Grants access to update phone KYC process
            core.kyc.identity:update: Grants access to update identity KYC process
            core.kyc.proof-of-address:update: Grants access to update proof-of-address KYC process
            core.kyc.customer-due-diligence:update: Grants access to update customer due diligence KYC process
            core.kyc.enhanced-due-diligence:update: Grants access to update enhanced due diligence KYC process
            core.kyc.crypto-risk-assessment:update: Grants access to update crypto risk assessment KYC process
            core.kyc.self-categorization-statement:update: Grants access to update self-categorization statement KYC process
            core.kyc.tax-details:update: Grants access to update tax details KYC process
            core.capabilities:read: Grants access to view user capabilities
            core.terms-of-service:read: Grants access to view terms of service
            core.terms-of-service:accept: Grants access to accept terms of service
            core.files:create: Grants access to create files
            core.files:read: Grants access to view files
            core.files.metadata:read: Grants access to view files metadata
            core.files.metadata:write: Grants access to modify files metadata
            core.accounts:create: Grants access to create accounts
            core.accounts:read: Grants access to view accounts
            core.accounts:update: Grants access to update accounts
            core.accounts:archive: Grants access to archive accounts
            core.accounts:deposit-method: >-
              Grants access to deposit method needed for depositing into
              accounts
            core.accounts:use-test-helpers: Grants access to test helpers of accounts
            core.accounts.metadata:read: Grants access to view accounts metadata
            core.accounts.metadata:write: Grants access to modify accounts metadata
            core.assets:use-test-helpers: Grants access to test helpers of assets
            core.external-accounts:create: Grants access to create external accounts
            core.external-accounts:read: Grants access to view external accounts
            core.external-accounts:update: Grants access to update external accounts
            core.external-accounts:delete: Grants access to delete external accounts
            core.external-accounts.metadata:read: Grants access to view external accounts metadata
            core.external-accounts.metadata:write: Grants access to modify external accounts metadata
            core.transactions:create: Grants access to commit quotes
            core.transactions:read: Grants access to view transactions
            core.transactions.metadata:read: Grants access to view transactions metadata
            core.transactions.metadata:write: Grants access to modify transactions metadata
            core.transactions.requests-for-information:read: Grants access to view transactions requests for information
            core.transactions.requests-for-information:update: Grants access to update transactions requests for information
            core.portfolio:read: >-
              Grants access to view portfolio overview, performance, and
              historical balance
            core.statements:read: Grants access to read statements
            core.webhooks:management-link: Grants access to create webhook management links

````