HTTP API Reference

The JSON API served by vultrino web. This page is the task-oriented route map; the exhaustive, code-verified wire reference (every field, object, enum, and error code) is docs/dev/API.md — it wins where the two differ.

Base URL & transport

  • Default base: http://127.0.0.1:7879 (override with vultrino web --bind).
  • All JSON routes are under /api/v1/.
  • Plaintext HTTP — terminate TLS at a reverse proxy for network exposure.

There is no transparent forwarding proxy and no X-Vultrino-Credential header: a client names a credential alias in the request body and Vultrino runs the action for it (see POST /api/v1/execute). vultrino serve does not serve this API.

Authentication

Authorization: Bearer vk_your_api_key      # an API key
Authorization: Bearer vut_your_use_token   # a scoped use token

A vut_ prefix is a use token; anything else is validated as an API key. Admin routes require an API key with the admin permission (use tokens rejected). The workload-exchange route instead takes a signed vwa_ assertion.

Error bodies are { "error": "message", "code": "machine_code" }. Codes by status: 400 invalid_* / execute_error; 401 missing_api_key / invalid_api_key / invalid_token; 403 permission_denied / not_admin / not_authorized / token_unusable; 404 *_not_found; 409 *_exists / idempotency_*; 500 storage_error.

Public / authenticated routes

GET /api/v1/health — no auth

{ "status": "ok", "version": "0.1.0" }

POST /api/v1/execute — run an action with a credential (API key or use token)

Vultrino injects the secret, runs the action, scrubs the response, returns it. The body is flat (not nested under params):

{
  "credential": "github-api",
  "method": "GET",
  "url": "https://api.github.com/user",
  "action": "http.request",
  "headers": { "Accept": "application/json" },
  "body": null,
  "query": {}
}
FieldRequiredNotes
credentialyesCredential alias.
methodyesHTTP method.
urlyesTarget URL (public host — SSRF guard).
actionnoCanonical plugin.action or a govder action label. Omitted → http.request.
headers / body / querynoRequest headers / JSON body / query params.

200{ "status", "headers", "body" } (body is a string, post-scrub). 202{ "outcome": "pending_approval", "approval_id": "appr_…", … } — the action did not run; poll the approval. Errors: 401 (bad bearer); 403 token_unusable (revoked/expired/exhausted token); 400 execute_error (policy denied, credential not found, SSRF block).

GET /api/v1/approvals/{id} — poll & lazily run an approved action

Authenticate with the same bearer that opened the approval. On the first poll after a human approves, the action runs at most once and the result is returned. status is one of Pending / Escalated / Approved / Denied / Expired. Errors: 401; 403 not_authorized / token_revoked; 404 approval_not_found.

GET /api/v1/credentials — list (API key, read)

{ "credentials": [ { "alias": "github-api", "credential_type": "api_key", "description": "…" } ] }

Metadata only — secrets are never returned; filtered to the caller's role scope. There is no GET /api/v1/credentials/{alias} route.

Admin routes (API key with admin only)

Use tokens are rejected. Mutating routes honor an optional Idempotency-Key. See Admin API for bodies and semantics.

MethodPathPurpose
POST / PUT / DELETE/api/v1/policies[/{id}]Manage stored policies (hot-reload).
POST / DELETE/api/v1/credentials[/{id}]Create (write-only secret) / delete by id.
POST/api/v1/tokens, /api/v1/tokens/{id}/revokeMint / revoke use tokens.
POST / DELETE/api/v1/roles[/{id}]Manage roles.
POST / DELETE/api/v1/agents/{label}/haltKill / un-kill an agent principal (V6).
GET/api/v1/sessions, /api/v1/metricsIn-flight sessions; per-process metrics (V12).
GET / POST/api/v1/events[?after=N], /api/v1/events/{seq}/replaySigned outbox replay + DLQ (V9).
PUT / DELETE/api/v1/workload-grants/{agent}Author / remove exchange grant templates.

Connector surfaces (same server)

MethodPathAuthPurpose
POST/mcpvk_ / vut_Networked MCP transport (JSON-RPC).
POST/llm, /llm/{*path}, /llm/channels/{channel}[/{*path}]vk_ / vut_Metered LLM proxy (provider gate default-deny; SSE streaming).
POST/api/v1/workload/exchangevwa_Trade a signed workload assertion for short-lived use tokens (gated by VULTRINO_WORKLOAD_EXCHANGE_ENABLED).
GET/api/v1/runtime/controlvut_Non-consuming liveness lease; 409 runtime_cancelled once revoked/expired/halted.

HTML admin panel (session auth)

Served alongside the API for human operators: /login, /dashboard (/), /credentials, /roles, /keys, /tokens, /approvals, /audit. Login is rate-limited; write forms require a CSRF token.