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

# Change a project's settings

> Changes only the settings you send. A key you omit keeps its stored value, so send the keys you mean to change and nothing else — this is a merge patch, not a replacement. Nested settings are sent nested (`{"greetingsSettings": {"staticGreeting": "Oi!"}}`), which changes that one greeting and leaves the rest of the section alone. Read getProjectSettings first: the keys it returns to you are the keys accepted here, and anything else — a field your role cannot write, or a key that is not a setting at all — is refused by name with nothing saved. Every accepted call is recorded in getProjectSettingsHistory with the value on each side of the change, which is what makes it reversible.



## OpenAPI

````yaml /api-reference/specs/claudia/v1.json patch /v1/projects/{project}/settings
openapi: 3.0.1
info:
  title: Claudia API
  version: 1.0.0
servers:
  - url: https://api.cloudhumans.com/claudia
    description: Production
  - url: https://api.cloudhumans.com/claudia/staging
    description: Staging
security:
  - bearerAuth: []
tags:
  - name: MCP Servers
    description: >-
      The MCP servers your agents can call tools on. Registering one here is
      what makes its tools selectable in an agent; the credentials it needs are
      stored encrypted and never read back.
  - name: Knowledge Base Content
    description: Read, search and edit the content that answers your customers.
  - name: Content Quality
    description: Rewrites proposed for content that is answering your customers badly.
  - name: Playground
    description: >-
      Talk to one of your agents as if you were a customer, without touching a
      real conversation.
  - name: Project Settings
    description: >-
      Read and change how a ClaudIA project behaves — the settings screens of
      the ClaudIA app, as an API.
  - name: Content Improvements
    description: Answers Claudia proposes for questions your content does not cover yet.
  - name: Knowledge Bases
    description: The knowledge bases your account can manage.
  - name: Content Sources
    description: The sites Claudia crawls to keep a knowledge base in sync.
paths:
  /v1/projects/{project}/settings:
    patch:
      tags:
        - Project Settings
      summary: Change a project's settings
      description: >-
        Changes only the settings you send. A key you omit keeps its stored
        value, so send the keys you mean to change and nothing else — this is a
        merge patch, not a replacement. Nested settings are sent nested
        (`{"greetingsSettings": {"staticGreeting": "Oi!"}}`), which changes that
        one greeting and leaves the rest of the section alone. Read
        getProjectSettings first: the keys it returns to you are the keys
        accepted here, and anything else — a field your role cannot write, or a
        key that is not a setting at all — is refused by name with nothing
        saved. Every accepted call is recorded in getProjectSettingsHistory with
        the value on each side of the change, which is what makes it reversible.
      operationId: updateProjectSettings
      parameters:
        - name: project
          in: path
          description: >-
            The ClaudIA project to act on, by name. Get the names from
            listMyClaudiaProjects — a project these credentials do not cover
            answers 404, indistinguishable from one that does not exist.
          required: true
          schema:
            type: string
        - name: accountId
          in: query
          description: >-
            The CloudChat account whose permissions decide what you may read and
            write here, e.g. `7`. It is permission context, not the resource:
            the project is named in the path. Only unique within an instance, so
            it is always read together with the `cloudchat-instance` header —
            get the pair from listMyCloudChatAccounts. An account your
            credentials hold no editing claim for answers 403.
          required: true
          schema:
            type: string
        - name: cloudchat-instance
          in: header
          description: >-
            The CloudChat instance the account lives in, e.g. `4`. Sent as a
            header, and required: with `accountId` it forms the pair that names
            exactly one account, which `accountId` alone does not.
            listMyCloudChatAccounts returns the value to send here alongside
            each accountId.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              additionalProperties:
                type: object
        required: true
      responses:
        '200':
          description: >-
            Saved. The settings are returned as they now stand, filtered the
            same way getProjectSettings filters them.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectSettings'
        '400':
          description: >-
            The patch would leave the project in an invalid state, or is not a
            settings object at all. Nothing was saved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectSettingsRejected'
        '401':
          description: Missing, expired or invalid credentials.
        '403':
          description: >-
            The credentials hold no claim for this account, or the patch named
            fields this role cannot write. Nothing was saved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectSettingsForbiddenFields'
        '404':
          description: >-
            No such resource, or none these credentials can reach — the two are
            deliberately indistinguishable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limit applied by the API gateway. Back off and retry.
        '503':
          description: >-
            CloudChat could not be reached to resolve what this role may write,
            so nothing was saved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    ProjectSettings:
      required:
        - name
      type: object
      properties:
        name:
          type: string
          description: >-
            The project these settings belong to. Always present, whatever your
            permissions.
          example: acme_support
        readOnlyPaths:
          type: array
          description: >-
            Dotted paths present in this response that you may read but not
            write. Sending one of them to updateProjectSettings is refused.
            Absent when there are none.
          example:
            - classificationSettings.enabled
          items:
            type: string
            description: >-
              Dotted paths present in this response that you may read but not
              write. Sending one of them to updateProjectSettings is refused.
              Absent when there are none.
            example: '["classificationSettings.enabled"]'
      description: >-
        How one ClaudIA project behaves — the same settings the ClaudIA app
        shows on its settings screens. The set of keys is NOT fixed: it is
        whatever your role is allowed to see on this account, resolved against
        CloudChat on every call, so two callers reading the same project can
        legitimately get different keys. Read this before patching: the keys
        present here, minus the ones listed in `readOnlyPaths`, are exactly the
        keys updateProjectSettings accepts from you. Nested settings arrive as
        nested objects, and a key is addressed in `readOnlyPaths`, in the
        history and in an error as its dotted path
        (`greetingsSettings.staticGreeting`).
    ProjectSettingsRejected:
      required:
        - error
        - violations
      type: object
      properties:
        error:
          type: string
          description: What went wrong.
          example: The settings were rejected by validation
        violations:
          type: array
          description: Every rule broken by this patch, so one call reports all of them.
          items:
            $ref: '#/components/schemas/ProjectSettingsViolation'
      description: >-
        The patch was well-formed and permitted, but the resulting settings
        would be invalid. Nothing was saved.
    ProjectSettingsForbiddenFields:
      required:
        - error
        - fields
      type: object
      properties:
        error:
          type: string
          description: What went wrong.
          example: 'Forbidden: these fields cannot be changed with these credentials'
        fields:
          type: array
          description: >-
            The dotted paths that were refused. A path is refused both when your
            role cannot write it and when it is not a settings field at all, so
            a misspelled key shows up here rather than being ignored. Read
            getProjectSettings to see what you may write.
          example:
            - greetingsSettings.staticGreeting
          items:
            type: string
            description: >-
              The dotted paths that were refused. A path is refused both when
              your role cannot write it and when it is not a settings field at
              all, so a misspelled key shows up here rather than being ignored.
              Read getProjectSettings to see what you may write.
            example: '["greetingsSettings.staticGreeting"]'
      description: >-
        The patch was refused because it named fields this role cannot write on
        this account.
    Error:
      required:
        - error
      type: object
      properties:
        error:
          type: string
          description: What went wrong.
          example: 'Forbidden: token holds no claim for the requested account'
      description: Something the caller needs to fix.
    ProjectSettingsViolation:
      required:
        - params
        - path
        - ruleId
      type: object
      properties:
        path:
          type: string
          description: The dotted path the rule applies to.
          example: splitLargeMessages.chunkSize
        ruleId:
          type: string
          description: Which rule was broken.
          example: value_out_of_range
        params:
          type: object
          additionalProperties:
            type: object
            description: The rule's bounds or expected values, when it has any.
            example:
              min: 1
              max: 4096
          description: The rule's bounds or expected values, when it has any.
          example:
            min: 1
            max: 4096
      description: One rule the patch broke.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````