---
title: "Update conversation title"
method: PATCH
path: "/conversations/{conversationId}/title"
tags: ["Conversations"]
---

# Update conversation title

`PATCH /conversations/{conversationId}/title`

Update the title of a conversation.

**Overview:**

Conversation titles are auto-generated from the first query by default.
Use this endpoint to set a custom, more descriptive title.

**Title limits:**

- Minimum: 1 character
- Maximum: 200 characters

**Permissions:**

The conversation must exist, belong to the calling user's organization,
be owned by the caller (matched on `userId`), and not be soft-deleted.

## Path parameters

- `conversationId` string, objectId, required

## Request body

- object
  - `title` string, required — New conversation title

## Response `200`

Title updated successfully

- object
  - `conversation` object, required — The full conversation document after the title update, returned as stored in MongoDB.
    - `_id` string, objectId, required — Unique conversation identifier
    - `userId` string, objectId, required — ID of the user who owns this conversation
    - `orgId` string, objectId, required — Organization this conversation belongs to
    - `title` string — Conversation title. Present and equal to the value submitted in the request body after a successful update.
    - `initiator` string, objectId, required — User who started the conversation
    - `messages` object[], required — All messages stored on this conversation.
      - `_id` string, objectId, required
      - `messageType` 'user_query' | 'bot_response' | 'error' | 'feedback' | 'system', required
      - `content` string, required
      - `contentFormat` 'MARKDOWN' | 'JSON' | 'HTML', required
      - `confidence` string, nullable — AI confidence in the answer. Present only on `bot_response` messages, and only when the model emitted a trailing confidence block. This field is now optional and nullable; it was previously always present and non-nullable. Treat a missing or `null` value as "no confidence reported" and guard before using it. Change effective in SDK v1.3.0 (v1.2.0 and earlier always populated it).
      - `citations` CitationReference[], required — References to source documents used in the response, stored as raw citation pointers (not populated on this endpoint).
        - `citationId` string, objectId — ID of the citation record
        - `relevanceScore` number — How relevant this citation is to the query (0-1)
        - `excerpt` string — Relevant excerpt from the source document
        - `context` string — Additional context around the citation
      - `followUpQuestions` FollowUpQuestion[], required
        - `question` string — The suggested question text
        - `confidence` string — Confidence level for this suggestion
        - `reasoning` string — Why this question might be relevant
      - `feedback` MessageFeedback[], required
        - `isHelpful` boolean — Overall helpfulness rating
        - `ratings` object
          - `accuracy` integer — How accurate was the information (1-5)
          - `relevance` integer — How relevant was the response (1-5)
          - `completeness` integer — How complete was the answer (1-5)
          - `clarity` integer — How clear was the explanation (1-5)
        - `categories` string[] — Categories of issues or positive attributes identified
        - `comments` object
          - `positive` string — What was good about the response
          - `negative` string — What could be improved
          - `suggestions` string — Specific suggestions for improvement
        - `citationFeedback` object[] — Feedback on individual citations
          - `_id` string, objectId — Auto-generated sub-document identifier
          - `citationId` string, objectId
          - `isRelevant` boolean
          - `relevanceScore` integer
          - `comment` string
        - `followUpQuestionsHelpful` boolean — Were the suggested follow-up questions helpful
        - `unusedFollowUpQuestions` string[] — Follow-up questions that were suggested but not used by the user
        - `source` 'user' | 'system' | 'admin' | 'auto' — Origin of the feedback. Always present in responses (server applies the default `user`).
        - `feedbackProvider` string, objectId — User who submitted the feedback
        - `timestamp` integer — Time the feedback was created, stored as a Number (epoch milliseconds) with a server-side default of `Date.now`, so always present in responses. Not an ISO 8601 datetime.
        - `revisions` object[] — Audit trail of edits to this feedback entry
          - `_id` string, objectId — Auto-generated sub-document identifier
          - `updatedFields` string[] — Names of feedback fields modified in this revision
          - `previousValues` object — Map of previously-set values for the fields named in `updatedFields`, keyed by field name. Stored as a Mongoose Map of Mixed values.
          - `updatedBy` string, objectId
          - `updatedAt` integer — Time the revision was recorded, as epoch milliseconds.
        - `metrics` object — Optional telemetry captured alongside the feedback
          - `timeToFeedback` number — Time from response delivery to feedback submission
          - `userInteractionTime` number — Total time the user spent reviewing the response
          - `feedbackSessionId` string
          - `userAgent` string
          - `platform` string
      - `referenceData` object[], required — Reference IDs surfaced from tool responses, used for follow-up queries.
        - `name` string — Display name shown to the user.
        - `id` string — Technical identifier (numeric ID, UUID, etc.).
        - `type` string — Item type (e.g. `project`, `issue`, `file`, `notebook`, `page`).
        - `app` string — Source application (e.g. `jira`, `confluence`, `sharepoint`, `slack`, `drive`, `gmail`).
        - `webUrl` string — URL to open the item in a browser.
        - `metadata` object — App-specific fields keyed by name (e.g. `key` for a Jira project, `siteId` for a SharePoint document).
      - `modelInfo` ConversationModelInfo — AI model configuration recorded against a conversation or message.
        - `modelKey` string — Stable identifier of the configured model record
        - `modelName` string — Provider-facing model name (e.g. `gpt-4o-mini`)
        - `modelProvider` string — Provider key (e.g. `openai`, `anthropic`)
        - `modelFriendlyName` string — Human-readable display name
        - `chatMode` string — Chat mode used for this turn (e.g. `quick`, `internal_search`)
      - `appliedFilters` object
        - `apps` AppliedFilterNode[]
          - `id` string — Unique identifier of the filter node
          - `name` string — Display name of the filter node
          - `nodeType` string — Type of the node (e.g. app, recordGroup, folder, record)
          - `connector` string — Connector identifier associated with this node
        - `kb` AppliedFilterNode[]
          - `id` string — Unique identifier of the filter node
          - `name` string — Display name of the filter node
          - `nodeType` string — Type of the node (e.g. app, recordGroup, folder, record)
          - `connector` string — Connector identifier associated with this node
      - `attachments` ChatAttachmentRef[] — Files uploaded for this message turn (see `POST /conversations/attachments/upload`).
        - `recordId` string, required — Attachment record id returned from the upload endpoint.
        - `recordName` string — Original display name of the file when known.
        - `mimeType` string — MIME type of the uploaded file.
        - `extension` string — File extension (e.g. `pdf`).
        - `virtualRecordId` string — Optional synthetic record id used by the graph layer.
      - `metadata` object
        - `processingTimeMs` number
        - `modelVersion` string
        - `aiTransactionId` string
        - `reason` string
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
    - `status` 'None' | 'Inprogress' | 'Complete' | 'Failed' — Current status of the conversation: - `None` — no activity yet - `Inprogress` — AI is processing - `Complete` — response ready - `Failed` — error occurred
    - `failReason` string — Error description, populated only when `status` is `Failed`.
    - `modelInfo` ConversationModelInfo — AI model configuration recorded against a conversation or message.
      - `modelKey` string — Stable identifier of the configured model record
      - `modelName` string — Provider-facing model name (e.g. `gpt-4o-mini`)
      - `modelProvider` string — Provider key (e.g. `openai`, `anthropic`)
      - `modelFriendlyName` string — Human-readable display name
      - `chatMode` string — Chat mode used for this turn (e.g. `quick`, `internal_search`)
    - `isShared` boolean, required — Whether this conversation is shared with others
    - `shareLink` string — Shareable link if the conversation is shared
    - `sharedWith` object[], required — Users this conversation is shared with
      - `userId` string, objectId, required
      - `accessLevel` 'read' | 'write', required
    - `isArchived` boolean, required — Whether this conversation is archived
    - `archivedBy` string, objectId, nullable — User ID of the last user who archived this row, or `null` after unarchive cleared the archive state. Absent on rows that have never been archived.
    - `isDeleted` boolean, required — Whether this conversation has been soft-deleted.
    - `deletedBy` string, objectId — User who soft-deleted this conversation.
    - `conversationErrors` object[], required — Errors recorded against this conversation (e.g. failed message generations).
      - `_id` string, objectId, required — Sub-document identifier auto-assigned by MongoDB.
      - `message` string, required
      - `errorType` string
      - `timestamp` string, date-time, required — Time the error was recorded. Server-defaulted to `Date.now` when the entry is pushed, so always present.
      - `messageId` string, objectId
      - `stack` string
      - `metadata` object — Free-form metadata attached to this error entry (Map of Mixed in the schema).
    - `metadata` object — Free-form metadata attached to the conversation.
    - `lastActivityAt` integer, required — Unix timestamp of the last activity, stored as epoch milliseconds (server-side default `Date.now`).
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `__v` integer, required — Mongoose document version key.
  - `meta` object, required
    - `requestId` string, required — Server-side request identifier. Read from the `X-Request-ID` header when supplied, otherwise auto-generated, so this field is always present.
    - `timestamp` string, date-time, required
    - `duration` integer, required — Server-side processing time in milliseconds.

## Other responses

- `400` — Invalid request. Possible causes: - `title` missing, empty, or longer than 200 characters. - `conversationId` path parameter is not a valid ObjectId.
- `401` — Unauthorized
- `403` — Forbidden - token is missing the `conversation:write` scope
- `404` — Conversation not found, soft-deleted, or not owned by the caller.
- `500` — Persistence layer failed to update the conversation document.

---

[API](https://skmtc.net/pipeshub-ai/apis/pipeshub-api.md) · [All operations](https://skmtc.net/pipeshub-ai/apis/pipeshub-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/pipeshub-ai/pipeshub-api/versions/abd27cfefc73/schema)
