Jobs API
The Jobs API allows you to preview content, trigger jobs manually, and check job status.
Preview Job
Section titled “Preview Job”Preview what content a job would add without actually adding anything.
Endpoint: POST /v1/jobs/preview/{job-name}
Parameters:
job-name(path, required) - Job identifier (e.g.,trending-movies,popular-shows)
Available Jobs:
trending-movies,trending-showspopular-movies,popular-showssmart-popular-movies,smart-popular-showsbox-officefavorited-movies,favorited-showsplayed-movies,played-showswatched-movies,watched-showscollected-movies,collected-showsanticipated-movies,anticipated-shows
Example Request:
curl -X POST http://localhost:9090/v1/jobs/preview/trending-moviesExample Response:
{ "job_name": "trending_movies", "total_found": 25, "will_add": 10, "already_exists": 8, "filtered_out": 7, "mode": "direct", "has_posters": true, "items": [ { "title": "Dune: Part Two", "year": 2024, "tmdb_id": 693134, "imdb_id": "tt15239678", "poster_url": "https://image.tmdb.org/t/p/w500/...", "overview": "Follow the mythic journey of Paul Atreides...", "rating": 8.7, "votes": 5234, "popularity": 95000, "genres": ["Science Fiction", "Adventure"], "runtime": 166, "already_exists": false, "filtered_out": false, "filter_reason": "" } ]}Response Fields:
job_name- Name of the jobtotal_found- Total items found from Traktwill_add- Items that would be added (pass filters, not in library)already_exists- Items already in your libraryfiltered_out- Items rejected by filtersmode- Integration mode (directorjellyseerr)has_posters- Whether TMDB poster images are availableitems- Array of preview items
Item Fields:
title- Content titleyear- Release yeartmdb_id- TMDB ID (movies and shows)tvdb_id- TVDB ID (shows only)imdb_id- IMDB IDposter_url- Poster image URL (if TMDB configured)overview- Content descriptionrating- Trakt rating (0-10)votes- Number of votespopularity- Popularity scoregenres- Array of genre namesruntime- Runtime in minutesalready_exists- Whether already in libraryfiltered_out- Whether rejected by filtersfilter_reason- Reason for rejection (if filtered)
Trigger Job
Section titled “Trigger Job”Manually trigger a job to run immediately.
Endpoint: POST /v1/jobs/trigger/{job-name}
Parameters:
job-name(path, required) - Job identifier
Example Request:
curl -X POST http://localhost:9090/v1/jobs/trigger/trending-moviesExample Response:
{ "message": "Job 'trending-movies' triggered successfully", "job": "trending-movies"}Job Status
Section titled “Job Status”Get the status of all configured jobs.
Endpoint: GET /v1/jobs/status
Example Request:
curl http://localhost:9090/v1/jobs/statusExample Response:
{ "jobs": [ { "name": "trending_movies", "enabled": true, "last_run": "2026-01-08T15:30:00Z", "next_run": "2026-01-08T16:30:00Z", "sync_interval": "1h", "mode": "direct" }, { "name": "popular_shows", "enabled": false, "last_run": null, "next_run": null, "sync_interval": "6h", "mode": "direct" } ]}Advanced Examples
Section titled “Advanced Examples”Preview with jq Filtering
Section titled “Preview with jq Filtering”Get only items that will be added:
curl -s -X POST http://localhost:9090/v1/jobs/preview/trending-movies \ | jq '.items[] | select(.will_add == true) | {title, year, rating}'Get Filtered Out Items
Section titled “Get Filtered Out Items”See what was rejected and why:
curl -s -X POST http://localhost:9090/v1/jobs/preview/trending-movies \ | jq '.items[] | select(.filtered_out == true) | {title, filter_reason}'Check All Job Statuses
Section titled “Check All Job Statuses”curl -s http://localhost:9090/v1/jobs/status | jq '.jobs[] | {name, enabled, last_run}'Error Responses
Section titled “Error Responses”Job Not Found (404):
{ "error": "Job not found: invalid-job-name"}Job Disabled (400):
{ "error": "Job 'trending-movies' is not enabled"}Execution Error (500):
{ "error": "Failed to fetch trending movies: connection timeout"}Next Steps
Section titled “Next Steps”- Explore Activity API
- Review Configuration API
- Learn about Jobs