Browse the docs

API reference

Streaming

HLS delivery for a transcode session, direct file streams and pre-roll.

Paths are relative to /api/v1 on your server.

GET/playto/{sessionId}/{file}#

What a renderer fetches for the session it was sent (Play To)

Not signed in, and no cast ticket: ticket is the session’s own, made when Play To sent it and good for nothing else, and only the renderer it was sent to — the connection’s own address — may use it, while the session lives. media.<ext> is the file as it is (byte ranges), stream.ts the transcoder’s stream as one MPEG transport stream and audio.flac or audio.mp3 a track decoded as it is read (both seek with TimeSeekRange.dlna.org), subtitle-<stream>.srt a text subtitle as SubRip, poster.jpg its picture. at is where a conversion’s clock starts, in milliseconds: its time seeks, its length and its subtitles count from there.

Authorisation
None
ParameterInTypeDescription
sessionId requiredpathstring
file requiredpathstring
ticket requiredquerystring
atqueryinteger
  • 200Success. application/octet-stream ·
  • 400VALIDATION_FAILED: the request did not match the schema; details.issues lists what. application/json · ErrorEnvelope
  • 401UNAUTHENTICATED: no ticket, or not this session’s application/json · ErrorEnvelope
  • 403FORBIDDEN: from any address but the renderer’s application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. NOT_FOUND: the session has ended, or is not one Play To started application/json · ErrorEnvelope
DELETE/stream/{sessionId}#

Stop a transcode session

Authorisation
Bearer token or API key · Session cookie · Cast ticket
ParameterInTypeDescription
sessionId requiredpathstring
  • 204Done; no body.
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
GET/stream/{sessionId}/{variant}/{segment}#

One fMP4 segment

Blocks until the segment exists, up to the lookahead; SEGMENT_DURATION_SECONDS apart.

Authorisation
Bearer token or API key · Session cookie · Cast ticket
ParameterInTypeDescription
sessionId requiredpathstring
variant requiredpathstring
segment requiredpathstring
  • 200Success. video/mp4 ·
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
GET/stream/{sessionId}/{variant}/index.m3u8#

HLS media playlist for a variant

Authorisation
Bearer token or API key · Session cookie · Cast ticket
ParameterInTypeDescription
sessionId requiredpathstring
variant requiredpathstring
  • 200Success. application/vnd.apple.mpegurl · string
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
GET/stream/{sessionId}/{variant}/init.mp4#

fMP4 initialisation segment

Authorisation
Bearer token or API key · Session cookie · Cast ticket
ParameterInTypeDescription
sessionId requiredpathstring
variant requiredpathstring
  • 200Success. video/mp4 ·
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
POST/stream/{sessionId}/keepalive#

Keep a session alive while paused

Authorisation
Bearer token or API key · Session cookie · Cast ticket
Body
application/json · object
ParameterInTypeDescription
sessionId requiredpathstring
  • 204Done; no body.
  • 400VALIDATION_FAILED: the request did not match the schema; details.issues lists what. application/json · ErrorEnvelope
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
GET/stream/{sessionId}/master.m3u8#

HLS master playlist

Authorisation
Bearer token or API key · Session cookie · Cast ticket
ParameterInTypeDescription
sessionId requiredpathstring
  • 200Success. application/vnd.apple.mpegurl · string
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
  • 410TRANSCODE_SESSION_GONE: the session timed out or was stopped application/json · ErrorEnvelope
POST/stream/{sessionId}/seek#

Restart the transcode at a position

Authorisation
Bearer token or API key · Session cookie · Cast ticket
Body
application/json · object
ParameterInTypeDescription
sessionId requiredpathstring
  • 200Success. application/json · object
  • 400VALIDATION_FAILED: the request did not match the schema; details.issues lists what. application/json · ErrorEnvelope
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
GET/stream/comic/{mediaFileId}#

Serve a comic archive for the reader

A CBZ is served as it is; a CBR or CB7 is unpacked once and served as a CBZ, and only so many comics are unpacked at a time.

Authorisation
Bearer token or API key · Session cookie
ParameterInTypeDescription
mediaFileId requiredpathstring
  • 200Success. application/octet-stream ·
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
  • 413PAYLOAD_TOO_LARGE: the comic is larger than the reader will unpack application/json · ErrorEnvelope
  • 503COMIC_UNPACK_BUSY: as many comics as the server will unpack at once are already being unpacked; Retry-After says when to come back application/json · ErrorEnvelope
GET/stream/file/{mediaFileId}#

Direct play a media file

The file as it is on disk, with Accept-Ranges. The decision engine sends a client here when the device can play the file unchanged.

Authorisation
Bearer token or API key · Session cookie · Cast ticket
ParameterInTypeDescription
mediaFileId requiredpathstring
  • 200Success. application/octet-stream ·
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. MEDIA_FILE_MISSING: the file is not where the scan left it application/json · ErrorEnvelope
GET/stream/file/{mediaFileId}/gapless#

A track as one exact whole, for a gapless join

The file’s first audio stream decoded by FFmpeg — which takes off what the encoder put at its start and end: an MP3’s LAME delay and padding, an AAC’s priming — and sent as FLAC (2026-10-02). The music player fetches an album’s next lossy track this way, so the join between them lands to the sample. Music tracks only, and only so many decoded at once; on a refusal the player plays the plain file.

Authorisation
Bearer token or API key · Session cookie
ParameterInTypeDescription
mediaFileId requiredpathstring
  • 200Success. audio/flac ·
  • 400VALIDATION_FAILED: the file is not a music track’s application/json · ErrorEnvelope
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope
  • 415MEDIA_TRANSCODE_DISABLED: the account may not have media converted application/json · ErrorEnvelope
  • 503TRANSCODE_LIMIT_REACHED: as many tracks as the server will decode at once are being decoded, with others waiting; Retry-After says when to come back application/json · ErrorEnvelope
GET/stream/preroll/{index}#

Serve a pre-roll file

Authorisation
Bearer token or API key · Session cookie
ParameterInTypeDescription
index requiredpathstring
  • 200Success. video/* ·
  • 401UNAUTHENTICATED: no session, or the access token expired. application/json · ErrorEnvelope
  • 403FORBIDDEN: the account lacks library:view, or the library, label, age or schedule scope refuses it. application/json · ErrorEnvelope
  • 404NOT_FOUND: no such thing, or not one the caller may see. application/json · ErrorEnvelope