Skip to content

Update work

PATCH
/api/v1/works/{id}
curl --request PATCH \
--url https://example.com/api/v1/works/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Content-Type: application/json' \
--cookie kivo_session=<kivo_session> \
--data '{ "title": "example", "sortTitle": "example", "originalTitle": "example", "year": 1, "overview": "example", "contentRating": "example", "genres": [ "example" ], "studios": [ "example" ], "episode": { "airDate": "2026-04-15" }, "book": { "subtitle": "example", "publisher": "example", "releaseDate": "example", "asin": "example", "authors": [ "example" ], "narrators": [ "example" ], "series": [ { "name": "example", "position": "example", "primary": true } ] }, "series": { "ordering": "example" } }'

Each field sent is saved and locked, so refreshes keep it. Setting lockedFields replaces the set of locked fields, which is how a field is unlocked. series.ordering changes a series’ episode ordering and renumbers its episodes without touching watch state.

id
required

A UUIDv7.

string format: uuid
Media typeapplication/json

Only the fields sent change, and each is locked.

object
title
string
>= 1 characters
sortTitle
string
>= 1 characters
originalTitle
string
year
integer
overview
string
contentRating

One of listContentRatings’ names, which also sets the age it means, or empty for unrated.

string
genres
Array<string>
studios
Array<string>
episode
object
airDate
string format: date
book

A book’s own fields. Its description is overview. Their locked field names are book. and the field’s name.

object
subtitle
string
publisher
string
releaseDate

YYYY, YYYY-MM or YYYY-MM-DD, or empty; sets the year too.

string
/^(\d{4}(-\d{2}(-\d{2})?)?)?$/
asin
string
<= 20 characters
authors

Names in order, used as written; the first is the primary author.

Array<string>
narrators
Array<string>
series

The book’s series, replacing those it has. A name is the oldest series of that name, else a new one.

Array<object>
object
name
required
string
>= 1 characters
position

As written, such as 1, 1.5 or 1-3.

string
primary

One series is primary; with none marked, the first.

boolean
series
object
ordering

Documented values aired, dvd, absolute, group:<ID>, where the ID is one of the series’ TMDb episode groups (field code unknownEpisodeGroup otherwise). An ordering TMDb can’t resolve when episodes are placed, such as DVD for a series with no DVD order, places them in aired order. Not a locked field.

string

Example generated

{
"title": "example",
"sortTitle": "example",
"originalTitle": "example",
"year": 1,
"overview": "example",
"contentRating": "example",
"genres": [
"example"
],
"studios": [
"example"
],
"episode": {
"airDate": "2026-04-15"
},
"book": {
"subtitle": "example",
"publisher": "example",
"releaseDate": "example",
"asin": "example",
"authors": [
"example"
],
"narrators": [
"example"
],
"series": [
{
"name": "example",
"position": "example",
"primary": true
}
]
},
"series": {
"ordering": "example"
}
}

The updated work.

Media typeapplication/json

The detail page: the summary’s fields plus the rest. Fields marked “detail only” in the kind objects are set here.

object
id
required

A UUIDv7.

string format: uuid
kind
required

What a work is: video an item of a videos library and book an item of an audiobooks library. Skip kinds you don’t know.

string
Allowed values: movie series season episode extra video book
title
required
string
year
integer
durationMs

The default version’s duration.

integer
communityRating

TMDb’s community rating of a movie, series or episode: the average of its users’ votes, 0 to 10. Absent when it has no votes.

number format: double
<= 10
communityVotes

How many votes communityRating averages.

integer
>= 1
contentRating

The content rating for the server’s content rating country, such as PG-13 or TV-MA; absent when unrated. On the detail page, a season or episode without one has its series’.

string
addedAt
string format: date-time
matchState
required

Whether a work is identified: identifying is provisional, its first identification pending, and unmatched provisional with no confident match. Provisional items are playable.

string
Allowed values: matched identifying unmatched
available
required

False when every version’s folder is unreachable.

boolean
images
required
object
poster

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
backdrop

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
still

An episode’s or video’s frame, for landscape cards.

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
logo

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
userState

The user’s state for a work. For a series or season, played means every episode is.

object
played
required
boolean
favorite
required
boolean
playCount
required
integer
positionMs

The resume position, when in progress.

integer
versionId

The version last played, which positionMs is on; it may be gone. Resume continues its edition, and a version of another edition starts from the beginning.

string format: uuid
lastPlayedAt
string format: date-time
movie
object
edition

The label the movie’s folder’s edition tag gives it, such as Final Cut. Shown after the title wherever it appears.

string
series
object
seasonCount

Detail only.

integer
unplayedCount
required

Unplayed episodes.

integer
recentlyAddedCount

In Recently Added, the episodes this summary bundles.

integer
lastAirYear
integer
ordering

Detail only. Documented values aired, dvd, absolute, or group:<provider episode group ID>.

string
nextUp

Detail only. The episode the primary button plays.

object
id
required

A UUIDv7.

string format: uuid
kind
required

What a work is: video an item of a videos library and book an item of an audiobooks library. Skip kinds you don’t know.

string
Allowed values: movie series season episode extra video book
title
required
string
year
integer
durationMs

The default version’s duration.

integer
communityRating

TMDb’s community rating of a movie, series or episode: the average of its users’ votes, 0 to 10. Absent when it has no votes.

number format: double
<= 10
communityVotes

How many votes communityRating averages.

integer
>= 1
contentRating

The content rating for the server’s content rating country, such as PG-13 or TV-MA; absent when unrated. On the detail page, a season or episode without one has its series’.

string
addedAt
string format: date-time
matchState
required

Whether a work is identified: identifying is provisional, its first identification pending, and unmatched provisional with no confident match. Provisional items are playable.

string
Allowed values: matched identifying unmatched
available
required

False when every version’s folder is unreachable.

boolean
images
required
object
poster

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
backdrop

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
still

An episode’s or video’s frame, for landscape cards.

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
logo

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
userState

The user’s state for a work. For a series or season, played means every episode is.

object
played
required
boolean
favorite
required
boolean
playCount
required
integer
positionMs

The resume position, when in progress.

integer
versionId

The version last played, which positionMs is on; it may be gone. Resume continues its edition, and a version of another edition starts from the beginning.

string format: uuid
lastPlayedAt
string format: date-time
movie
object
edition

The label the movie’s folder’s edition tag gives it, such as Final Cut. Shown after the title wherever it appears.

string
series
object recursive
season
object
number
required

0 is Specials.

integer
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
episodeCount

How many episodes the season lists. Set in its series’ season list and on its detail.

integer
unplayedCount
required
integer
episode
object
seasonNumber
required

0 is Specials.

integer
number
required
integer
endNumber

The last episode a multi-episode file covers (E1 to E2).

integer
airDate
string format: date
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
seasonId

A UUIDv7.

string format: uuid
previousId

Detail only. The previous episode in the series’ order, across seasons, with specials last. Absent for the first.

string format: uuid
nextId

Detail only. The next episode in the series’ order, across seasons, with specials last. Absent for the last.

string format: uuid
overview

A season’s episode list only. The episode’s synopsis, absent when it has none.

string
extra
object
type
required

What an extra is.

string
Allowed values: trailer featurette behindTheScenes deletedScene interview scene short other
parentId

The movie, series or season it belongs to.

string format: uuid
book
object
authors
required

In credit order; the first is the primary author.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
narrators
required
Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
series
required

The series the book is in, the primary first.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
position

The book’s position as written, such as 1, 1.5 or 1-3; absent for none.

string
primary
required
boolean
subtitle

Detail only.

string
publisher

Detail only.

string
language

Detail only, as its source gives it.

string
abridged

Detail only; absent when unknown.

boolean
releaseDate

Detail only. YYYY, YYYY-MM or YYYY-MM-DD.

string
libraryId

The library this work is in. Absent when the user doesn’t see it.

string format: uuid
path

In the unmatched list only: the folder a series or book was parsed from, else the file, as found in its library. Absent when it has no file there.

string
season
object
number
required

0 is Specials.

integer
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
episodeCount

How many episodes the season lists. Set in its series’ season list and on its detail.

integer
unplayedCount
required
integer
episode
object
seasonNumber
required

0 is Specials.

integer
number
required
integer
endNumber

The last episode a multi-episode file covers (E1 to E2).

integer
airDate
string format: date
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
seasonId

A UUIDv7.

string format: uuid
previousId

Detail only. The previous episode in the series’ order, across seasons, with specials last. Absent for the first.

string format: uuid
nextId

Detail only. The next episode in the series’ order, across seasons, with specials last. Absent for the last.

string format: uuid
overview

A season’s episode list only. The episode’s synopsis, absent when it has none.

string
extra
object
type
required

What an extra is.

string
Allowed values: trailer featurette behindTheScenes deletedScene interview scene short other
parentId

The movie, series or season it belongs to.

string format: uuid
book
object
authors
required

In credit order; the first is the primary author.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
narrators
required
Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
series
required

The series the book is in, the primary first.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
position

The book’s position as written, such as 1, 1.5 or 1-3; absent for none.

string
primary
required
boolean
subtitle

Detail only.

string
publisher

Detail only.

string
language

Detail only, as its source gives it.

string
abridged

Detail only; absent when unknown.

boolean
releaseDate

Detail only. YYYY, YYYY-MM or YYYY-MM-DD.

string
libraryId

The library this work is in. Absent when the user doesn’t see it.

string format: uuid
path

In the unmatched list only: the folder a series or book was parsed from, else the file, as found in its library. Absent when it has no file there.

string
originalTitle
string
sortTitle
string
overview
string
genres
required
Array<string>
studios
required
Array<string>
credits
required
Array<object>
object
personId
required

A UUIDv7.

string format: uuid
name
required
string
role
required

Free text, such as actor, director, writer; a book’s are author and narrator.

string
character
string
photo

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
externalIds
required
Array<object>
object
provider
required

A metadata provider an ID is from; audible is a book’s ASIN.

string
Allowed values: tmdb tvdb imdb anidb audible
kind
required

The provider’s kind, such as movie, series, episode.

string
id
required
string
versions
required

Playable versions in libraries the user can see. A version with a missing file isn’t listed, and is again if the file returns within 30 days. Untagged versions come first, then each edition by label, ignoring case; within an edition, the taller picture comes first, then the larger size. A play that names no version plays the one the user last played (UserState.versionId) while it’s listed here, else the first. Empty for series and seasons.

Array<object>

One playable copy of a work. Its tracks are its first part’s.

object
id
required

A UUIDv7.

string format: uuid
edition

The cut its files’ edition tag names, such as Final Cut; absent for an untagged version.

string
resolution

Its video’s resolution class; absent without video.

string
Allowed values: 4k 1080p 720p sd
hdr

Its video’s HDR format; absent for SDR or without video.

string
Allowed values: hdr10 hdr10plus hlg dolbyVision
available
required

False when a part’s folder is unreachable.

boolean
libraryId

A UUIDv7.

string format: uuid
container
string
durationMs
required
integer
sizeBytes
required
integer format: int64
bitrateBps
integer format: int64
parts
required
Array<object>
object
fileId
required

A UUIDv7.

string format: uuid
name
required

The file’s name.

string
durationMs
required
integer
sizeBytes
required
integer format: int64
tracks
required
Array<object>

An audio, video or subtitle track. Kind-specific data is under its type’s name.

object
id
required

The track’s ID; chooses it in a play request. An embedded track keeps its ID while its file is unchanged, and a subtitle file keeps its own while it stays at its path, so adding or removing one never changes another track’s ID.

string format: uuid
type
required

A track’s type.

string
Allowed values: video audio subtitle
codec
required
string
language

A BCP 47 tag.

string
title

The track’s title as the file gives it, such as “Commentary by the director” or “Signs & Songs”; for a downloaded subtitle, the release OpenSubtitles says it was made for, such as Modern.Family.S03E16.480p.BluRay.x264-mSD.

string
default
required
boolean
forced

Subtitles only, marked as forced (they show only lines in another language than the audio); absent when not.

boolean
hearingImpaired

Marked as for the deaf and hard of hearing (SDH); absent when not.

boolean
commentary

Marked as commentary, or titled with the word; absent when not.

boolean
original

Audio only: in the work’s original language, as the metadata provider gives it, where the work also has audio in another language; never a commentary. Absent when not.

boolean
video
object
width
required
integer
height
required
integer
resolution

A video’s resolution class, by its width, since wide films are short: 4k from 3200 pixels, 1080p from 1700, 720p from 1200, else sd. The library’s resolution filter classes videos the same way.

string
Allowed values: 4k 1080p 720p sd
frameRate
number
profile

As the codec names it, such as “Main 10”.

string
hdr

Its HDR format, hdr10, hlg or dolbyVision; absent for SDR. An HDR10+ video’s is hdr10.

string
Allowed values: hdr10 hdr10plus hlg dolbyVision
audio
object
channels
required
integer
layout

The channel layout as main and LFE channels, such as “2.0”, “4.0”, “5.1” or “7.1”; absent when the file doesn’t say.

string
profile

What the audio’s profile says beyond its codec: atmos for Dolby Atmos on TrueHD or E-AC-3, dtsX, dtsHdMa or dtsHdHra for DTS; absent for any other.

string
Allowed values: atmos dtsX dtsHdMa dtsHdHra
subtitle
object
source
required

Where a subtitle lives: embedded in the media, external a subtitle file next to the video in the library, downloaded from OpenSubtitles. How a play delivers it is the track’s delivery, where external means a subtitle sent to the client as its own file.

string
Allowed values: embedded external downloaded
audioTrackId

The audio track the caller’s play of this version starts with when the request chooses none (PlayCreate); absent when the version has no audio.

string format: uuid
subtitleTrackId

The subtitle track the caller’s play of this version starts with when the request chooses none (PlayCreate); absent when subtitles start off.

string format: uuid
workIds
required

The works this version covers, in order; more than one for a multi-episode file.

Array<string>
chapterCount

Chapters on the version’s timeline: each part’s own, and for a part of several with none, the part itself, as a book of per-chapter files has them. A part’s chapters are left out unless they are in order, don’t overlap and fit in its file.

integer
chapters

A book’s chapters on the version’s timeline, as a play lists them, for its page to list and start playback at; absent for other kinds.

Array<object>
object
startMs
required
integer
endMs
required
integer
title
string
markers

An episode’s or a movie’s markers on the version’s timeline, as a play of it has them; absent for other kinds.

Array<object>

A part of a video’s timeline a player offers to skip. An episode has intro, recap and credits markers, a movie credits only, any other video none. Each kind comes from an admin’s marker, else, for an episode, what the server found in its season’s audio and pictures, else the file’s own chapters (a chapter whose whole name is the marker’s: Intro, Opening Credits, OP; Recap, Previously On; Credits, End Credits, ED, where it belongs and as long as one lasts).

object
kind
required

What a marker skips. A later server may add kinds; skip a marker of a kind you don’t know.

string
Allowed values: intro recap credits
startMs
required
integer
endMs
required
integer
source
required

Where a marker comes from: the file’s chapters, the audio its episode shares with others in its season (and, for credits, its pictures), or an admin. A later server may add sources.

string
Allowed values: chapter fingerprint manual
final

Set on final credits: nothing follows them to the video’s end but, perhaps, a next episode’s preview, so up next may appear at their start.

boolean
remembersTracks

With versions: whether choosing tracks for this work remembers them for its series, as for an episode when the user’s rememberTracks is on (PlaybackPreferences).

boolean
extras
required

Extras, as summaries of kind extra.

Array<object>

The work’s summary, with its artwork; absent for a work the admin may not see.

object
id
required

A UUIDv7.

string format: uuid
kind
required

What a work is: video an item of a videos library and book an item of an audiobooks library. Skip kinds you don’t know.

string
Allowed values: movie series season episode extra video book
title
required
string
year
integer
durationMs

The default version’s duration.

integer
communityRating

TMDb’s community rating of a movie, series or episode: the average of its users’ votes, 0 to 10. Absent when it has no votes.

number format: double
<= 10
communityVotes

How many votes communityRating averages.

integer
>= 1
contentRating

The content rating for the server’s content rating country, such as PG-13 or TV-MA; absent when unrated. On the detail page, a season or episode without one has its series’.

string
addedAt
string format: date-time
matchState
required

Whether a work is identified: identifying is provisional, its first identification pending, and unmatched provisional with no confident match. Provisional items are playable.

string
Allowed values: matched identifying unmatched
available
required

False when every version’s folder is unreachable.

boolean
images
required
object
poster

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
backdrop

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
still

An episode’s or video’s frame, for landscape cards.

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
logo

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
userState

The user’s state for a work. For a series or season, played means every episode is.

object
played
required
boolean
favorite
required
boolean
playCount
required
integer
positionMs

The resume position, when in progress.

integer
versionId

The version last played, which positionMs is on; it may be gone. Resume continues its edition, and a version of another edition starts from the beginning.

string format: uuid
lastPlayedAt
string format: date-time
movie
object
edition

The label the movie’s folder’s edition tag gives it, such as Final Cut. Shown after the title wherever it appears.

string
series
object
seasonCount

Detail only.

integer
unplayedCount
required

Unplayed episodes.

integer
recentlyAddedCount

In Recently Added, the episodes this summary bundles.

integer
lastAirYear
integer
ordering

Detail only. Documented values aired, dvd, absolute, or group:<provider episode group ID>.

string
nextUp

Detail only. The episode the primary button plays.

object
id
required

A UUIDv7.

string format: uuid
kind
required

What a work is: video an item of a videos library and book an item of an audiobooks library. Skip kinds you don’t know.

string
Allowed values: movie series season episode extra video book
title
required
string
year
integer
durationMs

The default version’s duration.

integer
communityRating

TMDb’s community rating of a movie, series or episode: the average of its users’ votes, 0 to 10. Absent when it has no votes.

number format: double
<= 10
communityVotes

How many votes communityRating averages.

integer
>= 1
contentRating

The content rating for the server’s content rating country, such as PG-13 or TV-MA; absent when unrated. On the detail page, a season or episode without one has its series’.

string
addedAt
string format: date-time
matchState
required

Whether a work is identified: identifying is provisional, its first identification pending, and unmatched provisional with no confident match. Provisional items are playable.

string
Allowed values: matched identifying unmatched
available
required

False when every version’s folder is unreachable.

boolean
images
required
object
poster

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
backdrop

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
still

An episode’s or video’s frame, for landscape cards.

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
logo

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
userState

The user’s state for a work. For a series or season, played means every episode is.

object
played
required
boolean
favorite
required
boolean
playCount
required
integer
positionMs

The resume position, when in progress.

integer
versionId

The version last played, which positionMs is on; it may be gone. Resume continues its edition, and a version of another edition starts from the beginning.

string format: uuid
lastPlayedAt
string format: date-time
movie
object
edition

The label the movie’s folder’s edition tag gives it, such as Final Cut. Shown after the title wherever it appears.

string
series
object recursive
season
object
number
required

0 is Specials.

integer
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
episodeCount

How many episodes the season lists. Set in its series’ season list and on its detail.

integer
unplayedCount
required
integer
episode
object
seasonNumber
required

0 is Specials.

integer
number
required
integer
endNumber

The last episode a multi-episode file covers (E1 to E2).

integer
airDate
string format: date
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
seasonId

A UUIDv7.

string format: uuid
previousId

Detail only. The previous episode in the series’ order, across seasons, with specials last. Absent for the first.

string format: uuid
nextId

Detail only. The next episode in the series’ order, across seasons, with specials last. Absent for the last.

string format: uuid
overview

A season’s episode list only. The episode’s synopsis, absent when it has none.

string
extra
object
type
required

What an extra is.

string
Allowed values: trailer featurette behindTheScenes deletedScene interview scene short other
parentId

The movie, series or season it belongs to.

string format: uuid
book
object
authors
required

In credit order; the first is the primary author.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
narrators
required
Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
series
required

The series the book is in, the primary first.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
position

The book’s position as written, such as 1, 1.5 or 1-3; absent for none.

string
primary
required
boolean
subtitle

Detail only.

string
publisher

Detail only.

string
language

Detail only, as its source gives it.

string
abridged

Detail only; absent when unknown.

boolean
releaseDate

Detail only. YYYY, YYYY-MM or YYYY-MM-DD.

string
libraryId

The library this work is in. Absent when the user doesn’t see it.

string format: uuid
path

In the unmatched list only: the folder a series or book was parsed from, else the file, as found in its library. Absent when it has no file there.

string
season
object
number
required

0 is Specials.

integer
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
episodeCount

How many episodes the season lists. Set in its series’ season list and on its detail.

integer
unplayedCount
required
integer
episode
object
seasonNumber
required

0 is Specials.

integer
number
required
integer
endNumber

The last episode a multi-episode file covers (E1 to E2).

integer
airDate
string format: date
seriesId
required

A UUIDv7.

string format: uuid
seriesTitle
required
string
seasonId

A UUIDv7.

string format: uuid
previousId

Detail only. The previous episode in the series’ order, across seasons, with specials last. Absent for the first.

string format: uuid
nextId

Detail only. The next episode in the series’ order, across seasons, with specials last. Absent for the last.

string format: uuid
overview

A season’s episode list only. The episode’s synopsis, absent when it has none.

string
extra
object
type
required

What an extra is.

string
Allowed values: trailer featurette behindTheScenes deletedScene interview scene short other
parentId

The movie, series or season it belongs to.

string format: uuid
book
object
authors
required

In credit order; the first is the primary author.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
narrators
required
Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
series
required

The series the book is in, the primary first.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
string
position

The book’s position as written, such as 1, 1.5 or 1-3; absent for none.

string
primary
required
boolean
subtitle

Detail only.

string
publisher

Detail only.

string
language

Detail only, as its source gives it.

string
abridged

Detail only; absent when unknown.

boolean
releaseDate

Detail only. YYYY, YYYY-MM or YYYY-MM-DD.

string
libraryId

The library this work is in. Absent when the user doesn’t see it.

string format: uuid
path

In the unmatched list only: the folder a series or book was parsed from, else the file, as found in its library. Absent when it has no file there.

string
collections
required

Collections this work is in.

Array<object>

A movie collection or a videos library’s folder, for its card.

object
id
required

A UUIDv7.

string format: uuid
name
required
string
workCount
required

Its root works the user sees.

integer
source

Where a collection comes from: provider a movie collection, folder a videos-library folder.

string
Allowed values: provider folder
images
required

Its poster: a movie collection’s own, which its movies’ metadata refreshes fetch, else the poster of its first root work the user sees that has one, in release order.

object
poster

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
backdrop

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
still

An episode’s or video’s frame, for landscape cards.

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
logo

Fetch with GET /api/v1/images/{id}?width=….

object
id
required

A UUIDv7.

string format: uuid
blurhash
string
width

The largest stored width.

integer
height
integer
lockedFields

Admins only. Fields an admin edited, shown with a lock icon.

Array<string>

Example

{
"kind": "movie",
"matchState": "matched",
"series": {
"nextUp": {
"kind": "movie",
"matchState": "matched",
"extra": {
"type": "trailer"
}
}
},
"extra": {
"type": "trailer"
},
"externalIds": [
{
"provider": "tmdb"
}
],
"versions": [
{
"resolution": "4k",
"hdr": "hdr10",
"tracks": [
{
"type": "video",
"video": {
"resolution": "4k",
"hdr": "hdr10"
},
"audio": {
"profile": "atmos"
},
"subtitle": {
"source": "embedded"
}
}
],
"markers": [
{
"kind": "intro",
"source": "chapter"
}
]
}
],
"extras": [
{
"kind": "movie",
"matchState": "matched",
"series": {
"nextUp": {
"kind": "movie",
"matchState": "matched",
"extra": {
"type": "trailer"
}
}
},
"extra": {
"type": "trailer"
}
}
],
"collections": [
{
"source": "provider"
}
]
}

The request is malformed or a field is invalid (code invalidRequest).

Media typeapplication/problem+json

An RFC 9457 problem document. code is stable and is what clients translate.

object
type
required

A URI naming the problem type; about:blank when only code matters.

string
title
required

A short English summary, for logs.

string
status
required
integer
detail

English detail for logs and developers; never internal error text.

string
instance
string
code
required

A problem’s stable code, which clients translate. A client that doesn’t know a code goes by the response’s status.

string
Allowed values: invalidRequest unauthenticated invalidCredentials wrongPassword forbidden crossOrigin denied notFound expired notReady rangeNotSatisfiable conflict alreadySetUp nameTaken lastAdmin ownUser fileStillPresent kindMismatch notStoppable streamLimit notPlayable noFallback playEnded throttled rateLimited providerUnavailable notConfigured quotaUsed transcodeBusy transcodeFailed internal
requestId
required

The request ID, also in the X-Request-Id header and the server log.

string
reason

For transcodeBusy and notPlayable, why. For transcodeBusy: transcodeLimit or storageFull. For notPlayable: noTracks, fileUnplayable, subtitleUnplayable, transcodeFailed, keyframeIndexMissing or downloadsNotAllowed.

string
Allowed values: noTracks fileUnplayable subtitleUnplayable keyframeIndexMissing transcodeFailed transcodeLimit storageFull downloadsNotAllowed sourceUnreadable subtitlesUnavailable planUnreadable
mismatch

For fileUnplayable, the capability the file failed.

object
field
required
string
declared

The declared value, lists joined by commas; absent when the client declared none.

string
actual
required
string
retryAfterSeconds

For throttled and rateLimited, the Retry-After header’s value.

integer
errors

For invalidRequest, what’s wrong with which field.

Array<object>
object
field
required

A JSON pointer into the body, or a parameter name.

string
code
required

What’s wrong with a field: tooLarge for a file or list over its size, unsupported for a file in a format the server doesn’t take, unknownEpisodeGroup for a group:<ID> ordering TMDb doesn’t list for the series, and notABook for a work edited with books that isn’t one.

string
Allowed values: required invalid tooShort tooLong tooLarge unsupported outOfRange unknownEpisodeGroup notABook
plays

For streamLimit, the user’s plays, to show what is playing where.

Array<object>

One of the user’s plays, for the stream limit.

object
id
required

A UUIDv7.

string format: uuid
workId
required

A UUIDv7.

string format: uuid
title
required
string
clientName

The name of the session or API key it was started by.

string
startedAt
required
string format: date-time
message

For playEnded, the admin’s words to the viewer, when they gave any.

string
resetsAt

For quotaUsed, when the quota resets, when the provider said.

string format: date-time

Example

{
"code": "invalidRequest",
"reason": "noTracks",
"errors": [
{
"code": "required"
}
]
}

No valid session or API key (code unauthenticated), or a failed sign-in (code invalidCredentials).

Media typeapplication/problem+json

An RFC 9457 problem document. code is stable and is what clients translate.

object
type
required

A URI naming the problem type; about:blank when only code matters.

string
title
required

A short English summary, for logs.

string
status
required
integer
detail

English detail for logs and developers; never internal error text.

string
instance
string
code
required

A problem’s stable code, which clients translate. A client that doesn’t know a code goes by the response’s status.

string
Allowed values: invalidRequest unauthenticated invalidCredentials wrongPassword forbidden crossOrigin denied notFound expired notReady rangeNotSatisfiable conflict alreadySetUp nameTaken lastAdmin ownUser fileStillPresent kindMismatch notStoppable streamLimit notPlayable noFallback playEnded throttled rateLimited providerUnavailable notConfigured quotaUsed transcodeBusy transcodeFailed internal
requestId
required

The request ID, also in the X-Request-Id header and the server log.

string
reason

For transcodeBusy and notPlayable, why. For transcodeBusy: transcodeLimit or storageFull. For notPlayable: noTracks, fileUnplayable, subtitleUnplayable, transcodeFailed, keyframeIndexMissing or downloadsNotAllowed.

string
Allowed values: noTracks fileUnplayable subtitleUnplayable keyframeIndexMissing transcodeFailed transcodeLimit storageFull downloadsNotAllowed sourceUnreadable subtitlesUnavailable planUnreadable
mismatch

For fileUnplayable, the capability the file failed.

object
field
required
string
declared

The declared value, lists joined by commas; absent when the client declared none.

string
actual
required
string
retryAfterSeconds

For throttled and rateLimited, the Retry-After header’s value.

integer
errors

For invalidRequest, what’s wrong with which field.

Array<object>
object
field
required

A JSON pointer into the body, or a parameter name.

string
code
required

What’s wrong with a field: tooLarge for a file or list over its size, unsupported for a file in a format the server doesn’t take, unknownEpisodeGroup for a group:<ID> ordering TMDb doesn’t list for the series, and notABook for a work edited with books that isn’t one.

string
Allowed values: required invalid tooShort tooLong tooLarge unsupported outOfRange unknownEpisodeGroup notABook
plays

For streamLimit, the user’s plays, to show what is playing where.

Array<object>

One of the user’s plays, for the stream limit.

object
id
required

A UUIDv7.

string format: uuid
workId
required

A UUIDv7.

string format: uuid
title
required
string
clientName

The name of the session or API key it was started by.

string
startedAt
required
string format: date-time
message

For playEnded, the admin’s words to the viewer, when they gave any.

string
resetsAt

For quotaUsed, when the quota resets, when the provider said.

string format: date-time

Example

{
"code": "invalidRequest",
"reason": "noTracks",
"errors": [
{
"code": "required"
}
]
}

Signed in, but this needs an admin (code forbidden); a same-origin request (code crossOrigin); or a device code that was denied (code denied).

Media typeapplication/problem+json

An RFC 9457 problem document. code is stable and is what clients translate.

object
type
required

A URI naming the problem type; about:blank when only code matters.

string
title
required

A short English summary, for logs.

string
status
required
integer
detail

English detail for logs and developers; never internal error text.

string
instance
string
code
required

A problem’s stable code, which clients translate. A client that doesn’t know a code goes by the response’s status.

string
Allowed values: invalidRequest unauthenticated invalidCredentials wrongPassword forbidden crossOrigin denied notFound expired notReady rangeNotSatisfiable conflict alreadySetUp nameTaken lastAdmin ownUser fileStillPresent kindMismatch notStoppable streamLimit notPlayable noFallback playEnded throttled rateLimited providerUnavailable notConfigured quotaUsed transcodeBusy transcodeFailed internal
requestId
required

The request ID, also in the X-Request-Id header and the server log.

string
reason

For transcodeBusy and notPlayable, why. For transcodeBusy: transcodeLimit or storageFull. For notPlayable: noTracks, fileUnplayable, subtitleUnplayable, transcodeFailed, keyframeIndexMissing or downloadsNotAllowed.

string
Allowed values: noTracks fileUnplayable subtitleUnplayable keyframeIndexMissing transcodeFailed transcodeLimit storageFull downloadsNotAllowed sourceUnreadable subtitlesUnavailable planUnreadable
mismatch

For fileUnplayable, the capability the file failed.

object
field
required
string
declared

The declared value, lists joined by commas; absent when the client declared none.

string
actual
required
string
retryAfterSeconds

For throttled and rateLimited, the Retry-After header’s value.

integer
errors

For invalidRequest, what’s wrong with which field.

Array<object>
object
field
required

A JSON pointer into the body, or a parameter name.

string
code
required

What’s wrong with a field: tooLarge for a file or list over its size, unsupported for a file in a format the server doesn’t take, unknownEpisodeGroup for a group:<ID> ordering TMDb doesn’t list for the series, and notABook for a work edited with books that isn’t one.

string
Allowed values: required invalid tooShort tooLong tooLarge unsupported outOfRange unknownEpisodeGroup notABook
plays

For streamLimit, the user’s plays, to show what is playing where.

Array<object>

One of the user’s plays, for the stream limit.

object
id
required

A UUIDv7.

string format: uuid
workId
required

A UUIDv7.

string format: uuid
title
required
string
clientName

The name of the session or API key it was started by.

string
startedAt
required
string format: date-time
message

For playEnded, the admin’s words to the viewer, when they gave any.

string
resetsAt

For quotaUsed, when the quota resets, when the provider said.

string format: date-time

Example

{
"code": "invalidRequest",
"reason": "noTracks",
"errors": [
{
"code": "required"
}
]
}

No such resource, or the caller may not see it (code notFound).

Media typeapplication/problem+json

An RFC 9457 problem document. code is stable and is what clients translate.

object
type
required

A URI naming the problem type; about:blank when only code matters.

string
title
required

A short English summary, for logs.

string
status
required
integer
detail

English detail for logs and developers; never internal error text.

string
instance
string
code
required

A problem’s stable code, which clients translate. A client that doesn’t know a code goes by the response’s status.

string
Allowed values: invalidRequest unauthenticated invalidCredentials wrongPassword forbidden crossOrigin denied notFound expired notReady rangeNotSatisfiable conflict alreadySetUp nameTaken lastAdmin ownUser fileStillPresent kindMismatch notStoppable streamLimit notPlayable noFallback playEnded throttled rateLimited providerUnavailable notConfigured quotaUsed transcodeBusy transcodeFailed internal
requestId
required

The request ID, also in the X-Request-Id header and the server log.

string
reason

For transcodeBusy and notPlayable, why. For transcodeBusy: transcodeLimit or storageFull. For notPlayable: noTracks, fileUnplayable, subtitleUnplayable, transcodeFailed, keyframeIndexMissing or downloadsNotAllowed.

string
Allowed values: noTracks fileUnplayable subtitleUnplayable keyframeIndexMissing transcodeFailed transcodeLimit storageFull downloadsNotAllowed sourceUnreadable subtitlesUnavailable planUnreadable
mismatch

For fileUnplayable, the capability the file failed.

object
field
required
string
declared

The declared value, lists joined by commas; absent when the client declared none.

string
actual
required
string
retryAfterSeconds

For throttled and rateLimited, the Retry-After header’s value.

integer
errors

For invalidRequest, what’s wrong with which field.

Array<object>
object
field
required

A JSON pointer into the body, or a parameter name.

string
code
required

What’s wrong with a field: tooLarge for a file or list over its size, unsupported for a file in a format the server doesn’t take, unknownEpisodeGroup for a group:<ID> ordering TMDb doesn’t list for the series, and notABook for a work edited with books that isn’t one.

string
Allowed values: required invalid tooShort tooLong tooLarge unsupported outOfRange unknownEpisodeGroup notABook
plays

For streamLimit, the user’s plays, to show what is playing where.

Array<object>

One of the user’s plays, for the stream limit.

object
id
required

A UUIDv7.

string format: uuid
workId
required

A UUIDv7.

string format: uuid
title
required
string
clientName

The name of the session or API key it was started by.

string
startedAt
required
string format: date-time
message

For playEnded, the admin’s words to the viewer, when they gave any.

string
resetsAt

For quotaUsed, when the quota resets, when the provider said.

string format: date-time

Example

{
"code": "invalidRequest",
"reason": "noTracks",
"errors": [
{
"code": "required"
}
]
}

A server-side failure: 500 (code internal, or transcodeFailed for a play’s media), or 503 for something unavailable (codes providerUnavailable and transcodeBusy, for now; notConfigured, until an admin configures it).

Media typeapplication/problem+json

An RFC 9457 problem document. code is stable and is what clients translate.

object
type
required

A URI naming the problem type; about:blank when only code matters.

string
title
required

A short English summary, for logs.

string
status
required
integer
detail

English detail for logs and developers; never internal error text.

string
instance
string
code
required

A problem’s stable code, which clients translate. A client that doesn’t know a code goes by the response’s status.

string
Allowed values: invalidRequest unauthenticated invalidCredentials wrongPassword forbidden crossOrigin denied notFound expired notReady rangeNotSatisfiable conflict alreadySetUp nameTaken lastAdmin ownUser fileStillPresent kindMismatch notStoppable streamLimit notPlayable noFallback playEnded throttled rateLimited providerUnavailable notConfigured quotaUsed transcodeBusy transcodeFailed internal
requestId
required

The request ID, also in the X-Request-Id header and the server log.

string
reason

For transcodeBusy and notPlayable, why. For transcodeBusy: transcodeLimit or storageFull. For notPlayable: noTracks, fileUnplayable, subtitleUnplayable, transcodeFailed, keyframeIndexMissing or downloadsNotAllowed.

string
Allowed values: noTracks fileUnplayable subtitleUnplayable keyframeIndexMissing transcodeFailed transcodeLimit storageFull downloadsNotAllowed sourceUnreadable subtitlesUnavailable planUnreadable
mismatch

For fileUnplayable, the capability the file failed.

object
field
required
string
declared

The declared value, lists joined by commas; absent when the client declared none.

string
actual
required
string
retryAfterSeconds

For throttled and rateLimited, the Retry-After header’s value.

integer
errors

For invalidRequest, what’s wrong with which field.

Array<object>
object
field
required

A JSON pointer into the body, or a parameter name.

string
code
required

What’s wrong with a field: tooLarge for a file or list over its size, unsupported for a file in a format the server doesn’t take, unknownEpisodeGroup for a group:<ID> ordering TMDb doesn’t list for the series, and notABook for a work edited with books that isn’t one.

string
Allowed values: required invalid tooShort tooLong tooLarge unsupported outOfRange unknownEpisodeGroup notABook
plays

For streamLimit, the user’s plays, to show what is playing where.

Array<object>

One of the user’s plays, for the stream limit.

object
id
required

A UUIDv7.

string format: uuid
workId
required

A UUIDv7.

string format: uuid
title
required
string
clientName

The name of the session or API key it was started by.

string
startedAt
required
string format: date-time
message

For playEnded, the admin’s words to the viewer, when they gave any.

string
resetsAt

For quotaUsed, when the quota resets, when the provider said.

string format: date-time

Example

{
"code": "invalidRequest",
"reason": "noTracks",
"errors": [
{
"code": "required"
}
]
}