API Reference

Every feature in the Aura Workshop desktop app is also reachable over HTTP. The embedded web server exposes 258 REST + WebSocket endpoints plus a drop-in OpenAI/Anthropic-compatible gateway — an identical surface in both desktop and headless daemon deployments. This reference is verified route-by-route against Aura Workshop 1.36.2.

Base URL: http://localhost:18800
Content-Type: application/json for POST/PUT bodies
Auth: Authorization: Bearer <token> on guarded routes (or a JWT session cookie)
TLS: none built in — terminate HTTPS at a reverse proxy (a Caddyfile ships with the daemon image)

The surface

The axum web server binds port 18800 and composes its router from six sub-routers. Every bare path in the tables below (e.g. /settings, /tasks) is served under the /api nest — the real URL is /api/settings, /api/tasks. Paths shown with an explicit leading segment (/auth/*, /oauth/callback, /ws/*, /charts/*, /media/*, /v1/*, /acp/*, /.well-known/*, and the literal /api/health + /api/heartbeat/incoming) are already fully qualified.

Sub-routerCovers
public_api/api/health, /api/heartbeat/incoming, /auth/*, /oauth/callback
/api (nested)240+ application routes — everything grouped by domain below
ws_routes/ws/browser, /ws/sidepanel
chart_routes/charts/{file}, /media/{file}, /api/image-proxy
gateway_routes/v1/chat/completions, /v1/models, /v1/messages
acp_routes/.well-known/agent.yml, /acp/*

Totals: 247 application routes (routes.rs) + 11 ACP inbound routes (acp_routes.rs) = 258 REST + WebSocket endpoints. The gateway (/v1/*) and the two /ws/* sockets are counted within the 247. The desktop app additionally calls 365 Tauri commands in-process — see Tauri commands.

Authentication model

The middleware runs on every request and sorts routes into four buckets:

  1. Always public (auth bypassed): /auth/*, /api/health, /api/heartbeat*, /ws/*, /api/image-proxy, /charts/*, /acp/ping, /.well-known/*, plus the public ACP manifest GETs /acp/agents and /acp/agents/*.
  2. Non-API static: any path not starting with /api/, /v1/, or /acp/ passes through (the SPA, /oauth/callback, /media/*). The login page renders client-side.
  3. Guarded: everything under /api/, /v1/, and /acp/* (except the public ACP GETs) requires a matching Authorization: Bearer token (constant-time compared) or a valid JWT session cookie.
  4. Strict remote mode: when AURA_REMOTE_DEPLOYMENT=true or AURA_VIEWER_MODE=true, guarded routes are rejected with 401 even if no token/password is configured. Only local Tauri-app usage (neither env var set) keeps the "allow all on localhost" fallback.

The bearer token is sourced from the AURA_WEB_TOKEN env var (preferred) or settings.web_server_token in the DB. Password auth via POST /auth/login issues a JWT cookie as an alternative.

MethodPathAuthDescription
POST/auth/loginpublicBody { password } → sets JWT cookie
POST/auth/logoutpublicClears the JWT cookie
GET/auth/configpublic{ password_required, methods }
GET/auth/checkauth{ ok: true } if the bearer/JWT is valid
# Authenticated request
curl -H "Authorization: Bearer $AURA_WEB_TOKEN" \
  http://localhost:18800/api/tasks

REST handlers return a JSON error body with an appropriate HTTP status (400 / 401 / 404 / 429 / 500). /api/health and /acp/ping report the versioned identity aura-workshop/1.36.2.

Tasks

Agent tasks — the durable unit of work. For simple tool-less chat see Conversations.

MethodPathDescription
GET/tasksList. Query ?status, ?limit, ?offset
POST/tasksCreate. { title, description, project_path?, project_id?, model?, task_mode?, auto_run? }
GET/tasks/pagedCursor/offset-paged task list
GET/tasks/countTask count (optionally by status)
GET/tasks/searchFTS5 search over tasks_fts. Query ?q=
GET/tasks/interruptedTasks with checkpoints awaiting resume
GET/tasks/{id}Task details
DELETE/tasks/{id}Delete task + its messages
GET/tasks/{id}/messagesAll task_messages rows
POST/tasks/{id}/messagesAppend a follow-up + auto-resume the agent. { content }
POST/tasks/{id}/messages/archive/exportExport a task's message archive
POST/tasks/messages/archive/restoreRestore a message archive
GET/tasks/{id}/compactionsContext-compaction history
GET/tasks/{id}/workflow-inspectionInspect the task's workflow/team execution graph
GET/tasks/{id}/events/replayReplay agent events. Query ?from_seq, ?namespaces
POST/tasks/{id}/title{ title }
POST/tasks/{id}/model{ model }
GET/tasks/{id}/goal-stateStructured GoalState JSON
POST/tasks/{id}/goal-review/submitApprove + relaunch. { criteria, deliverables, max_iterations }
POST/tasks/{id}/goal-review/cancelCancel a pending goal review
GET/tasks/{id}/filesFiles created/uploaded under the task workspace
# Create a task
curl -X POST -H "Authorization: Bearer $AURA_WEB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Prime generator","description":"Write a Python script that prints primes","task_mode":"execute","auto_run":true}' \
  http://localhost:18800/api/tasks

Chat & agent (SSE)

These endpoints stream Content-Type: text/event-stream. Events include text, thinking, tool_start, tool_end, node_*, done, and error — see SSE event shapes.

MethodPathDescription
POST/chat/sendSimple chat stream (no tools). { conversation_id?, content, model?, system_prompt? }
POST/chat/enhancedChat with tool use enabled
POST/agent/runOne-shot agent run. { prompt, project_path?, model?, allowed_tools? }
POST/tasks/{id}/runResume a task and stream agent events
POST/tasks/{id}/resumeResume from an interrupted checkpoint
POST/inference/stopCancel a running task. { task_id }
POST/chat-dispatch-slashDispatch a slash command from the chat composer
GET/eventsGlobal SSE feed (all task + workflow events). Query ?task_id, ?namespaces
# Stream a one-shot agent run
curl -N -X POST -H "Authorization: Bearer $AURA_WEB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"What is the capital of France?"}' \
  http://localhost:18800/api/agent/run

# event: text
# data: {"content":"The capital of France is Paris."}
# event: done
# data: {"task_id":"task_abc123","status":"completed"}

Conversations & messages

Simple chat conversations, no tool access.

MethodPathDescription
GET/conversationsList conversations
POST/conversationsCreate. { title }
DELETE/conversations/{id}Delete
PUT/conversations/{id}/title{ title }
GET/conversations/{id}/messagesMessage list
POST/conversations/{id}/messagesAppend. { role, content }

Platform & settings

MethodPathDescription
GET/platformPublic. { platform, arch, version }
GET/context-window/{model}Context window (tokens) for a model; honors custom_providers.context_window
GET/settingsFull Settings struct as JSON
PUT/settingsSave full/partial settings; invalid enum fields fall back to defaults
GET/settings/default-promptsBuilt-in system prompts (Anthropic / local / compaction)
POST/settings/testProbe a provider with a minimal request. { ok, error? }
POST/email/testSend a test email via configured SMTP/sendmail
GET/environmentSystem environment / capability report
GET/diagnosticsFull diagnostic snapshot
GET/integrations/gwsGoogle Workspace CLI availability
GET/integrations/dockerDocker availability
GET/cli-tools/detectDetect installed CLI-tool binaries
GET/web-server/statusWeb server bind info
GET/remote-deploymentsActive remote deployments

Memory & knowledge

File-based markdown memory plus the memory_facts index with hybrid recall and distillation, alongside three knowledge stores. See Memory & Knowledge for the concepts.

Native memory

MethodPathDescription
GET/memoriesList file-based memories (user + project)
POST/memoriesSave. { name, type, scope, content }
DELETE/memories/{name}Delete
GET/memories/factsList memory_facts
DELETE/memories/facts/{id}Delete a fact
POST/memories/searchHybrid recall (FTS5/BM25 + embedding-cosine, RRF, ACL-filtered)
GET/memories/statsMemory stats
GET/memories/layer-statsL1/L2/L3 distillation-layer stats
POST/memories/distillRun distillation now
GET/memories/reviewsPending memory reviews
POST/memories/reviews/{id}/approveApprove a pending memory
POST/memories/reviews/{id}/rejectReject a pending memory

Embeddings for hybrid recall come from a user-configured external endpoint (Settings → Memory) — there is no bundled embedding server.

Wiki

Markdown knowledge pages (wiki_pages + FTS), injection-scanned.

MethodPathDescription
POST/wiki/listList pages
POST/wiki/getRead a page
POST/wiki/upsertCreate / update a page
POST/wiki/searchFTS search
POST/wiki/deleteDelete a page
GET/wiki/statsWiki stats

Code graph

Heuristic symbol + import index (code_symbols + FTS, code_edges) over Rust/TS/JS/Py/Go.

MethodPathDescription
POST/codegraph/scanIndex a project path
POST/codegraph/queryQuery symbols / edges
POST/codegraph/statsIndex stats

Concept graph

LLM triple-extraction knowledge graph (concept_nodes + concept_edges).

MethodPathDescription
POST/concept-graph/buildBuild/extend the graph from content
POST/concept-graph/getFetch the graph (nodes + edges)
POST/concept-graph/queryQuery the graph
POST/concept-graph/statsGraph stats

Skills & role skills

MethodPathDescription
GET/skillsList skills with YAML-frontmatter metadata
DELETE/skills/{name}Delete a user-installed skill
POST/skills/{name}/toggle{ enabled }
GET/skills/{name}/contentRaw SKILL.md
PUT/skills/{name}/content{ content }
GET/skills/curatorCurator status: active / stale / archived
POST/skills/{name}/status{ status }
POST/skills/{name}/pin{ pinned }

Role skills are markdown system-prompt personas — a separate system from skills.

MethodPathDescription
GET/role-skillsList
POST/role-skillsSave. { name, content }
GET/role-skills/{name}Get content
DELETE/role-skills/{name}Delete

Design systems (markdown design guides with live previews):

MethodPathDescription
GET/design-systemsList
GET/design-systems/{name}/contentGet markdown content
PUT/design-systems/{name}/contentUpdate
DELETE/design-systems/{name}Delete
GET/design-systems/{name}/previewGenerate a preview
GET/design-preview/{name}Serve a cached preview

Automation

Schedules, chat listeners, webhooks, and slash commands. See Automation & Workflows for the concepts.

Schedules

MethodPathDescription
GET/schedulesList
POST/schedulesCreate. { title, prompt, schedule_type, schedule_time, ... }
PUT/schedules/{id}Update
DELETE/schedules/{id}Delete
POST/schedules/{id}/toggle{ enabled }

schedule_type: once | hourly | daily | weekly | cron. duration_type: once | repeat_until | forever. background_deploy=true + target_agent_id forwards execution to a remote agent.

Listeners

MethodPathDescription
GET/listenersList
POST/listenersCreate
PUT/listeners/{id}Update
DELETE/listeners/{id}Delete
POST/listeners/{id}/startStart subprocess + Composio MCP auto-mount
POST/listeners/{id}/stopStop, kill subprocess, drop IM bindings
POST/listeners/{id}/toggle{ enabled }
GET/listeners/{id}/logsEvent logs
GET/listeners/statusesAll status snapshots
GET/listeners/platformsSupported platform list

IM bindings tie a (listener, channel, thread) to a task for conversational continuity:

MethodPathDescription
GET/im-bindings/{task_id}List bindings on a task
DELETE/im-bindings/{task_id}Remove

Webhooks

MethodPathDescription
GET/webhooksList
POST/webhooksCreate. { name, url_path, agent_prompt, secret? }
PUT/webhooks/{id}Update
DELETE/webhooks/{id}Delete
POST/webhooks/{id}/toggle{ enabled }
GET/webhooks/{id}/urlPublic trigger URL
GET/webhooks/{id}/logsInvocation logs
The management routes above live on the main API server. The inbound webhook that actually fires an agent listens on a separate port 18790: POST http://{host}:18790/webhook/{url_path} with an x-webhook-secret or Authorization header.

Slash commands

MethodPathDescription
GET/slash-commandsList
POST/slash-commandsCreate. { name, handler_type, handler_target, allowed_senders? }
PUT/slash-commands/{id}Update
DELETE/slash-commands/{id}Delete
POST/slash-commands/{id}/toggle{ enabled }

handler_type: agent_task | workflow | skill | builtin.

Workflows & teams

MethodPathDescription
GET/workflowsList automation_workflows
POST/workflowsCreate. { name, trigger_type, trigger_config, definition }
GET/workflows/{id}Get with definition
PUT/workflows/{id}Update
DELETE/workflows/{id}Delete
POST/workflows/{id}/runStart a run. { trigger_data? }
GET/workflow/runs/{run_id}Run status + step list
POST/workflow/approvals/{request_id}/resolve{ response: "approve"|"reject", data? }

Teams — role bundles run as a nested workflow:

MethodPathDescription
GET/teamsList
POST/teamsCreate. { name, roles, workflow_definition?, auto_parallel? }
PUT/teams/{id}Update
DELETE/teams/{id}Delete
POST/teams/runExecute team workflow. { team_id, message, project_path? }

Multi-agent orchestration (cloud + peer participants via the debate/plan/goal engines):

MethodPathDescription
POST/plan/start-executionStart executing an approved multi-agent plan
POST/plan/saveSave an approved plan + resume the agent. { task_id, plan }
POST/multi-agent/retry-plan-stepRe-run a single plan step
POST/multi-agent/continue-researchContinue a research fan-out run
POST/acp-peers/debateStart a debate. { topic, mode, participant_peer_ids, rounds?, moderator_peer_id? }
GET/acp-peers/debates/{task_id}Debate transcript

Autonomous loops

Self-paced agent loops (task_mode="autonomous"), backed by the autonomous_loops table plus a scheduled_tasks arming row per loop. See Autonomous Agents.

MethodPathDescription
GET/autonomous-loopsList loop definitions
POST/autonomous-loopsSave/upsert a loop definition
DELETE/autonomous-loops/{id}Delete
POST/autonomous-loops/{id}/startArm + start the loop
POST/autonomous-loops/{id}/stopStop the loop definition
POST/autonomous-loops/task/{task_id}/stopStop the running loop task

MCP & plugins

MethodPathDescription
GET/mcp/serversList configured servers
POST/mcp/serversSave / upsert
DELETE/mcp/servers/{id}Delete
POST/mcp/servers/{id}/connectConnect
POST/mcp/servers/{id}/disconnectDisconnect
GET/mcp/statusesAll connection statuses
POST/mcp/v1Aura as an MCP server. JSON-RPC 2.0; exposes bash, read_file, write_file, edit_file, glob, grep, list_dir, web_search, web_fetch to external MCP clients

Plugins — CLI tools that register as MCP servers via a manifest (plugins table):

MethodPathDescription
GET/pluginsList installed
POST/pluginsInstall. { manifest }
POST/plugins/{id}/enableEnable
POST/plugins/{id}/disableDisable
DELETE/plugins/{id}Uninstall

Render helpers (diagrams / charts to files served under /charts/):

MethodPathDescription
POST/render/mermaidRender Mermaid source to PNG
POST/render/mermaid/repairLLM-driven repair of a broken Mermaid spec
POST/render/plantumlRender a PlantUML spec to SVG via the bundled JRE

Models & providers

MethodPathDescription
GET/provider-models/cached/{provider}Cached models for a provider
GET/provider-models/status/{provider}Cache freshness for a provider
POST/provider-models/fetchFetch from a provider's /models. { provider }
POST/provider-models/refresh-backgroundKick off a background refresh
POST/provider-models/fetch-allFetch all configured providers
DELETE/provider-models/clear/{provider}Clear cache

Custom providers & credentials:

MethodPathDescription
GET/providers/customList custom providers
POST/providers/customSave / upsert
DELETE/providers/custom/{id}Delete
GET/credentialsList credentials (encrypted in DB)
POST/credentialsSave. { name, credential_type, username?, secret, service_url?, notes? }
GET/credentials/{id}Get with decrypted secret
DELETE/credentials/{id}Delete
To run a local model, point a custom provider at any OpenAI-compatible server (Ollama, LM Studio, vLLM). There is no dedicated local-inference or cluster REST surface — /aura/status and /cluster/* do not exist.

Billing & routing

MethodPathDescription
GET/billing/summaryUsage summary by provider
GET/billing/limitsSpend limits
POST/billing/limitsSave a limit
GET/billing/fallback-orderFallback chain
POST/billing/fallback-orderSave chain
GET/billing/pricingProvider pricing
POST/billing/pricingSave / override pricing
POST/billing/resetReset usage counters
GET/billing/dailyDaily usage
GET/billing/daily-by-modelDaily usage by model
GET/billing/daily-by-providerDaily usage by provider
GET/routing/statsSmart-routing decision stats

License:

MethodPathDescription
POST/license/validateValidate + cache against control. { key }
GET/license/statusCurrent tier + features

Dependencies (downloadable runtime deps — Node, Python, browser-act, etc.):

MethodPathDescription
GET/deps/statusPer-dep install state
POST/deps/installBegin download/extract/venv-create. { id }
POST/deps/cancelCancel in-progress. { id }

OAuth & integrations

Direct OAuth (our client IDs, PKCE flow) — see Integrations.

MethodPathAuthDescription
GET/oauth/providersauthAvailable direct OAuth providers + status
POST/oauth/startauth{ provider }{ auth_url, state }
POST/oauth/llm/startauthBegin LLM-provider (subscription) OAuth
POST/oauth/llm/complete-codeauthComplete an LLM OAuth code exchange
POST/oauth/llm/device-startauthBegin device-code LLM OAuth
GET/oauth/connectionsauthList connections rows (decrypted summary)
POST/oauth/connections/{id}/refreshauthForce token refresh
DELETE/oauth/connections/{id}authDisconnect
GET/oauth/callbackpublicOAuth redirect target; validates state, exchanges code

Composio (cloud OAuth, ~100 toolkits):

MethodPathDescription
GET/composio/statusConnectivity + free-tier usage
GET/composio/toolkitsList toolkits
GET/composio/connectionsList the user's connections
GET/composio/usageCounters from composio_usage
GET/composio/tools-enabled/{toolkit_slug}Read per-toolkit master switch
POST/composio/tools-enabled/{toolkit_slug}{ enabled }
POST/composio/connectManaged-OAuth connect. { toolkit_slug }{ redirect_url, connected_account_id }
GET/composio/auth-fields/{slug}Required auth fields for an API-key toolkit
POST/composio/connect-keyAPI-key connect. { toolkit_slug, fields }
DELETE/composio/connections/{id}Disconnect at Composio
POST/composio/prune/{toolkit_slug}Prune stale connections for a toolkit
POST/composio/refresh-mcp/{toolkit_slug}Rebuild the toolkit's MCP mount

Cloud storage connectors:

MethodPathDescription
GET/cloud/connectorsList Google Drive / OneDrive / Dropbox connectors
POST/cloud/connectorsSave
DELETE/cloud/connectors/{id}Delete

ACP peers

Local admin of the acp_agents table (discovered + manual peers). Discovered peers default enabled=0 until you admit them. Peer discovery uses UDP broadcast on port 18802.

MethodPathDescription
GET/acp-peersList peers
POST/acp-peersAdd a manual peer
GET/acp-peers/self/manifestOur hosted manifest
POST/acp-peers/scanTrigger LAN scan
GET/acp-peers/{id}Peer details
DELETE/acp-peers/{id}Remove
POST/acp-peers/{id}/enabledAdmit / un-admit. { enabled }
POST/acp-peers/{id}/testProbe connectivity
POST/acp-peers/{id}/delegateOne-shot delegation. { prompt }

ACP inbound REST surface

The routes peers call into our agent (acp_routes.rs). /acp/ping and the /acp/agents GETs are public; everything else requires Bearer auth. {*name} captures slashes so slash-namespaced agents (e.g. aura-workshop/cursor) resolve.

MethodPathAuthDescription
GET/.well-known/agent.ymlpublicYAML manifest of self + all hosted agents
GET/acp/pingpublic{ status: "ok", host_software: "aura-workshop/1.36.2" }
GET/acp/agentspublicList hosted agents (paginated)
GET/acp/agents/{*name}publicSingle AgentManifest (slash-capturing)
POST/acp/runsauthCreate a run. { agent_name, input, mode: "sync"|"async"|"stream", session_id? }
GET/acp/runs/{run_id}authPoll status
POST/acp/runs/{run_id}authResume an awaiting run
POST/acp/runs/{run_id}/cancelauthCancel
GET/acp/runs/{run_id}/eventsauthSSE event stream
GET/acp/session/{session_id}authSession descriptor
GET/acp/session/{session_id}/stateauthSession state JSON
GET/acp/session/{session_id}/messagesauthConversation history

Files, projects & ops

Files & voice

MethodPathDescription
GET/filesDownload a file. Query ?path
POST/files/uploadMultipart upload
POST/files/save-temp-imageSave a base64 image to a temp file
GET/voice/voicesList TTS voices
GET/voice/capabilitiesSTT/TTS capability report
POST/voice/stop-speechStop current TTS playback
POST/voice/realtime-connectEstablish a realtime speech-to-speech session
POST/voice/transcribeMultipart audio → text
POST/voice/save-tempSave base64 audio to a temp file

Projects

MethodPathDescription
GET/projectsList
POST/projectsCreate. { name, description?, goals? }
GET/projects/{id}Get
PUT/projects/{id}Update
DELETE/projects/{id}Delete
GET/projects/{id}/tasksTasks scoped to project
POST/projects/{id}/tasks/assign{ task_id }
POST/projects/{id}/tasks/remove{ task_id }

Import / export

MethodPathDescription
POST/import/parseParse an arbitrary import file
POST/import/executeExecute a parsed import
POST/import/manus/listList Manus agents
POST/import/manus/importImport from Manus
POST/import/agent/parseParse a .agent export
POST/import/agent/executeExecute an agent import
POST/import/claude-code/scanScan local Claude Code sessions
POST/import/claude-code/importImport sessions
POST/import/aura-remote/listList remote tasks
POST/import/aura-remote/importImport remote tasks
POST/export/tasksExport tasks for sharing
POST/aura-image/checkCheck coolkoo/aura-workshop:daemon-latest availability

Data management

MethodPathDescription
POST/data/clear-historyDelete all conversations
POST/data/reset-keysClear API keys
POST/data/reset-databaseDrop + recreate the DB
POST/data/clear-model-cacheClear cached provider models
POST/data/reset-allFull app reset
GET/database/healthDB health check
POST/database/maintenanceRun maintenance (vacuum/analyze)
GET/database/maintenance/jobsList maintenance jobs
POST/database/maintenance/jobsStart a maintenance job
GET/database/maintenance/jobs/{id}Job status
POST/database/maintenance/jobs/{id}/cancelCancel a job

Viewer (remote deployment dashboard)

MethodPathDescription
GET/viewer/statusDeployment overview (uptime, mode, active tasks)
GET/viewer/itemsDeployed schedules + listeners + webhooks
GET/viewer/tasksRecent tasks
GET/viewer/tasks/{id}/messagesTask message history
GET/viewer/eventsSSE feed for the viewer

Health, media & metrics

MethodPathAuthDescription
GET/api/healthpublic{ status, version, uptime_seconds, daemon_mode }
POST/api/heartbeat/incomingpublicInbound heartbeat from remote daemons
GET/metricsauthPrometheus text format
GET/openapi.jsonauthOpenAPI 3.0 schema
GET/docsauthSwagger UI (loads /api/openapi.json)
GET/charts/{filename}publicServe generated chart/diagram files
GET/media/{filename}publicServe other generated media
GET/api/image-proxypublicProxy external images (avoids CORS in PDF export)

WebSocket endpoints

Both live outside the /api nest and bypass auth in the middleware.

PathAuthDescription
GET /ws/browserpublicChrome-extension browser automation. Text frames carry JSON commands; the extension echoes responses keyed by request_id. 30 s per-command timeout.
GET /ws/sidepanelpublicChrome side-panel keepalive. Chat itself goes over REST; this socket is ping/pong only.

Gateway (OpenAI/Anthropic-compatible)

The /v1/* gateway makes Aura a drop-in LLM endpoint. Each request is parsed, the provider is resolved from the model name, the key + base URL are looked up from settings, and the request is proxied upstream — streaming responses are re-emitted in the client's expected format, with spend limits, fallback, and usage logging applied automatically. Point any OpenAI or Anthropic SDK at your Aura instance to centralize LLM access, cost control, and audit through a single endpoint. These routes are guarded (auth required).

MethodPathDescription
POST/v1/chat/completionsOpenAI-compatible chat completions (streaming + non-streaming)
GET/v1/modelsOpenAI-compatible model listing
POST/v1/messagesAnthropic-compatible messages API (streaming + non-streaming)
# Use Aura as an OpenAI-compatible endpoint
curl -X POST http://localhost:18800/v1/chat/completions \
  -H "Authorization: Bearer $AURA_WEB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "auto",
    "messages": [{"role":"user","content":"Hello!"}],
    "stream": true
  }'

Passing "model": "auto" lets Aura Routing pick the tier — see Models & Providers.

SSE event shapes

Streaming endpoints (/chat/*, /agent/run, /tasks/{id}/run, /tasks/{id}/resume, /events, /viewer/events, /acp/runs/{id}/events) emit named event: lines with JSON payloads.

EventPayload
text{ content, namespace?: string[] }
thinking{ content }
tool_start{ tool, input, tool_use_id }
tool_end{ tool, output, success, tool_use_id }
step_start / step_done{ step, title?, status? }
node_pendingnode_waiting{ node_id, label, node_type, status, error? }
workflow_running / _completed / _failed{ status, error? }
approval_needed{ request_id, title, description, options: string[] }
approval_resolved{ step_id, response: "approve"|"reject"|"timeout" }
task_completed{ step_id, output }
done{ task_id, status }
error{ message }

Multi-agent runs dual-emit every event on both the SSE broadcaster (/api/events) and the Tauri window, namespaced multi_agent.plan.* / acp.debate.*. Every event carries a monotonic _seq so SSE reconnects can de-dup.

Tauri commands

The desktop app calls 365 #[command] functions via Tauri invoke() instead of HTTP, registered in a single generate_handler! macro. Commands and REST routes are two front doors onto the same shared business logic — browser mode maps each command name onto its REST equivalent, so any command that isn't mirrored as a REST route breaks daemon/browser deployments. They cover the same domains as the tables above: tasks, chat & agent, goals/plan/autonomous, settings, skills, MCP/plugins, automation, memory & knowledge, providers/models, OAuth & Composio, ACP + multi-agent, billing/licensing, remote deployment, voice/files, and more.

Adding a command requires all five steps for daemon/browser parity: #[command] in commands.rs → register in lib.rs → wrapper in tauri-api.ts → REST mirror in routes.rs → mapping in web-invoke.ts. Shared logic lives in core/, never inlined.

Rate limits & guards

LimitValue
ACP request body4 MB
ACP SSE event size256 KB
ACP SSE events per run10,000
ACP connect timeout30 s
MCP stdio / HTTP request timeout30 s
WebSocket per-command30 s
Listener rate limitper-minute / per-hour, per listener
Loop detectorwarn @ 3 identical tool calls, hard-stop @ 6
Bash timeout60–300 s (default 120; install ops 300)
Autonomous-loop intervalclamped 5 min – 24 h (30 min default)
Live ports: 18800 (web / REST / SSE / WebSocket / ACP REST), 18790 (inbound webhooks), 18802/udp (ACP peer discovery).