Skip to content

Roles and Permissions

MZAP has three fixed roles. Every user has exactly one role. Permissions are enforced in two places: the web UI hides controls the user cannot use, and the API rejects requests with 401 Unauthorized or 403 Forbidden when the role is insufficient.

Admins have unrestricted access. They can:

  • Create, edit, enable/disable, and delete users.
  • Change any user's password and regenerate any user's API key.
  • Enable or disable global authentication.
  • Assign players and zones to Operators and Viewers.
  • Lock the workspace, forcing all users to log in again.
  • Create, delete, rename, and favourite players and zones; configure audio devices.
  • Change application settings, AirPlay, stream failover, and auto-ducking.
  • Create, edit, and delete jingles; manage EQ and compressor presets.
  • Save, load, import, and export workspaces.

Admin always sees every player and zone. The assignment list is ignored for admin users.

Operators run day-to-day audio on their assigned players and zones. They can:

  • Play, pause, stop, seek, skip, and jump to a track on assigned players.
  • Adjust player and zone volume, mute, EQ, and compressor on assigned resources.
  • Change an assigned player's playlist and playback mode, and load files into it.
  • Change an assigned SoundMachine player's station, mix or schedule, and like or dislike its songs.
  • Mark assigned players and zones as favorites, or remove them from favorites.
  • Connect and disconnect their assigned players and zones in the routing matrix — see Routing.
  • Play and stop jingles.
  • Create and edit playlists.
  • Create, edit, enable, disable, duplicate, delete, and manually run scheduler tasks.
  • Browse the media library and internet radio catalog.
  • Subscribe to real-time event and level streams (filtered to their assigned resources).

Operators cannot:

  • Create, delete, or rename players and zones.
  • Add, remove, or reconfigure audio devices.
  • Create, edit, or delete jingles (they can play them).
  • Import, export, duplicate, or delete playlists.
  • Manage users or change global settings, AirPlay, failover, or auto-ducking.
  • See or control players and zones that haven't been assigned to them.

An Operator can route only between resources they own: the player and the zone must both be in their assignment list. A request that changes several zones at once is rejected as a whole if even one of those zones is not assigned — it is never partly applied.

Viewers are read-only. They can:

  • See the state of assigned players and zones (current track, position, state, volume).
  • See the scheduler's task list, status, and execution log.
  • Subscribe to event and level streams for their assigned resources.

Viewers cannot change anything — no transport, no volume, no jingles, and no manually running a scheduler task. Every write endpoint returns 403 Forbidden for viewer credentials. Use this role for dashboards, status displays, or kiosk screens that only need to observe.

ActionAdminOperatorViewer
Log in / log outyesyesyes
View assigned players and zonesallassignedassigned
Play / pause / stop / seek / skipyesassignedno
Adjust volume, mute, EQ, compressoryesassignedno
Change a player's playlist or playback modeyesassignedno
Change a SoundMachine player's sourceyesassignedno
Mark players and zones as favoritesyesassignedno
Route players to zonesyesassigned (both ends)no
Play and stop jinglesyesyesno
Create, edit, delete jinglesyesnono
Create and edit playlistsyesyesno
Import, export, duplicate, delete playlistsyesnono
Manage and run scheduler tasksyesyesno
View scheduler tasks and logyesyesyes
Create, delete, rename players and zonesyesnono
Initialize or remove audio devicesyesnono
AirPlay, failover, auto-ducking settingsyesnono
Save, load, import, export workspacesyesnono
Manage users and API keysyesnono
Toggle global authenticationyesnono
Change application settingsyesnono
Lock the workspaceyesnono
Subscribe to event/level SSE streamsall eventsfilteredfiltered

"Assigned" means the operation is allowed only on resources in the user's assignment list (see Player and zone assignments).

The Users tab is only visible to admins. The Devices tab and the Settings save controls are also admin-only. Operators and Viewers see the tabs for day-to-day work — players, zones, playlists, jingles, library, radio, scheduler — and the desktop app shows only the controls their role can use:

  • Viewers see no transport controls anywhere. Players cards, the player detail view, and the matrix batch bar hide play/pause/stop/next/previous; the seek bar shows position and duration but cannot be dragged; and double-clicking a queue track does nothing. The Players page shows a View only badge next to its title so the missing controls are explained.
  • Operators can assign zones to their players and toggle routing in the matrix. Auto-ducking and AirPlay receiver settings stay admin-only.
  • If the host ever refuses an action, a toast reads "You don't have permission to do that." instead of the action failing silently.
  • Operators and Viewers start on the Players tab when they sign in, without the Welcome tab. Welcome is still available from Help → Welcome. Admins restore their saved layout as before, and only admins save the tab layout to the workspace — an Operator or Viewer rearranging tabs does not overwrite it.

Admins can also hide individual sidebar sections from a user — see Hiding sections from a user.

When a non-admin is logged in, the players and zones grids render only assigned resources. Assignment changes take effect on the next request; no reload is required.

Every protected endpoint runs three checks in order:

  1. Authenticated? No token (or an invalid one) returns 401 Unauthorized.
  2. Role sufficient? A role below the endpoint's minimum returns 403 Forbidden.
  3. Resource assigned? For endpoints that target a specific player or zone, the ID must be in the user's assignment list (admins bypass this check). Missing assignment returns 403 Forbidden.

Read-only listing endpoints return a filtered list for Operators and Viewers instead of 403. For example, GET /api/players returns every player for an admin but only assigned players for an operator.

Server-Sent Events from /api/stream/events and /api/stream/levels are filtered the same way: non-admins only receive events for resources assigned to them.