Skip to content

HTTP API

Pixie exposes a small HTTP API on 127.0.0.1:7860 (configurable). Most of it is server-rendered HTML for the dashboard, but there’s a JSON surface that Claude Code skills and external integrations use.

Dashboard / HTML routes

MethodPathReturns
GET/Dashboard with sidebar + recent runs panel.
GET/tool/{tool_id}Single-tool page (form, output panel, history).
GET/tool/{tool_id}/runs/{run_id}Past run loaded into inputs + outputs.
GET/tool/{tool_id}/settingsPer-tool settings (secrets, overrides).
GET/settingsGlobal settings (theme, accent, density).
GET/libraryArtefact gallery across all tools.
GET/emptyEmpty-state screen (when tools/ is empty).

htmx fragment routes

These return HTML fragments swapped into the page by htmx.

MethodPathUsed for
POST/tool/{tool_id}/runRun a tool. Body is form-encoded inputs.
GET/tool/{tool_id}/streamSSE proxy to the tool’s /stream.
POST/tool/{tool_id}/cancelCancel an in-flight run.
GET/tool/{tool_id}/runsRun history dropdown.
GET/tools-changedLightweight “anything changed?” partial (htmx poll).
GET/tool/{tool_id}/autocomplete/{ep}Proxy to the tool’s autocomplete endpoint.

JSON API

Skills and external integrations use these. All return application/json.

MethodPathEffect
GET/api/toolsList all discovered tools with id, name, status, latest validation summary.
GET/api/tools/{tool_id}/validateRun the validator on demand, return the full report.
POST/api/tools/{tool_id}/stopSend SIGTERM to a running tool subprocess.
GET/api/launcher/stateWarm dict snapshot (developer-mode only).
GET/api/healthz{"ok": true} once Pixie is fully booted.
GET/api/artefactsPaginated artefact list. Query params: tool, mime, starred, label, tag, from, to, page.
POST/api/artefacts/{id}/starToggle star on an artefact.
POST/api/artefacts/{id}/labelSet the artefact label.
POST/api/artefacts/{id}/deleteSoft delete (writes deleted_at).
GET/api/runs/{run_id}/exportStream a zip of the run (inputs, outputs, artefacts).
GET/api/runs/{run_id}/reportStream a zip with a rendered report.md plus assets.
GET/api/workspacesList workspaces.
POST/api/workspacesCreate a workspace. Body: {name, colour?}.
DELETE/api/workspaces/{id}Delete a workspace (cascades tool_workspaces).
POST/api/workspaces/{id}/tools/{tool_id}Add a tool to a workspace.
DELETE/api/workspaces/{id}/tools/{tool_id}Remove a tool from a workspace.

Headers Pixie sets when calling tools

When forwarding a request to a tool’s /run, the proxy adds:

HeaderValue
Content-Typeapplication/json
X-Pixie-Run-Idthe same UUID as the body’s run_id
X-Pixie-Artefacts-Dirabsolute path where the tool may write large outputs

What Pixie does NOT expose

  • No auth — there are no tokens, no sessions, no API keys for Pixie’s own API. Defence is loopback binding only.
  • No remote-execute endpoint — every endpoint runs in-process or forwards to a tool subprocess.
  • No upload/install endpoint — tools are added by Claude Code skills writing to tools/ on disk, not via HTTP.
  • No public 0.0.0.0 listenerconfig._host_must_be_loopback enforces 127.0.0.0/8 or ::1 at process boot.

Example: list tools, then run one

Terminal window
# List all tools
curl -s http://127.0.0.1:7860/api/tools | jq '.[] | {id, status: .validation.overall}'
# Validate one
curl -s http://127.0.0.1:7860/api/tools/lorenz-ode-solver/validate | jq '.overall'
# Run the tool (via the htmx fragment endpoint — accepts form data)
curl -s -X POST http://127.0.0.1:7860/tool/lorenz-ode-solver/run \
-d sigma=10 -d rho=28 -d beta=2.667 -d t_end=40 -d steps=8000

The last call returns HTML (the rendered output panel). If you want JSON back from a tool, hit the tool’s own port directly — but that port is dynamic and the launcher owns it; in practice, talk to Pixie.