API reference
Everything under /api needs at least a presenter session; admin-only routes are marked. Displays use /api/public with their screen token.
| Route | Does |
|---|---|
GET /api/snapshot | Everything the panel renders from |
POST /api/screens/:id/state | Point a screen at something |
POST /api/screens/:id/nav | first / prev / next / last / goto |
GET POST /api/music | Read the bus; patch playing, muted, volume, index (queue, loop, screens, auto-mute are admin) |
POST /api/music/skip | Advance by delta |
POST /api/music/queue admin | add, removeAt, or from/to to reorder |
POST /api/audio admin | Upload a track (multipart) |
GET /api/tags | Every tag in use, with how many things carry it |
PATCH /api/decks/:id admin | title, speaker, tags (array), archived (0/1) |
PATCH /api/videos/:id admin | title, tags, archived |
PATCH /api/galleries/:id admin | name, interval_ms, tags, archived |
PATCH /api/photos/:id admin | caption, tags |
POST /api/settings admin | Meeting branding, theme, backdrops |
GET /api/public/music | The bus, for a display |
POST /api/public/music/ended | A display reporting its track ran out |
GET /healthz | Liveness: touches the DB, so a process with a broken database reports unhealthy |
GET /theme | Palette only, unauthenticated, for the sign-in page |
POST /api/access/redeem | Redeem an explicit presenter or share access-link confirmation |
The WebSocket at /ws carries state, settings, music, snapshot, presence, data, bye, and the WebRTC handshake. It also accepts one frame from a display: { t:'nav', action }, the arrow keys of a locked screen. It moves only the screen that socket authenticated as, and only inside that screen's current deck.