The routes behind reachy.cagatay.my, generated from dashboard/server.py
(and the passkey router in dashboard/auth.py) by scripts/routedoc.py at every docs build. Body fields
are the keys the handler actually reads; anonymous? is what the _gate middleware decides.
Whether an Ask turn is running and the last answer. · src
GET
/api/emotions
—
🔒 key
The recorded-move library the daemon exposes (81 moves on 1.10). · src
GET
/api/health
—
✅ public
Liveness + daemon reachability, camera status, last error, daemon pressure (fds/limit, CLOSE-WAIT on :8000) and the state-stream status. The only public /api/* route. · src
GET
/api/log
n: int, after: int
🔒 key
Tail of the cross-persona agent log (n ≤ 300 rows, after = row id) + recent dashboard events. · src
GET
/api/state
—
🔒 key
Full robot state: head/body/antenna pose, motor mode, daemon loop Hz, CM4 system stats, service states, tracking/doa/imu when present. · src
GET
/api/telemetry
—
🔒 key
State + camera status — the tiny.technology endpoint-device telemetry action. · src
Turn-toward-speaker controller status: enabled, last bearing (deg), why it is not turning, turns/windups, sign cross-check counters.
POST
/api/doa
JSON
🔒
{enabled: bool} — turn toward speech when face tracking has no lock (default on; K in the cockpit). Personas may call it from 127.0.0.1 without a key.
39 routes; 11 answer without a key (health, the auth handshake and the SPA shell), the rest 401 anonymous callers and close a WebSocket with 4401.
The WebSocket carries three frame kinds: state (the same object as GET /api/state), agent_log
(rows from the shared brain — user/assistant/tool/reasoning, tagged by persona) and event (dashboard
receipts such as look ok yaw=9 by token). See Dashboard for what the cockpit
does with them.