> ## 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 self-categorization statement

> Update the self-categorization statement 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 self-categorization statement** is the endpoint used to submit the form that determines the user's investor profile, including risk level and investment preferences.

<Tip>This process is **exempt** for all users residing outside of Great Britain (GB).</Tip>

When calling [`GET /core/kyc?detailed=selfCategorizationStatement`](./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/self-categorization-statement
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/self-categorization-statement:
    patch:
      tags:
        - KYC
      summary: Update self-categorization statement
      description: Update the self-categorization statement process for a user.
      operationId: core.update-kyc-self-categorization-statement
      parameters:
        - $ref: '#/components/parameters/accept-language'
      requestBody:
        $ref: >-
          #/components/requestBodies/update-kyc-self-categorization-statement-request-body
      responses:
        '200':
          $ref: >-
            #/components/responses/update-kyc-self-categorization-statement-response
        '404':
          $ref: >-
            #/components/responses/update-kyc-self-categorization-statement-not-found-response
        '409':
          $ref: >-
            #/components/responses/update-kyc-self-categorization-statement-conflict-response
      security:
        - OAuth2:
            - core.kyc.self-categorization-statement: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-self-categorization-statement-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:
                  result:
                    description: The result of the verification.
                    type: string
                    enum:
                      - approved
                      - rejected
                  attempts:
                    description: The attempts state of the verification.
                    type: object
                    properties:
                      used:
                        description: The number of attempts used. Default is 1.
                        type: integer
                        minimum: 1
                      maximum:
                        description: The maximum number of attempts allowed. Default is 30.
                        type: integer
                        minimum: 1
                    default:
                      used: 1
                      maximum: 30
                    required:
                      - used
                      - maximum
                  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:
                  - result
                  - attempts
                  - expiresAt
                  - verifiedAt
            required:
              - input
          examples:
            Update Process - Uphold-verified:
              value:
                input:
                  formId: ac33651f-f2d3-47c4-8e8d-06fb87361f5c
                  answers:
                    investor:
                      type: restricted_investor
            Update Process - Partner-verified:
              value:
                input:
                  answers:
                    investor-category:
                      type: high_net_worth_investor
                      annual-income-above-100000: 'yes'
                      annual-income: 120000
                      net-assets-above-250000: 'yes'
                      net-assets: 255000
                output:
                  result: approved
                  attempts:
                    used: 1
                    maximum: 30
                  expiresAt: '2026-01-01T00:00:00.000Z'
                  verifiedAt: '2023-01-01T00:00:00.000Z'
  responses:
    update-kyc-self-categorization-statement-response:
      description: KYC self-categorization statement process updated.
      content:
        application/json:
          schema:
            type: object
            properties:
              selfCategorizationStatement:
                $ref: '#/components/schemas/kyc-self-categorization-statement'
            required:
              - selfCategorizationStatement
          examples:
            Process Updated - Uphold-verified:
              value:
                selfCategorizationStatement:
                  code: self-categorization-statement
                  status: pending
                  verification:
                    model: uphold-verified
                    method: manual
                    dependencies: []
                  input:
                    formId: ac33651f-f2d3-47c4-8e8d-06fb87361f5c
                    answers:
                      investor:
                        type: restricted_investor
                  hint:
                    type: form
                    formId: ac33651f-f2d3-47c4-8e8d-06fb87361f5c
                    schema:
                      type: object
                      properties:
                        investor:
                          type: object
                          title: Client Categorization
                          description: >-
                            The FCA divides investors into 2 types. Choose the
                            best fit for you.
                          minProperties: 1
                          unevaluatedProperties: false
                          required:
                            - type
                          properties:
                            type:
                              type: string
                              oneOf:
                                - const: restricted_investor
                                  title: Restricted Investor
                                - const: high_net_worth_investor
                                  title: High-Net-Worth Investor
                        investor-profile:
                          type: object
                          title: Restricted Investor
                          description: >-
                            Confirm whether you qualify as a Restricted
                            Investor.
                          minProperties: 1
                          unevaluatedProperties: false
                          properties:
                            invested-less-than-10-percent:
                              type: string
                              description: >-
                                Have you invested less than 10% of your net
                                assets in high-risk investments in the past 12
                                months?
                              oneOf:
                                - const: 'yes'
                                  title: >-
                                    Yes, I have invested less than 10% of my net
                                    assets
                                - const: 'no'
                                  title: >-
                                    No, I have invested more than 10% of my net
                                    assets
                            invested-percentage:
                              type: string
                              title: Percentage invested
                              description: >-
                                If yes, roughly what percentage of your net
                                assets have you invested in high-risk
                                investments?
                              pattern: ^(100|[1-9]?\d(\.\d{1,2})?)$
                            invest-less-than-10-percent:
                              type: string
                              description: >-
                                Do you intend to invest less than 10% of your
                                net assets in high-risk investments in the next
                                12 months?
                              oneOf:
                                - const: 'yes'
                                  title: >-
                                    Yes, I intend to invest less than 10% of my
                                    net assets
                                - const: 'no'
                                  title: >-
                                    No, I intend to invest more than 10% of my
                                    net assets
                            invest-percentage:
                              type: string
                              title: Percentage intended to invest
                              description: >-
                                If yes, roughly what percentage of your net
                                assets do you intend to invest in high-risk
                                investments?
                              pattern: ^(100|[1-9]?\d(\.\d{1,2})?)$
                            investor-type-confirmation:
                              type: boolean
                              const: true
                              title: >-
                                I accept that being a Restricted Investor will
                                expose me to promotions for investment where
                                there is a significant risk of losing all the
                                money I invest.
                          allOf:
                            - if:
                                properties:
                                  invested-less-than-10-percent:
                                    const: 'yes'
                                required:
                                  - invested-less-than-10-percent
                              then:
                                type: object
                                properties:
                                  invested-percentage: true
                                required:
                                  - invested-percentage
                              else:
                                type: object
                                properties:
                                  invested-percentage: false
                            - if:
                                properties:
                                  invest-less-than-10-percent:
                                    const: 'yes'
                                required:
                                  - invest-less-than-10-percent
                              then:
                                type: object
                                properties:
                                  invest-percentage: true
                                required:
                                  - invest-percentage
                              else:
                                type: object
                                properties:
                                  invest-percentage: false
                          required:
                            - invested-less-than-10-percent
                            - invest-less-than-10-percent
                            - investor-type-confirmation
                    uiSchema:
                      type: Categorization
                      elements:
                        - type: Category
                          label: Client Categorization
                          elements:
                            - type: Control
                              scope: '#/properties/investor/properties/type'
                        - type: Category
                          label: Restricted Investor
                          elements:
                            - type: Control
                              scope: >-
                                #/properties/investor-profile/properties/invested-less-than-10-percent
                            - type: Control
                              scope: >-
                                #/properties/investor-profile/properties/invested-percentage
                              rule:
                                effect: SHOW
                                condition:
                                  scope: >-
                                    #/properties/investor-profile/properties/invested-less-than-10-percent
                                  schema:
                                    const: 'yes'
                            - type: Control
                              scope: >-
                                #/properties/investor-profile/properties/invest-less-than-10-percent
                            - type: Control
                              scope: >-
                                #/properties/investor-profile/properties/invest-percentage
                              rule:
                                effect: SHOW
                                condition:
                                  scope: >-
                                    #/properties/investor-profile/properties/invest-less-than-10-percent
                                  schema:
                                    const: 'yes'
                            - type: Control
                              scope: >-
                                #/properties/investor-profile/properties/investor-type-confirmation
            Process Updated - Partner-verified:
              value:
                selfCategorizationStatement:
                  code: self-categorization-statement
                  status: ok
                  verification:
                    model: partner-verified
                    method: manual
                    dependencies: []
                  input:
                    formId: ac33651f-f2d3-47c4-8e8d-06fb87361f5c
                    answers:
                      investor-category:
                        type: high_net_worth_investor
                        annual-income-above-100000: 'yes'
                        annual-income: 120000
                        net-assets-above-250000: 'yes'
                        net-assets: 255000
                  output:
                    result: approved
                    attempts:
                      used: 1
                      maximum: 30
                    expiresAt: '2026-01-01T00:00:00.000Z'
                    verifiedAt: '2023-01-01T00:00:00.000Z'
            Process Rejected:
              value:
                selfCategorizationStatement:
                  code: self-categorization-statement
                  status: pending
                  verification:
                    model: uphold-verified
                    method: manual
                    dependencies: []
                  output:
                    result: rejected
                    attempts:
                      used: 1
                      maximum: 30
      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-self-categorization-statement-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-self-categorization-statement-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-self-categorization-statement:
      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:
            result:
              description: The result of the verification.
              type: string
              enum:
                - approved
                - rejected
            attempts:
              description: The attempts state of the verification.
              type: object
              properties:
                used:
                  description: The number of attempts used.
                  type: integer
                maximum:
                  description: The maximum number of attempts.
                  type: integer
              required:
                - used
                - maximum
            offboard:
              description: The offboarding state of the verification.
              type: object
              properties:
                completedAt:
                  description: The date and time when the offboarding was completed.
                  type: string
                  format: date-time
                endsAt:
                  description: The date and time when the offboard ends.
                  type: string
                  format: date-time
              required:
                - endsAt
            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:
            - result
        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

````