Skip to content

Real-time

HTTP routes and behavior for real-time.

WS /api/ws # WebSocket (JWT via subprotocol header)

WebSocket events:

  • media_availability_changed: payload-free inventory/access invalidation; clients refetch their own authorized availability.

  • config_changed; payload-free invalidation after Discover visibility or instance/access changes; every session re-fetches /api/config.

  • download_progress: admin only, { tmdb_id, media_type, progress, status, instance_id }

  • request_status_changed: queue polling and arr webhooks. Requesters assigned to the instance receive a payload-free refetch hint; admins receive { tmdb_id, media_type, status, instance_id }. Status is available, partially_available, requested, or unavailable (REST uses partial for the second value).

  • downloads_queue: admin only, full download-client queue snapshot { instance_id, paused, speed_bps, items }, sent on change

  • arr_queue_changed: { instance_id, service_type } invalidation ping for admins and requesters currently assigned to that instance; clients refetch via REST

  • targeted events fanned out per user/admin: request_pending, request_decision, request_quota_changed (user ID only; caller and admins refetch allowance state), issue_created, issue_updated, agent_action_pending, agent_action_decided, agent_autoapproval_paused, remediation_autodispatch_disabled, plex_access_request, media_server_access, issue_question, issue_fix_confirm, issue_closed, profile_change_pending, profile_change_decided (WS-only, no push; drains the other admins’ approval badges after a decision; both proposal events carry the authoritative pending_count)

The hub rechecks each socket’s current device and role before delivery, and current instance grants for scoped events. Revoked devices are disconnected; role or grant changes take effect without reconnecting. Inbound WebSocket application messages are ignored and capped at 1 KiB.

View the maintained source for this page.