Skip to content

List plays

GET
/api/v1/plays
curl --request GET \
--url https://example.com/api/v1/plays \
--cookie kivo_session=<kivo_session>

What’s playing now, for Now playing. Every user’s plays, oldest first, with their decisions and transcode diagnostics.

The plays.

Media typeapplication/json
object
items
required
Array<object>

A play with its diagnostics, for Now playing.

object
id
required

A UUIDv7.

string format: uuid
workId
required

A UUIDv7.

string format: uuid
title
required
string
work

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
versionId

A UUIDv7.

string format: uuid
userId
required

A UUIDv7.

string format: uuid
username
required
string
clientName

The name of the session or API key it was started by, such as “Living Room”.

string
address

The client’s IP address, through trusted proxies.

string
startedAt
required
string format: date-time
state
required

What the player is doing, as the last heartbeat reported it.

string
Allowed values: playing paused buffering ended
local
required
boolean
positionMs
required

Where playback is, as the last heartbeat reported it.

integer
durationMs

The version’s duration, every part’s.

integer
bitrateBps

The stream’s bitrate, a video transcode’s target or else the source’s, when known.

integer format: int64
bandwidthBps

The client’s measured download rate, as its last heartbeat reported it.

integer format: int64
device

The app and device that started it, as its requests identify them.

object
app

The app, such as kivo-android or kivo-web.

string
appVersion
string
platform

What a client runs on.

string
Allowed values: androidTv appleTv iPhone iPad androidPhone browser cast tizen
osVersion
string
deviceModel

The device’s model, coarse, such as SHIELD Android TV, iPhone16,2 or Firefox 132.

string
delivery
required

How a play’s media is fetched: file is the original, each part’s url with range requests; stream is the HLS playlist at url.

string
Allowed values: file stream
videoProcessing

Where the video is transcoded, accelerator when an accelerator encodes it; absent when the video isn’t transcoded.

string
Allowed values: accelerator cpu
tracks
required

Every track of the version and the subtitle choice off, as PlayStarted.tracks gives them.

Array<object>

One choice of a play: a track of its version, or the subtitle choice off, and how it shows.

object
trackId
required

A track’s id, or off.

string
<= 36 characters
type
required

A track’s type.

string
Allowed values: video audio subtitle
selected

True for the tracks the play shows; absent otherwise.

boolean
delivery

Absent when choosing it starts a new play.

string
Allowed values: file stream external burn none
codec

The codec it’s delivered as, such as hevc, aac or webvtt.

string
hdr

The video’s HDR as delivered; absent for SDR.

string
Allowed values: hdr10 hdr10plus hlg dolbyVision
transcode

What a transcoded track becomes.

object
width
integer
height
integer
bitrateBps
integer format: int64
channels
integer
encoder

Video only; what encodes it, the accelerator’s name as GET /api/v1/accelerators gives it, such as Intel Quick Sync (QSV), or CPU.

string
reason

Why the track isn’t delivered unchanged in the file, or why choosing it starts a new play, when there’s a reason to give.

string
Allowed values: containerUnsupported videoCodecUnsupported videoCodecTagUnsupported videoProfileUnsupported videoLevelUnsupported videoBitDepthUnsupported videoResolutionUnsupported videoFrameRateUnsupported videoBitrateUnsupported videoRefFramesUnsupported videoInterlacedUnsupported videoAnamorphicUnsupported videoHdrUnsupported audioCodecUnsupported audioChannelsUnsupported audioSampleRateUnsupported audioBitDepthUnsupported audioProfileUnsupported subtitleCodecUnsupported trackSelectionUnsupported streamCodecUnsupported directPlayDisabled burnSubtitlesEnabled clientQualityLimit remoteQualityLimit bandwidthLimit dialogueBoost keyframeIndexMissing subtitlePreparing fallback downloadQuality
mismatch

The capability that failed: its field (such as maxLevel, codec or containers), what the client declared, and what the track has.

object
field
required
string
declared

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

string
actual
required
string
index

For file, the track’s stream index, to select it in the player.

integer
url

For external, the file, relative to the API root.

string
fonts

For an ass subtitle delivered external, the URLs of the fonts it uses, each once, relative to the API root: GET /api/v1/fonts/{sha256}, cacheable for good. Load them before drawing.

Array<string>
sourceTracks

The selected source tracks, titled as a version’s tracks are.

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
transcode

An HLS play’s ffmpeg job, for display only.

object
state

Absent when no job is running.

string
Allowed values: running paused done failed
encodedMs

Where the job’s segments reach on the version’s timeline.

integer
speed

Seconds of media the job makes a second while it works, pauses left out; 1.8 is 1.8× realtime. Absent until its first segment.

number format: double
command

The ffmpeg command line, to reproduce it by hand.

string
exitCode
integer
stderr

The tail of ffmpeg’s error output.

string
seekToFirstFrameMs

After each of the play’s recent seeks, the time to the first frame the client reported, oldest first.

Array<integer>

Example

{
"items": [
{
"work": {
"kind": "movie",
"matchState": "matched",
"series": {
"nextUp": {
"kind": "movie",
"matchState": "matched",
"extra": {
"type": "trailer"
}
}
},
"extra": {
"type": "trailer"
}
},
"state": "playing",
"device": {
"platform": "androidTv"
},
"delivery": "file",
"videoProcessing": "accelerator",
"tracks": [
{
"type": "video",
"delivery": "file",
"hdr": "hdr10",
"reason": "containerUnsupported"
}
],
"sourceTracks": [
{
"type": "video",
"video": {
"resolution": "4k",
"hdr": "hdr10"
},
"audio": {
"profile": "atmos"
},
"subtitle": {
"source": "embedded"
}
}
],
"transcode": {
"state": "running"
}
}
]
}

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

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