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

# Update a conversation

> Update status, priority, Pending On, or Pending Reason. Normal lifecycle and required custom-field rules apply. A Closed Conversation requires an explicit valid transition to Open, which may include other allowed metadata in the same update. Pending fields omitted while Pending are preserved; leaving Pending clears them. Requires a tenant API key with cxm:conversations.write or an existing broader write scope. The complete JSON body must not exceed 32768 bytes. Each invocation executes independently, with no request deduplication, version precondition, preparation step, or retry protection. A timeout may follow a successful commit. Merged and non-customer records are rejected.



## OpenAPI

````yaml /api-reference/openapi-v1.json patch /api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}
openapi: 3.1.0
info:
  title: Crescendo CXP API
  version: 1.0.0
  description: >-
    Use the Customer Experience Platform API from trusted server-side
    applications to create Conversations, read projected detail and stored
    history, update operational fields, assign work, and add internal notes.
    Writes execute independently; repeating a write may repeat its effects.
servers:
  - url: https://platform.crescendo.ai
    description: Production
security: []
tags:
  - name: Conversations
    description: Create, continue, and manage customer conversations.
paths:
  /api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}:
    patch:
      tags:
        - Conversations
      summary: Update a conversation
      description: >-
        Update status, priority, Pending On, or Pending Reason. Normal lifecycle
        and required custom-field rules apply. A Closed Conversation requires an
        explicit valid transition to Open, which may include other allowed
        metadata in the same update. Pending fields omitted while Pending are
        preserved; leaving Pending clears them. Requires a tenant API key with
        cxm:conversations.write or an existing broader write scope. The complete
        JSON body must not exceed 32768 bytes. Each invocation executes
        independently, with no request deduplication, version precondition,
        preparation step, or retry protection. A timeout may follow a successful
        commit. Merged and non-customer records are rejected.
      operationId: updateConversation
      parameters:
        - name: tenantId
          in: path
          required: true
          description: Exact tenant-authorized ID without path separators.
          schema:
            type: string
            maxLength: 128
            minLength: 1
          example: tenant_demo
        - name: conversationId
          in: path
          required: true
          description: Exact tenant-authorized ID without path separators.
          schema:
            type: string
            maxLength: 512
            minLength: 1
          example: CX123
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateConversationRequest'
            example:
              changes:
                status: pending
                pendingOn: customer
      responses:
        '200':
          description: Committed operation result; notification delivery is not implied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConversationOperationResponse'
        '400':
          description: >-
            Invalid fields, unknown properties, or a disallowed status
            transition.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: BadRequest
                message: >-
                  Invalid fields, unknown properties, or a disallowed status
                  transition.
        '401':
          description: The API key is missing, invalid, or expired.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: Unauthenticated
                message: The API key is missing, invalid, or expired.
        '403':
          description: The API key does not authorize this tenant or operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: PermissionDenied
                message: The API key does not authorize this tenant or operation.
        '404':
          description: >-
            The customer Conversation or active assignee is unavailable in this
            tenant.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: NotFound
                message: >-
                  The customer Conversation or active assignee is unavailable in
                  this tenant.
        '409':
          description: >-
            The Conversation is merged/Closed, a lock is held, or
            lifecycle/realtime ownership constraints reject the operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: Conflict
                message: >-
                  The Conversation is merged/Closed, a lock is held, or
                  lifecycle/realtime ownership constraints reject the operation.
        '413':
          description: The JSON body exceeds 32768 bytes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: PayloadTooLarge
                message: The JSON body exceeds 32768 bytes.
        '429':
          description: The request exceeds the API rate limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: RateLimitExceeded
                message: The request exceeds the API rate limit.
          headers:
            Retry-After:
              description: Seconds to wait before another request.
              schema:
                type: integer
                minimum: 1
        '502':
          description: The downstream request failed; the write may already have completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: BadGateway
                message: >-
                  The downstream request failed; the write may already have
                  completed.
        '503':
          description: >-
            A required service is unavailable; the write may already have
            completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: ServiceUnavailable
                message: >-
                  A required service is unavailable; the write may already have
                  completed.
        '504':
          description: The request timed out; the write may already have completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: GatewayTimeout
                message: The request timed out; the write may already have completed.
      security:
        - BearerApiKey: []
components:
  schemas:
    UpdateConversationRequest:
      type: object
      additionalProperties: false
      properties:
        changes:
          type: object
          additionalProperties: false
          properties:
            status:
              type: string
              enum:
                - open
                - pending
                - resolved
                - closed
            priority:
              type: string
              enum:
                - low
                - normal
                - high
                - urgent
            pendingOn:
              type:
                - string
                - 'null'
              maxLength: 255
              minLength: 1
              description: >-
                customer, an exact configured Pending On value, or null.
                Non-null values require Pending status.
            pendingReason:
              type:
                - string
                - 'null'
              maxLength: 2000
              minLength: 1
              description: >-
                Pending Reason text or null; non-null values require Pending
                status.
          required: []
          minProperties: 1
      required:
        - changes
    ConversationOperationResponse:
      type: object
      additionalProperties: false
      properties:
        conversation:
          type: object
          additionalProperties: false
          properties:
            id:
              type: string
              maxLength: 512
            status:
              type: string
              enum:
                - open
                - pending
                - resolved
                - closed
            priority:
              type:
                - string
                - 'null'
              enum:
                - low
                - normal
                - high
                - urgent
                - null
            pendingOn:
              type:
                - string
                - 'null'
            pendingReason:
              type:
                - string
                - 'null'
            assignee:
              anyOf:
                - $ref: '#/components/schemas/ConversationOperationAssignee'
                - type: 'null'
            teamId:
              type:
                - string
                - 'null'
          required:
            - id
            - status
            - priority
            - pendingOn
            - pendingReason
            - assignee
            - teamId
      required:
        - conversation
    Error:
      type: object
      additionalProperties: false
      required:
        - code
        - message
      properties:
        code:
          type: string
          enum:
            - BadRequest
            - InvalidCustomField
            - Unauthenticated
            - PermissionDenied
            - EmailChannelNotFound
            - AssigneeNotFound
            - NotFound
            - EmailChannelDisabled
            - ContactIdentityConflict
            - OrganizationAmbiguous
            - AssigneeAmbiguous
            - Conflict
            - PayloadTooLarge
            - RateLimitExceeded
            - BadGateway
            - ServiceUnavailable
            - GatewayTimeout
        message:
          type: string
    ConversationOperationAssignee:
      type: object
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
            - agent
            - team
        id:
          type: string
          maxLength: 255
          minLength: 1
          pattern: ^[^\s/\\%?#\p{Cc}]+$
      required:
        - type
        - id
  securitySchemes:
    BearerApiKey:
      type: http
      scheme: bearer
      description: >-
        Tenant API key with `cxm:conversations.write`, `cxm:conversations.*`,
        `cxm:write`, or `cxm:*` scope. Keep it in a trusted backend; do not
        expose it in browser code.

````