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

# Add a conversation internal note

> Append one text-only internal note to a non-closed Conversation with trusted API system attribution. Notes are never sent to the customer; existing internal notifications still apply. Repeated identical requests can create multiple notes. API-key identifiers are omitted from the result. 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 post /api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/internal-notes
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}/internal-notes:
    post:
      tags:
        - Conversations
      summary: Add a conversation internal note
      description: >-
        Append one text-only internal note to a non-closed Conversation with
        trusted API system attribution. Notes are never sent to the customer;
        existing internal notifications still apply. Repeated identical requests
        can create multiple notes. API-key identifiers are omitted from the
        result. 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: addConversationInternalNote
      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/AddConversationInternalNoteRequest'
            example:
              body: Customer requested a billing review.
      responses:
        '201':
          description: Committed operation result; notification delivery is not implied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConversationInternalNoteResponse'
        '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:
    AddConversationInternalNoteRequest:
      type: object
      additionalProperties: false
      properties:
        body:
          type: string
          maxLength: 20000
          minLength: 1
          description: >-
            Non-blank internal note text. The complete JSON body must also fit
            within 32768 bytes.
      required:
        - body
    ConversationInternalNoteResponse:
      type: object
      additionalProperties: false
      properties:
        note:
          type: object
          additionalProperties: false
          properties:
            id:
              type: string
            createdAt:
              type: string
              format: date-time
            visibility:
              type: string
              const: internal
            author:
              type: object
              additionalProperties: false
              properties:
                type:
                  type: string
                  enum:
                    - agent
                    - system
                id:
                  type:
                    - string
                    - 'null'
                name:
                  type: string
                  maxLength: 256
              required:
                - type
                - id
                - name
          required:
            - id
            - createdAt
            - visibility
            - author
      required:
        - note
    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
  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.

````