{ "components": { "schemas": { "AbandonInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/AbandonInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "reason": { "description": "required non-empty audited reason for abandoning the candidate", "type": "string" } }, "required": [ "reason" ], "type": "object" }, "ActingCredit": { "additionalProperties": false, "properties": { "character": { "type": "string" }, "credit_id": { "type": "string" }, "episode_count": { "format": "int64", "type": "integer" } }, "required": [ "credit_id", "character" ], "type": "object" }, "ActionResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ActionResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "cleared": { "description": "queue records cleared by a reviewed closeout", "format": "int64", "type": "integer" }, "detail": { "type": "string" }, "health_state": { "type": "string" }, "reason": { "type": "string" }, "status": { "description": "ok | blocked | busy | not_eligible | missing | invalid | arr_error", "type": "string" } }, "required": [ "status" ], "type": "object" }, "ActivityFeed": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ActivityFeed.json" ], "format": "uri", "readOnly": true, "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/RequestProgress" }, "type": [ "array", "null" ] }, "requester": { "description": "Household key the feed is attributed to, or all for the household", "type": "string" }, "sources": { "items": { "$ref": "#/components/schemas/EvidenceSource" }, "type": [ "array", "null" ] }, "truncated": { "description": "More recent requests exist than the window returned", "type": "boolean" } }, "required": [ "requester", "items", "truncated", "sources" ], "type": "object" }, "Actor": { "additionalProperties": false, "properties": { "name": { "type": "string" }, "requester": { "description": "The acting operator's own household requester key", "type": "string" }, "role": { "enum": [ "admin", "household" ], "type": "string" } }, "required": [ "name", "role", "requester" ], "type": "object" }, "ArrGateDrop": { "additionalProperties": false, "properties": { "indexer": { "type": "string" }, "rejections": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "release": { "type": "string" } }, "required": [ "indexer", "release", "rejections" ], "type": "object" }, "Candidate": { "additionalProperties": false, "properties": { "backdrop_path": { "description": "TMDB-relative landscape artwork path; absent when none is observed", "type": "string" }, "contributions": { "items": { "$ref": "#/components/schemas/SeedContribution" }, "type": [ "array", "null" ] }, "genre_ids": { "description": "Observed candidate genre IDs; absence does not prove no genres", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "overview": { "type": "string" }, "poster_path": { "type": "string" }, "score": { "format": "double", "type": "number" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "tvdb_id": { "format": "int64", "type": "integer" }, "year": { "format": "int64", "type": "integer" } }, "required": [ "tvdb_id", "title", "overview", "poster_path", "year", "score", "contributions", "media_type", "tmdb_id" ], "type": "object" }, "CandidateReviewMapping": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/CandidateReviewMapping.json" ], "format": "uri", "readOnly": true, "type": "string" }, "available": { "type": "boolean" }, "episode": { "format": "int64", "type": "integer" }, "episode_id": { "format": "int64", "type": "integer" }, "key": { "description": "SxxEyy", "type": "string" }, "season": { "format": "int64", "type": "integer" }, "title": { "type": "string" } }, "required": [ "available" ], "type": "object" }, "CastMember": { "additionalProperties": false, "properties": { "character": { "type": "string" }, "credit_id": { "type": "string" }, "name": { "type": "string" }, "order": { "format": "int64", "type": "integer" }, "performer_id": { "format": "int64", "type": "integer" }, "profile_url": { "type": "string" } }, "required": [ "performer_id", "name", "character", "credit_id", "order" ], "type": "object" }, "CreateReplacementHoldInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/CreateReplacementHoldInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "arr": { "description": "primary Arr instance name", "minLength": 1, "type": "string" }, "episode_ids": { "description": "one or more Sonarr episode ids; mutually exclusive with movie_id", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "movie_id": { "description": "one Radarr movie id; mutually exclusive with episode_ids", "format": "int64", "type": "integer" }, "reason": { "description": "why this replacement is being held", "minLength": 1, "type": "string" }, "ttl_hours": { "description": "hold duration in hours; defaults to 168", "format": "int64", "maximum": 720, "minimum": 1, "type": "integer" } }, "required": [ "arr", "reason" ], "type": "object" }, "DeleteBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/DeleteBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "result": { "$ref": "#/components/schemas/DeleteResult", "description": "the delete outcome (ok | partial | conflict | inconclusive | missing_in_arr | arr_error | not_wired | error) with pruned + mirror counts" } }, "required": [ "result" ], "type": "object" }, "DeleteRequest": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/DeleteRequest.json" ], "format": "uri", "readOnly": true, "type": "string" }, "scope_id": { "description": "The scope_id of the deletion impact the operator confirmed; a different or unobtainable current scope deletes nothing", "pattern": "^[0-9a-f]{64}$", "type": "string" } }, "required": [ "scope_id" ], "type": "object" }, "DeleteResult": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "media_type": { "type": "string" }, "mirrors": { "format": "int64", "type": "integer" }, "orphans": { "format": "int64", "type": "integer" }, "pruned": { "format": "int64", "type": "integer" }, "status": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "status" ], "type": "object" }, "DeletionAudience": { "additionalProperties": false, "properties": { "bucket": { "description": "Present only for a layer source", "type": "string" }, "libraries": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "owner": { "description": "Membership owner label; absent for direct import sources", "type": "string" }, "source": { "description": "Configured layer:bucket or import:root-folder-basename reference", "type": "string" }, "users": { "items": { "type": "string" }, "type": [ "array", "null" ] } }, "required": [ "source", "libraries", "users" ], "type": "object" }, "DeletionCopy": { "additionalProperties": false, "properties": { "arr_kind": { "type": "string" }, "arr_name": { "type": "string" }, "id": { "format": "int64", "type": "integer" }, "path": { "type": "string" }, "present": { "type": "boolean" }, "title": { "type": "string" }, "year": { "format": "int64", "type": "integer" } }, "required": [ "arr_kind", "arr_name", "present", "id", "title", "year", "path" ], "type": "object" }, "DeletionImpact": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/DeletionImpact.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "media_type": { "type": "string" }, "scope": { "$ref": "#/components/schemas/DeletionScope" }, "scope_id": { "description": "SHA-256 comparison fingerprint, not authorization; fresh observation required before execution", "type": "string" }, "status": { "enum": [ "ready", "missing", "inconclusive" ], "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "status" ], "type": "object" }, "DeletionScope": { "additionalProperties": false, "properties": { "audiences": { "description": "Configured libraries/viewers affected through memberships, layer links or present primary/mirror import paths", "items": { "$ref": "#/components/schemas/DeletionAudience" }, "type": [ "array", "null" ] }, "links": { "description": "Managed layer symlinks to unlink, including separately labelled orphan collateral; emptied directories are pruned", "items": { "$ref": "#/components/schemas/RemovalLink" }, "type": [ "array", "null" ] }, "memberships": { "description": "Exact membership buckets to remove; no watched-state erasure", "items": { "type": "string" }, "type": [ "array", "null" ] }, "mirrors": { "description": "Every configured rule-derived mirror, including verified absences", "items": { "$ref": "#/components/schemas/DeletionCopy" }, "type": [ "array", "null" ] }, "primary": { "$ref": "#/components/schemas/DeletionCopy" }, "retained_links": { "description": "Existing layer links retained by the executor but losing their present primary/mirror source content; not unlink effects", "items": { "$ref": "#/components/schemas/RemovalLink" }, "type": [ "array", "null" ] } }, "required": [ "primary", "mirrors", "memberships", "links", "retained_links", "audiences" ], "type": "object" }, "Detail": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/Detail.json" ], "format": "uri", "readOnly": true, "type": "string" }, "genres": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "held_title": { "$ref": "#/components/schemas/HeldTitle" }, "metadata": { "$ref": "#/components/schemas/TitleMetadata" }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "ratings": { "items": { "$ref": "#/components/schemas/Rating" }, "type": [ "array", "null" ] }, "runtime": { "format": "int64", "type": "integer" }, "seasons": { "items": { "$ref": "#/components/schemas/Season" }, "type": [ "array", "null" ] }, "state": { "enum": [ "observed", "partial", "unavailable" ], "type": "string" }, "title": { "$ref": "#/components/schemas/Title" } }, "required": [ "state", "title", "metadata_state", "genres", "seasons", "metadata", "observations" ], "type": "object" }, "Discovery": { "additionalProperties": false, "properties": { "genre_id": { "format": "int64", "type": "integer" }, "next": { "description": "Same selected query's next public page, bounded at page 500; absence alone does not prove catalogue exhaustion", "type": "string" }, "region": { "description": "Comma-separated selected service regions; NL for unfiltered discovery", "type": "string" }, "service_id": { "format": "int64", "type": "integer" }, "sort": { "enum": [ "trending", "popular", "new", "top", "upcoming" ], "type": "string" }, "state": { "description": "Empty is an answered zero-match lane; exhausted is an empty page beyond upstream total_pages; partial cannot prove absence", "enum": [ "observed", "empty", "partial", "exhausted" ], "type": "string" } }, "required": [ "genre_id", "service_id", "sort", "region", "state" ], "type": "object" }, "DispatchLogEntry": { "additionalProperties": false, "properties": { "arr_kind": { "type": "string" }, "arr_name": { "type": "string" }, "bucket": { "type": "string" }, "detail": { "type": "string" }, "id": { "format": "int64", "type": "integer" }, "media_type": { "type": "string" }, "mirrored_to": { "type": "string" }, "outcome": { "type": "string" }, "requested_by": { "type": "string" }, "rule": { "type": "string" }, "source": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "ts": { "type": "string" } }, "required": [ "id", "ts", "tmdb_id", "media_type", "outcome" ], "type": "object" }, "Display": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/Display.json" ], "format": "uri", "readOnly": true, "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "poster_url": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "metadata_state" ], "type": "object" }, "DownloadsBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/DownloadsBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "provenance": { "description": "current primary-Arr library items classified by the acquisition source of their current files: torrent, spot, manual, or usenet-streamed. torrent means at least one record still holds the file a torrent handoff imported; once managed usenet imports have replaced every such file, the item reads as that usenet lane and its torrent history stays in the torrent lane's handoff log", "items": { "$ref": "#/components/schemas/ProvenanceItem" }, "type": [ "array", "null" ] }, "rows": { "description": "one row per physical download, grouped by Arr target and download id", "items": { "$ref": "#/components/schemas/Row" }, "type": [ "array", "null" ] }, "usage": { "description": "library item counts and cached actual local-dataset bytes by provenance source", "items": { "$ref": "#/components/schemas/SourceUsage" }, "type": [ "array", "null" ] } }, "required": [ "rows", "provenance", "usage" ], "type": "object" }, "DryRunPlan": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/DryRunPlan.json" ], "format": "uri", "readOnly": true, "type": "string" }, "is_anime": { "description": "bucket-routing anime-ness (from the matched rule)", "type": "boolean" }, "matched": { "description": "false when no arr had a lookup candidate or no rule matched", "type": "boolean" }, "mirrors": { "description": "rule-derived mirror instances the add fans out to", "items": { "type": "string" }, "type": [ "array", "null" ] }, "rule": { "type": "string" }, "target": { "description": "routed primary arr instance name", "type": "string" }, "target_kind": { "type": "string" }, "title": { "type": "string" } }, "required": [ "matched", "mirrors", "is_anime" ], "type": "object" }, "Enrichment": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/Enrichment.json" ], "format": "uri", "readOnly": true, "type": "string" }, "genres": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "metadata": { "$ref": "#/components/schemas/TitleMetadata" }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "ratings": { "items": { "$ref": "#/components/schemas/Rating" }, "type": [ "array", "null" ] }, "runtime": { "format": "int64", "type": "integer" }, "seasons": { "items": { "$ref": "#/components/schemas/Season" }, "type": [ "array", "null" ] }, "state": { "enum": [ "observed", "unavailable" ], "type": "string" }, "title": { "$ref": "#/components/schemas/Title" } }, "required": [ "state", "title", "metadata_state", "genres", "seasons", "metadata", "observations", "ratings" ], "type": "object" }, "Episode": { "additionalProperties": false, "properties": { "air_date": { "type": "string" }, "name": { "type": "string" }, "number": { "format": "int64", "type": "integer" }, "overview": { "type": "string" }, "recorded": { "enum": [ "recorded", "missing", "unknown" ], "type": "string" } }, "required": [ "number", "name", "overview", "recorded" ], "type": "object" }, "EpisodeFileChip": { "additionalProperties": false, "properties": { "quality": { "type": "string" }, "release_name": { "type": "string" }, "resolution": { "type": "string" }, "size_bytes": { "format": "int64", "type": "integer" } }, "required": [ "size_bytes" ], "type": "object" }, "EpisodeOption": { "additionalProperties": false, "properties": { "absolute_episode": { "format": "int64", "type": "integer" }, "air_date": { "type": "string" }, "episode": { "format": "int64", "type": "integer" }, "episode_id": { "format": "int64", "type": "integer" }, "has_file": { "type": "boolean" }, "in_payload": { "type": "boolean" }, "key": { "description": "SxxEyy", "type": "string" }, "monitored": { "type": "boolean" }, "reason": { "type": "string" }, "season": { "format": "int64", "type": "integer" }, "selectable": { "type": "boolean" }, "title": { "type": "string" } }, "required": [ "episode_id", "season", "episode", "key", "monitored", "has_file", "in_payload", "selectable" ], "type": "object" }, "EpisodeRow": { "additionalProperties": false, "properties": { "air_date": { "type": "string" }, "episode": { "format": "int64", "type": "integer" }, "file": { "$ref": "#/components/schemas/EpisodeFileChip" }, "has_file": { "type": "boolean" }, "key": { "description": "SxxEyy", "type": "string" }, "monitored": { "type": "boolean" }, "queue_state": { "description": "Arr queue status for this exact episode; omitted when no matching queue row was observed", "type": "string" }, "runtime_minutes": { "description": "Sonarr episode runtime in minutes; omitted when Sonarr reports none", "format": "int64", "type": "integer" }, "season": { "format": "int64", "type": "integer" }, "title": { "type": "string" }, "watched": { "additionalProperties": { "type": "boolean" }, "type": "object" } }, "required": [ "season", "episode", "key", "monitored", "has_file", "watched" ], "type": "object" }, "EpisodeView": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/EpisodeView.json" ], "format": "uri", "readOnly": true, "type": "string" }, "owners": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "seasons": { "items": { "$ref": "#/components/schemas/SeasonGroup" }, "type": [ "array", "null" ] }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "users": { "description": "jellyfin usernames whose sees: matrix covers this item (watch-chip columns)", "items": { "type": "string" }, "type": [ "array", "null" ] } }, "required": [ "tmdb_id", "title", "owners", "users", "seasons" ], "type": "object" }, "ErrorDetail": { "additionalProperties": false, "properties": { "location": { "description": "Where the error occurred, e.g. 'body.items[3].tags' or 'path.thing-id'", "type": "string" }, "message": { "description": "Error message text", "type": "string" }, "value": { "description": "The value at the given location" } }, "type": "object" }, "ErrorModel": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ErrorModel.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "description": "A human-readable explanation specific to this occurrence of the problem.", "examples": [ "Property foo is required but is missing." ], "type": "string" }, "errors": { "description": "Optional list of individual error details", "items": { "$ref": "#/components/schemas/ErrorDetail" }, "type": [ "array", "null" ] }, "instance": { "description": "A URI reference that identifies the specific occurrence of the problem.", "examples": [ "https://example.com/error-log/abc123" ], "format": "uri", "type": "string" }, "status": { "description": "HTTP status code", "examples": [ 400 ], "format": "int64", "type": "integer" }, "title": { "description": "A short, human-readable summary of the problem type. This value should not change between occurrences of the error.", "examples": [ "Bad Request" ], "type": "string" }, "type": { "default": "about:blank", "description": "A URI reference to human-readable documentation for the error.", "examples": [ "https://example.com/errors/example" ], "format": "uri", "type": "string" } }, "type": "object" }, "EvidenceSource": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "name": { "type": "string" }, "state": { "enum": [ "observed", "unavailable" ], "type": "string" } }, "required": [ "name", "state" ], "type": "object" }, "FileDetail": { "additionalProperties": false, "properties": { "audio": { "type": "string" }, "container": { "type": "string" }, "quality": { "type": "string" }, "release_name": { "type": "string" }, "resolution": { "type": "string" }, "size_bytes": { "format": "int64", "type": "integer" }, "video": { "type": "string" } }, "required": [ "size_bytes" ], "type": "object" }, "FillGapsResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/FillGapsResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "searched_count": { "format": "int64", "type": "integer" }, "status": { "description": "ok | busy | missing_in_arr | arr_error", "type": "string" } }, "required": [ "status", "searched_count" ], "type": "object" }, "FilmographyPage": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/FilmographyPage.json" ], "format": "uri", "readOnly": true, "type": "string" }, "completeness": { "description": "Seerr filters adult credits and excludes crew here; not an exhaustive career", "enum": [ "returned-non-adult-cast" ], "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/FilmographyTitle" }, "type": [ "array", "null" ] }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "page": { "format": "int64", "type": "integer" }, "page_size": { "format": "int64", "type": "integer" }, "performer_id": { "format": "int64", "type": "integer" }, "source": { "enum": [ "seerr" ], "type": "string" }, "source_paging": { "enum": [ "unpaged" ], "type": "string" }, "total_pages": { "description": "Native pages of grouped typed titles; absent when source is unanswered", "format": "int64", "type": "integer" }, "total_results": { "description": "Unique typed titles in this returned source set; absent when source is unanswered", "format": "int64", "type": "integer" } }, "required": [ "performer_id", "metadata_state", "source", "source_paging", "completeness", "page", "page_size", "items", "observations" ], "type": "object" }, "FilmographyTitle": { "additionalProperties": false, "properties": { "credits": { "items": { "$ref": "#/components/schemas/ActingCredit" }, "type": [ "array", "null" ] }, "title": { "$ref": "#/components/schemas/Title" }, "users": { "description": "Configured viewers when visibility_state is configured; otherwise unknown", "items": { "type": "string" }, "type": [ "array", "null" ] }, "visibility_state": { "description": "Configured library audience only, never observed Jellyfin visibility or playback", "enum": [ "configured", "unknown" ], "type": "string" } }, "required": [ "title", "credits", "visibility_state", "users" ], "type": "object" }, "Finding": { "additionalProperties": false, "properties": { "id": { "format": "int64", "type": "integer" }, "message": { "type": "string" }, "severity": { "description": "Raw Arr HealthCheckResult; informational update warnings remain warning", "enum": [ "ok", "notice", "warning", "error" ], "type": "string" }, "source": { "type": "string" }, "state": { "description": "Health impact, independent of the raw severity", "enum": [ "healthy", "degraded", "unhealthy" ], "type": "string" }, "wiki_url": { "type": "string" } }, "required": [ "source", "severity", "message", "state" ], "type": "object" }, "Genre": { "additionalProperties": false, "properties": { "id": { "format": "int64", "type": "integer" }, "name": { "type": "string" } }, "required": [ "id", "name" ], "type": "object" }, "HealthDetail": { "additionalProperties": false, "properties": { "failed": { "type": "boolean" }, "has_file": { "type": "boolean" }, "in_queue": { "type": "boolean" }, "missing": { "type": "boolean" } }, "required": [ "has_file", "in_queue", "failed", "missing" ], "type": "object" }, "HealthzBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/HealthzBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "config": { "$ref": "#/components/schemas/HealthzConfig", "description": "Provenance of the config bytes this process parsed" }, "features": { "$ref": "#/components/schemas/HealthzFeatures", "description": "Config gates the cockpit shows or hides surfaces on" }, "modules": { "additionalProperties": { "$ref": "#/components/schemas/HealthzModule" }, "description": "Per-module status from the registry", "type": "object" }, "state": { "description": "Aggregate state; a disabled module is excluded from it", "enum": [ "starting", "healthy", "degraded", "unhealthy", "stopped" ], "type": "string" } }, "required": [ "state", "modules", "features" ], "type": "object" }, "HealthzConfig": { "additionalProperties": false, "properties": { "path": { "description": "Config file the process loaded", "type": "string" }, "sha256": { "description": "Hex sha256 of the raw config bytes; compare with a host-side sha256sum", "type": "string" }, "size": { "description": "Byte length of those config bytes", "format": "int64", "type": "integer" } }, "type": "object" }, "HealthzFeatures": { "additionalProperties": false, "properties": { "torrent_fallback": { "description": "features.torrent_fallback: the torrent lane and its Torrent tab", "type": "boolean" } }, "required": [ "torrent_fallback" ], "type": "object" }, "HealthzModule": { "additionalProperties": false, "properties": { "checked_at": { "description": "Cached check time; for Arr health this is the last valid sample, omitted before the first valid sample", "format": "date-time", "type": "string" }, "detail": { "description": "Human-readable context for non-healthy states", "type": "string" }, "findings": { "description": "Cached application diagnostics, preserving raw severity separately from health impact", "items": { "$ref": "#/components/schemas/Finding" }, "type": [ "array", "null" ] }, "kind": { "description": "process | glue; empty when the restart surface is not wired (spec emission)", "type": "string" }, "observation": { "$ref": "#/components/schemas/Observation", "description": "Application observation freshness and latest attempt failure; omitted for modules without this contract" }, "state": { "description": "Module state; disabled means a config gate turned this subsystem off", "enum": [ "starting", "healthy", "degraded", "unhealthy", "stopped", "disabled" ], "type": "string" } }, "required": [ "state" ], "type": "object" }, "HeldTitle": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/HeldTitle.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "$ref": "#/components/schemas/ItemDetail" }, "episodes": { "$ref": "#/components/schemas/EpisodeView" }, "libraries": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "state": { "enum": [ "observed", "partial" ], "type": "string" }, "versions": { "items": { "$ref": "#/components/schemas/TitleVersion" }, "type": [ "array", "null" ] }, "watched": { "additionalProperties": { "type": "boolean" }, "type": "object" } }, "required": [ "state", "detail", "libraries", "versions", "observations", "watched" ], "type": "object" }, "HistoryReport": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/HistoryReport.json" ], "format": "uri", "readOnly": true, "type": "string" }, "from": { "format": "date-time", "type": "string" }, "modules": { "items": { "$ref": "#/components/schemas/ModuleHistory" }, "type": [ "array", "null" ] }, "samples": { "format": "int64", "type": "integer" }, "to": { "format": "date-time", "type": "string" }, "window": { "type": "string" } }, "required": [ "window", "from", "to", "samples", "modules" ], "type": "object" }, "HoldingStats": { "additionalProperties": false, "properties": { "missing": { "format": "int64", "type": "integer" }, "size_bytes": { "format": "int64", "type": "integer" } }, "required": [ "size_bytes", "missing" ], "type": "object" }, "Item": { "additionalProperties": false, "properties": { "arr_kind": { "type": "string" }, "arr_name": { "type": "string" }, "is_anime": { "type": "boolean" }, "media_type": { "type": "string" }, "owners": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "poster_ref": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "year": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "title", "owners", "is_anime", "arr_kind", "arr_name" ], "type": "object" }, "ItemDetail": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ItemDetail.json" ], "format": "uri", "readOnly": true, "type": "string" }, "backdrop_ref": { "description": "Public provider landscape artwork from the holding Arr", "type": "string" }, "file": { "$ref": "#/components/schemas/FileDetail" }, "health": { "$ref": "#/components/schemas/HealthDetail" }, "is_anime": { "type": "boolean" }, "media_type": { "type": "string" }, "owners": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "poster_ref": { "description": "Public provider poster artwork from the holding Arr", "type": "string" }, "runtime": { "description": "minutes", "format": "int64", "type": "integer" }, "source": { "$ref": "#/components/schemas/SourceDetail" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "users": { "description": "jellyfin usernames whose sees: matrix covers this item (movie watch-chip columns)", "items": { "type": "string" }, "type": [ "array", "null" ] }, "year": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "title", "owners", "is_anime", "source", "health", "users" ], "type": "object" }, "ItemsBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ItemsBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "counts": { "description": "owner-rail counts including Unassigned", "items": { "$ref": "#/components/schemas/OwnerCount" }, "type": [ "array", "null" ] }, "items": { "description": "poster-grid entries: title/year/poster ref/owners/anime badge", "items": { "$ref": "#/components/schemas/Item" }, "type": [ "array", "null" ] }, "library": { "$ref": "#/components/schemas/RailStats", "description": "owner-rail Library stats: size/last import/queue/missing/failed" }, "media_type": { "type": "string" } }, "required": [ "media_type", "items", "counts", "library" ], "type": "object" }, "LayerVisibilityActionOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LayerVisibilityActionOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "action": { "$ref": "#/components/schemas/LayerVisibilityActionView" }, "events": { "items": { "$ref": "#/components/schemas/LayerVisibilityEventView" }, "type": [ "array", "null" ] }, "observation": { "$ref": "#/components/schemas/LayerVisibilityObservationView" } }, "required": [ "action", "events" ], "type": "object" }, "LayerVisibilityActionView": { "additionalProperties": false, "properties": { "action_id": { "description": "durable layer action identity; the approval names this", "type": "string" }, "bucket": { "type": "string" }, "created_at": { "format": "date-time", "type": "string" }, "detail": { "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "operation": { "enum": [ "MaterializeAndRefresh" ], "type": "string" }, "stage": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "updated_at": { "format": "date-time", "type": "string" }, "version": { "format": "int64", "type": "integer" } }, "required": [ "action_id", "tmdb_id", "media_type", "bucket", "operation", "stage", "detail", "version", "created_at", "updated_at" ], "type": "object" }, "LayerVisibilityActionsOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LayerVisibilityActionsOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/LayerVisibilityActionView" }, "type": [ "array", "null" ] } }, "required": [ "items" ], "type": "object" }, "LayerVisibilityApprovalView": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LayerVisibilityApprovalView.json" ], "format": "uri", "readOnly": true, "type": "string" }, "action_id": { "type": "string" }, "bucket": { "type": "string" }, "detail": { "type": "string" }, "stage": { "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "version": { "format": "int64", "type": "integer" } }, "required": [ "action_id", "bucket", "stage", "detail", "version", "updated_at" ], "type": "object" }, "LayerVisibilityEventView": { "additionalProperties": false, "properties": { "created_at": { "format": "date-time", "type": "string" }, "from_stage": { "type": "string" }, "reason": { "type": "string" }, "to_stage": { "type": "string" } }, "required": [ "from_stage", "to_stage", "reason", "created_at" ], "type": "object" }, "LayerVisibilityExpectedItemView": { "additionalProperties": false, "properties": { "key": { "description": "movie sentinel or SxxEyy logical identity", "type": "string" }, "path": { "description": "expected owned-layer media-source path", "type": "string" }, "provider": { "description": "provider episode identity when available", "type": "string" } }, "required": [ "key", "path" ], "type": "object" }, "LayerVisibilityObservationView": { "additionalProperties": false, "properties": { "bucket": { "type": "string" }, "detail": { "type": "string" }, "expected": { "items": { "$ref": "#/components/schemas/LayerVisibilityExpectedItemView" }, "type": [ "array", "null" ] }, "first_drift_at": { "format": "date-time", "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "observed_at": { "format": "date-time", "type": "string" }, "status": { "enum": [ "converged", "drift", "scanner_pending", "unknown", "no_files", "unreleased", "needs_operator" ], "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "bucket", "status", "detail", "observed_at", "expected" ], "type": "object" }, "LayerVisibilityObservationsOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LayerVisibilityObservationsOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/LayerVisibilityObservationView" }, "type": [ "array", "null" ] } }, "required": [ "items" ], "type": "object" }, "LegacyMovieEntry": { "additionalProperties": false, "properties": { "bucket": { "type": "string" }, "entry_path": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "bucket", "entry_path" ], "type": "object" }, "LibraryActivity": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LibraryActivity.json" ], "format": "uri", "readOnly": true, "type": "string" }, "failed": { "description": "Titles with a recent failed grab across sources whose history answered", "format": "int64", "type": "integer" }, "history_state": { "description": "Whether every source answered its import history; partial means failed and last_import are lower bounds", "enum": [ "observed", "partial", "unavailable" ], "type": "string" }, "last_import": { "description": "Newest import timestamp across sources whose history answered", "type": "string" }, "media_type": { "type": "string" }, "queue": { "description": "Active downloads across sources whose queue answered; never a stand-in for an unanswered queue", "format": "int64", "type": "integer" }, "queue_state": { "description": "Whether every source answered its download queue; partial means queue is a lower bound", "enum": [ "observed", "partial", "unavailable" ], "type": "string" }, "sources": { "description": "Per-source answers; detail names the unanswered read", "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "state": { "description": "Weakest of queue_state and history_state", "enum": [ "observed", "partial", "unavailable" ], "type": "string" } }, "required": [ "state", "queue_state", "history_state", "media_type", "queue", "failed", "sources" ], "type": "object" }, "LibraryAudience": { "additionalProperties": false, "properties": { "is_anime": { "type": "boolean" }, "libraries": { "description": "Enabled configured household libraries covering this membership scope", "items": { "type": "string" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "owner": { "description": "Named household membership used by the existing add, move and remove interface", "type": "string" }, "users": { "description": "Enabled Jellyfin usernames whose configured sees covers this scope, not watch-write authority", "items": { "type": "string" }, "type": [ "array", "null" ] } }, "required": [ "owner", "media_type", "is_anime", "libraries", "users" ], "type": "object" }, "LibraryAudiencesBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LibraryAudiencesBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "audiences": { "items": { "$ref": "#/components/schemas/LibraryAudience" }, "type": [ "array", "null" ] } }, "required": [ "audiences" ], "type": "object" }, "LibraryCoverage": { "additionalProperties": false, "properties": { "complete": { "description": "All active predicates classified and collection sources observed; not metadata freshness or playback proof", "type": "boolean" }, "matched": { "format": "int64", "type": "integer" }, "metadata_observed": { "description": "Titles with both latest genre and provider outcomes observed, not a freshness guarantee", "format": "int64", "type": "integer" }, "total": { "format": "int64", "type": "integer" }, "unresolved": { "format": "int64", "type": "integer" }, "watched": { "description": "Watched source observation; absent/conflicting per-title flags remain unknown even after a successful collection read", "enum": [ "not_requested", "observed", "unavailable" ], "type": "string" } }, "required": [ "total", "matched", "unresolved", "metadata_observed", "complete", "watched" ], "type": "object" }, "LibraryFact": { "additionalProperties": false, "properties": { "metadata": { "$ref": "#/components/schemas/TitleMetadata" }, "watched": { "enum": [ "watched", "unwatched", "unknown" ], "type": "string" } }, "required": [ "metadata", "watched" ], "type": "object" }, "LibraryItem": { "additionalProperties": false, "properties": { "added_at": { "description": "When the title joined its holding Arr; not an import or playback timestamp", "type": "string" }, "arr_kind": { "type": "string" }, "arr_name": { "type": "string" }, "backdrop_ref": { "description": "Remote landscape artwork from the holding Arr", "type": "string" }, "is_anime": { "type": "boolean" }, "libraries": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "media_type": { "type": "string" }, "missing": { "type": "boolean" }, "owners": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "poster_ref": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "users": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "year": { "format": "int64", "type": "integer" } }, "required": [ "libraries", "users", "missing", "tmdb_id", "media_type", "title", "owners", "is_anime", "arr_kind", "arr_name" ], "type": "object" }, "LibraryObservation": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "observed_at": { "format": "date-time", "type": "string" }, "source": { "type": "string" }, "state": { "enum": [ "observed", "partial", "unavailable" ], "type": "string" } }, "required": [ "source", "state" ], "type": "object" }, "LibraryResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/LibraryResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "counts": { "items": { "$ref": "#/components/schemas/OwnerCount" }, "type": [ "array", "null" ] }, "coverage": { "$ref": "#/components/schemas/LibraryCoverage" }, "facts": { "items": { "$ref": "#/components/schemas/LibraryFact" }, "type": [ "array", "null" ] }, "items": { "items": { "$ref": "#/components/schemas/LibraryItem" }, "type": [ "array", "null" ] }, "library": { "type": "string" }, "media_type": { "type": "string" }, "observation_age_ms": { "description": "Age of observed_at when this response was built", "format": "int64", "type": "integer" }, "observed_at": { "description": "Oldest answering source read behind this collection; may predate the request by the shared-acquisition window", "format": "date-time", "type": "string" }, "query": { "type": "string" }, "snapshot": { "type": "string" }, "sources": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "state": { "enum": [ "observed", "partial", "unavailable" ], "type": "string" }, "stats": { "$ref": "#/components/schemas/HoldingStats" }, "unresolved": { "items": { "$ref": "#/components/schemas/LibraryItem" }, "type": [ "array", "null" ] }, "watch_checked_at": { "description": "Successful watched title-collection observation time; omitted for unrequested or unavailable reads", "format": "date-time", "type": "string" } }, "required": [ "snapshot", "observed_at", "observation_age_ms", "facts", "unresolved", "coverage", "state", "library", "media_type", "query", "items", "counts", "sources", "stats" ], "type": "object" }, "MediaHealthBreakerHoldInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthBreakerHoldInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "reason": { "description": "REQUIRED non-empty reason for suspending detection", "type": "string" } }, "required": [ "reason" ], "type": "object" }, "MediaHealthBreakerResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthBreakerResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "healthy_epochs": { "description": "clean control epochs credited so far; two close the breaker", "format": "int64", "type": "integer" }, "held": { "type": "boolean" }, "held_at": { "type": "string" }, "held_by": { "type": "string" }, "hold_reason": { "type": "string" }, "open": { "type": "boolean" }, "reason": { "description": "the detector fault that opened the breaker, if any", "type": "string" } }, "required": [ "open", "held", "healthy_epochs", "detail" ], "type": "object" }, "MediaHealthConsumerView": { "additionalProperties": false, "properties": { "arr": { "description": "kind/name of the holding arr", "type": "string" }, "episode_key": { "description": "SxxEyy; \"-\" for a movie", "type": "string" }, "import_path": { "type": "string" }, "imported_at": { "type": "string" }, "record_type": { "description": "episode | movie", "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "arr", "record_type", "tmdb_id" ], "type": "object" }, "MediaHealthDecisionInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthDecisionInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "reason": { "description": "audited operator note; REQUIRED to reject", "type": "string" } }, "type": "object" }, "MediaHealthDecisionResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthDecisionResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "state": { "description": "the proposal status after the decision", "type": "string" }, "status": { "description": "ok | not_eligible | missing | invalid", "type": "string" } }, "required": [ "status" ], "type": "object" }, "MediaHealthDetail": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthDetail.json" ], "format": "uri", "readOnly": true, "type": "string" }, "history": { "items": { "$ref": "#/components/schemas/MediaHealthRepairEvent" }, "type": [ "array", "null" ] }, "proposal": { "$ref": "#/components/schemas/MediaHealthProposalView" } }, "required": [ "proposal", "history" ], "type": "object" }, "MediaHealthProbeInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthProbeInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "blob_id": { "description": "blob id to probe", "type": "string" }, "media_type": { "description": "Required with tmdb_id for non-admin probes", "enum": [ "movie", "tv" ], "type": "string" }, "reason": { "description": "why this blob needs a fresh probe", "minLength": 1, "type": "string" }, "tmdb_id": { "description": "Required for non-admin probes: exact title with retained evidence for this blob", "format": "int64", "type": "integer" }, "webdav_path": { "description": "WebDAV path to resolve to a blob", "type": "string" } }, "required": [ "reason" ], "type": "object" }, "MediaHealthProbeResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthProbeResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "blob_id": { "type": "string" }, "requested_at": { "type": "string" } }, "required": [ "blob_id", "requested_at" ], "type": "object" }, "MediaHealthProposalView": { "additionalProperties": false, "properties": { "blob_id": { "type": "string" }, "confirmed_at": { "type": "string" }, "consumers": { "items": { "$ref": "#/components/schemas/MediaHealthConsumerView" }, "type": [ "array", "null" ] }, "fault_kind": { "description": "dead_blob", "type": "string" }, "group": { "description": "review | repairing | closed", "type": "string" }, "media_type": { "description": "tv | movie", "type": "string" }, "proposal_id": { "format": "int64", "type": "integer" }, "repair_note": { "type": "string" }, "repair_stage": { "type": "string" }, "size_bytes": { "format": "int64", "type": "integer" }, "status": { "description": "the proposal status grammar", "type": "string" }, "summary": { "description": "what approving this repair will do", "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "webdav_path": { "type": "string" } }, "required": [ "proposal_id", "group", "status", "fault_kind", "blob_id", "confirmed_at", "media_type", "summary", "consumers" ], "type": "object" }, "MediaHealthRepairEvent": { "additionalProperties": false, "properties": { "at": { "type": "string" }, "from_stage": { "type": "string" }, "reason": { "type": "string" }, "to_stage": { "type": "string" } }, "required": [ "to_stage", "at" ], "type": "object" }, "MediaHealthReviewResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MediaHealthReviewResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "breaker_open": { "type": "boolean" }, "breaker_reason": { "type": "string" }, "group": { "type": "string" }, "proposals": { "items": { "$ref": "#/components/schemas/MediaHealthProposalView" }, "type": [ "array", "null" ] } }, "required": [ "breaker_open", "proposals" ], "type": "object" }, "MembershipChange": { "additionalProperties": false, "properties": { "action": { "enum": [ "move", "add", "remove" ], "type": "string" }, "actor": { "description": "Server-authenticated subject that submitted this change", "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/MembershipItem" }, "type": [ "array", "null" ] }, "source": { "type": "string" }, "target": { "type": "string" } }, "required": [ "action", "items" ], "type": "object" }, "MembershipInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MembershipInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "action": { "enum": [ "move", "add", "remove" ], "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/MembershipItem" }, "type": [ "array", "null" ] }, "source": { "type": "string" }, "target": { "type": "string" } }, "required": [ "action", "items" ], "type": "object" }, "MembershipItem": { "additionalProperties": false, "properties": { "is_anime": { "type": "boolean" }, "media_type": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "is_anime" ], "type": "object" }, "MembershipJob": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MembershipJob.json" ], "format": "uri", "readOnly": true, "type": "string" }, "change": { "$ref": "#/components/schemas/MembershipChange" }, "error": { "type": "string" }, "id": { "type": "string" }, "results": { "items": { "$ref": "#/components/schemas/MembershipResult" }, "type": [ "array", "null" ] }, "state": { "enum": [ "pending", "running", "completed", "failed" ], "type": "string" } }, "required": [ "id", "state", "change", "results" ], "type": "object" }, "MembershipJobsBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MembershipJobsBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "jobs": { "items": { "$ref": "#/components/schemas/MembershipJob" }, "type": [ "array", "null" ] } }, "required": [ "jobs" ], "type": "object" }, "MembershipResult": { "additionalProperties": false, "properties": { "action": { "type": "string" }, "bucket": { "type": "string" }, "media_type": { "type": "string" }, "reason": { "type": "string" }, "source": { "type": "string" }, "status": { "type": "string" }, "target": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "watch_items": { "description": "durable rows captured; may also be restored for destination-visible users", "format": "int64", "type": "integer" } }, "required": [ "action", "source", "target", "tmdb_id", "media_type", "status" ], "type": "object" }, "MissingItem": { "additionalProperties": false, "properties": { "check_error": { "description": "an arr lookup errored — membership uncertain, not pruned", "type": "boolean" }, "media_type": { "type": "string" }, "missing_in": { "description": "arr instance names the item is absent from", "items": { "type": "string" }, "type": [ "array", "null" ] }, "rule": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "missing_in" ], "type": "object" }, "MissingOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MissingOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/MissingItem" }, "type": [ "array", "null" ] } }, "required": [ "items" ], "type": "object" }, "ModuleHistory": { "additionalProperties": false, "properties": { "name": { "type": "string" }, "series": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "transitions": { "format": "int64", "type": "integer" }, "uptime": { "format": "double", "type": "number" } }, "required": [ "name", "series", "uptime", "transitions" ], "type": "object" }, "MovieCutoverBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MovieCutoverBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "result": { "$ref": "#/components/schemas/MovieCutoverResult", "description": "the cutover outcome, recovery paths, snapshot count and primary path plan" } }, "required": [ "result" ], "type": "object" }, "MovieCutoverCandidate": { "additionalProperties": false, "properties": { "buckets": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "entries": { "items": { "$ref": "#/components/schemas/LegacyMovieEntry" }, "type": [ "array", "null" ] }, "recovery_cutover_id": { "format": "int64", "type": "integer" }, "tmdb_id": { "format": "int64", "type": "integer" }, "unresolved_paths": { "items": { "type": "string" }, "type": [ "array", "null" ] } }, "required": [ "tmdb_id", "buckets", "entries" ], "type": "object" }, "MovieCutoverEvidence": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MovieCutoverEvidence.json" ], "format": "uri", "readOnly": true, "type": "string" }, "entries": { "items": { "$ref": "#/components/schemas/LegacyMovieEntry" }, "type": [ "array", "null" ] }, "latest": { "$ref": "#/components/schemas/MovieCutoverResult" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "entries" ], "type": "object" }, "MovieCutoverPendingBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/MovieCutoverPendingBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "candidates": { "description": "legacy entries and unfinished recovery cutovers grouped by movie", "items": { "$ref": "#/components/schemas/MovieCutoverCandidate" }, "type": [ "array", "null" ] } }, "required": [ "candidates" ], "type": "object" }, "MovieCutoverResult": { "additionalProperties": false, "properties": { "cutover_id": { "format": "int64", "type": "integer" }, "detail": { "type": "string" }, "entries": { "items": { "$ref": "#/components/schemas/LegacyMovieEntry" }, "type": [ "array", "null" ] }, "primary_moves": { "items": { "$ref": "#/components/schemas/PrimaryMove" }, "type": [ "array", "null" ] }, "status": { "type": "string" }, "step": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "unresolved_paths": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "watch_items": { "format": "int64", "type": "integer" }, "watch_snapshot": { "format": "int64", "type": "integer" } }, "required": [ "cutover_id", "tmdb_id", "status", "step", "watch_items", "watch_snapshot" ], "type": "object" }, "NotifyLogEntry": { "additionalProperties": false, "properties": { "event": { "description": "media_arrived | media_stalled | media_regrab | media_import_issue", "type": "string" }, "hint": { "description": "context recorded at send time (stall hint, or issue state + sanitized reason folded with arr/episodes/age)", "type": "string" }, "media_type": { "type": "string" }, "owner": { "description": "the bucket owner (requester) at send time", "type": "string" }, "sent_at": { "type": "string" }, "stage": { "description": "0 arrived; 1 first-stall; 2 incomplete-followup; regrab attempt / issue step otherwise", "format": "int64", "type": "integer" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "year": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "event", "stage", "sent_at" ], "type": "object" }, "NotifyRecentOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/NotifyRecentOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "entries": { "items": { "$ref": "#/components/schemas/NotifyLogEntry" }, "type": [ "array", "null" ] } }, "required": [ "entries" ], "type": "object" }, "Observation": { "additionalProperties": false, "properties": { "attempted_at": { "description": "Completion time of the latest observation attempt, successful or failed", "format": "date-time", "type": "string" }, "error": { "description": "Latest observation failure; retained findings are not a new successful observation", "type": "string" }, "freshness": { "description": "Unknown before a valid sample; stale only after the freshness threshold", "enum": [ "unknown", "fresh", "stale" ], "type": "string" } }, "required": [ "freshness" ], "type": "object" }, "OpenLink": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "state": { "enum": [ "observed", "missing", "unavailable", "unconfigured", "not_permitted" ], "type": "string" }, "url": { "description": "The viewer's own Jellyfin item page; the person signs in to Jellyfin as themself", "type": "string" } }, "required": [ "state" ], "type": "object" }, "Operator": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/Operator.json" ], "format": "uri", "readOnly": true, "type": "string" }, "capabilities": { "$ref": "#/components/schemas/OperatorCapabilities" }, "name": { "type": "string" }, "recommendation_profile": { "type": "string" }, "requester": { "type": "string" }, "role": { "enum": [ "admin", "household" ], "type": "string" }, "subject": { "type": "string" }, "watch_user": { "type": "string" } }, "required": [ "subject", "name", "role", "requester", "watch_user", "recommendation_profile", "capabilities" ], "type": "object" }, "OperatorCapabilities": { "additionalProperties": false, "properties": { "administer": { "type": "boolean" }, "manage_library": { "type": "boolean" }, "manage_memberships": { "type": "boolean" }, "recommendation_profiles": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "request_media": { "type": "boolean" }, "requesters": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "watch_users": { "items": { "type": "string" }, "type": [ "array", "null" ] } }, "required": [ "administer", "manage_library", "manage_memberships", "request_media", "watch_users", "recommendation_profiles", "requesters" ], "type": "object" }, "Option": { "additionalProperties": false, "properties": { "id": { "format": "int64", "type": "integer" }, "logo_url": { "description": "Validated TMDB CDN logo for a watch provider; absent for genres and when upstream has no safe logo", "type": "string" }, "name": { "type": "string" } }, "required": [ "id", "name" ], "type": "object" }, "Options": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/Options.json" ], "format": "uri", "readOnly": true, "type": "string" }, "genres": { "items": { "$ref": "#/components/schemas/Option" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "region": { "description": "Comma-separated configured catalogue regions", "type": "string" }, "services": { "description": "Curated streaming providers observed in their configured regions, not title availability or playback evidence", "items": { "$ref": "#/components/schemas/Option" }, "type": [ "array", "null" ] }, "state": { "enum": [ "observed", "partial", "unavailable" ], "type": "string" } }, "required": [ "state", "media_type", "region", "genres", "services", "observations" ], "type": "object" }, "OwnerCount": { "additionalProperties": false, "properties": { "count": { "format": "int64", "type": "integer" }, "owner": { "type": "string" } }, "required": [ "owner", "count" ], "type": "object" }, "Page": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/Page.json" ], "format": "uri", "readOnly": true, "type": "string" }, "discovery": { "$ref": "#/components/schemas/Discovery", "description": "General discovery context and upstream page observation, independent of local holding freshness" }, "items": { "items": { "$ref": "#/components/schemas/Title" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "all", "movie", "tv" ], "type": "string" }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "page": { "format": "int64", "type": "integer" }, "query": { "type": "string" }, "source": { "enum": [ "search", "general", "related" ], "type": "string" }, "state": { "enum": [ "observed", "partial" ], "type": "string" }, "total_pages": { "description": "Known pages; merged regional service lanes expose only the materialized prefix until exhaustion", "format": "int64", "type": "integer" }, "total_results": { "description": "Upstream matches before type filtering, or the known deduplicated prefix for merged regional service lanes", "format": "int64", "type": "integer" } }, "required": [ "state", "source", "query", "media_type", "page", "total_pages", "total_results", "items", "observations" ], "type": "object" }, "PayloadSanitizeBlockView": { "additionalProperties": false, "properties": { "dav_dir": { "type": "string" }, "detail": { "type": "string" }, "from_name": { "type": "string" }, "recorded_at": { "type": "string" }, "to_name": { "type": "string" } }, "required": [ "dav_dir", "from_name", "to_name", "detail", "recorded_at" ], "type": "object" }, "PerformerDetail": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/PerformerDetail.json" ], "format": "uri", "readOnly": true, "type": "string" }, "also_known_as": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "biography": { "type": "string" }, "birthday": { "type": "string" }, "deathday": { "type": "string" }, "known_for_department": { "type": "string" }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "name": { "type": "string" }, "performer_id": { "format": "int64", "type": "integer" }, "place_of_birth": { "type": "string" }, "profile_url": { "type": "string" }, "source": { "enum": [ "seerr" ], "type": "string" } }, "required": [ "performer_id", "metadata_state", "source" ], "type": "object" }, "Person": { "additionalProperties": false, "properties": { "key": { "type": "string" }, "name": { "description": "Jellyfin username the household member is known by", "type": "string" } }, "required": [ "key", "name" ], "type": "object" }, "PrimaryMove": { "additionalProperties": false, "properties": { "bucket": { "type": "string" }, "new_path": { "type": "string" }, "old_path": { "type": "string" } }, "required": [ "bucket", "old_path", "new_path" ], "type": "object" }, "ProvenanceItem": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "media_type": { "type": "string" }, "owner": { "type": "string" }, "source": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "title", "owner", "arr", "source" ], "type": "object" }, "Provider": { "additionalProperties": false, "properties": { "id": { "format": "int64", "type": "integer" }, "logo_url": { "type": "string" }, "name": { "type": "string" } }, "required": [ "id", "name" ], "type": "object" }, "RailStats": { "additionalProperties": false, "properties": { "failed": { "format": "int64", "type": "integer" }, "last_import": { "type": "string" }, "missing": { "format": "int64", "type": "integer" }, "queue": { "format": "int64", "type": "integer" }, "size_bytes": { "format": "int64", "type": "integer" } }, "required": [ "size_bytes", "queue", "missing", "failed" ], "type": "object" }, "Rating": { "additionalProperties": false, "properties": { "score": { "description": "RT is 0–100; IMDb and TMDB are 0–10. Absent is never zero.", "format": "double", "type": "number" }, "source": { "enum": [ "rt_critics", "rt_audience", "imdb", "tmdb" ], "type": "string" }, "state": { "enum": [ "observed", "unrated", "missing", "unavailable" ], "type": "string" }, "status": { "description": "Observed RT critics or audience label, never inferred from a percentage.", "type": "string" }, "url": { "type": "string" }, "votes": { "format": "int64", "type": "integer" } }, "required": [ "source", "state" ], "type": "object" }, "ReadProfile": { "additionalProperties": false, "properties": { "key": { "type": "string" }, "name": { "type": "string" } }, "required": [ "key", "name" ], "type": "object" }, "ReadinessStage": { "additionalProperties": false, "properties": { "name": { "enum": [ "request", "acquisition", "visibility", "playback" ], "type": "string" }, "observed_at": { "description": "When the evidence was last observed (RFC 3339 UTC), when the owner records it", "type": "string" }, "source": { "description": "The evidence owner this stage reads; it never stands in for another stage", "type": "string" }, "state": { "enum": [ "done", "partial", "in_progress", "none", "unknown", "stale", "conflicting", "failed" ], "type": "string" }, "summary": { "description": "What this stage's own evidence says, including why it is unknown, stale, conflicting or failed", "type": "string" } }, "required": [ "name", "state", "summary", "source" ], "type": "object" }, "RecentOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecentOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "entries": { "items": { "$ref": "#/components/schemas/DispatchLogEntry" }, "type": [ "array", "null" ] } }, "required": [ "entries" ], "type": "object" }, "RecommendationCoverage": { "additionalProperties": false, "properties": { "complete": { "description": "Successful ranked snapshot and all active predicates observed for its scoped candidates; not freshness, catalogue completeness or playback proof", "type": "boolean" }, "excluded": { "format": "int64", "type": "integer" }, "matched": { "format": "int64", "type": "integer" }, "total": { "format": "int64", "type": "integer" }, "unresolved": { "format": "int64", "type": "integer" } }, "required": [ "total", "matched", "excluded", "unresolved", "complete" ], "type": "object" }, "RecommendationDismissal": { "additionalProperties": false, "properties": { "hidden_at": { "format": "date-time", "type": "string" }, "hidden_by": { "description": "Household requester key of the operator who hid it", "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "poster_path": { "type": "string" }, "title": { "description": "Display name captured when hidden; empty when it was unknown", "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "year": { "format": "int64", "type": "integer" } }, "required": [ "media_type", "tmdb_id", "title", "year", "poster_path", "hidden_by", "hidden_at" ], "type": "object" }, "RecommendationDismissals": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationDismissals.json" ], "format": "uri", "readOnly": true, "type": "string" }, "dismissals": { "items": { "$ref": "#/components/schemas/RecommendationDismissal" }, "type": [ "array", "null" ] }, "profile": { "type": "string" } }, "required": [ "profile", "dismissals" ], "type": "object" }, "RecommendationFact": { "additionalProperties": false, "properties": { "genre_source": { "description": "Ranked genre context takes precedence; metadata is a fallback only when ranked genres are unknown", "enum": [ "ranked", "metadata", "unknown" ], "type": "string" }, "match": { "enum": [ "matched", "excluded", "unresolved" ], "type": "string" }, "metadata": { "$ref": "#/components/schemas/TitleMetadata" } }, "required": [ "metadata", "match", "genre_source" ], "type": "object" }, "RecommendationFeed": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationFeed.json" ], "format": "uri", "readOnly": true, "type": "string" }, "attempted_at": { "format": "date-time", "type": "string" }, "expires_at": { "description": "observed_at plus the configured feed interval; expiry only, not a scheduled refresh or retry", "format": "date-time", "type": "string" }, "failure": { "enum": [ "profile_resolution", "memberships", "history", "candidates", "cycle" ], "type": "string" }, "materialization": { "enum": [ "unknown", "pending", "current", "failed" ], "type": "string" }, "movies": { "items": { "$ref": "#/components/schemas/Candidate" }, "type": [ "array", "null" ] }, "observed_at": { "format": "date-time", "type": "string" }, "outcome": { "enum": [ "unknown", "ranked", "no_seeds", "empty" ], "type": "string" }, "profile": { "$ref": "#/components/schemas/ReadProfile" }, "projection": { "$ref": "#/components/schemas/RecommendationProjection" }, "shows": { "items": { "$ref": "#/components/schemas/Candidate" }, "type": [ "array", "null" ] }, "state": { "enum": [ "current", "stale", "unavailable" ], "type": "string" } }, "required": [ "projection", "profile", "state", "outcome", "materialization", "movies", "shows" ], "type": "object" }, "RecommendationHideInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationHideInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "poster_path": { "maxLength": 200, "type": "string" }, "title": { "description": "Display hint, used only when the retained feed no longer carries the title", "maxLength": 300, "type": "string" }, "tmdb_id": { "format": "int64", "minimum": 1, "type": "integer" }, "year": { "format": "int64", "maximum": 9999, "minimum": 0, "type": "integer" } }, "required": [ "media_type", "tmdb_id" ], "type": "object" }, "RecommendationHideResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationHideResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "created": { "description": "False when the title was already hidden", "type": "boolean" }, "dismissal": { "$ref": "#/components/schemas/RecommendationDismissal" }, "materialization": { "description": "Jellyfin recommendation folders after the hide; failed leaves the dismissal in force until the next cycle converges them", "enum": [ "current", "failed", "unchanged" ], "type": "string" }, "profile": { "type": "string" } }, "required": [ "profile", "dismissal", "created", "materialization" ], "type": "object" }, "RecommendationProfiles": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationProfiles.json" ], "format": "uri", "readOnly": true, "type": "string" }, "default_profile": { "type": "string" }, "profiles": { "items": { "$ref": "#/components/schemas/ReadProfile" }, "type": [ "array", "null" ] } }, "required": [ "profiles", "default_profile" ], "type": "object" }, "RecommendationProjection": { "additionalProperties": false, "properties": { "coverage": { "$ref": "#/components/schemas/RecommendationCoverage" }, "facts": { "description": "Scoped candidates in original movie rank followed by original series rank; unknown observations never prove exclusion", "items": { "$ref": "#/components/schemas/RecommendationFact" }, "type": [ "array", "null" ] }, "genre_id": { "format": "int64", "type": "integer" }, "media_type": { "enum": [ "all", "movie", "tv" ], "type": "string" }, "service_id": { "format": "int64", "type": "integer" }, "unresolved": { "description": "Possible matches with unknown active predicates, in original per-media relative order", "items": { "$ref": "#/components/schemas/Candidate" }, "type": [ "array", "null" ] } }, "required": [ "media_type", "genre_id", "service_id", "coverage", "facts", "unresolved" ], "type": "object" }, "RecommendationRestoreResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationRestoreResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "profile": { "type": "string" }, "restored": { "description": "False when the title was not hidden", "type": "boolean" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "profile", "media_type", "tmdb_id", "restored" ], "type": "object" }, "RecommendationSyncResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RecommendationSyncResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "state": { "enum": [ "healthy", "degraded", "unhealthy" ], "type": "string" }, "status": { "description": "synced", "type": "string" } }, "required": [ "status", "state" ], "type": "object" }, "RedispatchInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RedispatchInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "items": { "description": "items to re-dispatch", "items": { "$ref": "#/components/schemas/RedispatchItem" }, "type": [ "array", "null" ] } }, "required": [ "items" ], "type": "object" }, "RedispatchItem": { "additionalProperties": false, "properties": { "media_type": { "enum": [ "tv", "movie" ], "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type" ], "type": "object" }, "RedispatchOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RedispatchOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "results": { "items": { "$ref": "#/components/schemas/RedispatchResult" }, "type": [ "array", "null" ] } }, "required": [ "results" ], "type": "object" }, "RedispatchResult": { "additionalProperties": false, "properties": { "media_type": { "type": "string" }, "reason": { "type": "string" }, "status": { "description": "ok | partial | failed | skipped", "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "status" ], "type": "object" }, "RegrabRequest": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RegrabRequest.json" ], "format": "uri", "readOnly": true, "type": "string" }, "episode_ids": { "description": "arr episode ids to regrab (tv)", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "episode_keys": { "description": "SxxEyy keys to regrab (tv)", "items": { "type": "string" }, "type": [ "array", "null" ] }, "season": { "description": "regrab a whole season (tv)", "format": "int64", "type": "integer" } }, "type": "object" }, "RegrabResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RegrabResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "blocklisted": { "format": "int64", "type": "integer" }, "cleared": { "format": "int64", "type": "integer" }, "detail": { "type": "string" }, "searched": { "format": "int64", "type": "integer" }, "status": { "description": "ok | busy | superseded | missing_in_arr | invalid | arr_error", "type": "string" } }, "required": [ "status", "blocklisted", "cleared", "searched" ], "type": "object" }, "RemovalLink": { "additionalProperties": false, "properties": { "bucket": { "type": "string" }, "orphan": { "type": "boolean" }, "path": { "type": "string" }, "target": { "type": "string" } }, "required": [ "bucket", "path", "target", "orphan" ], "type": "object" }, "RemoveFromQueueInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RemoveFromQueueInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "reason": { "description": "required non-empty audited queue-removal reason", "type": "string" }, "then": { "description": "reopen for a new grab, or resolve an already-imported/duplicate issue", "enum": [ "reopen", "resolve" ], "type": "string" } }, "required": [ "reason", "then" ], "type": "object" }, "RenameHistoryOutputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RenameHistoryOutputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "passes": { "items": { "$ref": "#/components/schemas/RenamePass" }, "type": [ "array", "null" ] } }, "required": [ "passes" ], "type": "object" }, "RenamePass": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "detail": { "type": "string" }, "ended_at": { "type": "string" }, "files": { "format": "int64", "type": "integer" }, "pass_id": { "format": "int64", "type": "integer" }, "plan_json": { "type": "string" }, "repointed": { "format": "int64", "type": "integer" }, "request_id": { "description": "Opaque originating request identity, retained in the durable plan; absent for legacy or uncorrelated callers. Correlation only, not idempotency.", "type": "string" }, "series_id": { "format": "int64", "type": "integer" }, "started_at": { "type": "string" }, "status": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "watch_items": { "format": "int64", "type": "integer" } }, "required": [ "pass_id", "tmdb_id", "arr", "series_id", "title", "status", "plan_json", "files", "watch_items", "repointed", "detail", "started_at", "ended_at" ], "type": "object" }, "RenamePlan": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "files": { "items": { "$ref": "#/components/schemas/RenamePlanFile" }, "type": [ "array", "null" ] }, "series_id": { "format": "int64", "type": "integer" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "arr", "series_id", "title", "files" ], "type": "object" }, "RenamePlanBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RenamePlanBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "plan": { "$ref": "#/components/schemas/RenamePlan", "description": "the holding Sonarr, the series, and each pending file's existing and new path" } }, "required": [ "plan" ], "type": "object" }, "RenamePlanFile": { "additionalProperties": false, "properties": { "episode_file_id": { "format": "int64", "type": "integer" }, "episode_numbers": { "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "existing_path": { "type": "string" }, "new_path": { "type": "string" }, "season_number": { "format": "int64", "type": "integer" } }, "required": [ "episode_file_id", "season_number", "episode_numbers", "existing_path", "new_path" ], "type": "object" }, "RenameResult": { "additionalProperties": false, "properties": { "converged": { "type": "boolean" }, "detail": { "type": "string" }, "pass_id": { "format": "int64", "type": "integer" }, "plan": { "$ref": "#/components/schemas/RenamePlan" }, "renamed": { "format": "int64", "type": "integer" }, "repointed": { "items": { "$ref": "#/components/schemas/RepointedLink" }, "type": [ "array", "null" ] }, "skipped": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "status": { "type": "string" }, "watch_items": { "format": "int64", "type": "integer" }, "watch_snapshot": { "format": "int64", "type": "integer" } }, "required": [ "pass_id", "plan", "status", "renamed", "watch_items", "watch_snapshot", "converged" ], "type": "object" }, "RenameResultBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RenameResultBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "result": { "$ref": "#/components/schemas/RenameResult", "description": "the pass outcome with the plan it ran, the watch-state counts and any repointed layer links" } }, "required": [ "result" ], "type": "object" }, "ReplacementHoldReleaseResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ReplacementHoldReleaseResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "released": { "type": "boolean" } }, "required": [ "released" ], "type": "object" }, "ReplacementHoldView": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "created_at": { "format": "date-time", "type": "string" }, "expires_at": { "format": "date-time", "type": "string" }, "reason": { "type": "string" }, "record_id": { "format": "int64", "type": "integer" }, "record_type": { "type": "string" }, "requested_by": { "type": "string" } }, "required": [ "arr", "record_type", "record_id", "requested_by", "reason", "created_at", "expires_at" ], "type": "object" }, "ReplacementHoldsResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ReplacementHoldsResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "holds": { "items": { "$ref": "#/components/schemas/ReplacementHoldView" }, "type": [ "array", "null" ] } }, "required": [ "holds" ], "type": "object" }, "RepointedLink": { "additionalProperties": false, "properties": { "bucket": { "type": "string" }, "dir": { "type": "string" }, "new_name": { "type": "string" }, "new_target": { "type": "string" }, "old_name": { "type": "string" }, "old_target": { "type": "string" } }, "required": [ "bucket", "dir", "old_name", "new_name", "old_target", "new_target" ], "type": "object" }, "RequestIntentBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RequestIntentBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "recommendation_profile": { "type": "string" }, "requester": { "description": "Household requester key to attribute the request to; defaults to the signed-in operator's own requester and must be one of the operator's capability requesters", "type": "string" }, "seasons": { "description": "Television only: the explicit seasons wanted (0 is specials). An empty selection is refused, never read as all seasons. Omit for a movie", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "source": { "default": "title", "description": "Recommendation requires recommendation_profile and settles that profile's own acceptance only when it is also the requester", "enum": [ "title", "recommendation" ], "type": "string" }, "tmdb_id": { "format": "int64", "minimum": 1, "type": "integer" } }, "required": [ "media_type", "tmdb_id" ], "type": "object" }, "RequestProgress": { "additionalProperties": false, "properties": { "actor": { "$ref": "#/components/schemas/Actor", "description": "Who filed it, as recorded; absent when the request was filed outside the cockpit" }, "awaiting_approval": { "description": "The request is filed in Seerr and nothing has been dispatched, imported or observed yet, so no acquisition has started. Absent otherwise", "type": "boolean" }, "blocking_stage": { "description": "First stage without done evidence. Absent only when every stage has it. Not a readiness claim", "enum": [ "request", "acquisition", "visibility", "playback" ], "type": "string" }, "filed_by_you": { "description": "The signed-in operator filed this command", "type": "boolean" }, "id": { "description": "request-N for a cockpit command, dispatch-N for a request Seerr approved outside the cockpit", "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "on_behalf": { "description": "The actor's own requester differs from the attributed requester", "type": "boolean" }, "requested_at": { "type": "string" }, "requester": { "$ref": "#/components/schemas/Person", "description": "The household member the request is attributed to; this decides which feed the item belongs to" }, "seasons": { "description": "Television seasons explicitly requested; empty for a movie or when not recorded", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "stages": { "items": { "$ref": "#/components/schemas/ReadinessStage" }, "type": [ "array", "null" ] }, "title": { "description": "Known from the dispatch log or library membership; empty when no local record names the title yet", "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "id", "tmdb_id", "media_type", "requester", "on_behalf", "filed_by_you", "seasons", "stages" ], "type": "object" }, "RequestReceipt": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RequestReceipt.json" ], "format": "uri", "readOnly": true, "type": "string" }, "actor": { "$ref": "#/components/schemas/RequestReceiptActor", "description": "Authenticated operator who issued the command; separate from the requester" }, "attempts": { "format": "int64", "type": "integer" }, "coverage": { "description": "One outcome per selected season, never inferred from other seasons", "items": { "$ref": "#/components/schemas/RequestReceiptCoverage" }, "type": [ "array", "null" ] }, "created_at": { "type": "string" }, "detail": { "description": "Why the command is pending or what was refused", "type": "string" }, "id": { "description": "Native request record; retrying the same command resumes this record", "format": "int64", "type": "integer" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "membership": { "$ref": "#/components/schemas/RequestReceiptMembership" }, "on_behalf": { "description": "The requester differs from the acting operator's own household requester", "type": "boolean" }, "recommendation_profile": { "type": "string" }, "requester": { "description": "Household requester the request is attributed to", "type": "string" }, "requester_username": { "type": "string" }, "seasons": { "description": "Explicit television seasons the operator asked for; empty for a movie", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "seerr": { "$ref": "#/components/schemas/RequestReceiptSeerr" }, "source": { "enum": [ "title", "recommendation" ], "type": "string" }, "state": { "description": "Settled: every part has a verified outcome. Pending: a fact is unresolved. Retired: an administrator ended a stale-identity pending command without cancelling any Seerr request or reversing media effects", "enum": [ "settled", "pending", "retired" ], "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "updated_at": { "type": "string" } }, "required": [ "id", "media_type", "tmdb_id", "state", "requester", "requester_username", "actor", "on_behalf", "source", "seasons", "membership", "seerr", "coverage", "attempts", "created_at", "updated_at" ], "type": "object" }, "RequestReceiptActor": { "additionalProperties": false, "properties": { "name": { "type": "string" }, "requester": { "description": "The acting operator's own household requester key", "type": "string" }, "role": { "enum": [ "admin", "household" ], "type": "string" } }, "required": [ "name", "role", "requester" ], "type": "object" }, "RequestReceiptCoverage": { "additionalProperties": false, "properties": { "outcome": { "enum": [ "requested", "already_requested", "already_held", "unresolved" ], "type": "string" }, "request_id": { "format": "int64", "type": "integer" }, "season": { "format": "int64", "type": "integer" } }, "required": [ "season", "outcome" ], "type": "object" }, "RequestReceiptMembership": { "additionalProperties": false, "properties": { "bucket": { "description": "Library route the membership landed in", "type": "string" }, "dispatch_log_id": { "format": "int64", "type": "integer" }, "status": { "enum": [ "added", "already_owned", "pending_dispatch", "conflict", "failed" ], "type": "string" } }, "required": [ "status" ], "type": "object" }, "RequestReceiptSeerr": { "additionalProperties": false, "properties": { "outcome": { "enum": [ "requested", "already_requested", "not_needed", "not_attempted", "unresolved" ], "type": "string" }, "request_id": { "description": "Seerr request attributed to the requester that covers this command", "format": "int64", "type": "integer" } }, "required": [ "outcome" ], "type": "object" }, "RestartResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/RestartResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "kind": { "description": "process | sibling", "type": "string" }, "status": { "description": "restarting | degraded", "type": "string" }, "target": { "type": "string" } }, "required": [ "target", "kind", "status" ], "type": "object" }, "ResumeBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ResumeBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/ResumeTitle" }, "type": [ "array", "null" ] } }, "required": [ "items" ], "type": "object" }, "ResumeTitle": { "additionalProperties": false, "properties": { "episode": { "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "progress": { "format": "double", "maximum": 1, "minimum": 0, "type": "number" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "title", "progress" ], "type": "object" }, "Row": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "candidate_health": { "type": "string" }, "candidate_key": { "type": "string" }, "candidate_reason": { "type": "string" }, "download_id": { "type": "string" }, "episode": { "type": "string" }, "episode_count": { "format": "int64", "type": "integer" }, "eta": { "type": "string" }, "progress": { "format": "double", "type": "number" }, "protocol": { "type": "string" }, "source": { "type": "string" }, "state": { "type": "string" }, "state_detail": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "title", "protocol", "progress", "state", "source" ], "type": "object" }, "Season": { "additionalProperties": false, "properties": { "air_date": { "type": "string" }, "coverage": { "enum": [ "none", "partial", "complete", "unknown" ], "type": "string" }, "episode_count": { "format": "int64", "type": "integer" }, "name": { "type": "string" }, "number": { "format": "int64", "type": "integer" }, "overview": { "type": "string" }, "recorded_episodes": { "format": "int64", "type": "integer" }, "request_state": { "enum": [ "none", "requested", "unknown" ], "type": "string" }, "seerr_state": { "enum": [ "untracked", "unknown", "pending", "processing", "partial", "available", "blocklisted", "deleted" ], "type": "string" } }, "required": [ "number", "name", "overview", "episode_count", "recorded_episodes", "coverage", "request_state", "seerr_state" ], "type": "object" }, "SeasonCoverage": { "additionalProperties": false, "properties": { "coverage": { "enum": [ "complete", "partial", "none", "unknown" ], "type": "string" }, "season": { "format": "int64", "type": "integer" } }, "required": [ "season", "coverage" ], "type": "object" }, "SeasonDetail": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/SeasonDetail.json" ], "format": "uri", "readOnly": true, "type": "string" }, "episodes": { "items": { "$ref": "#/components/schemas/Episode" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "tv" ], "type": "string" }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "observations": { "items": { "$ref": "#/components/schemas/LibraryObservation" }, "type": [ "array", "null" ] }, "season": { "$ref": "#/components/schemas/Season" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "metadata_state", "season", "episodes", "observations" ], "type": "object" }, "SeasonGroup": { "additionalProperties": false, "properties": { "episodes": { "items": { "$ref": "#/components/schemas/EpisodeRow" }, "type": [ "array", "null" ] }, "season": { "format": "int64", "type": "integer" } }, "required": [ "season", "episodes" ], "type": "object" }, "SeedContribution": { "additionalProperties": false, "properties": { "added": { "description": "A successful attributed addition contributed nonzero seed weight", "type": "boolean" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "title": { "description": "Observed display name; absent when unknown", "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "watched": { "description": "A played history event contributed nonzero seed weight", "type": "boolean" } }, "required": [ "watched", "added", "media_type", "tmdb_id" ], "type": "object" }, "SeerrObservation": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "requests": { "items": { "$ref": "#/components/schemas/SeerrRequest" }, "type": [ "array", "null" ] }, "state": { "enum": [ "observed", "unavailable" ], "type": "string" } }, "required": [ "state", "requests" ], "type": "object" }, "SeerrRequest": { "additionalProperties": false, "properties": { "id": { "format": "int64", "type": "integer" }, "status": { "enum": [ "pending", "approved", "declined", "failed", "completed", "unknown" ], "type": "string" } }, "required": [ "id", "status" ], "type": "object" }, "SelectEpisodesInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/SelectEpisodesInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "episode_ids": { "description": "explicit arr episode ids to import (re-verified aired+monitored+belonging server-side)", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] } }, "required": [ "episode_ids" ], "type": "object" }, "SourceDetail": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "imported": { "description": "import timestamp (RFC3339)", "type": "string" }, "indexer": { "type": "string" } }, "required": [ "arr" ], "type": "object" }, "SourceUsage": { "additionalProperties": false, "properties": { "item_count": { "format": "int64", "type": "integer" }, "source": { "type": "string" } }, "required": [ "source", "item_count" ], "type": "object" }, "SpottarrFreshnessView": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/SpottarrFreshnessView.json" ], "format": "uri", "readOnly": true, "type": "string" }, "age": { "type": "string" }, "age_seconds": { "format": "int64", "type": "integer" }, "checked_at": { "format": "date-time", "type": "string" }, "count": { "format": "int64", "type": "integer" }, "detail": { "type": "string" }, "enabled": { "type": "boolean" }, "known": { "type": "boolean" }, "newest": { "format": "date-time", "type": "string" }, "state": { "enum": [ "disabled", "starting", "healthy", "degraded", "unhealthy", "stopped" ], "type": "string" } }, "required": [ "enabled", "known", "state" ], "type": "object" }, "Title": { "additionalProperties": false, "properties": { "backdrop_url": { "description": "Landscape artwork on the TMDB image CDN; absent when none is observed or the upstream path is not a CDN-relative path", "type": "string" }, "genre_ids": { "description": "TMDB genre IDs in this title's media-type namespace; absent is unobserved, empty is observed without genres", "items": { "format": "int64", "type": "integer" }, "type": "array" }, "held": { "enum": [ "held", "unheld", "unknown" ], "type": "string" }, "libraries": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "overview": { "type": "string" }, "poster_url": { "type": "string" }, "release_date": { "type": "string" }, "request_state": { "enum": [ "none", "requested", "unknown" ], "type": "string" }, "seerr_state": { "enum": [ "untracked", "unknown", "pending", "processing", "partial", "available", "blocklisted", "deleted" ], "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "title", "overview", "held", "request_state", "seerr_state", "libraries" ], "type": "object" }, "TitleCast": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TitleCast.json" ], "format": "uri", "readOnly": true, "type": "string" }, "credit_context": { "description": "Seerr exposes only each TV performer's most frequent aggregate role, not every role or episode count", "enum": [ "movie-character", "tv-leading-character" ], "type": "string" }, "items": { "items": { "$ref": "#/components/schemas/CastMember" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "metadata_state": { "enum": [ "observed", "missing", "unavailable" ], "type": "string" }, "paging": { "description": "One complete returned Seerr cast list, not invented upstream pages", "enum": [ "unpaged" ], "type": "string" }, "source": { "enum": [ "seerr" ], "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "metadata_state", "source", "paging", "credit_context", "items" ], "type": "object" }, "TitleDiagnosis": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TitleDiagnosis.json" ], "format": "uri", "readOnly": true, "type": "string" }, "candidates": { "items": { "$ref": "#/components/schemas/TriageDetail" }, "type": [ "array", "null" ] }, "dispatch": { "items": { "$ref": "#/components/schemas/DispatchLogEntry" }, "type": [ "array", "null" ] }, "dispatch_observation": { "$ref": "#/components/schemas/TitleDiagnosisObservation" }, "imports_observation": { "$ref": "#/components/schemas/TitleDiagnosisObservation" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "missing": { "items": { "$ref": "#/components/schemas/MissingItem" }, "type": [ "array", "null" ] }, "presence_observation": { "$ref": "#/components/schemas/TitleDiagnosisObservation" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "candidates", "dispatch", "missing", "imports_observation", "dispatch_observation", "presence_observation" ], "type": "object" }, "TitleDiagnosisObservation": { "additionalProperties": false, "properties": { "detail": { "type": "string" }, "state": { "enum": [ "observed", "unavailable" ], "type": "string" } }, "required": [ "state" ], "type": "object" }, "TitleMediaHealth": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TitleMediaHealth.json" ], "format": "uri", "readOnly": true, "type": "string" }, "breaker": { "$ref": "#/components/schemas/MediaHealthBreakerResult" }, "enabled": { "type": "boolean" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "proposals": { "items": { "$ref": "#/components/schemas/TitleMediaHealthProposal" }, "type": [ "array", "null" ] }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "enabled", "breaker", "proposals" ], "type": "object" }, "TitleMediaHealthFile": { "additionalProperties": false, "properties": { "arr": { "type": "string" }, "file_id": { "format": "int64", "type": "integer" }, "path": { "type": "string" }, "record_id": { "format": "int64", "type": "integer" } }, "required": [ "arr", "record_id", "file_id", "path" ], "type": "object" }, "TitleMediaHealthProposal": { "additionalProperties": false, "properties": { "files": { "items": { "$ref": "#/components/schemas/TitleMediaHealthFile" }, "type": [ "array", "null" ] }, "first_attempt_at": { "format": "date-time", "type": "string" }, "history": { "items": { "$ref": "#/components/schemas/MediaHealthRepairEvent" }, "type": [ "array", "null" ] }, "proposal": { "$ref": "#/components/schemas/MediaHealthProposalView" }, "usenet_attempts": { "format": "int64", "type": "integer" }, "verify_attempts": { "description": "Recorded inconclusive verification retries; a successful first read does not increment this", "format": "int64", "type": "integer" } }, "required": [ "files", "usenet_attempts", "verify_attempts", "proposal", "history" ], "type": "object" }, "TitleMetadata": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TitleMetadata.json" ], "format": "uri", "readOnly": true, "type": "string" }, "checked_at": { "format": "date-time", "type": "string" }, "genre_state": { "enum": [ "unobserved", "observed", "missing", "unavailable" ], "type": "string" }, "genres": { "items": { "$ref": "#/components/schemas/Genre" }, "type": [ "array", "null" ] }, "genres_observed_at": { "format": "date-time", "type": "string" }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "provider_state": { "enum": [ "unobserved", "observed", "missing", "unavailable" ], "type": "string" }, "providers": { "items": { "$ref": "#/components/schemas/Provider" }, "type": [ "array", "null" ] }, "providers_observed_at": { "format": "date-time", "type": "string" }, "region": { "enum": [ "NL" ], "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" } }, "required": [ "tmdb_id", "media_type", "region", "genre_state", "provider_state", "genres", "providers" ], "type": "object" }, "TitleRequestsBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TitleRequestsBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "requests": { "items": { "$ref": "#/components/schemas/RequestReceipt" }, "type": [ "array", "null" ] } }, "required": [ "requests" ], "type": "object" }, "TitleVersion": { "additionalProperties": false, "properties": { "file": { "$ref": "#/components/schemas/FileDetail" }, "role": { "enum": [ "primary", "mirror" ], "type": "string" }, "seasons": { "items": { "$ref": "#/components/schemas/SeasonGroup" }, "type": [ "array", "null" ] }, "source": { "type": "string" } }, "required": [ "source", "role" ], "type": "object" }, "TorrentArmInputBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TorrentArmInputBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "acknowledge_trip": { "description": "The owner acknowledged the trip reason; required to re-arm a tripped lane", "type": "boolean" }, "revision": { "description": "Plan revision the arm confirm listed", "format": "int64", "minimum": 1, "type": "integer" } }, "required": [ "revision" ], "type": "object" }, "TorrentArmingFloor": { "additionalProperties": false, "properties": { "dead_file": { "description": "At least one acceptable would-push for a dead-file proposal", "type": "boolean" }, "missing": { "description": "At least one acceptable would-push for a missing record", "type": "boolean" } }, "required": [ "dead_file", "missing" ], "type": "object" }, "TorrentArrRejectionCount": { "additionalProperties": false, "properties": { "count": { "description": "Number of releases with this rejection", "format": "int64", "type": "integer" }, "rejection": { "description": "Unsupported rejection returned by the Arr", "type": "string" } }, "required": [ "rejection", "count" ], "type": "object" }, "TorrentCandidateView": { "additionalProperties": false, "properties": { "arr_kind": { "description": "Arr kind holding the record", "enum": [ "sonarr", "radarr" ], "type": "string" }, "arr_name": { "description": "Primary Arr instance holding the record", "type": "string" }, "attempts": { "description": "Failed torrent attempts spent in the record's current qualification window", "format": "int64", "type": "integer" }, "attempts_per_window": { "description": "Failed attempts one qualification window allows", "format": "int64", "type": "integer" }, "available_at": { "description": "When the record became available (air date, or Radarr availability)", "format": "date-time", "type": "string" }, "detail": { "description": "Human-readable state of the clock, or the outcome that set the record's budget stage", "type": "string" }, "episode_key": { "description": "SxxEyy for an episode, empty for a movie", "type": "string" }, "kind": { "description": "dead_file: a repair proposal's record; missing: an Arr missing monitored record", "enum": [ "dead_file", "missing" ], "type": "string" }, "last_search_at": { "description": "The lane's latest own usenet search", "format": "date-time", "type": "string" }, "last_search_outcome": { "description": "Outcome of the lane's latest own usenet search", "enum": [ "silent", "found", "transport", "error" ], "type": "string" }, "ledger": { "description": "Ledger tracking the record's attempts: the repair proposal row, or import_candidates (source torrent)", "enum": [ "repair", "import" ], "type": "string" }, "new_silent_days": { "description": "Answered-silent days credited since the clock (or the seed) started", "format": "int64", "type": "integer" }, "next_at": { "description": "Earliest a waiting, retry-due or resting record can start again, assuming one answered-silent day per day", "format": "date-time", "type": "string" }, "paused": { "description": "A usenet grab or repair is in flight; the silence count is paused", "type": "boolean" }, "proposal_id": { "description": "Repair proposal for a dead_file record", "format": "int64", "type": "integer" }, "qualified": { "description": "Enough silence days, and a seeded record has at least one new one", "type": "boolean" }, "record_id": { "description": "Arr episode or movie id; the clock and budget belong to this record", "format": "int64", "type": "integer" }, "record_type": { "description": "Arr record type", "enum": [ "episode", "movie" ], "type": "string" }, "searching_since": { "description": "The conductarr-owned usenet-searching-since stamp; the clock start", "format": "date-time", "type": "string" }, "seeded": { "description": "The count was seeded from history at the lane's first pass", "type": "boolean" }, "silence_days": { "description": "Answered-silent days, seeded proxy days included", "format": "int64", "type": "integer" }, "silence_needed": { "description": "Silence days that qualify a record", "format": "int64", "type": "integer" }, "stage": { "description": "Lane stage: silent while the record accrues answered-silent days; waiting after a start that spent no attempt (no acceptable release, or a magnet with no peers); retry due after a failed attempt with attempts left; resting once the window's attempts are spent", "enum": [ "silent", "waiting", "retry due", "resting" ], "type": "string" }, "title": { "description": "Series or movie title", "type": "string" }, "tmdb_id": { "description": "TMDB id of the series or movie", "format": "int64", "type": "integer" } }, "required": [ "arr_kind", "arr_name", "record_type", "record_id", "tmdb_id", "title", "kind", "ledger", "stage", "paused", "silence_days", "silence_needed", "seeded", "new_silent_days", "qualified", "available_at", "searching_since", "attempts", "attempts_per_window", "detail" ], "type": "object" }, "TorrentCandidatesResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TorrentCandidatesResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "candidates": { "description": "Dead files first, then missing records, longest silence first", "items": { "$ref": "#/components/schemas/TorrentCandidateView" }, "type": [ "array", "null" ] }, "qualified": { "description": "How many rows qualify", "format": "int64", "type": "integer" }, "silence_needed": { "description": "Silence days that qualify a record", "format": "int64", "type": "integer" } }, "required": [ "silence_needed", "qualified", "candidates" ], "type": "object" }, "TorrentCoverage": { "additionalProperties": false, "properties": { "anime": { "$ref": "#/components/schemas/TorrentCoverageSlice", "description": "Records on an anime Arr" }, "dead_file": { "$ref": "#/components/schemas/TorrentCoverageSlice", "description": "Dead-file proposal records" }, "missing": { "$ref": "#/components/schemas/TorrentCoverageSlice", "description": "Missing monitored records" }, "non_anime": { "$ref": "#/components/schemas/TorrentCoverageSlice", "description": "Records on a non-anime Arr" } }, "required": [ "dead_file", "missing", "anime", "non_anime" ], "type": "object" }, "TorrentCoverageSlice": { "additionalProperties": false, "properties": { "acceptable": { "description": "Of those, rows holding an acceptable release (a would-push)", "format": "int64", "type": "integer" }, "dry_runs": { "description": "Plan rows whose latest torrent search ran", "format": "int64", "type": "integer" } }, "required": [ "dry_runs", "acceptable" ], "type": "object" }, "TorrentDiskProjection": { "additionalProperties": false, "properties": { "bytes": { "description": "Summed size of those rows' would-push releases", "format": "int64", "type": "integer" }, "floor_bytes": { "description": "Configured free-space floor below which no start runs", "format": "int64", "type": "integer" }, "free_bytes": { "description": "Free space on the /data/import dataset when the plan was built", "format": "int64", "type": "integer" }, "starts": { "description": "Plan rows counted: the first ones, up to the rolling start cap", "format": "int64", "type": "integer" } }, "required": [ "starts", "bytes", "free_bytes", "floor_bytes" ], "type": "object" }, "TorrentHandoff": { "additionalProperties": false, "properties": { "arr_gate_drops": { "items": { "$ref": "#/components/schemas/ArrGateDrop" }, "type": [ "array", "null" ] }, "candidate": { "$ref": "#/components/schemas/TorrentCandidateView" }, "finished_at": { "format": "date-time", "type": "string" }, "note": { "type": "string" }, "outcome": { "type": "string" }, "started_at": { "format": "date-time", "type": "string" } }, "required": [ "started_at", "finished_at", "candidate", "outcome", "note" ], "type": "object" }, "TorrentHistoryResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TorrentHistoryResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "events": { "items": { "$ref": "#/components/schemas/TorrentLaneEvent" }, "type": [ "array", "null" ] }, "handoffs": { "items": { "$ref": "#/components/schemas/TorrentHandoff" }, "type": [ "array", "null" ] } }, "required": [ "handoffs", "events" ], "type": "object" }, "TorrentIndexerDrops": { "additionalProperties": false, "properties": { "arr_rejections": { "description": "Distinct unsupported Arr rejection strings and their release counts", "items": { "$ref": "#/components/schemas/TorrentArrRejectionCount" }, "type": [ "array", "null" ] }, "coverage": { "description": "Maps an episode that is not a monitored, qualified record without a usenet file", "format": "int64", "type": "integer" }, "gate": { "description": "Refused by the Arr for any reason but ProtocolDisabled (or, for a dead file, the existing file)", "format": "int64", "type": "integer" }, "indexer": { "description": "Indexer display name as the Arr reports it", "type": "string" }, "language": { "description": "Language: Not Original on a non-anime Arr, or dub-only on an anime Arr", "format": "int64", "type": "integer" }, "seeders": { "description": "Fewer seeders than the minimum, or an unknown count", "format": "int64", "type": "integer" }, "tried": { "description": "GUID or infohash already tried for a covered record, unprovable, or in the release-corpse ledger", "format": "int64", "type": "integer" } }, "required": [ "indexer", "gate", "language", "seeders", "coverage", "tried" ], "type": "object" }, "TorrentLaneEvent": { "additionalProperties": false, "properties": { "at": { "format": "date-time", "type": "string" }, "detail": { "type": "string" }, "kind": { "description": "arm and disarm by the owner, a breaker trip, or unrecorded torrents removed at a qBittorrent child start", "enum": [ "arm", "disarm", "trip", "unrecorded_removed" ], "type": "string" } }, "required": [ "at", "kind", "detail" ], "type": "object" }, "TorrentPick": { "additionalProperties": false, "properties": { "guid": { "type": "string" }, "indexer_id": { "format": "int64", "type": "integer" }, "release": { "type": "string" }, "seeders": { "format": "int64", "type": "integer" }, "size": { "format": "int64", "type": "integer" } }, "required": [ "release", "indexer_id", "seeders", "size", "guid" ], "type": "object" }, "TorrentPlanResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TorrentPlanResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "dry_run_at": { "description": "When the shadow plan was produced", "format": "date-time", "type": "string" }, "next_rotation": { "description": "Next time the lane may start a handoff", "format": "date-time", "type": "string" }, "revision": { "description": "Monotonic plan revision", "format": "int64", "type": "integer" }, "rows": { "description": "Current handoff decisions; no row causes a grab", "items": { "$ref": "#/components/schemas/TorrentPlanRow" }, "type": [ "array", "null" ] } }, "required": [ "revision", "dry_run_at", "rows" ], "type": "object" }, "TorrentPlanRow": { "additionalProperties": false, "properties": { "arr_gate_drops": { "description": "Rejections from each release refused by the Arr gate", "items": { "$ref": "#/components/schemas/ArrGateDrop" }, "type": [ "array", "null" ] }, "candidate": { "$ref": "#/components/schemas/TorrentCandidateView" }, "note": { "type": "string" }, "outcome": { "type": "string" }, "pick": { "$ref": "#/components/schemas/TorrentPick" }, "usenet_check": { "type": "string" } }, "required": [ "candidate", "usenet_check", "outcome", "note" ], "type": "object" }, "TorrentRotation": { "additionalProperties": false, "properties": { "day_one": { "description": "Plan records the lane's first pass saw", "format": "int64", "type": "integer" }, "dry_run": { "description": "Day-one plan records that have had a dry run", "format": "int64", "type": "integer" } }, "required": [ "dry_run", "day_one" ], "type": "object" }, "TorrentStatusResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TorrentStatusResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "active": { "format": "int64", "type": "integer" }, "armed_revision": { "description": "Plan revision the owner armed on; absent in shadow and tripped, kept while paused", "format": "int64", "type": "integer" }, "child_detail": { "description": "The qBittorrent child's supervision detail", "type": "string" }, "child_state": { "description": "The qBittorrent child's supervision state; anything but healthy pauses an armed lane", "type": "string" }, "failure_limit": { "description": "This many failed attempts in a row trip an armed lane", "format": "int64", "type": "integer" }, "failure_streak": { "description": "Failed attempts in a row since the latest import; a handoff that spent no attempt neither counts nor resets it", "format": "int64", "type": "integer" }, "free_bytes": { "format": "int64", "type": "integer" }, "mode": { "description": "shadow: starts are dry runs; armed: a start pushes its pick; tripped: a breaker returned the lane to shadow until an acknowledged re-arm; paused: armed, but the qBittorrent child is not healthy, so nothing starts", "enum": [ "shadow", "armed", "tripped", "paused" ], "type": "string" }, "newly_qualified_24h": { "description": "Candidates newly qualified in the rolling 24h, the day-one baseline and anything before the latest acknowledged trip left out", "format": "int64", "type": "integer" }, "next_start": { "format": "date-time", "type": "string" }, "spike_limit": { "description": "More newly qualified candidates than this in 24h trip an armed lane", "format": "int64", "type": "integer" }, "starts_24h": { "format": "int64", "type": "integer" }, "trip_acknowledged": { "description": "An arm acknowledged the latest trip", "type": "boolean" }, "trip_reason": { "description": "Why the latest breaker trip fired; absent before any trip", "type": "string" }, "tripped_at": { "description": "When the latest breaker trip fired", "format": "date-time", "type": "string" } }, "required": [ "mode", "starts_24h", "active", "free_bytes", "trip_acknowledged", "newly_qualified_24h", "spike_limit", "failure_streak", "failure_limit", "child_state", "child_detail" ], "type": "object" }, "TorrentSummaryResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TorrentSummaryResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "arming_floor": { "$ref": "#/components/schemas/TorrentArmingFloor" }, "coverage": { "$ref": "#/components/schemas/TorrentCoverage" }, "indexers": { "description": "Drops per indexer and rule, by indexer name", "items": { "$ref": "#/components/schemas/TorrentIndexerDrops" }, "type": [ "array", "null" ] }, "projection": { "$ref": "#/components/schemas/TorrentDiskProjection" }, "revision": { "description": "Plan revision the summary was summed over", "format": "int64", "type": "integer" }, "rotation": { "$ref": "#/components/schemas/TorrentRotation" }, "usenet_won": { "description": "Plan rows whose fresh usenet check found an acceptable release", "format": "int64", "type": "integer" } }, "required": [ "revision", "indexers", "coverage", "rotation", "usenet_won", "projection", "arming_floor" ], "type": "object" }, "TriageCandidate": { "additionalProperties": false, "properties": { "arr": { "description": "kind/name of the holding MAIN arr", "type": "string" }, "candidate_key": { "type": "string" }, "episode_ids": { "description": "Arr episode ids this candidate was expected to satisfy", "items": { "format": "int64", "type": "integer" }, "type": [ "array", "null" ] }, "group": { "description": "active | issues | exhausted | resolved", "type": "string" }, "health_state": { "description": "the closed item-health grammar", "type": "string" }, "media_type": { "type": "string" }, "observed_at": { "type": "string" }, "owner": { "type": "string" }, "poster_ref": { "type": "string" }, "reason": { "type": "string" }, "resolved_at": { "type": "string" }, "retry_count": { "format": "int64", "type": "integer" }, "source": { "type": "string" }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "year": { "format": "int64", "type": "integer" } }, "required": [ "candidate_key", "group", "health_state", "source", "tmdb_id", "media_type", "arr", "retry_count", "observed_at" ], "type": "object" }, "TriageDetail": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TriageDetail.json" ], "format": "uri", "readOnly": true, "type": "string" }, "candidate": { "$ref": "#/components/schemas/TriageCandidate" }, "history": { "items": { "$ref": "#/components/schemas/TriageHistoryEvent" }, "type": [ "array", "null" ] }, "payload_sanitize_block": { "$ref": "#/components/schemas/PayloadSanitizeBlockView" } }, "required": [ "candidate", "history" ], "type": "object" }, "TriageHistoryEvent": { "additionalProperties": false, "properties": { "at": { "type": "string" }, "from_state": { "type": "string" }, "reason": { "type": "string" }, "to_state": { "type": "string" } }, "required": [ "to_state", "at" ], "type": "object" }, "TriageResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/TriageResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "candidates": { "items": { "$ref": "#/components/schemas/TriageCandidate" }, "type": [ "array", "null" ] }, "group": { "description": "the requested group filter (empty = all)", "type": "string" } }, "required": [ "candidates" ], "type": "object" }, "ViewerReadiness": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/ViewerReadiness.json" ], "format": "uri", "readOnly": true, "type": "string" }, "blocking_stage": { "enum": [ "request", "acquisition", "visibility", "playback" ], "type": "string" }, "coverage": { "description": "Recorded-file coverage of the requested seasons (or every listed season when none were recorded); empty for a movie", "items": { "$ref": "#/components/schemas/SeasonCoverage" }, "type": [ "array", "null" ] }, "media_type": { "enum": [ "movie", "tv" ], "type": "string" }, "open_link": { "$ref": "#/components/schemas/OpenLink" }, "seerr": { "$ref": "#/components/schemas/SeerrObservation" }, "sources": { "items": { "$ref": "#/components/schemas/EvidenceSource" }, "type": [ "array", "null" ] }, "stages": { "items": { "$ref": "#/components/schemas/ReadinessStage" }, "type": [ "array", "null" ] }, "title": { "type": "string" }, "tmdb_id": { "format": "int64", "type": "integer" }, "viewer": { "$ref": "#/components/schemas/Person" } }, "required": [ "tmdb_id", "media_type", "viewer", "stages", "seerr", "coverage", "open_link", "sources" ], "type": "object" }, "WatchConfigBody": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/WatchConfigBody.json" ], "format": "uri", "readOnly": true, "type": "string" }, "status": { "type": "string" } }, "required": [ "status" ], "type": "object" }, "WatchStateRequest": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/WatchStateRequest.json" ], "format": "uri", "readOnly": true, "type": "string" }, "episode_key": { "description": "SxxEyy for a tv episode; empty for a movie", "type": "string" }, "played": { "type": "boolean" }, "user": { "description": "jellyfin username (must be covered by the item's sees: matrix)", "type": "string" } }, "required": [ "user", "played" ], "type": "object" }, "WatchStateResult": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/WatchStateResult.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "type": "string" }, "played": { "description": "the read-back value", "type": "boolean" }, "status": { "description": "ok | forbidden | no_controller | missing | error", "type": "string" } }, "required": [ "status", "played" ], "type": "object" }, "WebhookAck": { "additionalProperties": false, "properties": { "$schema": { "description": "A URL to the JSON Schema for this object.", "examples": [ "https://example.com/schemas/WebhookAck.json" ], "format": "uri", "readOnly": true, "type": "string" }, "detail": { "description": "Human-readable context", "type": "string" }, "status": { "description": "accepted | ignored | test | error", "type": "string" } }, "required": [ "status" ], "type": "object" } }, "securitySchemes": { "authentikSession": { "description": "Existing Authentik forward-single proxy session cookie, verified against the configured outpost. Caller identity/role headers are never trusted.", "in": "header", "name": "Cookie", "type": "apiKey" }, "jellyfinToken": { "description": "Jellyfin access token: MediaBrowser Token=\"\u003c32 hex\u003e\". Verified per request against the configured Jellyfin GET /Users/Me; the immutable user id maps to a configured household person. Household authority only, TV-allowlisted operations only. Inert unless server.cockpit.jellyfin_sign_in.enabled.", "in": "header", "name": "Authorization", "type": "apiKey" } } }, "info": { "description": "The tailored media bundle: supervisor, dispatch, layer, watch-state, recommendations, curation, backfill.", "title": "conductarr", "version": "0.1.0-dev" }, "openapi": "3.1.0", "paths": { "/api/v1/activity": { "get": { "description": "Defaults to requests attributed to the signed-in operator; requester=all shows household progress. Items carry the recorded requester and actor exactly as filed, so an on-behalf request belongs to its requester. Stages are separate evidence from separate owners and are never collapsed into a ready flag: a request receipt, an Arr file, a library membership or Seerr availability each prove only their own stage, and unknown, stale, conflicting or failed evidence stays in its stage. The feed reads local ledgers and cached authenticated server playback admission only; no provider is called per row. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-activity", "parameters": [ { "description": "Household requester key to follow, or all for household progress. Defaults to the signed-in operator's own requests. This selects whose requests are shown; it never changes who is acting", "explode": false, "in": "query", "name": "requester", "schema": { "description": "Household requester key to follow, or all for household progress. Defaults to the signed-in operator's own requests. This selects whose requests are shown; it never changes who is acting", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActivityFeed" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Recent requests with their request, acquisition, visibility and playback stages" } }, "/api/v1/activity/titles/{tmdb}/{type}": { "get": { "description": "Reads Seerr request status, the holding Arr and a viewer-scoped Jellyfin view for this one title. Each live source fails independently and degrades only its own stage; a Seerr, Arr or Jellyfin outage leaves its stage stale or unknown and never proves readiness. Playback joins cached Jellyfin PlaybackInfo queried with the server key on the viewer's behalf, using a separate request pool sized by the layer visibility item_budget, with watch records and media-health faults as fallback. Items without a recorded Video stream in the first source and .strm paths are not sampled because Jellyfin can refresh metadata and inspect media for them. Admission proves neither playback policy, phone compatibility nor media bytes. open_link is the viewer's own Jellyfin item page, offered only after the viewer-scoped read found that item and only for a viewer the operator may open Jellyfin as; it carries no credential. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-activity-title", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } }, { "description": "Household member to read readiness for. Defaults to the signed-in operator", "explode": false, "in": "query", "name": "viewer", "schema": { "description": "Household member to read readiness for. Defaults to the signed-in operator", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ViewerReadiness" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "One title's viewer readiness with live Seerr, Arr and Jellyfin evidence and the Jellyfin hand-off" } }, "/api/v1/home/resume": { "get": { "description": "Read-only Jellyfin metadata: at most twelve resume items and one parent-series batch, bounded to five seconds. No caller-selected viewer, media-source lookup or playback write. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-home-resume", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ResumeBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Unfinished titles for the authenticated viewer" } }, "/api/v1/operator": { "get": { "description": "Identity is verified from the existing Authentik proxy session or, when enabled, the caller's Jellyfin token. Roles and targets come only from server configuration, never identity headers, requester bodies or selected profiles. Jellyfin sign-in grants household-only authority without library-management powers. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-cockpit-operator", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Operator" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik or Jellyfin sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] }, { "jellyfinToken": [] } ], "summary": "Authenticated cockpit operator and household authority" } }, "/api/v1/recommendations/profiles": { "get": { "description": " Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-recommendation-profiles", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationProfiles" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Configured household recommendation read profiles" } }, "/api/v1/recommendations/profiles/{profile}/dismissals": { "get": { "description": "Read-only durable list, newest first. Like the feed read it is not limited to the operator's own profile. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-recommendation-dismissals", "parameters": [ { "in": "path", "name": "profile", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationDismissals" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Titles hidden from one profile's personalised feed" }, "post": { "description": "Durable until an explicit restore. Requires the profile in the operator's recommendation_profiles capability. The title leaves the retained feed, its watched-seed and service projections and the profile's Jellyfin recommendation folders; it is never requested, and real media, general search and watch-state are untouched. Repeating the command is a no-op. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "post-recommendation-dismissal", "parameters": [ { "in": "path", "name": "profile", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationHideInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationHideResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Hide a title from one profile's personalised feed" } }, "/api/v1/recommendations/profiles/{profile}/dismissals/{type}/{tmdb}": { "delete": { "description": "Requires the profile in the operator's recommendation_profiles capability. The title is eligible again at the next ranking cycle under the same scorer and filters; it is not inserted into any feed and not requested. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "delete-recommendation-dismissal", "parameters": [ { "in": "path", "name": "profile", "required": true, "schema": { "type": "string" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "movie", "tv" ], "type": "string" } }, { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationRestoreResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Restore a hidden title's eligibility for one profile" } }, "/api/v1/recommendations/profiles/{profile}/feed": { "get": { "description": "Read-only in-memory observation; current expires at the configured feed interval. Ranking and Jellyfin materialization are independent. Unavailable means no successful ranking observation; stale preserves the last known result after expiry or failed refresh. Private conditional reads authenticate first and hash the complete retained projection plus operator authority and filters; matching If-None-Match returns a bodyless 304. This saves repeat transfer, not projection or hashing work. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-recommendation-feed", "parameters": [ { "description": "Private display validator from a prior authenticated feed read", "in": "header", "name": "If-None-Match", "schema": { "description": "Private display validator from a prior authenticated feed read", "type": "string" } }, { "in": "path", "name": "profile", "required": true, "schema": { "type": "string" } }, { "description": "Typed contributing watched seed; requires seed_tmdb_id", "explode": false, "in": "query", "name": "seed_media_type", "schema": { "description": "Typed contributing watched seed; requires seed_tmdb_id", "enum": [ "movie", "tv" ], "type": "string" } }, { "description": "Contributing watched seed identity; requires seed_media_type", "explode": false, "in": "query", "name": "seed_tmdb_id", "schema": { "description": "Contributing watched seed identity; requires seed_media_type", "format": "int64", "minimum": 1, "type": "integer" } }, { "description": "Observed candidate genre; filters retained rank without rescoring", "explode": false, "in": "query", "name": "genre_id", "schema": { "description": "Observed candidate genre; filters retained rank without rescoring", "format": "int64", "minimum": 1, "type": "integer" } }, { "description": "Retained candidate type scope; never a new discovery query", "explode": false, "in": "query", "name": "media_type", "schema": { "description": "Retained candidate type scope; never a new discovery query", "enum": [ "all", "movie", "tv" ], "type": "string" } }, { "description": "Observed NL flatrate provider ID; unknown candidate providers remain unresolved", "explode": false, "in": "query", "name": "service_id", "schema": { "description": "Observed NL flatrate provider ID; unknown candidate providers remain unresolved", "format": "int64", "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationFeed" } } }, "description": "OK", "headers": { "Cache-Control": { "schema": { "type": "string" } }, "ETag": { "schema": { "type": "string" } } } }, "304": { "description": "Authenticated display representation unchanged; reuse the private cached feed" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error, including 404 for an unknown profile and 422 for invalid input" } }, "security": [ { "authentikSession": [] } ], "summary": "Latest known native ranked recommendation feed" } }, "/api/v1/recommendations/sync": { "post": { "description": "Waits for any active scheduled cycle, then resolves, scores, materializes, and read-back verifies every configured profile feed. Administrative cockpit authority required.", "operationId": "post-recommendations-sync", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecommendationSyncResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Run a complete recommendation feed cycle" } }, "/api/v1/requests": { "post": { "description": "Files the request for the chosen household requester (default: the signed-in operator) through the non-admin Seerr on-behalf path, or, for media a household library already holds, adds the requester's membership without a second grab. The acting operator is recorded separately from the requester. Missing selected seasons stay requestable; a season is excluded only when its own files are complete or an active Seerr request for the same requester already covers it. Duplicate, lost or inconclusive Seerr responses are reconciled against Seerr's own request list: unproven coverage returns a pending, unresolved receipt, and resubmitting the same command resumes it before filing anything. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "post-request-intent", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RequestIntentBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RequestReceipt" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Request a movie or explicit television seasons for a household requester" } }, "/api/v1/requests/titles/{tmdb}/{type}": { "get": { "description": "Read-only receipts: acting operator, requester, outcomes per season, and the Seerr and dispatch receipts each command produced. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-title-requests", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TitleRequestsBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Native request records for one typed title" } }, "/api/v1/requests/{id}/retire": { "post": { "description": "Administrator-only local closeout after a fresh Seerr identity read proves the pending record no longer matches its household target. Preserves attribution and effect evidence. Does not cancel any filed Seerr request, undo membership, settle recommendations or submit another request. Unchanged identities, settled/retired records and concurrent title operations conflict. Administrative cockpit authority required.", "operationId": "post-retire-request", "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RequestReceipt" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Retire an exact stale-identity pending native request record" } }, "/arr/webhook": { "post": { "description": "Download and non-upgrade EpisodeFileDelete (Sonarr) or MovieFileDelete (Radarr) events are inserted into webhook_dedup and acknowledged immediately. File-delete events only re-materialize the title because a deleted Arr file otherwise leaves a dangling per-file Jellyfin layer link. Test events and other event types are ignored. Restricted to direct loopback bundled-service callers without browser/session/proxy headers; no cockpit role is granted.", "operationId": "post-arr-webhook", "requestBody": { "content": { "application/octet-stream": { "schema": { "contentMediaType": "application/octet-stream", "format": "binary", "type": "string" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookAck" } } }, "description": "OK" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Bundled-service caller required" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "summary": "Sonarr/Radarr primary intake webhook (insert + 200; worker materializes)" } }, "/arr/webhook/mirror": { "post": { "description": "Download and non-upgrade EpisodeFileDelete (Sonarr) or MovieFileDelete (Radarr) events are inserted into webhook_dedup and acknowledged immediately. The worker only re-materializes existing memberships; file deletes prune dangling per-file Jellyfin layer links. Restricted to direct loopback bundled-service callers without browser/session/proxy headers; no cockpit role is granted.", "operationId": "post-arr-mirror-webhook", "requestBody": { "content": { "application/octet-stream": { "schema": { "contentMediaType": "application/octet-stream", "format": "binary", "type": "string" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookAck" } } }, "description": "OK" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Bundled-service caller required" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "summary": "Sonarr/Radarr mirror refresh webhook (insert + 200; worker refreshes)" } }, "/auth/login": { "get": { "description": "Returns to the configured cockpit origin only; caller-supplied redirect destinations are not accepted. The existing reverse proxy routes /outpost.goauthentik.io to Authentik.", "operationId": "get-cockpit-login", "responses": { "302": { "description": "Found", "headers": { "Location": { "schema": { "type": "string" } } } }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "summary": "Enter the existing Authentik proxy sign-in flow" } }, "/catalogue/discover": { "get": { "description": "General-interest provider suggestions, not personalised Conductarr recommendations. Browsing cannot request or acquire media. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-discover", "parameters": [ { "explode": false, "in": "query", "name": "media_type", "schema": { "default": "all", "enum": [ "all", "movie", "tv" ], "type": "string" } }, { "explode": false, "in": "query", "name": "page", "schema": { "default": 1, "format": "int64", "maximum": 500, "minimum": 1, "type": "integer" } }, { "description": "TMDB genre ID in the selected movie or TV namespace; zero means no genre constraint", "explode": false, "in": "query", "name": "genre_id", "schema": { "description": "TMDB genre ID in the selected movie or TV namespace; zero means no genre constraint", "format": "int64", "minimum": 0, "type": "integer" } }, { "description": "Configured TMDB streaming-provider ID; zero means no service constraint", "explode": false, "in": "query", "name": "service_id", "schema": { "description": "Configured TMDB streaming-provider ID; zero means no service constraint", "format": "int64", "minimum": 0, "type": "integer" } }, { "description": "Requires movie or TV. Popular sorts by popularity; New by primary release date (movies) or first air date (TV), capped inclusively at today's UTC date, not service arrival; Top by vote average with at least 200 TMDB votes; Upcoming uses Seerr's premiere discovery from today's UTC date, ordered by popularity", "explode": false, "in": "query", "name": "sort", "schema": { "description": "Requires movie or TV. Popular sorts by popularity; New by primary release date (movies) or first air date (TV), capped inclusively at today's UTC date, not service arrival; Top by vote average with at least 200 TMDB votes; Upcoming uses Seerr's premiere discovery from today's UTC date, ordered by popularity", "enum": [ "popular", "new", "top", "upcoming" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Page" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "General Seerr discovery" } }, "/catalogue/options": { "get": { "description": "Read-only cached genre and configured regional streaming-provider options. Independent source observations distinguish answered empty lists from unavailable metadata. No title/lane preload, personalised ranking or availability claim. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-options", "parameters": [ { "explode": false, "in": "query", "name": "media_type", "required": true, "schema": { "enum": [ "movie", "tv" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Options" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Media-type genres and curated streaming services" } }, "/catalogue/performers/{performer}": { "get": { "description": "Read-only Seerr person facts with strict performer identity. Observed identity with empty optional facts differs from unavailable or explicitly missing metadata. Seerr lookup failures, including unknown people, return unavailable, not verified absence. No title holding, request, visibility or playback claim follows from person metadata. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-performer", "parameters": [ { "in": "path", "name": "performer", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PerformerDetail" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Selected cast performer identity and biography" } }, "/catalogue/performers/{performer}/filmography": { "get": { "description": "Read-only native pages of Seerr's unpaged non-adult cast credits, not an exhaustive career. Groups movie/series identities while preserving every role in returned order. Counts describe this source snapshot and are absent on failure. Household holding, configured audience and incomplete request relations remain independent; none proves playback. No per-credit detail fetch or mutation. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-filmography", "parameters": [ { "in": "path", "name": "performer", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "explode": false, "in": "query", "name": "page", "schema": { "default": 1, "format": "int64", "maximum": 1000000, "minimum": 1, "type": "integer" } }, { "explode": false, "in": "query", "name": "page_size", "schema": { "default": 20, "format": "int64", "maximum": 100, "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FilmographyPage" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Selected performer's typed acting filmography" } }, "/catalogue/search": { "get": { "description": "Authenticated read-only catalogue search. Request, local holding and provider availability are separate observations; failed provider reads are unavailable, never fabricated empty results. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-search", "parameters": [ { "explode": false, "in": "query", "name": "q", "required": true, "schema": { "maxLength": 300, "minLength": 1, "type": "string" } }, { "explode": false, "in": "query", "name": "media_type", "schema": { "default": "all", "enum": [ "all", "movie", "tv" ], "type": "string" } }, { "explode": false, "in": "query", "name": "page", "schema": { "default": 1, "format": "int64", "maximum": 500, "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Page" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Native Seerr movie and series search" } }, "/catalogue/titles/{tmdb}/{type}": { "get": { "description": "Reads provider metadata and the existing held-title owner independently. Unavailable metadata never erases known held files or implies a title is unheld. No request, membership, watched-state or acquisition writer is called. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-title", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Detail" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Native movie or series title workspace" } }, "/catalogue/titles/{tmdb}/{type}/cast": { "get": { "description": "Read-only unpaged Seerr cast with performer IDs distinct from typed title IDs. Series expose only the leading aggregate character per performer. Missing, unavailable and observed empty cast differ. Cast metadata proves neither holding, requests, visibility nor playback. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-cast", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TitleCast" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Movie or series cast performers" } }, "/catalogue/titles/{tmdb}/{type}/display": { "get": { "description": "Authenticated Seerr metadata read for visible request posters. Contains no holding, files, mirrors, watch state, request status or ratings. Missing or unavailable artwork says nothing about a request or media availability. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-display", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Display" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Public title presentation" } }, "/catalogue/titles/{tmdb}/{type}/enrichment": { "get": { "description": "Authenticated fresh Seerr metadata and ratings for an already observed workspace or a visible hero. Reads no Arr, files, mirrors, memberships or watch state. Local holding and coverage remain unknown; this response never authorizes a title action. Metadata, providers and ratings preserve their independent unavailable states. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-enrichment", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Enrichment" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Title metadata and source ratings" } }, "/catalogue/titles/{tmdb}/{type}/metadata": { "get": { "description": "Reuses bounded observations from committed title metadata reads, restored from SQLite and served from memory, with zero upstream or holding acquisition in this request. A single paced background fill observes held titles; cold and evicted titles remain unobserved until admitted. Restart preserves committed facts, their age and failure outcomes. States describe the latest attempt; timestamps identify last-known genre/provider facts, not a freshness guarantee. Provider observation requires an explicit NL result: empty or NL-absent regional results are ambiguous and preserve prior offers/timestamps as unobserved, not complete coverage. NL offers are Seerr-reported regional catalogue metadata, not subscriptions, membership, request eligibility or playback proof. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-metadata", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TitleMetadata" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Retained title genres and NL streaming offers" } }, "/catalogue/titles/{tmdb}/{type}/related": { "get": { "description": "Typed title-related provider suggestions kept separate from Conductarr's personalised ranking. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-related", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } }, { "explode": false, "in": "query", "name": "page", "schema": { "default": 1, "format": "int64", "maximum": 500, "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Page" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Related-title Seerr suggestions" } }, "/catalogue/tv/{tmdb}/seasons/{season}": { "get": { "description": "Reads an explicitly selected provider season and joins local primary episode evidence without requesting missing seasons or claiming playback. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-catalogue-season", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "season", "required": true, "schema": { "format": "int64", "minimum": 0, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SeasonDetail" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Selected television season metadata and recorded coverage" } }, "/curation/items": { "get": { "description": "Every enabled PRIMARY arr of the media type's kind joined with its bucket assignment, mapped to an owner (Justin/Mindel/Shared/Unassigned). The anime badge is SERVER-derived from the holding instance's is_anime flag (rename-proof). An arr that fails to list omits its items, never the whole view. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-curation-items", "parameters": [ { "description": "tv | movie (the TV/Movies toggle)", "explode": false, "in": "query", "name": "media_type", "schema": { "default": "tv", "description": "tv | movie (the TV/Movies toggle)", "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ItemsBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Poster-grid items + owner-rail counts for one media type" } }, "/curation/items/{tmdb}/tv/episodes": { "get": { "description": "The drill-in panel: seasons/episodes joined from the holding sonarr (SxxEyy, title, air date, monitored, has-file, per-episode file quality/size/release) + per-user Jellyfin watch chips. Users included are EXACTLY those whose sees: matrix covers the item's library (server-derived, owners-not-buckets). One episodes call + one files call + one Jellyfin list per user — never per-episode. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-curation-episodes", "parameters": [ { "description": "TMDB id of the series", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the series", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/EpisodeView" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Season-grouped episodes + per-user watch state for a TV item" } }, "/curation/items/{tmdb}/tv/fill-gaps": { "post": { "description": "Lists the holding sonarr's episodes ONCE, filters to the gaps (monitored, without a file, and already aired — unaired/future and unmonitored episodes excluded), and issues a single EpisodeSearch for their ids. Shares the one-in-flight-per-series guard with regrab (a second answers status=busy). Response carries searched_count; 0 with status=ok means there were no gaps (a quiet no-op). Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-curation-fill-gaps", "parameters": [ { "description": "TMDB id of the series", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the series", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FillGapsResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Search the gap episodes of a TV series (monitored + fileless + aired)" } }, "/curation/items/{tmdb}/{type}": { "get": { "description": "The always-open inspector's payload for a single tile (design §2.3): Identity (title/year/runtime/owners), File (size + media info), Source (arr/imported/indexer), Health (has-file/queued/failed/missing). Fetched ONLY on selection — the targeted per-item File/Source/Health reads never run across the grid (library-scale rule). The grid list carries owners + anime already; this adds the drill-in facts. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-curation-item-detail", "parameters": [ { "description": "TMDB id of the focused item", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the focused item", "format": "int64", "type": "integer" } }, { "description": "tv | movie", "in": "path", "name": "type", "required": true, "schema": { "description": "tv | movie", "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ItemDetail" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Inspector detail for one focused item" } }, "/curation/items/{tmdb}/{type}/delete": { "post": { "description": "Requires the scope_id of the deletion impact the operator confirmed. The current scope is observed again under the title lock; a different scope answers conflict and an unobservable one inconclusive, both before any effect. Only the confirmed primary and mirror records are FULL-removed (deleteFiles=true so the arr's own stale library symlink goes too; removeFromClient is NEVER sent — that GCs shared NzbDAV blobs the layer points at). The confirmed bucket-layer symlink(s) are pruned, the bucket_memberships rows dropped, and a targeted Jellyfin refresh issued. A mirror copy that cannot be removed after the primary is gone answers partial, never ok. Works for ANY provenance incl. usenet-streamed (the arr's on-disk file is its own symlink; the NzbDAV import tree is never touched). Bulk delete is a client-side fan-out over this endpoint — one confirmed scope and one result per item. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-curation-delete", "parameters": [ { "description": "TMDB id of the item to delete", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the item to delete", "format": "int64", "type": "integer" } }, { "description": "tv | movie", "in": "path", "name": "type", "required": true, "schema": { "description": "tv | movie", "enum": [ "tv", "movie" ], "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Delete one library item across all provenance (R12) within its confirmed scope" } }, "/curation/items/{tmdb}/{type}/deletion-impact": { "get": { "description": "Read-only observation of the existing deletion owner's primary and rule-derived mirrors, exact membership and managed layer-link effects (including orphan collateral), and configured libraries/viewers. ready supplies the scope the operator confirms: its scope_id binds a later deletion request, which observes the scope again and deletes nothing when it differs. It is not a reservation or authorization. missing and inconclusive never supply a scope; unavailable reads cannot prove absence. Global deletion removes the confirmed Arr records with deleteFiles=true, prunes managed links and emptied directories, reconciles memberships/dispatch and requests a best-effort Jellyfin refresh. It never removes download-client payloads, blocklists, deletes NzbDAV blobs or erases watched state. Separate membership Remove is non-destructive. This read changes nothing. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-curation-deletion-impact", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeletionImpact" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Observe exact global media deletion impact without changing media" } }, "/curation/items/{tmdb}/{type}/regrab": { "post": { "description": "Blocklists the grabbed release(s) (POST history/failed) + clears any queued grab (DELETE queue, removeFromClient=FALSE always, blocklist=true) then issues the replacement search (EpisodeSearch/SeasonSearch/MoviesSearch). Never touches the import tree; the arr replaces the file on the new import. One in-flight regrab per item (shared soak account) — a second answers status=busy. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-curation-regrab", "parameters": [ { "description": "TMDB id of the item", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the item", "format": "int64", "type": "integer" } }, { "description": "tv | movie", "in": "path", "name": "type", "required": true, "schema": { "description": "tv | movie", "enum": [ "tv", "movie" ], "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegrabRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegrabResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Regrab episodes/season (tv) or the movie (R12 regrab, pulled forward)" } }, "/curation/items/{tmdb}/{type}/watchstate": { "post": { "description": "Marks one user's episode (SxxEyy) or movie played/unplayed with a LIVE Jellyfin write, verified by read-back. Refuses a user not covered by the item's sees: matrix (status=forbidden). This is a direct operator write — NOT the capture/restore machinery — so it never touches the clobber guard. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "post-curation-watchstate", "parameters": [ { "description": "TMDB id of the item", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the item", "format": "int64", "type": "integer" } }, { "description": "tv | movie", "in": "path", "name": "type", "required": true, "schema": { "description": "tv | movie", "enum": [ "tv", "movie" ], "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WatchStateRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WatchStateResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Direct operator watch-state toggle (live Jellyfin write + read-back)" } }, "/curation/layer/movie-cutover": { "get": { "description": "Lists legacy movie links and started or failed cutovers that have a durable path plan and watch snapshot. RecoveryCutoverID identifies a bracket that can be resumed by posting the same TMDB id even if no legacy links remain. Administrative cockpit authority required.", "operationId": "get-curation-layer-movie-cutover", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MovieCutoverPendingBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "List legacy movies and interrupted movie cutovers" } }, "/curation/layer/movie-cutover/{tmdb}": { "get": { "description": "Read-only evidence, including a retained bracket after legacy links disappear. Snapshot and restored counts are durable reported counts, not a new capture or live playback proof. The existing POST re-observes scope and preserves its capture/restore policy. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-title-movie-cutover", "parameters": [ { "description": "TMDB id of the movie to convert", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the movie to convert", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MovieCutoverEvidence" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read one movie's legacy links and latest durable cutover" }, "post": { "description": "A fresh cutover requires an exact indexed Movie at each old primary path for every relevant viewer, then persists the planned old-to-new paths and per-user snapshot before converting any entry. Re-posting an unfinished bracket re-indexes the planned new paths and field-wise merges the durable snapshot with current live UserData only for indexed targets. Partial indexing restores the reachable subset and reports unresolved paths for another retry; any still-legacy entries need a fresh capture before conversion. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-curation-layer-movie-cutover", "parameters": [ { "description": "TMDB id of the movie to convert", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the movie to convert", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MovieCutoverBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Convert or safely resume one movie cutover" } }, "/curation/library": { "get": { "description": "Unpaged retained-metadata filtering. Items are confirmed matches; unresolved contains possible matches, never known exclusions. Coverage counts the entire named/my/all, type and text scope before genre/service/watched predicates, not a rendered page. Counts and source statistics cover the captured media-type collection. Source observation time is explicit; membership and configured viewers are rejoined on every read. A snapshot reuses the last collection across scopes; omit it for a fresh capture. Watched filtering indexes only the verified viewer's collection once per snapshot. Facts retain independent latest genre/provider outcomes and last-success timestamps: no TTL or freshness guarantee. Committed metadata survives restart; cold, evicted and capacity-overflow identities remain unobserved until admitted. A single paced background fill observes held titles; this request never hydrates metadata. Filter completeness is not complete metadata coverage, subscription, request eligibility or playback proof. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-household-library", "parameters": [ { "description": "Title or year search across household libraries by default", "explode": false, "in": "query", "name": "q", "schema": { "description": "Title or year search across household libraries by default", "maxLength": 300, "type": "string" } }, { "description": "my/all (reserved), an enabled exact library display, or a legacy owner/Unassigned label; configured named libraries take precedence over owner labels", "explode": false, "in": "query", "name": "library", "schema": { "description": "my/all (reserved), an enabled exact library display, or a legacy owner/Unassigned label; configured named libraries take precedence over owner labels", "type": "string" } }, { "explode": false, "in": "query", "name": "media_type", "schema": { "default": "all", "enum": [ "all", "tv", "movie" ], "type": "string" } }, { "description": "Observed genre ID in each title's movie/TV namespace; zero disables", "explode": false, "in": "query", "name": "genre_id", "schema": { "description": "Observed genre ID in each title's movie/TV namespace; zero disables", "format": "int64", "minimum": 0, "type": "integer" } }, { "description": "Observed NL flatrate provider ID; zero disables", "explode": false, "in": "query", "name": "service_id", "schema": { "description": "Observed NL flatrate provider ID; zero disables", "format": "int64", "minimum": 0, "type": "integer" } }, { "description": "Verified operator's Jellyfin Played flag, never a submitted viewer identity", "explode": false, "in": "query", "name": "watched", "schema": { "default": "all", "description": "Verified operator's Jellyfin Played flag, never a submitted viewer identity", "enum": [ "all", "watched", "unwatched" ], "type": "string" } }, { "description": "Reuse the last retained collection without Arr reads; omitted captures anew, replaced or restarted snapshots return 409", "explode": false, "in": "query", "name": "snapshot", "schema": { "description": "Reuse the last retained collection without Arr reads; omitted captures anew, replaced or restarted snapshots return 409", "type": "string" } }, { "description": "Force a new Arr acquisition instead of the shared one taken within the last few seconds; ignored with a snapshot", "explode": false, "in": "query", "name": "refresh", "schema": { "description": "Force a new Arr acquisition instead of the shared one taken within the last few seconds; ignored with a snapshot", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LibraryResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Unified held title search and configured household visibility" } }, "/curation/library-audiences": { "get": { "description": "Projects named membership routes, enabled Jellyfin libraries and users' configured sees by media type and anime scope. Includes empty libraries and scopes with no configured viewer. This read does not inspect current title unions, watch-write permissions or live media, and grants no mutation authority. An unwired audience read is unavailable, never an empty preview. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-library-audiences", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LibraryAudiencesBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Configured viewing audience for every enabled household membership scope" } }, "/curation/library/activity": { "get": { "description": "Acquired separately from the title collection so a slow queue or history read never delays title presence. Each source reports whether its queue and history answered; a count is only meaningful for sources that did, and an unanswered source is never a zero. Per-source read times are explicit and may predate the request by the shared-acquisition window; refresh forces a new read. Administrative cockpit authority required.", "operationId": "get-library-activity", "parameters": [ { "explode": false, "in": "query", "name": "media_type", "schema": { "default": "all", "enum": [ "all", "tv", "movie" ], "type": "string" } }, { "description": "Force a new queue and history read instead of the shared one taken within the last few seconds", "explode": false, "in": "query", "name": "refresh", "schema": { "description": "Force a new queue and history read instead of the shared one taken within the last few seconds", "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LibraryActivity" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Queue depth and import history of the primaries serving a media type" } }, "/curation/library/{tmdb}/{type}": { "get": { "description": "Reads one movie or series identity, its canonical household memberships/viewers, Arr-recorded primary and mirror files, and the existing watched-state interface. A missing title requires every relevant primary to answer; unavailable or partially answered evidence is not missing media or playback proof. Reads are performed only after explicit detail navigation, never pointer hover or bulk selection. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-held-title", "parameters": [ { "description": "TMDB id of the focused item", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the focused item", "format": "int64", "type": "integer" } }, { "description": "tv | movie", "in": "path", "name": "type", "required": true, "schema": { "description": "tv | movie", "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HeldTitle" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Committed held title workspace with seasons, versions and configured viewers" } }, "/curation/membership-jobs": { "get": { "description": " Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-curation-memberships", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MembershipJobsBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read recent membership commands" } }, "/curation/memberships": { "post": { "description": "Validates the unchanged admission rules and durably queues the change without waiting on Arr or Jellyfin. The existing intake worker applies watch-state capture, materialization, convergence and read-back. Poll the returned receipt ID for per-title outcomes; acceptance is not completion. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "post-curation-memberships", "parameters": [ { "description": "Reuse this key only for the same confirmed membership change", "in": "header", "name": "Idempotency-Key", "schema": { "description": "Reuse this key only for the same confirmed membership change", "maxLength": 80, "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MembershipInputBody" } } }, "required": true }, "responses": { "202": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MembershipJob" } } }, "description": "Accepted" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Dispatch a curation membership change" } }, "/curation/memberships/{id}": { "get": { "description": " Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-curation-membership", "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MembershipJob" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read membership command completion" } }, "/curation/rename/{tmdb}": { "get": { "description": "Sonarr's own GET /api/v3/rename for the holding primary: every episode file whose on-disk name differs from what the naming config builds, with its existing and new series-folder-relative path. Changes nothing. An EMPTY files list means the series is already converged, and the POST will refuse. 503 while arr_naming.rename_episodes is false. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-curation-rename", "parameters": [ { "description": "TMDB id of the series to rename (television only)", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the series to rename (television only)", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RenamePlanBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Preview the Sonarr rename pass for one series" }, "post": { "description": "Renames ONE series' episode files to the naming config's canonical names and carries its watch-state across: durable scoped snapshot plus a same-operation capture of every user who sees the item's buckets, Sonarr's RenameFiles command over exactly the previewed episodeFileIds (waited to a terminal status), per-file layer links repointed and renamed where a bucket entry is a real directory rather than a whole-title symlink, a Jellyfin notify + structural validate + bounded re-index poll, then the capture remapped onto the new item ids BY PATH and restored through the live-wins merge with read-back. Refuses an empty preview (409) and never runs automatically. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-curation-rename", "parameters": [ { "description": "TMDB id of the series to rename (television only)", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the series to rename (television only)", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RenameResultBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Run the Sonarr rename pass for one series" } }, "/curation/rename/{tmdb}/passes": { "get": { "description": "Newest first, including unfinished passes, independently of preview availability. Files is a planned count, not actual renames. Restored and repointed counts are retained; skipped files, convergence and the full response are not. A retained request_id matches the originating POST's optional X-Request-ID transport metadata; absent or different identities cannot prove that original finished. This is not idempotency or a reconstructed response. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-curation-rename-passes", "parameters": [ { "description": "TMDB id of the series to rename (television only)", "in": "path", "name": "tmdb", "required": true, "schema": { "description": "TMDB id of the series to rename (television only)", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RenameHistoryOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read all durable rename passes for one television title" } }, "/curation/watch-config": { "post": { "description": "Operator override for the boot-seeded watch guard. Resolves only enabled config Jellyfin usernames to runtime ids and atomically rewires reassign watch-state preservation. Boot retries this wiring while Jellyfin is unavailable. Answers 503 until serve supplies the resolver. Administrative cockpit authority required.", "operationId": "post-curation-watch-config", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WatchConfigBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Rewire the reassign watch-guard to enabled Jellyfin users" } }, "/dispatch/dry-run": { "get": { "description": "Returns the rule, routed primary arr and rule-derived mirror instances an add would fan out to. No side effects. Administrative cockpit authority required.", "operationId": "get-dispatch-dry-run", "parameters": [ { "description": "TMDB id to resolve", "explode": false, "in": "query", "name": "tmdb_id", "required": true, "schema": { "description": "TMDB id to resolve", "format": "int64", "type": "integer" } }, { "description": "tv | movie", "explode": false, "in": "query", "name": "media_type", "schema": { "default": "tv", "description": "tv | movie", "enum": [ "tv", "movie" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DryRunPlan" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Resolve routing for an item without adding (engine.Plan as data)" } }, "/dispatch/missing": { "get": { "description": "Compares each dispatch_log success against live arr state INCLUDING rule-derived mirror membership. An item deleted from an arr after its success row is surfaced here — the forever-dedup would otherwise never retry it. Administrative cockpit authority required.", "operationId": "get-dispatch-missing", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MissingOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Success rows whose item is absent from an arr (incl. rule-derived mirrors)" }, "post": { "description": "Forces a re-dispatch for the given items so a mirror deleted after a success row is re-added. The primary re-add is a safe 400-already_added. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-dispatch-missing-redispatch", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RedispatchInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RedispatchOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Re-dispatch missing items (bypasses the success dedup)" } }, "/dispatch/recent": { "get": { "description": " Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-dispatch-recent", "parameters": [ { "description": "max rows (newest first)", "explode": false, "in": "query", "name": "limit", "schema": { "default": 50, "description": "max rows (newest first)", "format": "int64", "maximum": 500, "minimum": 1, "type": "integer" } }, { "description": "filter by outcome (empty = all)", "explode": false, "in": "query", "name": "outcome", "schema": { "description": "filter by outcome (empty = all)", "enum": [ "success", "partial", "failed" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecentOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Paginated dispatch_log (newest first)" } }, "/downloads": { "get": { "description": "Groups Arr queue records by download id so a pack is one row, joins qBittorrent by infohash, and classifies active, client-queued, delay-pending, import-blocked, and imported-awaiting-seed-cleanup states server-side. Also returns a cached library provenance snapshot (torrent, spot, manual, usenet-streamed) with bounded on-demand local-dataset usage. Primary Arrs are listed once and indexed; no per-item API calls or per-poll filesystem walks. Authenticated household cockpit authority required; watch-state writes are limited to capability-listed viewers.", "operationId": "get-downloads", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DownloadsBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Grouped download activity and library storage provenance" } }, "/healthz": { "get": { "description": "HTTP 503 only when the aggregate is unhealthy (a restart may fix it); degraded states stay 200 — restart churn must not destroy healthy state.", "operationId": "get-healthz", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthzBody" } } }, "description": "OK" }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthzBody" } } }, "description": "Aggregate unhealthy (a restart may fix it)" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "summary": "Aggregate + per-module health" } }, "/healthz/history": { "get": { "description": "Reads the health-history ring table (a clock-driven sampler snapshots the registry's cached states ~every 60s, retained 14 days) and returns, per module, the ordered per-sample state series (the supervision-panel sparkline input), the uptime% (fraction of present samples healthy), and the restart-transition count (recoveries into healthy). Window is a Go duration query param (default 24h, clamped to the 14-day retention). Purely derived from the ring — no live probing. Administrative cockpit authority required.", "operationId": "get-healthz-history", "parameters": [ { "description": "look-back window as a Go duration (e.g. 24h, 6h); clamped to the 14-day retention", "explode": false, "in": "query", "name": "window", "schema": { "default": "24h", "description": "look-back window as a Go duration (e.g. 24h, 6h); clamped to the 14-day retention", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HistoryReport" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Per-module health series + uptime%/restart-transitions" } }, "/import-health/candidates": { "get": { "description": "The intake triage panel: every open candidate grouped by health (active = searching/downloading/source_complete/import_pending/retry_wait/regrab_eligible; issues = import_blocked/blocked_ambiguous; exhausted; resolved = an operator-resolved candidate). Optional group query filter. Read ONCE from the ledger — never a per-candidate query. Administrative cockpit authority required.", "operationId": "get-import-health-candidates", "parameters": [ { "description": "triage group filter (empty = all groups)", "explode": false, "in": "query", "name": "group", "schema": { "description": "triage group filter (empty = all groups)", "enum": [ "active", "issues", "exhausted", "resolved" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TriageResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Candidate triage grouped active/issues/exhausted/resolved" } }, "/import-health/candidates/{key}": { "get": { "description": "The inspector's per-item health view: the candidate's current health state + reason and its full append-only transition trail. Two indexed reads (get + history). Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-import-health-candidate", "parameters": [ { "description": "the candidate's idempotent key", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TriageDetail" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Current health + transition history for one candidate" } }, "/import-health/candidates/{key}/abandon": { "post": { "description": "Resolves ONE exhausted candidate with a required non-empty operator reason (audited in the ledger). The ledger enforces exhausted-only; a non-exhausted attempt answers 409 and an empty reason answers 400. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-import-health-abandon", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AbandonInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Audited abandon of an exhausted candidate" } }, "/import-health/candidates/{key}/accept-review-mapping": { "post": { "description": "Operator-confirmed form of the shipped confident remap. The request carries no episode id. Under the shared exact-import guard, the handler re-probes the Arr and requires exactly one file mapped to exactly one aired, monitored, fileless episode of the candidate's series with only numbering-confidence rejections. It submits that Arr episode id through the existing exact ManualImport seam and records import_pending. No queue, blocklist, file-delete, or guessed-id path is reachable. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-import-health-accept-review-mapping", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Accept the Arr's current 1:1 episode mapping" } }, "/import-health/candidates/{key}/clear-payload-sanitize-block": { "post": { "description": "Removes ONE candidate's payload-name-sanitize refusal marker. The automatic class records a marker only when the server's answer was evidence that the rename must not be repeated, and it never re-arms itself; this is the only way back. It performs no arr call, no queue mutation, no rename, and no candidate state change — the next sweep simply re-proves eligibility from scratch and may refuse again. A candidate carrying no marker answers not_eligible. Administrative cockpit authority required.", "operationId": "post-import-health-clear-payload-sanitize-block", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Re-arm the automatic payload-name sanitizer for one candidate" } }, "/import-health/candidates/{key}/episode-options": { "get": { "description": "Joins ONE scoped manual-import candidate probe to ONE series episode read and marks each episode selectable only when it is in the payload, belongs to the expected series, is aired + monitored, and has no file. A probe failure returns the series rows with in_payload=false for the raw-id fallback. This read never authorizes an import; select-episodes re-verifies every posted id server-side. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-import-health-episode-options", "parameters": [ { "description": "the candidate's idempotent key", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/EpisodeOption" }, "type": [ "array", "null" ] } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Browsable advisory episode options for one TV candidate" } }, "/import-health/candidates/{key}/regrab": { "post": { "description": "Allowed ONLY for a regrab_eligible candidate: re-searches its recorded primary Arr and exact candidate episode scope through the existing candidate curation primitive, never current membership or a whole-series fallback. Fresh recorded identity and monitored/fileless target proof precede mutation. The shared one-in-flight guard preserves removeFromClient=FALSE and skipRedownload=TRUE while blocklisting the failed release, then records the retry_wait cooldown. Any other health state returns not_eligible with the state named and never touches the queue — a usable/ambiguous payload is an import problem, not a grab problem. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-import-health-regrab", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Eligible regrab/retry through the curation regrab primitive" } }, "/import-health/candidates/{key}/remove-from-queue": { "post": { "description": "Eligible only for import_blocked, blocked_ambiguous, or exhausted. DownloadID locates a whole queue group; it is not removal authority. With or without a DownloadID, requires the verified recorded movie or series identity and, for TV, the complete expected episode set. Every row of a located download must match that scope before any DELETE; without a DownloadID, requires one exact fallback group. Shares the regrab guard and calls only queue delete with removeFromClient structurally false; the library deleteFiles path is unreachable. then=reopen transitions to regrab_eligible; then=resolve records a same-health audited resolution. Wrong health state or insufficient/conflicting queue scope answers 409 without mutation; refresh evidence and review the full download on a scope refusal. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-import-health-remove-from-queue", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RemoveFromQueueInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Reviewed operator removal of one blocked candidate's queue slot" } }, "/import-health/candidates/{key}/retry-import": { "post": { "description": "Re-probes the arr's manual-import read-back for ONE candidate, rebuilds the expectation from the arr's own records, re-evaluates exact, and submits ONLY a go-decision (import_pending). A still-failing result re-persists the typed reason (import_blocked/blocked_ambiguous) and issues NO import and NO regrab. Eligible only for import_blocked/blocked_ambiguous/source_complete; any other state answers 409 with the state named. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-import-health-retry-import", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Operator re-drive of a blocked/complete candidate's exact import" } }, "/import-health/candidates/{key}/review-mapping": { "get": { "description": "Returns available=true only when the Arr currently reports exactly one payload file mapped to exactly one aired, monitored, fileless episode of the candidate's series and every blocking rejection is a numbering-confidence rejection. This endpoint is read-only. The Accept request carries no episode id; its handler re-probes and submits the Arr's current mapping server-side. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-import-health-review-mapping", "parameters": [ { "description": "the candidate's idempotent key", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CandidateReviewMapping" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Arr-proven 1:1 episode mapping for operator review" } }, "/import-health/candidates/{key}/select-episodes": { "post": { "description": "Rebuilds a TV candidate's expectation with EXACTLY the posted episode ids, re-verified against the arr's own records (each must exist, belong to the series, be monitored + aired, and have no file) — the posted ids are never trusted blind. Any cross-series / unaired / unmonitored / file-backed / unknown id rejects the whole request with no submission. On a go-decision, submits exactly those ids. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-import-health-select-episodes", "parameters": [ { "description": "the candidate's idempotent key (exactly one candidate per call)", "in": "path", "name": "key", "required": true, "schema": { "description": "the candidate's idempotent key (exactly one candidate per call)", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SelectEpisodesInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Operator-supplied exact TV episode mapping (re-verified)" } }, "/media-health/breaker/hold": { "post": { "description": "The only operator override of the detection breaker, and it is fail-safe by construction: it can force the breaker open (suspending proposals and repairs) and nothing else. Authenticated operator attribution and a nonempty reason are required. Holding an already-held breaker re-attributes it. No request to this API can close the breaker, credit a control epoch, or shorten the two-clean-epoch recovery. Administrative cockpit authority required.", "operationId": "post-media-health-breaker-hold", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthBreakerHoldInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthBreakerResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Force the detector breaker OPEN under operator attribution" } }, "/media-health/breaker/release": { "post": { "description": "Clears the hold attribution only. The breaker stays OPEN with zero healthy control epochs, so the standard two-clean-epoch recovery runs from scratch afterwards — this endpoint uses authenticated operator attribution; releasing a breaker that is not held is a no-op. Administrative cockpit authority required.", "operationId": "post-media-health-breaker-release", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthBreakerResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Release an operator hold WITHOUT closing the breaker" } }, "/media-health/probe": { "post": { "description": "Persists one operator-requested probe for exactly one blob. Use blob_id or webdav_path, but never both. The request survives restart, is selected before scheduled targets within the same budget, and is consumed with the next recorded probe outcome. A disabled detector answers 503. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-media-health-probe", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthProbeInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthProbeResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Request ONE operator media-health probe" } }, "/media-health/proposals": { "get": { "description": "The media-health review panel: every confirmed NzbDAV fault the detector proposed a repair for, grouped by whether it awaits a decision, is being repaired, or is finished. Each proposal carries the COMPLETE consumer snapshot, so a season pack shows every episode the repair covers. The response also reports the detector's global breaker: while it is open, an approval is recorded but no repair executes. Read once from the ledger. Administrative cockpit authority required.", "operationId": "get-media-health-proposals", "parameters": [ { "description": "group filter (empty = all groups)", "explode": false, "in": "query", "name": "group", "schema": { "description": "group filter (empty = all groups)", "enum": [ "review", "repairing", "closed" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthReviewResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Media-fault repair proposals grouped review/repairing/closed" } }, "/media-health/proposals/{id}": { "get": { "description": "The inspector view: the proposal's blob identity, every Arr record it backs, and the append-only stage trail of its repair (queued, deleting, searching, awaiting, verifying, done/failed) with the reason recorded at each transition. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-media-health-proposal", "parameters": [ { "description": "the proposal id (exactly one proposal per call)", "in": "path", "name": "id", "required": true, "schema": { "description": "the proposal id (exactly one proposal per call)", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthDetail" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "One proposal with its repair transition trail" } }, "/media-health/proposals/{id}/approve": { "post": { "description": "Records operator consent for exactly one proposal and opens its repair at the queued stage. NO Arr call is made here: the fault-kind verifier re-probes immediately before acting and abandons the repair if its proof no longer holds. Only a pending proposal is eligible; an already decided, executing, or retracted one answers 409. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-media-health-approve", "parameters": [ { "description": "the proposal id (exactly one proposal per call)", "in": "path", "name": "id", "required": true, "schema": { "description": "the proposal id (exactly one proposal per call)", "format": "int64", "type": "integer" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthDecisionInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthDecisionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Approve the repair of ONE media fault" } }, "/media-health/proposals/{id}/reject": { "post": { "description": "Closes exactly one proposal with a required non-empty audited reason. No repair row is created and no Arr delete, blocklist, queue removal, search, or grab is ever issued for it. An empty reason answers 400; a non-pending proposal answers 409. The blob stays in the detector's inventory and re-surfaces only if its same fault kind is confirmed again. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-media-health-reject", "parameters": [ { "description": "the proposal id (exactly one proposal per call)", "in": "path", "name": "id", "required": true, "schema": { "description": "the proposal id (exactly one proposal per call)", "format": "int64", "type": "integer" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthDecisionInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MediaHealthDecisionResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Reject the repair of ONE media fault" } }, "/notify/recent": { "get": { "description": "Administrator-only notify_log feed: media_arrived, media_stalled, media_regrab, and media_import_issue pushes with the descriptor recorded at send time (title, year, owner, hint). Administrative cockpit authority required.", "operationId": "get-notify-recent", "parameters": [ { "description": "max rows (newest first)", "explode": false, "in": "query", "name": "limit", "schema": { "default": 15, "description": "max rows (newest first)", "format": "int64", "maximum": 200, "minimum": 1, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotifyRecentOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Recent notifications pushed to Home Assistant (newest first)" } }, "/operations/titles/{tmdb}/{type}": { "get": { "description": "Administrative read only. Includes terminal candidates and complete retained histories. Import, dispatch and current route-presence observations fail independently; unavailable evidence never proves empty, imported or playable media. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-title-diagnosis", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "movie", "tv" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TitleDiagnosis" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read exact retained import and dispatch evidence for a typed title" } }, "/operations/titles/{tmdb}/{type}/media-health": { "get": { "description": "Read only. Matches any recorded consumer and retains the entire proposal scope, including other titles and mirrors. File identities are proposal snapshots, not fresh Arr proof. No probe, repair, retry or policy change occurs. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-title-media-health", "parameters": [ { "in": "path", "name": "tmdb", "required": true, "schema": { "format": "int64", "minimum": 1, "type": "integer" } }, { "in": "path", "name": "type", "required": true, "schema": { "enum": [ "movie", "tv" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TitleMediaHealth" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read complete media-health proposals and repair evidence for one typed title" } }, "/reconcile/replacement-holds": { "get": { "description": "Lists replacement holds whose expiry is still in the future. Administrative cockpit authority required.", "operationId": "list-replacement-holds", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReplacementHoldsResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "List active operator replacement holds" }, "post": { "description": "Creates or replaces a TTL-bound hold for exactly one primary Radarr movie or a set of primary Sonarr episodes. A hold prevents auto-resolve from clearing the matching Arr queue candidate; it does not import the replacement. Administrative cockpit authority required.", "operationId": "create-replacement-holds", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateReplacementHoldInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReplacementHoldsResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Hold satisfied candidate auto-resolve for a replacement grab" } }, "/reconcile/replacement-holds/{arr}/{record_type}/{record_id}": { "delete": { "description": "Deletes the hold for one Arr record. Releasing a missing hold is an idempotent no-op. Administrative cockpit authority required.", "operationId": "release-replacement-hold", "parameters": [ { "description": "Arr instance name", "in": "path", "name": "arr", "required": true, "schema": { "description": "Arr instance name", "type": "string" } }, { "description": "held record type", "in": "path", "name": "record_type", "required": true, "schema": { "description": "held record type", "enum": [ "episode", "movie" ], "type": "string" } }, { "description": "Arr episode or movie id", "in": "path", "name": "record_id", "required": true, "schema": { "description": "Arr episode or movie id", "format": "int64", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReplacementHoldReleaseResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Release one operator replacement hold" } }, "/recovery/layer/actions": { "get": { "description": "Returns durable MaterializeAndRefresh proposals and execution stages. Paired tmdb_id/media_type selects complete retained title history, including terminal actions, without the global worklist limit. Approval is a separate, explicitly named POST. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits. Non-administrators must supply paired positive tmdb_id and movie/tv media_type filters; global worklists remain administrative.", "operationId": "get-recovery-layer-actions", "parameters": [ { "description": "exact title TMDB identity; requires media_type", "explode": false, "in": "query", "name": "tmdb_id", "schema": { "description": "exact title TMDB identity; requires media_type", "format": "int64", "minimum": 1, "type": "integer" } }, { "description": "exact title type; requires tmdb_id", "explode": false, "in": "query", "name": "media_type", "schema": { "description": "exact title type; requires tmdb_id", "enum": [ "movie", "tv" ], "type": "string" } }, { "description": "exact durable stage filter (empty = all)", "explode": false, "in": "query", "name": "stage", "schema": { "description": "exact durable stage filter (empty = all)", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LayerVisibilityActionsOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read reviewed layer convergence actions" } }, "/recovery/layer/actions/{action_id}": { "get": { "description": "Returns one stable action identity with its latest exact represented-child evidence and append-only durable stage history. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "get-recovery-layer-action", "parameters": [ { "description": "stable reviewed action identity", "in": "path", "name": "action_id", "required": true, "schema": { "description": "stable reviewed action identity", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LayerVisibilityActionOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read one layer action, exact proof, and history" } }, "/recovery/layer/actions/{action_id}/approve": { "post": { "description": "Runs the reviewed MaterializeAndRefresh for exactly one proposed action IN THE SERVING PROCESS, and returns the stage the executor left it in. Every stage is a durable compare-and-set commit, so the trail is readable from the action route while this call is in flight. The executor re-reads fresh proof and re-confirms the content behind the item before it materialises anything: an already-converged item closes without remote work, and unreadable content aborts as execution_uncertain rather than re-advertising a broken item. An unknown id answers 404, an action that is not proposed answers 409, and an unwired executor answers 503. There is no bulk approval by construction. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits.", "operationId": "post-recovery-layer-approve", "parameters": [ { "description": "stable reviewed action identity", "in": "path", "name": "action_id", "required": true, "schema": { "description": "stable reviewed action identity", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LayerVisibilityApprovalView" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Approve and execute ONE layer convergence action" } }, "/recovery/layer/observations": { "get": { "description": "Returns exact Arr-to-owned-link-to-Jellyfin observations. Paired tmdb_id/media_type selects every recorded bucket for that title without the global worklist limit. Parent Series, Season, and watch metadata are not convergence proof. Library-management cockpit capability required (administrators included); this grants authority across household titles, not other viewers' watched-state or recommendation edits. Non-administrators must supply paired positive tmdb_id and movie/tv media_type filters; global worklists remain administrative.", "operationId": "get-recovery-layer-observations", "parameters": [ { "description": "exact title TMDB identity; requires media_type", "explode": false, "in": "query", "name": "tmdb_id", "schema": { "description": "exact title TMDB identity; requires media_type", "format": "int64", "minimum": 1, "type": "integer" } }, { "description": "exact title type; requires tmdb_id", "explode": false, "in": "query", "name": "media_type", "schema": { "description": "exact title type; requires tmdb_id", "enum": [ "movie", "tv" ], "type": "string" } }, { "description": "status filter (empty = all)", "explode": false, "in": "query", "name": "status", "schema": { "description": "status filter (empty = all)", "enum": [ "converged", "drift", "scanner_pending", "unknown", "no_files", "unreleased", "needs_operator" ], "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LayerVisibilityObservationsOutputBody" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read current layer and Jellyfin convergence evidence" } }, "/recovery/spottarr/freshness": { "get": { "description": "Returns the cached read-only SQLite freshness observation: newest IndexedAt/UpdatedAt timestamp, age, and row count. HTTP liveness is not indexing proof. Administrative cockpit authority required.", "operationId": "get-recovery-spottarr-freshness", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpottarrFreshnessView" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Read cached Spottarr index freshness" } }, "/seerr/webhook": { "post": { "description": "Classifies notification_type: MEDIA_APPROVED/MEDIA_AUTO_APPROVED are inserted into webhook_dedup and answered 200 immediately (the worker runs the dispatch engine). TEST_NOTIFICATION answers 200 and does nothing. MEDIA_DECLINED and everything else are ignored (deletions are out of scope). Restricted to direct loopback bundled-service callers without browser/session/proxy headers; no cockpit role is granted.", "operationId": "post-seerr-webhook", "requestBody": { "content": { "application/octet-stream": { "schema": { "contentMediaType": "application/octet-stream", "format": "binary", "type": "string" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookAck" } } }, "description": "OK" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Bundled-service caller required" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "summary": "Jellyseerr approval webhook (insert + 200; worker dispatches)" } }, "/supervise/restart/{target}": { "post": { "description": "Cycles a process-backed bundled service (nzbdav, an arr, prowlarr, seerr) via the supervisor, or restarts an allowlisted sibling container through the socket-proxy (degrading cleanly when the proxy is absent). Worker-loop modules (dispatch-sweep, webhook-worker) are NOT restartable — they ride the conductarr process — and answer 400. Administrative cockpit authority required.", "operationId": "post-supervise-restart", "parameters": [ { "description": "module or sibling name to restart", "in": "path", "name": "target", "required": true, "schema": { "description": "module or sibling name to restart", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RestartResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Restart a bundled service or managed sibling" } }, "/torrent/arm": { "post": { "description": "Persists the armed state on the plan revision the owner read in the arm confirm; the next start pushes its pick. Answers 409 when that revision is no longer the current plan, and 503 while features.torrent_fallback is off. No restart is involved. Administrative cockpit authority required.", "operationId": "arm-torrent-lane", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentArmInputBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentStatusResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Arm the torrent lane" } }, "/torrent/candidates": { "get": { "description": "The joined candidates table of the torrent lane: every dead-file record of a repair proposal and every missing monitored record on a primary Arr, with the ledger that tracks it, its answered-silent days, whether the count was seeded from history, and whether it qualifies. Read from the lane's ledger alone; answers 503 while features.torrent_fallback is off. Administrative cockpit authority required.", "operationId": "get-torrent-candidates", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentCandidatesResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Torrent candidates with their silence clocks" } }, "/torrent/disarm": { "post": { "description": "Clears the armed state: the next start is a dry run again, and pushed handoffs run to their terminal. Answers 503 while features.torrent_fallback is off. Administrative cockpit authority required.", "operationId": "disarm-torrent-lane", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentStatusResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Return the torrent lane to shadow" } }, "/torrent/history": { "get": { "description": "Returns recorded handoffs from the lane ledger. Answers 503 while features.torrent_fallback is off. Administrative cockpit authority required.", "operationId": "get-torrent-history", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentHistoryResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Torrent handoff history" } }, "/torrent/plan": { "get": { "description": "Returns the latest cached dry-run plan and its row decisions without issuing grabs. Answers 503 while features.torrent_fallback is off. Administrative cockpit authority required.", "operationId": "get-torrent-plan", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentPlanResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Latest torrent shadow plan" } }, "/torrent/status": { "get": { "description": "Returns cached lane mode and handoff capacity. Answers 503 while features.torrent_fallback is off. Administrative cockpit authority required.", "operationId": "get-torrent-status", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentStatusResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Torrent lane shadow status" } }, "/torrent/summary": { "get": { "description": "Sums the current plan's rows: torrent releases each acceptability rule dropped per indexer, coverage by kind and anime flag, rotation over the day-one set, usenet wins, the disk of the next starts against the floor, and whether the arming floor holds per kind. Reads persisted state only; answers 503 while features.torrent_fallback is off. Administrative cockpit authority required.", "operationId": "get-torrent-summary", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TorrentSummaryResult" } } }, "description": "OK" }, "401": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Authentik sign-in required" }, "403": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Operator or target is not permitted" }, "503": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Identity verification or operation unavailable" }, "default": { "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ErrorModel" } } }, "description": "Error" } }, "security": [ { "authentikSession": [] } ], "summary": "Torrent shadow summary" } } } }