---
title: "Get chat history"
method: GET
path: "/api/chat/history"
tags: ["Chat"]
---

# Get chat history

`GET /api/chat/history`

## Request

- Base URL: `https://app.cotool.ai`
- URL: `https://app.cotool.ai/api/chat/history`
- Auth: HTTP bearer

Retrieve all events and chat metadata for the specified chat conversation. If the chat has a structured output schema, the generated structured output is returned in `chat.result`.

## Query parameters

- `chatId` string, uuid, required: Unique identifier of the chat to retrieve history for
- `limit` number: Optional page size for paginated history fetch (1-100)
- `beforeCursor` string: Cursor for loading older events

## Response `200`

Successful response

- object: Chat history response containing events and chat metadata
  - `events` ChatEvent[], required: Array of chat event objects
    - union: A chat event that can be one of many types: chat messages, tool usage, status updates, artifacts, etc. Each event has a discriminator field "type" that determines its structure.
      - object
        - `id` string, required: Unique event identifier
        - `type` 'chat', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `sender` 'user' | 'assistant', required: Who sent the message
        - `messageType` 'text' | 'image' | 'file' | 'tool_result' | 'tool_call', required: Type of message content
        - `content` string: Message content
        - `attachments` object[]: Optional message attachments
          - `fileId` string, required: Unique file identifier
          - `fileName` string: Original file name
          - `size` number: File size in bytes
          - `objectPath` string: Storage path for retrieval
          - `fileType` 'image' | 'pdf' | 'spreadsheet' | 'document' | 'presentation' | 'file': Semantic file type
          - `previewText` string: Optional preview text for text files
        - `agentInputVersion` integer: Version of structured agent input metadata
        - `agentInputSourceType` string: Source type for structured agent input (e.g. jira_webhook, cron_trigger)
        - `agentInputSchemaType` string: Human-readable schema classification for structured agent input
        - `agentInputHeadline` string: Primary summary line for structured agent input
        - `agentInputContext` string: Secondary context summary for structured agent input
        - `agentInputSeverity` string: Severity level for structured agent input, when available
        - `agentInputLinkLabel` string: Label for an external deep-link associated with structured agent input
        - `agentInputLinkUrl` string: URL for an external deep-link associated with structured agent input
        - `agentInputPayload` union: A JSON value (string, number, boolean, null, array, or object)
          - string
          - number
          - boolean
          - JsonValue[]
          - object
        - `modelAlias` unknown, required
        - `toolCalls` object[]: Tool calls made in this message
          - `type` 'tool-call', required
          - `toolCallId` string, required: Unique tool call identifier
          - `toolName` string, required: Name of the tool being called
          - `input` unknown
        - `providerToolSearch` object[]: Provider-executed tool searches in this message, replayed only to the same provider
          - `provider` 'openai' | 'anthropic', required
          - `toolCallId` string, required
          - `toolName` string, required
          - `input` union, required: A JSON value (string, number, boolean, null, array, or object)
            - string
            - number
            - boolean
            - JsonValue[]
            - object
          - `output` union, required: A JSON value (string, number, boolean, null, array, or object)
            - string
            - number
            - boolean
            - JsonValue[]
            - object
          - `callProviderMetadata` object
          - `resultProviderMetadata` object
      - object
        - `id` string, required: Unique event identifier
        - `type` 'liveStatus', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `text` string, required: Status text (e.g., "Thinking", "Planning")
      - object
        - `id` string, required: Unique event identifier
        - `type` 'toolUsed', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `toolUseId` string, required: Unique tool use identifier
        - `parentToolUseId` string: Parent tool use identifier when this tool was invoked by another tool
        - `codeModeBlockId` string: Code Mode JavaScript block or marimo cell that invoked this tool
        - `toolName` string, required: Name of the tool used
        - `toolDisplayName` string, required: Display name of the tool
        - `briefActionDescription` string, required: Brief description of the action
        - `visibleActionInput` string: Visible input to the tool
        - `status` 'inProgress' | 'success' | 'error', required: Tool execution status
        - `noRender` boolean: Whether this tool event should stay out of the chat timeline
        - `outputDisplay` 'peek' | 'collapsed' | 'panel': How the output shows in the chat log: peek (always shown under the row), collapsed (behind the row) or panel (side panel only). Left out, the frontend derives it from the result type.
        - `input` unknown
        - `frontendOutput` unknown
        - `rawOutputUuid` string: UUID for raw output retrieval
        - `toolResultPart` unknown
        - `agentChatId` string: Chat ID where agent execution occurred (for agent tools)
        - `slackThread` object: Slack thread metadata for linking this tool call to a Slack thread
          - `teamId` string, required: Slack workspace/team ID
          - `channelId` string, required: Slack channel ID
          - `threadTs` string, required: Thread timestamp (parent message ts)
      - object
        - `id` string, required: Unique event identifier
        - `type` 'toolUseConfirmation', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `toolName` string, required: Name of the tool requiring confirmation
        - `toolDescription` string, required: Description of the tool
        - `uuid` string, required: Confirmation UUID
        - `input` unknown
        - `toolDisplayName` string: Display name of the tool
        - `briefActionDescription` string: Brief description of the action
      - object
        - `id` string, required: Unique event identifier
        - `type` 'waitingForUserResponse', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `toolName` string, required: Name of the tool that is waiting
        - `toolCallId` string, required: The AI SDK tool call ID
        - `toolEventId` string, required: The tool event ID for updates
        - `toolUseId` string, required: The unique tool use ID
        - `message` string, required: The message/question being asked
        - `buttonLabels` string[], required: Labels for the response buttons
        - `slackChannelId` string: Slack channel ID if message was sent to Slack
        - `slackMessageTs` string: Slack message timestamp if message was sent to Slack
        - `promptStatus` 'pending' | 'resolved' | 'cancelled', required: Current status of the waiting prompt
        - `selectedLabel` string: The label that was selected (when resolved)
        - `answeredBy` 'slack' | 'ui' | 'timeout': How the prompt was resolved: a response from Slack or the UI, or `timeout` when it elapsed with no user response (mirrors the timed-wait event's resolvedBy discriminator).
        - `slackUserId` string: Slack user ID of responder if answered via Slack
      - object
        - `id` string, required: Unique event identifier
        - `type` 'timedWait', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `toolName` string, required: Name of the wait tool
        - `toolCallId` string, required: The AI SDK tool call ID
        - `toolEventId` string, required: The tool event ID for updates
        - `toolUseId` string, required: The unique tool use ID
        - `waitSeconds` integer, required: Requested wait duration in seconds
        - `resumeAtTimestamp` number, required: Unix timestamp in milliseconds when the wait should resume
        - `waitStatus` 'pending' | 'completed' | 'cancelled', required: Current status of the timed wait
        - `resolvedBy` 'timer' | 'user': How the wait finished
      - object
        - `id` string, required: Unique event identifier
        - `type` 'statusUpdate', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `agentStatus` 'planning' | 'warning' | 'executing' | 'error' | 'completed' | 'idle', required: Current agent status
        - `brief` string, required: Brief status summary
        - `description` string: Detailed status description
        - `planStepId` string: Associated plan step ID
        - `noRender` boolean: UI rendering hint
        - `slackThread` object: Slack thread metadata linking this chat to a Slack thread for re-entry lookup
          - `teamId` string, required: Slack workspace/team ID
          - `channelId` string, required: Slack channel ID
          - `threadTs` string, required: Thread timestamp (parent message ts)
        - `modelFallback` object: Set on model-fallback notices so clients can reflect the model actually serving the chat
          - `fromModelAlias` unknown, required
          - `toModelAlias` unknown, required
          - `sticky` boolean, required: Whether the chat stays on toModelAlias for its later turns (content-filter fallbacks) rather than only this turn
        - `metadata` object: Run identity, so clients can tell runs of one chat apart
          - `turnId` string: The chat turn whose run this status reports on
      - object
        - `id` string, required: Unique event identifier
        - `type` 'structuredOutputStatus', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `status` 'pending' | 'generating' | 'ready' | 'error', required: Current status of structured output generation
        - `error` string: Error information when generation fails
        - `output` object: The structured output result and schema when ready
          - `result` union: A JSON value (string, number, boolean, null, array, or object)
            - string
            - number
            - boolean
            - JsonValue[]
            - object
          - `schema` CotoolJsonSchema: A JSON Schema definition with Cotool-specific extensions for structured output presets
            - `type` 'string' | 'number' | 'boolean' | 'null' | 'object' | 'array', required
            - `title` string
            - `description` string
            - `properties` object
            - `items` CotoolJsonSchema (recursive)
            - `minItems` integer
            - `maxItems` integer
            - `required` string[]
            - `enum` string[]
            - `additionalProperties` boolean
            - `x-cotool` object
              - …
      - object
        - `id` string, required: Unique event identifier
        - `type` 'chatChunk', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `sender` 'assistant', required: Always assistant for streaming
        - `chunk` string, required: Text chunk delta
        - `position` number, required: Chunk position in overall content
        - `modelAlias` unknown
        - `isReasoning` boolean: Whether this is a reasoning chunk
      - object
        - `id` string, required: Unique event identifier
        - `type` 'reportChunk', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `position` number, required: Chunk position in report
        - `content` string, required: Report chunk content
      - object
        - `id` string, required: Unique event identifier
        - `type` 'reportComplete', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `content` string, required: Complete report content
      - object
        - `id` string, required: Unique event identifier
        - `type` 'reportError', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `content` string, required: Error message
      - object
        - `id` string, required: Unique event identifier
        - `type` 'artifact', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `artifactId` string, required: Unique artifact identifier
        - `artifactType` 'markdown-file' | 'file' | 'image' | 'pdf' | 'spreadsheet', required: Type of artifact
        - `title` string, required: Artifact title
        - `description` string: Artifact description
        - `docStoreKeyStr` string, required: Document store key for retrieval
        - `isReport` boolean: Whether this is a report artifact
        - `previewText` string: Content preview
        - `metadata` object: Additional metadata
        - `fileName` string: Original file name if this is a file-based artifact
        - `mimeType` string: MIME type for file-based artifacts
        - `size` number: File size in bytes for file-based artifacts
      - object
        - `id` string, required: Unique event identifier
        - `type` 'artifactUpdate', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `artifactId` string, required: Artifact being updated
        - `artifactType` 'markdown-file' | 'file' | 'image' | 'pdf' | 'spreadsheet', required: Type of artifact
        - `title` string, required: Updated artifact title
        - `description` string: Updated artifact description
        - `isReport` boolean: Whether this is a report artifact
        - `previewText` string: Updated content preview
        - `metadata` object: Updated metadata
        - `fileName` string: Original file name if this is a file-based artifact
        - `mimeType` string: MIME type for file-based artifacts
        - `size` number: File size in bytes for file-based artifacts
      - object
        - `id` string, required: Unique event identifier
        - `type` 'reasoningMessage', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `sender` 'assistant', required: Always assistant for reasoning
        - `content` string, required: Reasoning content
        - `modelAlias` unknown
        - `signature` string: Reasoning signature
        - `metadata` object: Provider state required to continue reasoning across model turns
          - `openai` object
            - `itemId` string: Responses API reasoning item ID
            - `reasoningEncryptedContent` string, nullable: Opaque encrypted Responses API reasoning state
          - `xai` object
            - `itemId` string: Responses API reasoning item ID
            - `reasoningEncryptedContent` string, nullable: Opaque encrypted Responses API reasoning state
      - object
        - `id` string, required: Unique event identifier
        - `type` 'compactionStarted', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `modelAlias` unknown
        - `trigger` 'automatic' | 'manual': Whether compaction was automatic or user-requested
        - `beforeMessages` integer: Model messages before compaction
      - object
        - `id` string, required: Unique event identifier
        - `type` 'compactionFinished', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `content` string, required: Hidden compacted context payload used to reconstruct future model history
        - `modelAlias` unknown
        - `trigger` 'automatic' | 'manual': Whether compaction was automatic or user-requested
        - `completedAt` number: Wall-clock completion time when timestamp is backdated for history replay
        - `metadata` union: Provider-native state required to resume from this compaction
          - object
            - `provider` 'anthropic', required
          - object
            - `provider` 'openai', required
            - `itemId` string, required: Opaque OpenAI compaction item identifier
            - `encryptedContent` string: Opaque encrypted OpenAI compaction state
        - `stats` object: Estimated context size before and after compaction
          - `beforeTokens` integer, required: Estimated conversation message tokens before compaction, excluding the system prompt and tool definitions
          - `afterTokens` integer, required: Estimated conversation message tokens after compaction, excluding the system prompt and tool definitions
          - `contextTokensAfter` integer: Estimated size of the next model request after compaction: system prompt, tool definitions, and compacted messages. Absent when the compacting caller does not know the next request.
          - `savedTokens` integer, required: Estimated tokens removed by compaction
          - `reductionPercentage` number, required: Estimated percentage reduction in context tokens
          - `beforeMessages` integer, required: Model messages before compaction
          - `afterMessages` integer, required: Model messages after compaction
        - `status` 'error': Marks a started compaction that did not produce reusable state
        - `description` string: User-facing explanation when compaction fails
      - object
        - `id` string, required: Unique event identifier
        - `type` 'tokenUsage', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `modelAlias` unknown, required
        - `inputTokens` number, required: Tokens used for prompt in this turn
        - `outputTokens` number, required: Tokens used for completion in this turn
        - `totalTokens` number, required: Total tokens used in this turn
        - `inputTokensCumulative` number, required: Cumulative prompt tokens
        - `outputTokensCumulative` number, required: Cumulative completion tokens
        - `totalTokensCumulative` number, required: Cumulative total tokens
        - `loop` number, required: Turn/loop number that produced this usage
      - object
        - `id` string, required: Unique event identifier
        - `type` 'tokenUsageV2', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `modelAlias` unknown, required
        - `totalTokens` number, required: The estimated context occupancy for the next model turn. This is not cumulative usage across the agent run.
        - `contextManagedInputTokens` number, required: The provider-reported input tokens for the current model turn, including cached input exactly once.
        - `contextManagedOutputTokens` number, required: The provider-reported output tokens generated by the current model turn.
        - `contextManagedTotalTokens` number, required: The provider-reported input plus output tokens for the current model turn. Unlike totalTokens, this includes the input a native compaction step consumed inside the same request.
        - `loop` number, required: Turn/loop number that produced this usage
      - object
        - `id` string, required: Unique event identifier
        - `type` 'parseError', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `content` string, required: Error content
        - `modelAlias` unknown, required
      - object
        - `id` string, required: Unique event identifier
        - `type` 'userFileUploaded', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `fileId` string: Unique file identifier
        - `fileName` string: Original file name
        - `mimeType` string: MIME type of the file
        - `size` number: File size in bytes
        - `fileType` 'image' | 'pdf' | 'spreadsheet' | 'document' | 'presentation' | 'file': Type of file
        - `objectPath` string: Storage path for file retrieval
        - `previewText` string: Content preview for text files
        - `metadata` object: Additional file metadata
      - object
        - `id` string, required: Unique event identifier
        - `type` 'persistentWorkspaceManifest', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `content` string, required: Rendered <persistent_workspace_manifest> block
      - object
        - `id` string, required: Unique event identifier
        - `type` 'chatTitleChanged', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `title` string, required: New chat title
        - `previousTitle` string: Previous title if available
      - object
        - `id` string, required: Unique event identifier
        - `type` 'runDelivery', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `brief` string, required: Human-readable summary, e.g. "Output delivery to Ops webhook"
        - `metadata` object, required: Delivery reference and destination snapshot
          - `deliveryId` string, uuid, required: deliveries row this event points at; live status is read from there
          - `purpose` 'response' | 'acceptance-criteria', required: Whether this is the turn output delivery or an acceptance-criteria notification
          - `destinationType` 'webhook' | 'teams' | 'slack' | 'pagerduty' | 'linear' | 'tines' | 'incidentio', required: Destination type snapshotted at enqueue time
          - `destinationName` string, required: Destination name snapshotted at enqueue time
      - object
        - `id` string, required: Unique event identifier
        - `type` 'codeDetectionInterpretationStale', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `reason` 'stale' | 'changed', required: Whether notebook edits made the current interpretation stale or a refreshed interpretation is now available
        - `revision` string, required: Notebook revision associated with the staleness or refreshed interpretation
        - `staleStepIds` string[], required: Interpretation steps whose cells changed for stale events; empty when the whole view is stale or the interpretation changed
        - `structural` boolean, required: Whether the update should render as a structural workflow change
      - object
        - `id` string, required: Unique event identifier
        - `type` 'codeDetectionCellExecutionProgress', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `cellHash` string, required: Content hash of the notebook cell that started executing
        - `runId` string: Identity of the run this progress belongs to; matches the runId of the corresponding codeDetectionRunStarted event. Optional only for events persisted before run identity existed.
      - object
        - `id` string, required: Unique event identifier
        - `type` 'codeDetectionRunStarted', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `runStartedAt` number, required: Epoch ms the run started; correlates progress and completion events
        - `runId` string: Identity shared by this run's start, progress, and completion events so overlapping runs cannot cross-contaminate. Optional only for events persisted before run identity existed.
      - object
        - `id` string, required: Unique event identifier
        - `type` 'codeDetectionRunCompleted', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `runStartedAt` number, required: Epoch ms the run started; matches the corresponding codeDetectionRunStarted event
        - `runId` string: Identity of the run that completed; matches the runId of the corresponding codeDetectionRunStarted event. Optional only for events persisted before run identity existed.
        - `execution` object, required: Run outcome in the same shape as a panel-initiated run response
          - `revision` string, required: Executed notebook revision
          - `returnCode` integer, required
          - `stdout` string, required
          - `stderr` string, required
          - `results` object[], nullable, required: Rows the notebook passed to emit_results(), or null when it never called it
          - `executionId` string, uuid, nullable: Persisted execution identity, or null when the editor run has no detection record
          - `executionTimeMs` integer, required
      - object
        - `id` string, required: Unique event identifier
        - `type` 'codeDetectionEditorUrlChanged', required
        - `timestamp` number, required: Event timestamp
        - `chatId` string, required: Chat ID this event belongs to
        - `editorUrl` string, required: Tunnel URL of the recreated notebook editor
  - `chat` Chat, required: A chat conversation between a user/agent and the AI system
    - `id` string, required: Unique chat identifier
    - `userId` string, nullable: User who owns this chat (null for agent or detection chats)
    - `agentId` string, nullable: Agent who owns this chat (null for user or detection chats)
    - `detectionId` string, nullable: Detection this chat belongs to (null for user or agent chats)
    - `parentChatId` string, nullable: Parent chat for nested sub-agent chats (null for top-level chats)
    - `organizationId` string, required: Organization this chat belongs to
    - `title` string, nullable, required: Chat title
    - `createdAt` string, date-time, required: When the chat was created
    - `updatedAt` string, date-time, required: When the chat was last updated
    - `experience` 'chat' | 'write-detection', required: The type of chat experience. Default is "chat".
    - `command` 'create-agent' | 'create-detection-agent' | 'create-response-agent' | 'create-skill' | 'hunt-intel' | 'hunt-intel-new' | 'merge-library-update' | 'tune-detection' | 'update-detection-agent' | 'update-response-agent' | 'update-skill' | 'null', nullable: Slash command that started this chat (e.g., create-response-agent). Null for regular chats.
    - `codeDetectionId` string, uuid, nullable: Code detection this chat is bound to, for Code Mode editor/tuning sessions. Null for regular chats.
    - `codeDetectionSessionMode` 'editor' | 'tuning' | 'null', nullable: How this chat relates to its bound code detection: freeform editing or feedback-driven tuning. Detection-bound chats open in the Code Mode layout.
    - `modelAlias` unknown, required
    - `contentFilterFallbackModelAlias` string, nullable: Active content-filter fallback model for this chat. Later turns use this model until the user explicitly selects a model. Chat history returns null when fallback policy or model availability prevents using the stored pin.
    - `triggerId` string, nullable: ID of the trigger that created this chat
    - `triggerName` string, nullable: Name of the trigger
    - `triggerSource` string, nullable: Source of the trigger (e.g., api, manual, jira, cron, slack)
    - `triggerDescription` string, nullable: Description of the trigger
    - `linearOrganizationId` string, nullable: Linear workspace bound to this chat for Agent Session re-entry
    - `linearIssueId` string, nullable: Linear issue used while reserving an API-created Agent Session
    - `linearAgentSessionId` string, nullable: Linear Agent Session bound to this chat for follow-up routing
    - `status` 'queued' | 'running' | 'waiting' | 'done' | 'error' | 'interrupted', required: Chat execution status: queued (created but not yet claimed), running (actively executing), waiting (awaiting user response), done (completed), error (failed), interrupted (stopped by user)
    - `statusMessage` string, nullable: Additional status context, typically error messages for error status or waiting prompt details
    - `result` union: A JSON value (string, number, boolean, null, array, or object)
      - string
      - number
      - boolean
      - JsonValue[]
      - object
    - `structuredOutputSchema` CotoolJsonSchema: A JSON Schema definition with Cotool-specific extensions for structured output presets
      - `type` 'string' | 'number' | 'boolean' | 'null' | 'object' | 'array', required
      - `title` string
      - `description` string
      - `properties` object
      - `items` CotoolJsonSchema (recursive)
      - `minItems` integer
      - `maxItems` integer
      - `required` string[]
      - `enum` string[]
      - `additionalProperties` boolean
      - `x-cotool` object
        - `presetId` 'classification' | 'markdown' | 'templatedReport' | 'toolCallEvidence'
        - `viewerId` string
    - `shareToken` string, uuid, nullable: Share token for this chat (null if not shared)
    - `isPinned` boolean: Whether the chat is pinned by its owner. Pinned chats appear in a dedicated section in the sidebar.
    - `evalScore` number, nullable: LLM judge evaluation score (0-100)
    - `evalExplanation` string, nullable: Explanation for the evaluation score
    - `evalBulletSummary` string[], nullable: Bullet point summary of the evaluation
    - `criticalIssue` object, nullable: Critical external blocker detected by LLM judge evaluation
      - `category` 'authentication' | 'connectivity' | 'missing_data' | 'permission' | 'configuration' | 'service_unavailable' | 'content_filter', required: Category of the critical issue (see: authentication, connectivity, missing_data, permission, configuration, service_unavailable)
      - `explanation` string, required: One sentence explaining what went wrong
    - `acceptanceCriteriaResults` object[], nullable: Per-criterion acceptance criteria evaluation results from the LLM judge
      - `criterion` string, required: The acceptance criterion being evaluated
      - `met` boolean, required: Whether the agent run satisfied this acceptance criterion
      - `explanation` string, required: Brief explanation of why the criterion was or was not met
  - `feedbackByEvent` object: Latest human thumb feedback keyed by chat event id
  - `nextCursor` string, nullable: Cursor for loading older events
  - `hasMore` boolean: Whether more older events are available

## Other responses

- `400`: Bad request — input validation failed or the request was malformed
- `401`: Unauthorized — missing or invalid API key / session
- `403`: Forbidden — the authenticated user lacks the required permissions
- `500`: Internal server error

---

[API](https://skmtc.dev/cotool/apis/cotool-api.md) - [All operations](https://skmtc.dev/cotool/apis/cotool-api/llms.txt) - [OpenAPI document](https://skmtc.dev/cotool/apis/cotool-api/revisions/f5abe0add203?raw)
