Skip to content

Search works

GET
/api/v1/search
curl --request GET \
--url 'https://example.com/api/v1/search?q=example' \
--cookie kivo_session=<kivo_session>

Searches works, people and collections across the libraries the user sees. Matches words: runs of letters and digits, without case or diacritics, so “spider man” finds Spider-Man. Every word must match a whole word, except the last, which matches the start of one, as the query is typed. A query with no words finds nothing. Works match by their titles, alternative titles or the people credited on them, and come best first: a title that is the query (a leading “The”, “A” or “An” ignored), then one starting with it, one holding it as a phrase, one holding its words, then alternative titles, then people only; within each, the most voted first. Clients group them by kind. People match by name, ranked the same way, then by credits, and collections by name, ranked the same way; a collection is found when the profile sees one of its root works. There’s no fuzzy matching, and text without spaces between words, such as Japanese, matches only from its start. limit applies to works, people and collections each.

q
required
string
>= 1 characters <= 200 characters
limit
integer
>= 1 <= 200

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

Matching works and people.

Media typeapplication/json
object
works
required

Works, best first.

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
people
required

People credited on a work the profile sees, best first.

Array<object>
object
id
required

A UUIDv7.

string format: uuid
name
required
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
role
required

The credit role they have on the most of the root works the profile sees, as Credit.role.

string
workCount
required

The movies, shows, videos and books the profile sees that they’re credited on, an episode counting as its series; in a library’s authors, the library’s books they wrote.

integer
collections
required

Collections holding a root work the profile sees, best first.

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

Example

{
"works": [
{
"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"
}
]
}

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