-
Notifications
You must be signed in to change notification settings - Fork 16
Jellyfin and Emby Integration
The Jellyfin and Emby integration brings media server analytics directly into Arr Dashboard, providing real-time stream monitoring, watch history, library statistics, and library cleanup — at full parity with the Plex integration, without requiring a Tautulli-equivalent layer.
With a Jellyfin or Emby instance connected, you get:
- Now Playing — Real-time view of active streams with transcode/direct play status and bandwidth
- Continue Watching / On Deck — Resume where you left off
- Recently Added — Latest media added to your libraries
- Watch History — Detailed viewing history captured every 5 minutes from active sessions
- Statistics tab (v2.17.0+) — A dedicated Jellyfin tab in the Statistics page renders 14 cards at full parity with the Plex tab: 6 leaderboards (Top + Most Popular × movies/shows/music), transcode/bandwidth/codec/device breakdowns, user analytics, watch history, quality score, and bandwidth forecast. See Statistics for the full surface.
- Library Enrichment — Watch status overlaid on library items throughout the dashboard
- Library Cleanup — Watch-aware cleanup rules using Jellyfin/Emby data
Jellyfin and Emby expose session data directly through their own APIs — no separate analytics service (like Plex's Tautulli) is needed. The Jellyfin Statistics tab works out of the box once an instance is configured; leaderboards populate as new sessions are captured.
Because Emby and Jellyfin descend from the same codebase, Arr Dashboard treats them as a single unified integration:
- The same backend client handles both services
- The same connection test, cache layer, and dashboard widgets work transparently for each
- Adding both Jellyfin and Emby side-by-side is fully supported; multi-instance aggregates combine data from both
You choose the service type (Jellyfin or Emby) when adding a new instance — everything else is handled for you.
Before setting up the integration:
- A running Jellyfin or Emby server
- An API key from your Jellyfin/Emby instance (admin access required for some features)
- Network connectivity between Arr Dashboard and the media server
- Log in to Arr Dashboard
- Go to Settings → Services
- Click Add Instance
- Select Jellyfin as the service type
- Enter:
- Name - A friendly label (e.g., "Main Jellyfin")
-
Base URL - Your Jellyfin server URL (e.g.,
http://192.168.1.100:8096) - API Key - Your Jellyfin API key
- Click Test Connection to verify
- Click Save
Finding your Jellyfin API key:
- Log in to Jellyfin as an admin
- Navigate to Dashboard → API Keys
- Click the + button to create a new API key
- Copy the generated key
- Go to Settings → Services
- Click Add Instance
- Select Emby as the service type
- Enter:
- Name - A friendly label (e.g., "Main Emby")
-
Base URL - Your Emby server URL (e.g.,
http://192.168.1.100:8096) - API Key - Your Emby API key
- Click Test Connection to verify
- Click Save
Finding your Emby API key:
- Log in to Emby as an admin
- Navigate to Settings → General (or Advanced → API Keys on some versions)
- Create a new API key
- Copy the generated key
Tip: Jellyfin and Emby both default to port
8096. If you changed the port, use the value from your media server settings.
The Now Playing widget on the Dashboard shows all active Jellyfin/Emby streams in real time.
| Information | Description |
|---|---|
| User | Who is watching |
| Title | What they are watching (movie, episode) |
| Progress | Playback progress bar |
| Stream Type | Direct Play, Direct Stream, or Transcode |
| Quality | Resolution and bitrate |
| Bandwidth | Current bandwidth usage |
| Device | Device name and client application |
Session snapshots refresh on a short interval so active streams stay current across multiple clients.
Shows in-progress items and next-up episodes for each user. Data is pulled directly from the Jellyfin/Emby on-deck APIs.
- Partially-watched movies and in-progress series
- Episode-level progress for TV series
- Per-user on-deck lists when multiple users are active
Displays the latest media added to your libraries:
- Movies, TV shows, and episodes recently added
- Organized by library section
- Includes poster artwork and metadata
Full watch history is available for every connected user without requiring a separate analytics service:
- Per-item play history with timestamps
- Watch count per item
- Platform and device information per play
- Last watched date
This history is used throughout the dashboard for library enrichment and cleanup rule evaluation.
The analytics suite mirrors the Plex integration and surfaces deep insight into media server usage.
- Per-user watch statistics
- Most active users
- Watch time trends
- Breakdown of devices and clients used for playback
- Device usage frequency
- Direct Play vs. Direct Stream vs. Transcode ratios
- Transcode decision reasons
- Hardware acceleration usage
- Video and audio codec distribution across your library
- Codec usage in active streams
- Library quality scoring based on resolution, codec, and bitrate
- Identify low-quality items that may benefit from upgrades
- Historical bandwidth usage patterns
- Forecasted bandwidth needs based on usage trends
- Per-series episode completion tracking
- Per-user series progress
When a Jellyfin or Emby instance is connected, watch status information is overlaid on library items throughout the dashboard:
- Library page - Items show watched/unwatched badges
- Watch count - How many times an item has been played
- Last watched date - When the item was most recently viewed
- Watched by - Which users have watched the item
This enrichment data is also available to the Library Cleanup feature for making watch-aware decisions.
Jellyfin/Emby integration unlocks the following watch-aware cleanup rule evaluators:
| Evaluator | Description |
|---|---|
| Last Watched | Items not watched for longer than a threshold |
| Watch Count | Items below or above a play count threshold |
| On Deck | Skip or prioritize items currently on deck |
| User Rating | Filter by user rating |
| Watched By | Match items watched by specific users |
| Added At | Filter by when the item was added to the library |
| Episode Completion | Match series where episode completion meets a threshold |
See Library Cleanup for how to combine these with other cleanup rules.
Arr Dashboard caches Jellyfin/Emby library metadata and session data to avoid excessive API calls.
| Cache | Source | Purpose |
|---|---|---|
| JellyfinCache | Jellyfin/Emby | Library metadata (titles, ratings, file info) |
| JellyfinEpisodeCache | Jellyfin/Emby | Episode-level data for series |
- Caches refresh automatically on a schedule
-
Cache Health status is tracked via
CacheRefreshStatus - You can trigger a manual cache refresh from the dashboard
- Stale caches trigger a
CACHE_REFRESH_STALEnotification event (if notifications are configured)
- Navigate to the Jellyfin/Emby analytics or library section
- Click the Refresh button to force a cache update
- Wait for the refresh to complete (large libraries may take a moment)
Rather than reusing a personal API key, create a dedicated API key in Jellyfin/Emby for Arr Dashboard. This makes it easy to revoke access without affecting your personal clients.
If Jellyfin/Emby and Arr Dashboard run on the same machine or LAN, use the internal address (e.g., http://192.168.1.100:8096) rather than any remote access URL. LAN access is faster and avoids depending on external DNS or reverse proxies.
The first cache refresh on a large library (10,000+ items) can take several minutes. Let it complete before navigating between analytics tabs so every chart has data to render.
Running both Plex and Jellyfin/Emby side-by-side is fully supported. Multi-instance analytics combine data across media servers, and the dashboard's incognito mode anonymizes server names and user identifiers in screenshots.
Causes:
- Incorrect Base URL or API key
- Server is not running or unreachable from Arr Dashboard's network
- API key was revoked or regenerated
Solutions:
- Verify the URL is reachable from the Arr Dashboard host
- Confirm the API key is still valid by listing it in the Jellyfin/Emby admin UI
- Test the connection via Settings → Services → Test Connection
- Check firewall rules allow traffic on port 8096 (or your custom port)
Causes:
- No one is currently watching
- Session snapshot not yet captured
- Server connection is stale
Solutions:
- Start a playback on Jellyfin/Emby to verify
- Wait for the next session refresh cycle
- Test the server connection in Settings → Services
Causes:
- No watch history yet (new or lightly-used server)
- Cache not yet populated
- API key lacks permission to read analytics data
Solutions:
- Allow time for watch history to accumulate on your server
- Trigger a manual cache refresh
- Verify the API key is from an admin account (required for some analytics endpoints)
Causes:
- Image proxy cannot reach the media server
- Reverse proxy stripping required headers
- Mixed HTTP/HTTPS content blocking in the browser
Solutions:
- Ensure the Base URL uses the same protocol as Arr Dashboard (HTTP or HTTPS)
- Confirm the API key has admin access (image proxy requires it)
- Review reverse proxy rules to ensure
AuthorizationandX-Emby-Tokenheaders are passed through
Causes:
- Cache has not refreshed since the watch event
- Account used for the API key does not see other users' watch status
- Multi-user library with restricted user permissions
Solutions:
- Trigger a manual cache refresh
- Use an admin-level API key so watch status is visible across users
- Verify user permissions in Jellyfin/Emby allow the API user to see shared libraries
GET /api/jellyfin/info/:instanceIdGET /api/jellyfin/now-playing/:instanceIdGET /api/jellyfin/on-deck/:instanceIdGET /api/jellyfin/recently-added/:instanceIdGET /api/jellyfin/history/:instanceIdGET /api/jellyfin/watch-enrichment/:instanceId# Cache health status
GET /api/jellyfin/cache/health
# Trigger cache refresh
POST /api/jellyfin/cache/refresh/:instanceId# User analytics
GET /api/jellyfin/analytics/users/:instanceId
# Device analytics
GET /api/jellyfin/analytics/devices/:instanceId
# Transcode analytics
GET /api/jellyfin/analytics/transcode/:instanceId
# Codec analytics
GET /api/jellyfin/analytics/codec/:instanceId
# Bandwidth analytics
GET /api/jellyfin/analytics/bandwidth/:instanceId
# Quality score
GET /api/jellyfin/analytics/quality-score/:instanceId
# Bandwidth forecast
GET /api/jellyfin/analytics/forecast/:instanceId
# Episode completion
GET /api/jellyfin/analytics/episode-completion/:instanceIdNote: All Jellyfin routes also serve Emby instances — the backend automatically routes requests based on the service type of the instance ID.