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 isavailable,partially_available,requested, orunavailable(REST usespartialfor 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 authoritativepending_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.