Skip to content

REST endpoints

All endpoints below live under https://app.vonz.io (prod) or http://vonz.localhost (dev). Versioned routes (/v1/*) require authentication; unversioned routes are either public or use bespoke auth (Telegram signing, Slack signature, OAuth callbacks).

This page is hand-written, focused on the concepts and shapes you need to know. For machine-readable schemas and an interactive request-builder, jump to:

When this page and the OpenAPI spec disagree, the spec wins — it’s generated from the live Zod schemas while this page is hand-edited and can lag.

Public. Returns { ok: true, version, pool: { … } }. Liveness check for orchestrators / load balancers.

Submit a task. Returns { task_id, status, created_at }.

{
"mode": "session", // or "batch"
"profile_id": "prof_…",
"prompt": "Summarize my unread emails",
"session_id": "sess_… (optional)", // continue an existing session
"allowed_tools": ["Bash"], // override profile's defaults
"max_turns": 10,
"max_budget_usd": 1.0,
"priority": "normal"
}
modeMeaning
batchFire-and-forget. Result polled via GET /v1/tasks/:id. Container is reaped on completion.
sessionInteractive. Bound to a workspace; container stays warm for follow-ups.

List tasks. Query: status, mode, page, limit.

One task. Includes result.text, result.tool_calls[], result.input_tokens, result.output_tokens, result.cost_usd, result.turns once complete.

Cancel a running task. Idempotent: if already done, no-op.

List your workspaces. Query: status (filter), page, limit.

Response: { workspaces: WorkspaceSummary[], total: number }. Playbook-only workspaces (session_id prefix pb-) are excluded unless they’ve been thread-claimed via Telegram — see Telegram integration.

One workspace.

Update mutable fields: name, starred, pinned, archived, tags, public_preview, model_override.

Permanent delete. Removes the container, volume (if any), and DB row.

The full event-log transcript: every token, tool call, tool result, user message, turn boundary. Use for debugging, replay, audit.

Browse the workspace’s filesystem inside the container.

Multipart upload to /workspace/<path> in the container.

Tarball download of selected paths.

List your profiles.

Create. Required: name, slug, api_key_id. Optional: model, default_tools, mcp_servers, claude_md, memory_enabled, persistent_sessions, etc.

Full profile (including claude_md).

Update.

Delete. Existing workspaces remain.

Models available to this profile (filtered by linked api_key_id capabilities).

List playbooks for a profile.

Create. See Playbooks concept for field semantics.

One playbook.

Update.

Delete.

Fire immediately. Returns 202 Accepted with { status: "started", playbook_id }. Poll /v1/playbooks/:id/runs for status.

Historical runs.

Webhook trigger (no auth — secret in URL). For trigger_type=webhook playbooks.

List your integrations. Sensitive config fields (bot_token, refresh_token, access_token, api_key, secret) are redacted to ••••••••.

Create an email or webhook integration. (Slack uses OAuth, Gmail uses OAuth, Telegram uses BotFather + claim, Teller uses Connect — see per-integration docs.)

{ "type": "webhook", "config": { "url": "https://hooks.zapier.com/…", "secret": "optional-hmac" } }

Update config, enabled, is_default, scope, profile_ids. Cross-user profile_ids are rejected with 400.

Disconnect.

Send a test notification through this integration.

  • GET /api/slack/callback — Slack OAuth return
  • GET /api/gmail/callback — Gmail OAuth return
  • POST /v1/integrations/teller/callback — Teller Connect’s onSuccess payload sink
  • POST /v1/integrations/teller/config — application_id, environment, etc. (configures the dashboard widget)
  • GET /v1/integrations/telegram/config + various /v1/integrations/telegram/* for bot setup

List your memory rows (across all profiles).

Create. Required: type, name, body. Optional: profile_id, description, importance.

One memory row.

Update.

Delete.

List secret names (values redacted).

Create. Body: { name, value, scope?, profile_ids? }. Name must match ^[A-Z_][A-Z0-9_]*$. Cross-user profile_ids rejected with 400.

Update name, value, scope, profile_ids.

Delete.

Identical surface for all three types:

ListCreateGetUpdateDelete
GET /v1/toolsPOST /v1/toolsGET /v1/tools/:idPATCH /v1/tools/:idDELETE /v1/tools/:id
GET /v1/skillsPOST /v1/skillsGET /v1/skills/:idPATCH /v1/skills/:idDELETE /v1/skills/:id
GET /v1/agentsPOST /v1/agentsGET /v1/agents/:idPATCH /v1/agents/:idDELETE /v1/agents/:id

List your connected Git provider accounts (GitHub / GitLab / Bitbucket OAuth).

GET /v1/integrations/git/:provider/authorize?returnPath=…

Section titled “GET /v1/integrations/git/:provider/authorize?returnPath=…”

Begin OAuth.

GET /v1/integrations/git/:provider/callback

Section titled “GET /v1/integrations/git/:provider/callback”

OAuth return URL.

Disconnect.

Container-pool stats (min/max/in-use/idle).

List managed containers.

Force-remove a container. Requires admin.

Under /admin/*. Operator-only; not documented here. See Authentication → Admin endpoints.