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-router | Covers |
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:
- 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/*.
- 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.
- 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.
- 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.
| Method | Path | Auth | Description |
POST | /auth/login | public | Body { password } → sets JWT cookie |
POST | /auth/logout | public | Clears the JWT cookie |
GET | /auth/config | public | { password_required, methods } |
GET | /auth/check | auth | { 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.
| Method | Path | Description |
GET | /tasks | List. Query ?status, ?limit, ?offset |
POST | /tasks | Create. { title, description, project_path?, project_id?, model?, task_mode?, auto_run? } |
GET | /tasks/paged | Cursor/offset-paged task list |
GET | /tasks/count | Task count (optionally by status) |
GET | /tasks/search | FTS5 search over tasks_fts. Query ?q= |
GET | /tasks/interrupted | Tasks with checkpoints awaiting resume |
GET | /tasks/{id} | Task details |
DELETE | /tasks/{id} | Delete task + its messages |
GET | /tasks/{id}/messages | All task_messages rows |
POST | /tasks/{id}/messages | Append a follow-up + auto-resume the agent. { content } |
POST | /tasks/{id}/messages/archive/export | Export a task's message archive |
POST | /tasks/messages/archive/restore | Restore a message archive |
GET | /tasks/{id}/compactions | Context-compaction history |
GET | /tasks/{id}/workflow-inspection | Inspect the task's workflow/team execution graph |
GET | /tasks/{id}/events/replay | Replay agent events. Query ?from_seq, ?namespaces |
POST | /tasks/{id}/title | { title } |
POST | /tasks/{id}/model | { model } |
GET | /tasks/{id}/goal-state | Structured GoalState JSON |
POST | /tasks/{id}/goal-review/submit | Approve + relaunch. { criteria, deliverables, max_iterations } |
POST | /tasks/{id}/goal-review/cancel | Cancel a pending goal review |
GET | /tasks/{id}/files | Files 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.
| Method | Path | Description |
POST | /chat/send | Simple chat stream (no tools). { conversation_id?, content, model?, system_prompt? } |
POST | /chat/enhanced | Chat with tool use enabled |
POST | /agent/run | One-shot agent run. { prompt, project_path?, model?, allowed_tools? } |
POST | /tasks/{id}/run | Resume a task and stream agent events |
POST | /tasks/{id}/resume | Resume from an interrupted checkpoint |
POST | /inference/stop | Cancel a running task. { task_id } |
POST | /chat-dispatch-slash | Dispatch a slash command from the chat composer |
GET | /events | Global 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.
| Method | Path | Description |
GET | /conversations | List conversations |
POST | /conversations | Create. { title } |
DELETE | /conversations/{id} | Delete |
PUT | /conversations/{id}/title | { title } |
GET | /conversations/{id}/messages | Message list |
POST | /conversations/{id}/messages | Append. { role, content } |
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
| Method | Path | Description |
GET | /memories | List file-based memories (user + project) |
POST | /memories | Save. { name, type, scope, content } |
DELETE | /memories/{name} | Delete |
GET | /memories/facts | List memory_facts |
DELETE | /memories/facts/{id} | Delete a fact |
POST | /memories/search | Hybrid recall (FTS5/BM25 + embedding-cosine, RRF, ACL-filtered) |
GET | /memories/stats | Memory stats |
GET | /memories/layer-stats | L1/L2/L3 distillation-layer stats |
POST | /memories/distill | Run distillation now |
GET | /memories/reviews | Pending memory reviews |
POST | /memories/reviews/{id}/approve | Approve a pending memory |
POST | /memories/reviews/{id}/reject | Reject 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.
| Method | Path | Description |
POST | /wiki/list | List pages |
POST | /wiki/get | Read a page |
POST | /wiki/upsert | Create / update a page |
POST | /wiki/search | FTS search |
POST | /wiki/delete | Delete a page |
GET | /wiki/stats | Wiki stats |
Code graph
Heuristic symbol + import index (code_symbols + FTS, code_edges) over Rust/TS/JS/Py/Go.
| Method | Path | Description |
POST | /codegraph/scan | Index a project path |
POST | /codegraph/query | Query symbols / edges |
POST | /codegraph/stats | Index stats |
Concept graph
LLM triple-extraction knowledge graph (concept_nodes + concept_edges).
| Method | Path | Description |
POST | /concept-graph/build | Build/extend the graph from content |
POST | /concept-graph/get | Fetch the graph (nodes + edges) |
POST | /concept-graph/query | Query the graph |
POST | /concept-graph/stats | Graph stats |
Skills & role skills
| Method | Path | Description |
GET | /skills | List skills with YAML-frontmatter metadata |
DELETE | /skills/{name} | Delete a user-installed skill |
POST | /skills/{name}/toggle | { enabled } |
GET | /skills/{name}/content | Raw SKILL.md |
PUT | /skills/{name}/content | { content } |
GET | /skills/curator | Curator 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.
| Method | Path | Description |
GET | /role-skills | List |
POST | /role-skills | Save. { name, content } |
GET | /role-skills/{name} | Get content |
DELETE | /role-skills/{name} | Delete |
Design systems (markdown design guides with live previews):
| Method | Path | Description |
GET | /design-systems | List |
GET | /design-systems/{name}/content | Get markdown content |
PUT | /design-systems/{name}/content | Update |
DELETE | /design-systems/{name} | Delete |
GET | /design-systems/{name}/preview | Generate 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
| Method | Path | Description |
GET | /schedules | List |
POST | /schedules | Create. { 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
| Method | Path | Description |
GET | /listeners | List |
POST | /listeners | Create |
PUT | /listeners/{id} | Update |
DELETE | /listeners/{id} | Delete |
POST | /listeners/{id}/start | Start subprocess + Composio MCP auto-mount |
POST | /listeners/{id}/stop | Stop, kill subprocess, drop IM bindings |
POST | /listeners/{id}/toggle | { enabled } |
GET | /listeners/{id}/logs | Event logs |
GET | /listeners/statuses | All status snapshots |
GET | /listeners/platforms | Supported platform list |
IM bindings tie a (listener, channel, thread) to a task for conversational continuity:
| Method | Path | Description |
GET | /im-bindings/{task_id} | List bindings on a task |
DELETE | /im-bindings/{task_id} | Remove |
Webhooks
| Method | Path | Description |
GET | /webhooks | List |
POST | /webhooks | Create. { name, url_path, agent_prompt, secret? } |
PUT | /webhooks/{id} | Update |
DELETE | /webhooks/{id} | Delete |
POST | /webhooks/{id}/toggle | { enabled } |
GET | /webhooks/{id}/url | Public trigger URL |
GET | /webhooks/{id}/logs | Invocation 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
| Method | Path | Description |
GET | /slash-commands | List |
POST | /slash-commands | Create. { 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
| Method | Path | Description |
GET | /workflows | List automation_workflows |
POST | /workflows | Create. { name, trigger_type, trigger_config, definition } |
GET | /workflows/{id} | Get with definition |
PUT | /workflows/{id} | Update |
DELETE | /workflows/{id} | Delete |
POST | /workflows/{id}/run | Start 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:
| Method | Path | Description |
GET | /teams | List |
POST | /teams | Create. { name, roles, workflow_definition?, auto_parallel? } |
PUT | /teams/{id} | Update |
DELETE | /teams/{id} | Delete |
POST | /teams/run | Execute team workflow. { team_id, message, project_path? } |
Multi-agent orchestration (cloud + peer participants via the debate/plan/goal engines):
| Method | Path | Description |
POST | /plan/start-execution | Start executing an approved multi-agent plan |
POST | /plan/save | Save an approved plan + resume the agent. { task_id, plan } |
POST | /multi-agent/retry-plan-step | Re-run a single plan step |
POST | /multi-agent/continue-research | Continue a research fan-out run |
POST | /acp-peers/debate | Start 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.
| Method | Path | Description |
GET | /autonomous-loops | List loop definitions |
POST | /autonomous-loops | Save/upsert a loop definition |
DELETE | /autonomous-loops/{id} | Delete |
POST | /autonomous-loops/{id}/start | Arm + start the loop |
POST | /autonomous-loops/{id}/stop | Stop the loop definition |
POST | /autonomous-loops/task/{task_id}/stop | Stop the running loop task |
MCP & plugins
| Method | Path | Description |
GET | /mcp/servers | List configured servers |
POST | /mcp/servers | Save / upsert |
DELETE | /mcp/servers/{id} | Delete |
POST | /mcp/servers/{id}/connect | Connect |
POST | /mcp/servers/{id}/disconnect | Disconnect |
GET | /mcp/statuses | All connection statuses |
POST | /mcp/v1 | Aura 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):
| Method | Path | Description |
GET | /plugins | List installed |
POST | /plugins | Install. { manifest } |
POST | /plugins/{id}/enable | Enable |
POST | /plugins/{id}/disable | Disable |
DELETE | /plugins/{id} | Uninstall |
Render helpers (diagrams / charts to files served under /charts/):
| Method | Path | Description |
POST | /render/mermaid | Render Mermaid source to PNG |
POST | /render/mermaid/repair | LLM-driven repair of a broken Mermaid spec |
POST | /render/plantuml | Render a PlantUML spec to SVG via the bundled JRE |
Models & providers
| Method | Path | Description |
GET | /provider-models/cached/{provider} | Cached models for a provider |
GET | /provider-models/status/{provider} | Cache freshness for a provider |
POST | /provider-models/fetch | Fetch from a provider's /models. { provider } |
POST | /provider-models/refresh-background | Kick off a background refresh |
POST | /provider-models/fetch-all | Fetch all configured providers |
DELETE | /provider-models/clear/{provider} | Clear cache |
Custom providers & credentials:
| Method | Path | Description |
GET | /providers/custom | List custom providers |
POST | /providers/custom | Save / upsert |
DELETE | /providers/custom/{id} | Delete |
GET | /credentials | List credentials (encrypted in DB) |
POST | /credentials | Save. { 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
| Method | Path | Description |
GET | /billing/summary | Usage summary by provider |
GET | /billing/limits | Spend limits |
POST | /billing/limits | Save a limit |
GET | /billing/fallback-order | Fallback chain |
POST | /billing/fallback-order | Save chain |
GET | /billing/pricing | Provider pricing |
POST | /billing/pricing | Save / override pricing |
POST | /billing/reset | Reset usage counters |
GET | /billing/daily | Daily usage |
GET | /billing/daily-by-model | Daily usage by model |
GET | /billing/daily-by-provider | Daily usage by provider |
GET | /routing/stats | Smart-routing decision stats |
License:
| Method | Path | Description |
POST | /license/validate | Validate + cache against control. { key } |
GET | /license/status | Current tier + features |
Dependencies (downloadable runtime deps — Node, Python, browser-act, etc.):
| Method | Path | Description |
GET | /deps/status | Per-dep install state |
POST | /deps/install | Begin download/extract/venv-create. { id } |
POST | /deps/cancel | Cancel in-progress. { id } |
OAuth & integrations
Direct OAuth (our client IDs, PKCE flow) — see Integrations.
| Method | Path | Auth | Description |
GET | /oauth/providers | auth | Available direct OAuth providers + status |
POST | /oauth/start | auth | { provider } → { auth_url, state } |
POST | /oauth/llm/start | auth | Begin LLM-provider (subscription) OAuth |
POST | /oauth/llm/complete-code | auth | Complete an LLM OAuth code exchange |
POST | /oauth/llm/device-start | auth | Begin device-code LLM OAuth |
GET | /oauth/connections | auth | List connections rows (decrypted summary) |
POST | /oauth/connections/{id}/refresh | auth | Force token refresh |
DELETE | /oauth/connections/{id} | auth | Disconnect |
GET | /oauth/callback | public | OAuth redirect target; validates state, exchanges code |
Composio (cloud OAuth, ~100 toolkits):
| Method | Path | Description |
GET | /composio/status | Connectivity + free-tier usage |
GET | /composio/toolkits | List toolkits |
GET | /composio/connections | List the user's connections |
GET | /composio/usage | Counters from composio_usage |
GET | /composio/tools-enabled/{toolkit_slug} | Read per-toolkit master switch |
POST | /composio/tools-enabled/{toolkit_slug} | { enabled } |
POST | /composio/connect | Managed-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-key | API-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:
| Method | Path | Description |
GET | /cloud/connectors | List Google Drive / OneDrive / Dropbox connectors |
POST | /cloud/connectors | Save |
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.
| Method | Path | Description |
GET | /acp-peers | List peers |
POST | /acp-peers | Add a manual peer |
GET | /acp-peers/self/manifest | Our hosted manifest |
POST | /acp-peers/scan | Trigger LAN scan |
GET | /acp-peers/{id} | Peer details |
DELETE | /acp-peers/{id} | Remove |
POST | /acp-peers/{id}/enabled | Admit / un-admit. { enabled } |
POST | /acp-peers/{id}/test | Probe connectivity |
POST | /acp-peers/{id}/delegate | One-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.
| Method | Path | Auth | Description |
GET | /.well-known/agent.yml | public | YAML manifest of self + all hosted agents |
GET | /acp/ping | public | { status: "ok", host_software: "aura-workshop/1.36.2" } |
GET | /acp/agents | public | List hosted agents (paginated) |
GET | /acp/agents/{*name} | public | Single AgentManifest (slash-capturing) |
POST | /acp/runs | auth | Create a run. { agent_name, input, mode: "sync"|"async"|"stream", session_id? } |
GET | /acp/runs/{run_id} | auth | Poll status |
POST | /acp/runs/{run_id} | auth | Resume an awaiting run |
POST | /acp/runs/{run_id}/cancel | auth | Cancel |
GET | /acp/runs/{run_id}/events | auth | SSE event stream |
GET | /acp/session/{session_id} | auth | Session descriptor |
GET | /acp/session/{session_id}/state | auth | Session state JSON |
GET | /acp/session/{session_id}/messages | auth | Conversation history |
Files, projects & ops
Files & voice
| Method | Path | Description |
GET | /files | Download a file. Query ?path |
POST | /files/upload | Multipart upload |
POST | /files/save-temp-image | Save a base64 image to a temp file |
GET | /voice/voices | List TTS voices |
GET | /voice/capabilities | STT/TTS capability report |
POST | /voice/stop-speech | Stop current TTS playback |
POST | /voice/realtime-connect | Establish a realtime speech-to-speech session |
POST | /voice/transcribe | Multipart audio → text |
POST | /voice/save-temp | Save base64 audio to a temp file |
Projects
| Method | Path | Description |
GET | /projects | List |
POST | /projects | Create. { name, description?, goals? } |
GET | /projects/{id} | Get |
PUT | /projects/{id} | Update |
DELETE | /projects/{id} | Delete |
GET | /projects/{id}/tasks | Tasks scoped to project |
POST | /projects/{id}/tasks/assign | { task_id } |
POST | /projects/{id}/tasks/remove | { task_id } |
Import / export
| Method | Path | Description |
POST | /import/parse | Parse an arbitrary import file |
POST | /import/execute | Execute a parsed import |
POST | /import/manus/list | List Manus agents |
POST | /import/manus/import | Import from Manus |
POST | /import/agent/parse | Parse a .agent export |
POST | /import/agent/execute | Execute an agent import |
POST | /import/claude-code/scan | Scan local Claude Code sessions |
POST | /import/claude-code/import | Import sessions |
POST | /import/aura-remote/list | List remote tasks |
POST | /import/aura-remote/import | Import remote tasks |
POST | /export/tasks | Export tasks for sharing |
POST | /aura-image/check | Check coolkoo/aura-workshop:daemon-latest availability |
Data management
| Method | Path | Description |
POST | /data/clear-history | Delete all conversations |
POST | /data/reset-keys | Clear API keys |
POST | /data/reset-database | Drop + recreate the DB |
POST | /data/clear-model-cache | Clear cached provider models |
POST | /data/reset-all | Full app reset |
GET | /database/health | DB health check |
POST | /database/maintenance | Run maintenance (vacuum/analyze) |
GET | /database/maintenance/jobs | List maintenance jobs |
POST | /database/maintenance/jobs | Start a maintenance job |
GET | /database/maintenance/jobs/{id} | Job status |
POST | /database/maintenance/jobs/{id}/cancel | Cancel a job |
Viewer (remote deployment dashboard)
| Method | Path | Description |
GET | /viewer/status | Deployment overview (uptime, mode, active tasks) |
GET | /viewer/items | Deployed schedules + listeners + webhooks |
GET | /viewer/tasks | Recent tasks |
GET | /viewer/tasks/{id}/messages | Task message history |
GET | /viewer/events | SSE feed for the viewer |
Health, media & metrics
| Method | Path | Auth | Description |
GET | /api/health | public | { status, version, uptime_seconds, daemon_mode } |
POST | /api/heartbeat/incoming | public | Inbound heartbeat from remote daemons |
GET | /metrics | auth | Prometheus text format |
GET | /openapi.json | auth | OpenAPI 3.0 schema |
GET | /docs | auth | Swagger UI (loads /api/openapi.json) |
GET | /charts/{filename} | public | Serve generated chart/diagram files |
GET | /media/{filename} | public | Serve other generated media |
GET | /api/image-proxy | public | Proxy external images (avoids CORS in PDF export) |
WebSocket endpoints
Both live outside the /api nest and bypass auth in the middleware.
| Path | Auth | Description |
GET /ws/browser | public | Chrome-extension browser automation. Text frames carry JSON commands; the extension echoes responses keyed by request_id. 30 s per-command timeout. |
GET /ws/sidepanel | public | Chrome 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).
| Method | Path | Description |
POST | /v1/chat/completions | OpenAI-compatible chat completions (streaming + non-streaming) |
GET | /v1/models | OpenAI-compatible model listing |
POST | /v1/messages | Anthropic-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.
| Event | Payload |
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_pending … node_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
| Limit | Value |
| ACP request body | 4 MB |
| ACP SSE event size | 256 KB |
| ACP SSE events per run | 10,000 |
| ACP connect timeout | 30 s |
| MCP stdio / HTTP request timeout | 30 s |
| WebSocket per-command | 30 s |
| Listener rate limit | per-minute / per-hour, per listener |
| Loop detector | warn @ 3 identical tool calls, hard-stop @ 6 |
| Bash timeout | 60–300 s (default 120; install ops 300) |
| Autonomous-loop interval | clamped 5 min – 24 h (30 min default) |
Live ports: 18800 (web / REST / SSE / WebSocket / ACP REST),
18790 (inbound webhooks), 18802/udp (ACP peer discovery).