Homepage and Homarr widgets¶
JellyGlance stays the command center. Homepage and Homarr poll compact JSON instead of scraping the UI.
Create a key in Settings → API Key. The same page (and the list below) can copy or download Homarr widgets, a Homepage YAML pack, and a curl command. Homarr never puts the key in the export — paste it after import as header x-api-token.
New keys default to widgets-only: they may GET compact widget routes. Opt into widgets-write when a key also needs to POST session, download, request, or repair actions. Full keys keep the previous /api behaviour. Existing keys stay full until you change them. The same page shows last-used time for each key.
Interactive docs live in the Glance app at Settings → API Key. Try widget routes with your session, or authorize Swagger with apiKey (x-api-token) and open the Widgets tag. The standalone spec UI is also at /swagger-ui. /swagger redirects there.
Do not put the key in a public iframe URL if the dashboard is on the internet. Prefer a LAN call from Homepage or Homarr.
See the downloadable Homarr widgets and Homepage YAML below. Replace the example host and add your API key in your dashboard settings.
Snapshot¶
GET /api/widgets/homepage is the all-in-one board. Dedicated routes below are better when you want one feature per tile.
{
"jellyglance": true,
"sessionsRecent": 0,
"sessionsToday": 0,
"sessionsDay": 0,
"viewersToday": 0,
"users": 12,
"libraries": 4,
"movies": 820,
"shows": 140,
"episodes": 4100,
"addedWeek": 18,
"downloads": 0,
"downloadTotal": 0,
"stalled": 0,
"digest": 0,
"digestOk": true,
"storage": "5.2 TB",
"storageBytes": 5717460464435,
"invites": 0,
"calendarUpcoming": 0,
"calendarToday": 0,
"autobrr": 0,
"jellyfinOk": true,
"jellyfinName": "Jellyfin",
"jellyfinVersion": "10.10.7",
"backupAt": null,
"updatedAt": "2026-09-06T22:51:59.140Z"
}
| Field | Meaning |
|---|---|
sessionsRecent |
Playback rows in the last 15 minutes |
sessionsToday |
Playback rows since midnight |
sessionsDay |
Playback rows in the last 24 hours |
viewersToday |
Distinct users who played something today |
users |
Synced Jellyfin users |
libraries / movies / shows / episodes |
Catalog totals |
addedWeek |
Library items created in the last 7 days |
downloads |
Incomplete queue items |
downloadTotal |
All cached queue items |
stalled |
Failed, errored, or stalled downloads |
digest |
Ops items that need attention |
digestOk |
true when the digest is empty |
storage / storageBytes |
Sum of synced library file sizes |
invites |
Cached Wizarr invite rows |
calendarUpcoming / calendarToday |
Arr releases without a file |
autobrr |
Cached autobrr hits |
jellyfinOk / jellyfinName / jellyfinVersion |
Last-seen Jellyfin info |
backupAt |
Last backup hint from settings |
GET /api/widgets lists every token endpoint below.
Homarr¶
- Create a key in Settings → API Key.
- Download a JSON from that page, or use the files under
/widgets/. - In Homarr: Management → Custom Widgets → Import.
- Edit the URL if Glance is not
http://jellyglance:3000. - Paste the Glance API key. Auth type is already
apiKeyHeader/x-api-token.
The JSON uses Homarr Custom JSX so each widget has a Glance header, colored stat cards, tables, or item lists. Homarr still owns the board chrome.
| Widget | File | Source |
|---|---|---|
| Overview | jellyglance-homarr.json | /api/widgets/homepage |
| Catalog | jellyglance-homarr-catalog.json | /api/widgets/catalog |
| Storage | jellyglance-homarr-storage.json | /api/widgets/storage |
| Sessions | jellyglance-homarr-sessions.json | /api/widgets/sessions |
| Now playing | jellyglance-homarr-nowplaying.json | /api/widgets/nowplaying |
| Viewers | jellyglance-homarr-viewers.json | /api/widgets/viewers |
| Users | jellyglance-homarr-users.json | /api/widgets/users |
| Activity | jellyglance-homarr-activity.json | /api/widgets/activity |
| Watch time | jellyglance-homarr-watch.json | /api/widgets/watch |
| Statistics | jellyglance-homarr-statistics.json | /api/widgets/statistics |
| Libraries | jellyglance-homarr-libraries.json | /api/widgets/libraries |
| Recently added | jellyglance-homarr-recent.json | /api/widgets/recent |
| Repair | jellyglance-homarr-repair.json | /api/widgets/repair |
| Item glance | jellyglance-homarr-item.json | /api/item-glance/ITEM_ID |
| Downloads | jellyglance-homarr-downloads.json | /api/widgets/downloads |
| Stalled | jellyglance-homarr-stalled.json | /api/widgets/stalled |
| Queue list | jellyglance-homarr-queue.json | /api/widgets/downloads |
| Stitched queue | jellyglance-homarr-stitched.json | /api/widgets/stitched |
| Calendar | jellyglance-homarr-calendar.json | /api/widgets/calendar |
| Releases today | jellyglance-homarr-today.json | /api/widgets/today |
| Requests | jellyglance-homarr-requests.json | /api/widgets/requests |
| Issues | jellyglance-homarr-issues.json | /api/widgets/issues |
| Invites | jellyglance-homarr-invites.json | /api/widgets/invites |
| autobrr | jellyglance-homarr-autobrr.json | /api/widgets/autobrr |
| Transcodes | jellyglance-homarr-transcodes.json | /api/widgets/transcodes |
| Maintainerr | jellyglance-homarr-maintainerr.json | /api/widgets/maintainerr |
| Automation | jellyglance-homarr-automation.json | /api/widgets/automation |
| Devices | jellyglance-homarr-devices.json | /api/widgets/devices |
| Health | jellyglance-homarr-health.json | /api/widgets/health |
| Ops digest | jellyglance-homarr-digest.json | /api/widgets/digest |
| Jellyfin | jellyglance-homarr-jellyfin.json | /api/jellyfin/status |
| Backup | jellyglance-homarr-backup.json | /api/widgets/backup |
| Webhooks | jellyglance-homarr-webhooks.json | /api/widgets/webhooks |
| Jobs | jellyglance-homarr-jobs.json | /api/widgets/jobs |
| Jellyfin jobs | jellyglance-homarr-jellyfin-jobs.json | /api/widgets/jellyfin-jobs |
| Newsletter | jellyglance-homarr-newsletter.json | /api/widgets/newsletter |
After importing Item glance, replace ITEM_ID in the widget URL with a Jellyfin item id.
Disconnected integrations return zeros or empty lists. GET /api/widgets/requests and GET /api/widgets/issues call Seerr live. The homepage snapshot does not.
Homepage¶
Point customapi widgets at the compact URLs. Ready-made YAML with one service per widget: jellyglance-homepage.yaml.
The YAML sets the Glance logo and a list layout. Homepage still skins the widget; this is as far as customapi can go. Remap only works on the main field — pair a second value with additionalField.
- JellyGlance:
icon: https://jellyglance.com/project-logo.png
href: http://jellyglance:3000
description: Sessions, downloads, alerts, storage
widget:
type: customapi
url: http://jellyglance:3000/api/widgets/homepage
refreshInterval: 60000
display: list
headers:
x-api-token: YOUR_JELLYGLANCE_API_KEY
mappings:
- field: storage
label: Storage
format: text
additionalField:
field: sessionsRecent
format: number
color: theme
- field: downloads
label: Downloads
format: number
additionalField:
field: stalled
format: number
color: adaptive
- field: digestOk
label: Digest
format: text
remap:
- value: true
to: Clear
- any: true
to: Check Glance
additionalField:
field: digest
format: number
color: adaptive
Other token endpoints¶
The same x-api-token header works on the rest of /api. Compact widget sources:
| Endpoint | Returns |
|---|---|
GET /settings/api-key |
In-app API explorer and Swagger UI |
GET /swagger-ui |
Standalone Swagger UI for the same token-auth routes |
GET /api/widgets |
Catalog of widget endpoints |
GET /api/widgets/homepage |
Combined dashboard snapshot |
GET /api/widgets/catalog |
{ movies, shows, episodes, libraries, addedWeek } |
GET /api/widgets/storage |
{ totalLabel, upcomingCount, upcomingEstimate } |
GET /api/widgets/sessions |
{ recent, today, last24h, viewersToday, users } |
GET /api/widgets/nowplaying |
Live Jellyfin sessions watching right now |
GET /api/widgets/viewers |
{ viewersToday, users, today } |
GET /api/widgets/users |
{ users, admins, activeToday, items[] } |
GET /api/widgets/activity |
Latest playback rows |
GET /api/widgets/watch |
{ hoursToday, hoursWeek, hoursAll } |
GET /api/widgets/statistics |
Top titles and users this week |
GET /api/widgets/recent |
Newest library titles |
GET /api/widgets/libraries |
{ totalLabel, libraries[] } |
GET /api/widgets/repair |
Missing posters, logos, runtime, unmatched imports |
GET /api/widgets/downloads |
{ active, stalled, total, items[] } |
GET /api/widgets/stalled |
Stalled queue items |
GET /api/widgets/stitched |
Cached queue with client names |
GET /api/widgets/calendar |
{ upcoming, today, estimate, items[] } |
GET /api/widgets/today |
Arr releases due today |
GET /api/widgets/requests |
Seerr { pending, approved, available, items[] } |
GET /api/widgets/issues |
Seerr { open, resolved, total, items[] } |
GET /api/widgets/invites |
Cached Wizarr links |
GET /api/widgets/autobrr |
Cached autobrr hits |
GET /api/widgets/transcodes |
Tdarr active workers, queue, and errors |
GET /api/widgets/maintainerr |
Maintainerr cleanup counts and reclaimable size |
GET /api/widgets/automation |
Latest integration health results |
GET /api/widgets/devices |
Known Jellyfin clients |
GET /api/widgets/health |
Digest plus a live Jellyfin ping |
GET /api/widgets/digest |
Ops items that need attention |
GET /api/widgets/backup |
Last backup hint |
GET /api/widgets/webhooks |
Recent webhook deliveries |
GET /api/widgets/jobs |
Latest Glance task runs |
GET /api/widgets/jellyfin-jobs |
Live Jellyfin scheduled tasks |
GET /api/widgets/newsletter |
Last newsletter send and next digest |
GET /api/ops-digest |
{ ok, count, items[] } |
GET /api/library-storage |
Per-library bytes plus totalLabel |
GET /api/downloads/stitched |
Queue items matched to Seerr requests |
GET /api/jellyfin/status |
Live Jellyfin reachability and version |
GET /api/item-glance/:id |
One Jellyfin title correlated with Seerr, Arr, and downloads |
Related item-level correlation lives on GET /api/item-glance/:jellyfinId (session cookie or the same API token).
Practical examples¶
Use the API cookbook for copyable curl requests, example responses, and dashboard imports.