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

# Edit a proposal before approving it

> Adjust the proposed text on a proposal that is still waiting. This changes the proposal, not your content — nothing is published until you approve it.



## OpenAPI

````yaml /api-reference/specs/claudia/v1.json put /v1/knowledge-bases/{kbId}/improvements/quality/{id}
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/knowledge-bases/{kbId}/improvements/quality/{id}:
    put:
      tags:
        - Content Quality
      summary: Edit a proposal before approving it
      description: >-
        Adjust the proposed text on a proposal that is still waiting. This
        changes the proposal, not your content — nothing is published until you
        approve it.
      operationId: updateQualityProposal
      parameters:
        - name: kbId
          in: path
          description: Knowledge base to operate on. Get the ids from listMyKnowledgeBases.
          required: true
          schema:
            type: string
        - name: id
          in: path
          description: Proposal to edit, as returned by listQualityProposals.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QualityEdit'
        required: true
      responses:
        '200':
          description: The proposal as stored.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QualityProposal'
        '400':
          description: The request could not be answered as written.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, expired or invalid credentials.
        '403':
          description: The credentials hold no account allowed to manage this content.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '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.
components:
  schemas:
    QualityEdit:
      type: object
      properties:
        proposedTitle:
          type: string
          description: Replace the proposed question. Omit to leave it as proposed.
        proposedResponse:
          type: string
          description: >-
            Replace the proposed answer. Omit to leave it as proposed; it cannot
            be blanked out.
        proposedChildren:
          type: array
          description: >-
            Replace the split of a QUEBRAR proposal. Omit to leave it as
            proposed; it cannot be emptied.
          items:
            $ref: '#/components/schemas/QualityChildInput'
      description: New text for a proposal, before approving it.
    QualityProposal:
      required:
        - action
        - analyzedResponse
        - analyzedTitle
        - createdAt
        - diagnosis
        - duplicateCheck
        - entryId
        - estimatedTickets
        - impactScore
        - performance
        - priority
        - reviewState
      type: object
      properties:
        id:
          type: string
          description: Use this id to edit, approve or reject the proposal.
          example: 6683f1c2a4b19e0012ab34cd
        entryId:
          type: string
          description: The content this proposal rewrites. Read it with getEntry.
        action:
          type: string
          description: >-
            What the proposal does to the content: REESCREVER and MELHORAR
            replace the answer, CORRIGIR_CONFIG also fixes the question,
            CONSOLIDAR and QUEBRAR restructure it and cannot be applied by this
            API yet.
          enum:
            - REESCREVER
            - MELHORAR
            - CONSOLIDAR
            - QUEBRAR
            - CORRIGIR_CONFIG
        analyzedTitle:
          type: string
          description: The question as it read when the content was analysed.
        analyzedResponse:
          type: string
          description: >-
            The answer as it read when the content was analysed. Compare it with
            the proposal to see what changes.
        proposedTitle:
          type: string
          description: Proposed new question. Only CORRIGIR_CONFIG changes it.
        proposedResponse:
          type: string
          description: Proposed new answer — what approving will publish.
        proposedChildren:
          type: array
          description: For a QUEBRAR proposal, the entries the content would be split into.
          items:
            $ref: '#/components/schemas/QualityChild'
        diagnosis:
          $ref: '#/components/schemas/QualityDiagnosis'
        performance:
          $ref: '#/components/schemas/QualityPerformance'
        priority:
          type: string
          description: How urgent the fix is.
          example: P1
        recommendationSummary:
          type: string
          description: The change in one line.
        recommendationDetails:
          type: string
          description: The reasoning behind the change, at length.
        impactScore:
          type: number
          description: >-
            Conversations per period this content could stop losing if it
            answered well — the theoretical ceiling.
          format: double
          example: 42
        estimatedTickets:
          type: number
          description: >-
            The realistic share of that ceiling, after how often the content is
            actually reached.
          format: double
          example: 17.5
        duplicateCheck:
          $ref: '#/components/schemas/QualityDuplicateCheck'
        reviewState:
          type: string
          description: Where the proposal stands in the review.
          enum:
            - PENDING
            - APPROVED
            - REJECTED
        clientDecision:
          type: string
          description: The decision recorded when it was approved or rejected.
          enum:
            - APROVAR_SEM_ALTERACAO
            - APROVAR_COM_AJUSTES
            - REESCREVER_DO_ZERO
            - REJEITAR
        finalText:
          type: string
          description: >-
            The text actually published on approval — the proposal, or your edit
            of it.
        clientNote:
          type: string
          description: The note recorded with the decision.
        decidedBy:
          type: string
          description: Who decided, taken from their credentials.
        decidedAt:
          type: string
          description: When it was decided (ISO-8601).
          example: '2026-08-11T09:14:22'
        driftDetected:
          type: boolean
          description: >-
            True when the content changed after it was analysed, so the proposal
            was written against an older answer. False when the current answer
            still matches. Absent when the current answer could not be read, so
            drift is unknown — the proposal may be written against stale
            content. Review it before approving; it never blocks.
          example: false
        analysisPeriod:
          type: string
          description: The window the performance figures cover.
          example: 2026-03-09 → 2026-04-07
        createdAt:
          type: string
          description: When the proposal was raised (ISO-8601).
          example: '2026-08-10T14:32:05'
      description: A rewrite proposed for content that is answering badly.
    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.
    QualityChildInput:
      required:
        - response
        - title
      type: object
      properties:
        title:
          type: string
          description: The question this child answers.
        response:
          type: string
          description: The answer.
        label:
          type: string
          description: Tag to apply.
        topic:
          type: string
          description: Topic to group it under.
      description: One entry a QUEBRAR proposal should split the content into.
    QualityChild:
      required:
        - response
        - title
      type: object
      properties:
        title:
          type: string
          description: The question this child answers.
        response:
          type: string
          description: The answer.
        label:
          type: string
          description: Tag to apply.
        topic:
          type: string
          description: Topic to group it under.
      description: One entry a QUEBRAR proposal would split the content into.
    QualityDiagnosis:
      required:
        - actionability
        - clarity
        - composite
        - resolution
      type: object
      properties:
        resolution:
          $ref: '#/components/schemas/QualityScore'
        actionability:
          $ref: '#/components/schemas/QualityScore'
        clarity:
          $ref: '#/components/schemas/QualityScore'
        composite:
          type: number
          description: The three dimensions combined, 0 to 1.
          format: double
          example: 0.42
      description: Why the content is being flagged.
    QualityPerformance:
      type: object
      properties:
        timesUsed:
          type: integer
          description: How many times the content was used to answer.
          format: int32
          example: 312
        retentionRatePct:
          type: number
          description: >-
            Share of those conversations Claudia resolved without a human, as a
            percentage.
          format: double
          example: 61.4
        csatPct:
          type: number
          description: Customer satisfaction over those conversations, as a percentage.
          format: double
          example: 72
        csatResponses:
          type: integer
          description: How many satisfaction answers that percentage is based on.
          format: int32
          example: 38
        clarifiedPct:
          type: number
          description: >-
            Share of conversations where the customer had to ask again to be
            understood, as a percentage.
          format: double
          example: 12.5
      description: How the content performed over the analysed window.
    QualityDuplicateCheck:
      required:
        - similar
        - status
      type: object
      properties:
        status:
          type: string
          description: '`ok`, `warn` or `risk`.'
          example: ok
        note:
          type: string
          description: What the overlap is, when there is one.
        similar:
          type: array
          description: Existing content the rewrite may collide with.
          items:
            $ref: '#/components/schemas/SimilarEntry'
      description: Whether the rewrite risks overlapping existing content.
    QualityScore:
      required:
        - reason
        - score
      type: object
      properties:
        score:
          type: number
          description: Score from 0 (worst) to 1 (best).
          format: double
          example: 0.35
        reason:
          type: string
          description: Why it scored that.
      description: One scored dimension, with the reasoning behind the score.
    SimilarEntry:
      required:
        - entryId
      type: object
      properties:
        entryId:
          type: string
          description: Read it with getEntry.
        title:
          type: string
          description: The question it answers.
      description: Existing content that overlaps a proposal.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````