The HTTP API
anz33 speaks the OpenAI API, so anything written for OpenAI works against it unchanged. It also serves a small control plane on the same port, which is what the dashboard uses.
Base address: http://127.0.0.1:3300. Everything below is relative
to that.
The OpenAI-compatible surface
| Endpoint | What it does |
|---|---|
GET /v1/models | Every model across every reachable engine, as one list. |
POST /v1/chat/completions | The main one. Supports "stream": true. |
POST /v1/embeddings | Routed to an engine that can produce embeddings. |
A request
curl http://127.0.0.1:3300/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"messages": [{"role": "user", "content": "Explain routing in one sentence"}]
}'
"model": "auto" lets anz33 choose. Any real model name pins the
request to whichever engine holds it — you never name the engine.
Streaming
{"model": "auto", "stream": true, "messages": [...]}
Server-sent events, exactly as an OpenAI client expects. The airlock restores redacted values inside the stream, including when a placeholder is split across several chunks.
Keys
Ignored unless you turned on require-keys, in which case send a
profile key the usual way:
-H "Authorization: Bearer <profile key>"
The local control plane
These are what the dashboard is built on. They are served on the same loopback address and are not part of the OpenAI surface.
| Endpoint | What it does |
|---|---|
GET /anz33dashboard | The dashboard page. |
GET /anz33chat | A plain chat page served by the router. |
GET /anz33/data | Everything the dashboard shows, as JSON: engines, models, power state, configuration and statistics. |
POST /anz33/config | Change a setting — allow cloud, battery saver, port. Every change is written to the audit log with its previous value. |
GET /anz33/audit | The audit log, including the result of the chain check. |
GET /anz33/memory | List memories. |
POST /anz33/memory | Add one. |
Scripting against it
# what is reachable right now
curl -s http://127.0.0.1:3300/anz33/data | jq '.engines[].name'
# how many requests today
curl -s http://127.0.0.1:3300/anz33/data | jq '.stats.requests'
# turn cloud off from a script
curl -s -X POST http://127.0.0.1:3300/anz33/config \
-H "Content-Type: application/json" \
-d '{"allow_cloud": false}'
Where it listens
127.0.0.1:3300 — this machine only. Two ways to change that:
anz33 serve --port 3310 # a different port, still local
anz33 serve --lan # answer other devices on your network
Or permanently, in ~/.anz33/config.json. Before using
--lan, read Sharing with your
household: that is the moment to require keys.
No TLS on loopback. Traffic to 127.0.0.1 never touches a
network, so HTTPS would add a certificate to install and manage in exchange for
nothing. Use http.