Jellyseerr is a media request manager for Jellyfin, Emby, and Plex. Users browse for movies and shows and submit requests; each request moves through approval, download, and availability. A built-in issue tracker handles problems that turn up after a title is available, such as a bad file or a wrong episode.

This score renders those notifications on the Tempo timeline. It reads Jellyseerr’s notification_type, assigns a severity and label per state, groups every event by its media title, and attaches one action that opens Jellyseerr.

How it works

Jellyseerr ships a native Webhook notification agent. It POSTs a JSON body that you define directly to Tempo’s ingestion endpoint. No helper, relay, or adapter runs on either side.

Jellyseerr  (Webhook notification agent)
      |  HTTP POST, your JSON template, bearer token
Tempo ingestion server  on <your-mac-host>:7776/ingest

You control the payload through Jellyseerr’s payload template, so the job is to map Jellyseerr’s template variables onto the metadata keys this score reads.

Setup

The score is built in. Tempo seeds it on first launch, so there is nothing to download. Enable it in Manage Sources if it is not already on.

  1. In Tempo, open Settings → Ingestion and add a token bound to com.jellyseerr. Copy it.
  2. Note your Tempo ingest endpoint: http://<your-mac-host>:7776/ingest. Jellyseerr must be able to reach that host and port on your LAN.
  3. In Jellyseerr, open Settings → Notifications → Webhook and enable the agent.
  4. Set the Webhook URL to http://<your-mac-host>:7776/ingest.
  5. Set the Authorization Header to Bearer YOUR_TOKEN_HERE, using the token you bound to com.jellyseerr.
  6. Replace the default JSON Payload with the template below.
  7. Pick the notification types you want under Notification Types, then save.
  8. Use Jellyseerr’s Test button to send a sample event and confirm it lands in Tempo.

JSON payload template

{
  "title": "{{subject}}",
  "eventType": "alert",
  "providerIdentifier": "com.jellyseerr",
  "metadata": {
    "event": "{{notification_type}}",
    "subject": "{{subject}}",
    "senderAddress": "<your-jellyseerr-host>"
  }
}

The score reads three metadata keys, and the webhook must send all three:

What you’ll see

Each notification lands as one event, grouped by media title, with a severity badge derived from its event value:

eventSeverityLabel
MEDIA_FAILEDerrorFailed
MEDIA_PENDINGwarningPending approval
ISSUE_CREATEDwarningIssue opened
ISSUE_REOPENEDwarningIssue opened
MEDIA_APPROVEDinfoApproved
MEDIA_AUTO_APPROVEDinfoApproved
MEDIA_DECLINEDinfoDeclined
MEDIA_AVAILABLEokAvailable
ISSUE_RESOLVEDokResolved

Any other event value falls through to the default info severity with the label Info.

Grouping and actions

Grouping uses ${metadata.subject}, the media title. As a request moves from pending approval to approved to available, each notification updates the same timeline line instead of adding a new one, and the badge reflects the latest state.

Every event carries one action:

The action depends on senderAddress being set in the payload. If it is missing, the URL is incomplete and the action will not reach Jellyseerr.

Troubleshooting