Contents

API reference

Everything under /api needs at least a presenter session; admin-only routes are marked. Displays use /api/public with their screen token.

RouteDoes
GET /api/snapshotEverything the panel renders from
POST /api/screens/:id/statePoint a screen at something
POST /api/screens/:id/navfirst / prev / next / last / goto
GET POST /api/musicRead the bus; patch playing, muted, volume, index (queue, loop, screens, auto-mute are admin)
POST /api/music/skipAdvance by delta
POST /api/music/queue adminadd, removeAt, or from/to to reorder
POST /api/audio adminUpload a track (multipart)
GET /api/tagsEvery tag in use, with how many things carry it
PATCH /api/decks/:id admintitle, speaker, tags (array), archived (0/1)
PATCH /api/videos/:id admintitle, tags, archived
PATCH /api/galleries/:id adminname, interval_ms, tags, archived
PATCH /api/photos/:id admincaption, tags
POST /api/settings adminMeeting branding, theme, backdrops
GET /api/public/musicThe bus, for a display
POST /api/public/music/endedA display reporting its track ran out
GET /healthzLiveness: touches the DB, so a process with a broken database reports unhealthy
GET /themePalette only, unauthenticated, for the sign-in page
POST /api/access/redeemRedeem 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.

Last updated