Skip to content

REST API Reference

The Kombuse server exposes a REST API for programmatic access to tickets, comments, agents, projects, and all other platform resources. This reference covers every endpoint group, common conventions, authentication, and the real-time WebSocket and MCP interfaces.

The REST API is available at http://127.0.0.1:<port>/api/. The server binds exclusively to localhost and is not reachable from remote hosts.

Port resolution:

  • Standalone server: default port 3331
  • Desktop app (embedded): port is dynamically assigned and written to ~/.kombuse/server-port

Request and response bodies use JSON (Content-Type: application/json), except file upload endpoints which use multipart/form-data.

Response validation: All responses are validated against registered Zod schemas before being sent. If a route’s response schema is not registered, the server returns a 500 error.

ID types:

ResourceID Type
Projects, Agents, Profiles, SessionsUUID (string)
Tickets, Comments, Labels, Milestones, EventsInteger

Timestamps are ISO 8601 strings. The canonical unique reference for a ticket is the (project_id, ticket_number) pair — ticket.id should not be used as a stable identifier.

Kombuse does not use API keys or tokens. Security relies on three mechanisms:

  1. Localhost binding — The server only listens on 127.0.0.1, making it unreachable from external machines.

  2. Host header validation — Every request must include a Host header matching localhost, 127.0.0.1, or [::1]. This prevents DNS rebinding attacks where a page at a malicious domain resolves to 127.0.0.1.

  3. WebSocket origin validation — Only connections from app://., http://localhost:*, and http://127.0.0.1:* origins are accepted.

kombuse_session_id — This field found on comments and sessions is not an authentication token. It links an action to a specific agent session for audit and tracing purposes.

MCP write access can be restricted via Settings > Chat > MCP Security. The “Allow anonymous write access” toggle controls whether MCP-connected tools can perform write operations.

List endpoints accept limit and offset query parameters. Default limits vary by resource (typically 50, max 100).

Most list endpoints support resource-specific query parameters such as status, project_id, and author_id. The ticket list supports sort_by (created_at, updated_at, last_activity_at, priority) and sort_order (asc, desc).

The search query parameter on GET /api/tickets performs full-text search with stemming across titles, bodies, and comments (max 200 characters). Matching results include:

  • match_context — highlighted snippet showing where the match occurred
  • match_source — one of title, body, or comment
SituationStatusBody
Validation failure400{ "error": ZodIssue[] }
Business / not-found error400 / 404 / 422{ "error": string }
Claim conflict409{ "error": string, "ticket": Ticket }
Duplicate slug409{ "error": string }

Endpoints that accept file uploads use multipart/form-data. The file binary and any required metadata fields are sent as form parts.

GET /api/attachments/:id/download streams the file binary with appropriate Content-Type and Content-Disposition headers. This is the only streaming route and is excluded from response schema validation.

Tickets are the central unit of work in Kombuse. The canonical address for a ticket is (project_id, ticket_number).

Statuses: open (default), in_progress, blocked, closed

Priorities: 0 (lowest) through 4 (highest); null when unset

GET /api/tickets — List tickets.

Query parameterTypeDescription
project_idstringFilter by project
statusstringopen | in_progress | blocked | closed
priorityinteger04
author_idstringFilter by author profile
assignee_idstringFilter by assignee
claimed_by_idstringFilter by claimer
unclaimedbooleanShow only unclaimed tickets
expired_claimsbooleanShow tickets with expired claims
milestone_idintegerFilter by milestone
viewer_idstringAdds has_unread field to results
searchstringFull-text search (max 200 chars)
sort_bystringcreated_at | updated_at | last_activity_at | priority
sort_orderstringasc | desc
label_idsstringComma-separated label integers
limit / offsetintegerPagination

Response: array of TicketWithRelations (includes author profile, assignee profile, labels array).


GET /api/tickets/counts — Per-status counts. Requires project_id.

Response:

{ "open": 12, "in_progress": 3, "blocked": 1, "closed": 45 }

GET /api/projects/:projectId/tickets/by-number/:number — Get a single ticket by its project-scoped number.


POST /api/tickets — Create a ticket. Returns 201.

Body fieldTypeRequired
project_idstringYes
author_idstringYes
titlestringYes
bodystringNo
statusstringNo
priorityintegerNo
assignee_idstringNo
milestone_idintegerNo
label_idsinteger[]No
triggers_enabledbooleanNo
loop_protection_enabledbooleanNo
external_source / external_id / external_urlstringNo

PATCH /api/projects/:projectId/tickets/by-number/:number — Update a ticket. All fields optional. Supports updated_by_id for audit.

DELETE /api/projects/:projectId/tickets/by-number/:number — Delete a ticket. Returns 204.

POST .../claim — Claim a ticket. Body: { claimer_id, duration_minutes? }. Returns 409 if already claimed.

POST .../unclaim — Release a claim. Supports force unclaim.

POST .../claim/extend — Extend a claim. Body: { additional_minutes } (required).

POST .../view — Mark ticket as viewed. Body: { profile_id } (required).

GET .../timeline — Merged chronological timeline of comments and events.

Response:

{
"items": [
{ "type": "comment", "timestamp": "...", "data": { ... } },
{ "type": "event", "timestamp": "...", "data": { ... } }
],
"total": 42
}

Comments are attached to tickets and support threaded replies and rich mention parsing.

GET /api/projects/:projectId/tickets/by-number/:number/comments — List comments.

Query parameterDescription
author_idFilter by author
parent_idInteger for thread; null for top-level only
limit / offsetPagination

Response: array of CommentWithAuthor (includes author profile).


GET /api/comments/:id — Get a single comment.


POST /api/projects/:projectId/tickets/by-number/:number/comments — Create a comment. Returns 201.

Body fieldTypeRequired
author_idstringYes
bodystringYes
parent_idintegerNo (threaded reply)
kombuse_session_idstringNo (links to agent session)
external_source / external_idstringNo

Comment bodies support @[Display Name](profile-id) mentions and #number ticket references. These are automatically parsed into structured mention records.


PATCH /api/comments/:id — Update a comment body. Sets is_edited to true.

DELETE /api/comments/:id — Delete a comment. Returns 204.

GET /api/comments/:id/mentions — Get parsed mentions from a comment.

Response: array of Mention objects with:

  • mention_type: profile or ticket
  • mentioned_profile_id or mentioned_ticket_id

Projects group tickets, agents, and labels. Each project can optionally link to a local code repository.

GET /api/projects — List projects.

Query parameterDescription
owner_idFilter by owner profile
repo_sourcegithub | gitlab | bitbucket
searchName search
limit / offsetPagination

repo_source accepts github, gitlab, or bitbucket. Currently, only github is fully integrated. The gitlab and bitbucket values are accepted and stored as project metadata but have no active integration — they are reserved for future use.


GET /api/projects/:id — Get project by UUID or slug.


POST /api/projects — Create a project. Returns 201.

Body fieldTypeRequired
namestringYes
owner_idstringYes
idstring (UUID)No
slugstring (kebab-case)No
descriptionstringNo
local_pathstringNo
repo_sourcestringNo
repo_owner / repo_namestringNo

When local_path is set, the server automatically configures Codex project trust and MCP config for that path.


PATCH /api/projects/:id — Update a project. All fields optional.

DELETE /api/projects/:id — Delete a project. Returns 204.


POST /api/projects/:id/init — Initialize a project with setup files in its local_path. Returns 400 if the project has no local_path configured, or 404 if not found.

Body fieldTypeDescription
skipMcpJsonbooleanSkip writing .claude/mcp.json
skipAgentsMdbooleanSkip writing AGENTS.md
skipKombuseDirbooleanSkip creating .kombuse/ directory
skipGitignorebooleanSkip updating .gitignore

All body fields are optional; omitting them runs all setup steps.

Project fields: id (UUID), name, slug, description, owner_id, local_path, repo_source, repo_owner, repo_name, created_at, updated_at.

Labels categorize tickets. Labels with at least one enabled trigger are called smart labels.

GET /api/projects/:projectId/labels — List labels.

Query parameterDescription
searchName search
sortname | usage (includes usage_count)
usage_scopeopen — counts usage on open tickets only
is_enabledboolean

GET /api/labels/:id — Get a single label.


POST /api/projects/:projectId/labels — Create a label. Returns 201. Body: { name, color (hex #rrggbb), description }.

PATCH /api/labels/:id — Update. Fields: name, color, description, is_enabled.

DELETE /api/labels/:id — Delete. Returns 204.

GET .../tickets/by-number/:number/labels — List labels on a ticket.

POST .../tickets/by-number/:number/labels/:labelId — Add label to ticket. Body: { added_by_id? } (profile UUID for audit). Returns 201.

DELETE .../tickets/by-number/:number/labels/:labelId — Remove label. Body: { removed_by_id? }. Returns 204.

GET /api/labels/:labelId/triggers — Get agent triggers associated with a label.

GET /api/projects/:projectId/smart-label-ids — Returns IDs of labels that have at least one enabled trigger.

Label fields: id (integer), project_id, name, slug, color, description, plugin_id, is_enabled, created_at.

Agents are AI actors configured with a system prompt, permissions, and execution settings.

GET /api/agents — List agents. Each agent is enriched with a resolved_preset field containing type, autoApprovedTools, and autoApprovedBashCommands.

Query parameterDescription
is_enabledboolean
enabled_for_chatAgents with config.enabled_for_chat = true
project_idScope to project (also includes global agents)
limit / offsetPagination

GET /api/agents/:id — Get agent by UUID.

GET /api/agents/by-slug/:slug — Get agent by slug. Supports plugin_id query param to scope the lookup.


POST /api/agents — Create an agent. Returns 201. Returns 409 if slug already exists.

Body fieldTypeRequired
namestringYes
descriptionstringYes
system_promptstringYes
idstring (UUID)No
slugstring (kebab-case)No
permissionsPermission[]No
configAgentConfigNo
is_enabledbooleanNo
project_idstringNo

PATCH /api/agents/:id — Update. Fields: system_prompt, permissions, config, is_enabled.

POST /api/agents/:id/reset-to-plugin-defaults — Reset a plugin-managed agent to its plugin defaults. Returns 409 if no plugin defaults exist.

DELETE /api/agents/:id — Delete. Returns 204.

Permissions are a discriminated union:

Resource permission:

{
"type": "resource",
"resource": "ticket",
"actions": ["read", "create", "update", "delete"],
"scope": "invocation | project | global",
"filter": { ... }
}

Tool permission:

{
"type": "tool",
"tool": "Bash",
"scope": "invocation | project | global"
}
FieldTypeDescription
backend_typestringclaude-code | codex | mock
modelstringModel ID override
max_tokensintegerMax output tokens
temperaturenumberSampling temperature
enabled_for_chatbooleanAvailable in chat sessions
can_invoke_agentsbooleanAllowed to trigger other agents
max_chain_depthintegerMax invocation chain depth (1–100)
auto_approved_tools_overridestring[]Override auto-approved tools list
auto_approved_bash_commands_overridestring[]Override auto-approved commands
retry_on_failurebooleanRetry failed invocations
max_retriesintegerMaximum retry count
timeout_msintegerExecution timeout
anthropic.thinkingobjectExtended thinking config (Claude Code)
openai.response_formatobjectResponse format config (Codex)

GET /api/agents/:agentId/triggers — List triggers for an agent.

POST /api/agents/:agentId/triggers — Create a trigger.

Body fieldTypeRequired
event_typestringYes
slugstringNo
project_idstringNo
conditionsobjectNo
is_enabledbooleanNo
priorityintegerNo
allowed_invokersAllowedInvoker[]No

AllowedInvoker types: any, user, agent (with optional agent_id / agent_type), system.

GET /api/triggers/:id — Get a single trigger by its numeric ID. Returns 404 if not found.

PATCH /api/triggers/:id — Update a trigger.

DELETE /api/triggers/:id — Delete a trigger. Returns 204.

GET /api/invocations — List invocations.

Query parameterDescription
agent_idFilter by agent
trigger_idFilter by trigger
statuspending | running | completed | failed
session_idFilter by session
project_idFilter by project
limit / offsetPagination

GET /api/invocations/:id — Get a single invocation.

GET /api/agents/:agentId/invocations — List invocations for an agent.

POST /api/agents/process-event — Find matching triggers for an event and create invocations. Body: { event_id }.

POST /api/agents/export — Export agents as markdown files. Body: { directory, agent_ids? }.

Profiles represent users and agent actors. Agent profiles are created automatically alongside agents.

GET /api/profiles — List profiles.

Query parameterDescription
typeuser | agent
is_activeboolean
searchName search
has_agentboolean — only profiles with a linked agent
project_idScope
limit / offsetPagination

GET /api/profiles/:id — Get profile by UUID.


POST /api/profiles — Create a profile. Returns 201.

Body fieldTypeRequired
typestringYes (user | agent)
namestringYes
idstring (UUID)No
emailstringNo
descriptionstringNo
avatar_urlstringNo (URL or icon name)
external_source / external_idstringNo

PATCH /api/profiles/:id — Update. Fields: name, email, description, avatar_url, is_active.

DELETE /api/profiles/:id — Soft-delete (sets is_active to false). Returns 204.

Profile fields: id (UUID), type, name, slug, email, description, avatar_url, external_source, external_id, plugin_id, is_active, created_at, updated_at.

Sessions represent chat interactions between a user and an agent backend.

GET /api/sessions — List sessions. Response includes computed fields: effective_backend, model_preference, applied_model, ticket_number, agent_name, prompt_preview.

Query parameterDescription
ticket_idFilter by ticket
project_idFilter by project
agent_idFilter by agent
statuspending | running | completed | failed | aborted | stopped
terminal_reasonFilter by terminal reason
has_backend_session_idboolean
sort_bycreated_at | updated_at
limit / offsetPagination (max 100, default 50)

POST /api/sessions — Create a chat session. Returns 201.

Backend type is resolved in order: session body → agent config → user default → fallback claude-code. The agent must be enabled and have config.enabled_for_chat = true. A stable kombuse_session_id is auto-generated in the format chat-*.

Body fieldTypeRequired
backend_typestringNo
model_preferencestringNo
agent_idstringNo
project_idstringNo

GET /api/sessions/:id — Get session by kombuse_session_id.


GET /api/sessions/:id/events — Stream-poll session events.

Query parameterDescription
since_seqReturn events after this sequence number
event_typeFilter by event type
limitMax events to return (max 1000, default 100)

Response: { session_id, events, total }.


DELETE /api/sessions/:id — Delete session. Returns 204.

GET /api/sessions/diagnostics — Abort investigation statistics. Query: recent_limit (max 200, default 20).

Events are the audit log of all actions in Kombuse. Subscriptions enable efficient polling for new events.

GET /api/events — List events.

Query parameterDescription
event_typeFilter by type
project_idFilter by project
ticket_idFilter by ticket
actor_idFilter by actor
actor_typeuser | agent | system
sinceISO datetime — events after this time
limit / offsetPagination

Response: EventWithActor array (includes actor profile).


GET /api/projects/:projectId/tickets/by-number/:number/events — Ticket-scoped events.


POST /api/events — Create an event (internal/system use). Returns 201.

Body fieldTypeRequired
event_typestringYes
actor_typestringYes
payloadobjectYes
project_idstringNo
ticket_idintegerNo
comment_idintegerNo
actor_idstringNo

Event fields: id (integer), event_type, project_id, ticket_id, ticket_number, comment_id, actor_id, actor_type, kombuse_session_id, payload (JSON string), created_at.

Subscriptions provide efficient event polling without requiring WebSocket connections.

GET /api/subscriptions — List subscriptions. Requires subscriber_id query param.

POST /api/subscriptions — Create a subscription. Body: { subscriber_id, event_type, project_id? }.

GET /api/subscriptions/:id/events — Fetch unprocessed events for a subscription.

POST /api/subscriptions/:id/acknowledge — Mark events as processed. Body: { last_event_id }.

DELETE /api/subscriptions/:id — Remove a subscription.

Milestones group tickets into deliverable phases.

GET /api/projects/:projectId/milestones — List milestones. Query: status (open | closed).

Response: MilestoneWithStats array including open_count, closed_count, and total_count.


GET /api/milestones/:id — Get milestone with stats.


POST /api/projects/:projectId/milestones — Create a milestone. Returns 201.

Body fieldTypeRequired
titlestringYes
descriptionstringNo
due_datestring (ISO date)No

PATCH /api/milestones/:id — Update. Fields: title, description (nullable), due_date (nullable), status (open | closed).

DELETE /api/milestones/:id — Delete. Returns 204.

Attachments store files linked to tickets or comments.

All upload endpoints use multipart/form-data with two form parts: the file binary and uploaded_by_id (required profile UUID).

POST /api/projects/:projectId/tickets/by-number/:number/attachments — Upload a file to a ticket. Returns 201.

POST /api/comments/:commentId/attachments — Upload a file to a comment. Returns 201.

Both return an Attachment object:

{
"id": 42,
"comment_id": null,
"ticket_id": 7,
"filename": "screenshot.png",
"mime_type": "image/png",
"size_bytes": 204800,
"storage_path": "...",
"uploaded_by_id": "profile-uuid",
"created_at": "..."
}

Returns 400 on invalid MIME type or if file size is exceeded.

GET /api/attachments/:id — Get attachment metadata.

GET /api/attachments/:id/download — Stream file binary. Sets Content-Type and Content-Disposition headers. This is the only streaming endpoint.

GET .../tickets/by-number/:number/attachments — List ticket attachments. Query: uploaded_by_id, limit, offset.

GET /api/comments/:commentId/attachments — List comment attachments.

DELETE /api/attachments/:id — Delete an attachment. Returns 204.

Plugins package agents, labels, triggers, and file assets for reuse and distribution.

GET /api/plugins — List installed plugins. Query: project_id.

GET /api/plugins/available — List available (uninstalled) plugins. Requires project_id.

GET /api/plugins/:id — Get a plugin.


POST /api/plugins/install — Install from a local .tar.gz package. Returns 201.

Body: { package_path, project_id, overwrite? }.

Response includes: agents_created, agents_updated, labels_created, labels_merged, triggers_created, triggers_updated, files_imported, files_preserved, warnings. Returns 409 if already installed (without overwrite).


POST /api/plugins/install-remote — Install from a registry. Body: { name, project_id, version?, overwrite? }.

POST /api/plugins/:id/pull — Pull the latest version from the plugin’s remote source.

PATCH /api/plugins/:id — Enable or disable a plugin. Body: { is_enabled? }.


DELETE /api/plugins/:id — Uninstall a plugin. Returns 204.

Query: modeorphan (default, detaches agents/labels rather than deleting) or delete (removes associated resources).


POST /api/plugins/export — Export project agents as a plugin package.

Body: { package_name (kebab-case), project_id, agent_ids?, description?, overwrite?, archive_format? }.

Response includes the archive path and checksum.


POST /api/plugins/publish — Publish a plugin to a registry.

Body: { package_name, project_id, author, registry_url, token, agent_ids?, channel?, version?, description?, overwrite? }.

GET /api/plugins/:id/check-updates — Check for available updates.

GET /api/plugins/:pluginId/files — List files bundled with a plugin.

GET /api/plugins/:pluginId/files/:fileId — Get a single plugin file.

PATCH /api/plugins/:pluginId/files/:fileId — Update file content. Body: { content }.

Plugin sources control where Kombuse looks for installable plugins.

GET /api/plugin-sources — Get plugin sources for a project. Requires project_id query parameter.

Response includes three categories:

FieldDescription
global_sourcesSources from global Kombuse config
project_sourcesSources specific to this project
default_sourcesComputed defaults (project plugins dir, global plugins dir, Kombuse registry)

Each source entry: { type: "filesystem" | "github" | "http", path?, repo?, package_name?, base_url?, token? }.

PUT /api/plugin-sources — Update project-specific plugin sources. Body: { project_id, sources: PluginSource[] }. Returns the same three-category response. Returns 403 if the config file cannot be written due to filesystem permissions.

The server provides a WebSocket endpoint at /ws for live event subscriptions.

ws://127.0.0.1:<port>/ws

Only connections from localhost origins (app://., http://localhost:*, http://127.0.0.1:*) are accepted.

Subscribe to topics:

{ "type": "subscribe", "topics": ["ticket:123", "session:abc-def"] }

Unsubscribe:

{ "type": "unsubscribe", "topics": ["ticket:123"] }

Topic format: resource:id (e.g. ticket:123, session:abc-def).

Send a chat message to a running session:

{ "type": "chat", "session_id": "chat-xxx", "message": "Hello" }

Respond to an agent permission request:

{
"type": "permission.response",
"kombuseSessionId": "session-uuid",
"requestId": "request-uuid",
"behavior": "allow",
"updatedInput": {},
"message": "optional denial reason",
"alwaysAllow": false
}
FieldTypeRequiredDescription
type"permission.response"YesMessage type identifier
kombuseSessionIdstringYesThe session ID for the active agent session
requestIdstringYesThe request ID from the corresponding agent.permission_pending message
behavior"allow" | "deny"YesWhether to allow or deny the permission request
updatedInputobjectNoModified tool input before execution (only when behavior is allow)
messagestringNoReason for denial (only when behavior is deny)
alwaysAllowbooleanNoWhen true with allow, persists the tool to the agent’s auto-approved list

Stop a running session:

{ "type": "stop_session", "session_id": "chat-xxx" }

Subscription confirmation:

{ "type": "subscribed", "topics": ["ticket:123"] }

Event notification:

{ "type": "event", "topic": "ticket:123", "event": { ... } }

Error:

{ "type": "error", "message": "..." }

Kombuse exposes a Model Context Protocol (MCP) server at /mcp using the Streamable HTTP transport in stateless mode. This allows AI coding agents such as Claude Code and Codex to interact with Kombuse programmatically without writing REST API calls directly.

  • Ticket management — create, search, and update tickets and comments
  • Database access — list tables and run read-only SQL queries
  • API access — list available endpoints and call GET endpoints
  • Agent management — list, create, and update agents
  • Desktop window management — open, navigate, screenshot, and close windows (desktop app only)

MCP access is configured via Settings > Chat:

  • Enable MCP for Claude Code — writes an MCP server entry to ~/.claude/settings.local.json. Toggling this setting stops all active Claude Code backends.
  • Enable MCP for Codex — writes an MCP server entry to ~/.codex/config.toml. Toggling this setting stops all active Codex backends.
  • Allow anonymous write access — controls whether MCP-connected tools can perform write operations (see Authentication & Security).

The following REST endpoints control whether MCP is enabled for each backend:

GET /api/claude-code/mcp — Get current Claude Code MCP configuration status.

PUT /api/claude-code/mcp — Enable or disable Claude Code MCP. Body: { enabled: boolean }. Stops active Claude Code backend sessions when toggling. Returns the new status and { stopped_sessions: number }.

GET /api/codex/mcp — Get current Codex MCP configuration status.

PUT /api/codex/mcp — Enable or disable Codex MCP. Body: { enabled: boolean }. Stops active Codex backend sessions when toggling. Returns the new status and { stopped_sessions: number }.

GET /api/claude-code/projects — Scan ~/.claude/projects/ and return discovered Claude Code projects. Each entry includes path, isImported (whether already imported into Kombuse), and project metadata.

POST /api/claude-code/projects/import — Import Claude Code projects into the database. Body: { paths: string[] } (min 1 path). Uses basename(path) as project name. Returns 201 with an array of created projects; already-imported paths are skipped.

GET /api/claude-code/sessions — List Claude Code sessions for a project. Query param: path (required) — filesystem path to the Claude Code project directory. Returns { sessions: [...] }.

GET /api/claude-code/sessions/:sessionId — Get a single Claude Code session. Query param: path (required). Returns raw JSONL content, parsed agent events, and a validation report: { items, count, events, validation: { valid, invalid, byType, errors } }. Returns 404 if the session does not exist.

GET /api/projects/:projectId/permissions — Read-only log of agent permission decisions.

Query parameterDescription
tool_nameFilter by tool
behaviorallow | deny | auto_approved
limit / offsetPagination

GET /api/backend-status — Availability and version of each backend type (claude-code, codex, mock).

POST /api/backend-status/refresh — Re-check backend availability.

GET /api/models — Available models per backend, including default_model_id.

GET /api/profiles/:profileId/settings — List all settings for a profile.

GET /api/profiles/:profileId/settings/:key — Get a single setting by key.

PUT /api/profile-settings — Set a profile setting.

DELETE /api/profiles/:profileId/settings/:key — Delete a setting.

GET /api/database/tables — List all database tables.

POST /api/database/query — Execute a read-only SQL query.

GET /api/sync/state — Returns pending permissions, active sessions, and agent statuses.

Analytics endpoints under /api/analytics/:

EndpointDescription
GET /api/analytics/sessions-per-daySessions created per day
GET /api/analytics/duration-percentilesSession duration percentiles
GET /api/analytics/pipeline-stage-durationTime spent per pipeline stage
GET /api/analytics/most-frequent-readsMost-read files
GET /api/analytics/tool-calls-per-sessionTool call counts
GET /api/analytics/slowest-toolsSlowest tool executions
GET /api/analytics/tool-call-volumeTool call volume over time
GET /api/analytics/ticket-burndownTicket burndown chart data
GET /api/analytics/agent-runtime-per-ticketAgent runtime per ticket

Desktop Window Management (Desktop App Only)

Section titled “Desktop Window Management (Desktop App Only)”
EndpointDescription
GET /api/desktop/windowsList open windows
POST /api/desktop/windowsOpen a new window
POST /api/desktop/windows/:id/navigateNavigate a window to a path
POST /api/desktop/windows/:id/execute-jsExecute JavaScript in an isolated window
POST /api/desktop/windows/:id/wait-forWait for a CSS selector
POST /api/desktop/windows/:id/screenshotCapture a screenshot
DELETE /api/desktop/windows/:idClose a window

GET /api/updates/status / POST /api/updates/check / POST /api/updates/install — Check and install application auto-updates.

GET /api/shell-updates/status / POST /api/shell-updates/check / POST /api/shell-updates/install — Check and install shell (CLI) updates.

  • MCP Integration — connect external AI tools to Kombuse using MCP
  • Agents — create and configure AI-powered agents