# API reference

Source: https://visuelize.com/docs/api
Updated: 2026-10-01

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.
