Skip to content

List library works

GET
/api/v1/libraries/{id}/works
curl --request GET \
--url 'https://example.com/api/v1/libraries/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/works?sort=title&played=unplayed&matchState=matched' \
--cookie kivo_session=<kivo_session>

The library’s top-level items, sorted and filtered. A movies library lists movies, with versions never shown separately; a shows library lists series; a videos library lists videos; an audiobooks library lists books.

A grid, paged by offset, with total on every page; works with the same sort key are listed by title. The first page (offset 0) of the title sort also has letters.

id
required

A UUIDv7.

string format: uuid
sort

The order of a library’s grid (listLibraryWorks).

string
Allowed values: title addedAt releaseDate rating myRating runtime lastPlayedAt author lastEpisodeAddedAt

Default title. Each sort has one direction: title A to Z ignoring leading articles, author A to Z by the first author’s name (an audiobooks library; then by title, books with no author first), runtime shortest first, the rest newest or highest first. lastEpisodeAddedAt puts the series whose newest episode in the library was added most recently first (a shows library; then by title). rating is the community rating weighted by its vote count (as if 50 more votes of 6.5 were cast), so a root work few people rated ranks below a well-rated one many people rated; myRating is the user’s own rating. Works without the rating come last, by title.

played

Works by the user’s state for them, as the grid’s filter asks.

string
Allowed values: unplayed inProgress played
genre
Array<string>

Any of these genres.

yearFrom
integer

The first year, inclusive.

yearTo
integer

The last year, inclusive.

contentRating
Array<string>

Any of these content ratings (see WorkSummary.contentRating).

resolution
Array<string>
Allowed values: 4k 1080p 720p sd

Any of these resolutions.

dynamicRange
Array<string>
Allowed values: hdr dolbyVision

Any of these dynamic ranges.

favorite
boolean

Only the user’s favorites.

narratorId

A UUIDv7.

string format: uuid

The books this person narrated.

matchState

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

Admins only (ignored for others). Only unmatched is taken, for unmatched items only.

offset
integer

How many items to skip from the start.

limit
integer
>= 1 <= 200

Page size. The default and the most a page holds depend on the listing.

A page of summaries.

Media typeapplication/json

A page of a grid of works.

object
items
required
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
total
required
integer
letters

On the first page (offset 0) of the title sort. See LetterStart.

Array<object>

Where a letter of a grid’s letter rail starts, in the grid’s order. A work files under the first character of its sort title, so leading articles are skipped, and a person or series under the first character of their sort name: A to Z, or # for digits and anything else. A letter is listed once, at its first item; letters without items are left out.

object
letter
required

A to Z, or #.

string
offset
required

The index of the letter’s first item in the grid.

integer

Example

{
"items": [
{
"kind": "movie",
"matchState": "matched",
"series": {
"nextUp": {
"kind": "movie",
"matchState": "matched",
"extra": {
"type": "trailer"
}
}
},
"extra": {
"type": "trailer"
}
}
]
}

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"
}
]
}

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"
}
]
}