API reference
Endpoints of the public API. Authenticate with an API key as described in Using the API.
On this page
- Authentication
- Errors
- Schedules
- GET /admin/schedules
- POST /admin/schedules/{task}/run
- Playback
- GET /admin/playback/history
- GET /admin/playback/sessions
- POST /admin/playback/sessions/{id}/stop
- Libraries
- GET /libraries
- POST /libraries
- GET /libraries/{id}
- POST /libraries/{id}/refresh
- POST /libraries/{id}/rescrape
- Items
- GET /items
- GET /items/{id}
- POST /items/{id}/refresh
- POST /items/{id}/rescan
- Search
- GET /search
- Scans
- POST /libraries/{id}/cancel-scan
- POST /libraries/{id}/scan
- GET /scans/errors
- GET /scans/events
- GET /scans/status
- Users
- GET /users
- GET /users/{id}
- Devices
- GET /devices
- DELETE /devices/{id}
- Media
- GET /images/items/{id}
- Plugins
- GET /plugins/installed
- System
- GET /activity
- GET /jobs
- POST /jobs/{id}/cancel
- GET /system/status
- GET /system/update
- Schemas
Authentication#
Authenticate with an API key (create one under System → API keys in the admin console) and send it in the Authorization header: Authorization: Bearer <key>.
Base path: /api/v1
Errors#
These responses are shared by many endpoints. Every error body has the structure below; branch on code, not on message.
| Name | Description |
|---|---|
BadRequest | Bad request |
Conflict | Conflict |
Forbidden | Forbidden |
InternalError | Internal server error |
NotFound | Not found |
NotModified | Response |
ServiceUnavailable | Service unavailable |
Unauthorized | Unauthorized |
messagestringRequiredHuman-readable explanation in the server's default language. Intended for logs and developers; branch on code instead.
paramsobjectExtra values that go with the error code (numbers, names, fields). See ErrorCode. Omitted when the code has no parameters.
Schedules#
GET /admin/schedules#
List scheduled tasks
Returns the scheduled maintenance tasks (library scan, scraping, poster generation, cleanup, backup) with their rule and whether they are paused or running.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/admin/schedules
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json ScheduleList |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
503 | Service unavailable | see Errors |
POST /admin/schedules/{task}/run#
Run a scheduled task now
Starts a scheduled task immediately without changing its schedule. task is one of library_scan, library_full_scan, scrape, poster_pregenerate, cleanup, backup. Responds 409 when the task is already running.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/admin/schedules/library_scan/run
Parameters
Schedulable task kind addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
202 | Accepted | application/json Schedule |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | see Errors |
503 | Service unavailable | see Errors |
Playback#
GET /admin/playback/history#
List play history
Returns finished playbacks, newest first, with cursor paging. Filter by member, client, device, item, title or a time range (from, to, tz).
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" "$KRYSPAL_URL/api/v1/admin/playback/history?memberId=2&limit=20"
Parameters
memberIdstringqueryReturn only records for this member (user) ID.
clientstringqueryReturn only records from this player application (case-insensitive).
deviceIdstringqueryReturn only records from this device ID.
itemIdstringqueryReturn only records for this item; for a series or season, includes its episodes.
titlestringqueryReturn only records whose title contains this text.
fromstring (date)queryStart of the range, inclusive. A date-time in RFC 3339 format, or a calendar date in the time zone given by tz, depending on the endpoint.
tostring (date)queryEnd of the range. Exclusive when a date-time in RFC 3339 format; inclusive of that whole day when a calendar date in the time zone given by tz, depending on the endpoint.
tzstringqueryIANA time zone name (for example "Asia/Taipei") that defines day boundaries and bucketing. Invalid values return 400; defaults to UTC. Offsets like "UTC+8" are not accepted.
cursorstringqueryOpaque pagination cursor taken from the previous response; omit to start from the beginning.
limitintegerqueryMaximum number of entries to return per page.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json PlayHistoryPage |
400 | Bad request | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
503 | Service unavailable | see Errors |
GET /admin/playback/sessions#
List active playback sessions
Returns who is watching what right now: member, device, player, progress and how the stream is delivered.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/admin/playback/sessions
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of PlaybackSession |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
503 | Service unavailable | see Errors |
POST /admin/playback/sessions/{id}/stop#
Stop a playback session
Stops an active playback session. Only sessions with stoppable: true can be stopped; others respond 409.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/admin/playback/sessions/s-1/stop
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
204 | No content | |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | see Errors |
503 | Service unavailable | see Errors |
Libraries#
GET /libraries#
List libraries
Returns every media library with its type, root paths and settings.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/libraries
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of Library |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /libraries#
Create a library
Creates a media library from one or more root paths and starts the first scan. The paths must exist on the server and must not overlap an existing library.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Movies","collectionType":"movies","paths":["/media/movies"]}' \
$KRYSPAL_URL/api/v1/libraries
Request body
application/json · CreateLibraryRequest
accessUserIdsarray of stringIDs of members who get access to the library on creation. If omitted or empty, only administrators can see it. An ID that does not exist or belongs to a disabled user returns 400.
namestringRequiredDisplay name of the library.
optionsLibraryOptionsUpdateComplete library settings applied at creation, with the same fields as PUT /libraries/{id}/options (remoteAllowedHosts is required). The operation is atomic: an invalid field returns 400 and nothing is created, and if saving the settings fails the new library is removed. If both realtimeMonitor and options.realtimeMonitor are set, the latter wins.
pathsarray of stringRequiredAbsolute directory paths that make up the library.
realtimeMonitorbooleanWhether to watch the library for file changes as they happen. Defaults to true. See LibraryOptions.realtimeMonitor.
Responses
| Status | Description | Body |
|---|---|---|
201 | Created | application/json Library |
400 | Bad request | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /libraries/{id}#
Get a library
Returns one media library with its effective settings. Responds 404 when the library does not exist.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/libraries/3
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json Library |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /libraries/{id}/refresh#
Refresh library metadata
Queues a metadata refresh for every item of a library. mode is missing or replaceAll.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" -H "Content-Type: application/json" -d '{"mode":"missing"}' $KRYSPAL_URL/api/v1/libraries/3/refresh
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Request body
application/json · RefreshMetadataRequest
modestring:missing|replaceAllRequired"missing" fills in only metadata that is absent; "replaceAll" replaces existing metadata.
recursivebooleanApplies to items only: also processes the children of a series, season or folder. Defaults to false. For a library the whole library is always processed.
replaceImagesbooleanAlso replaces images that came from providers. Defaults to false.
Responses
| Status | Description | Body |
|---|---|---|
202 | Accepted | application/json SimpleSuccess |
400 | Bad request | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /libraries/{id}/rescrape#
Rescrape a library
Queues every item of the library that was never matched or failed to match for scraping again. Returns how many were queued and how many were skipped.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/libraries/3/rescrape
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json RescrapeResult |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Items#
GET /items#
List items
Lists catalog items (movies, series, seasons, episodes) with filters and sorting. Use cursor for stable paging, or offset with includeTotal=true when you need a total. libraryId, type, year, genreId, q and many more filters can be combined.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" "$KRYSPAL_URL/api/v1/items?libraryId=3&type=Movie&limit=50&sort=dateCreated&order=desc"
Parameters
libraryIdstringqueryLibrary ID to restrict to. When omitted, all libraries are included. An unknown library returns 404.
parentIdstringqueryReturn only direct children of this item (for example seasons of a series or episodes of a season). For aggregate endpoints, restricts to the collection with this ID.
recursivebooleanqueryIf true, include all descendants of the library or of parentId. Defaults to false.
Return only entries of this item type. May be repeated where an array is accepted.
genreIdarray of stringqueryReturn only items with any of these genre IDs. May be repeated.
studioIdarray of stringqueryReturn only items from any of these studio IDs. May be repeated.
tagIdarray of stringqueryReturn only items with any of these tag IDs. May be repeated.
yeararray of integerqueryReturn only items from any of these years. May be repeated.
yearFromintegerqueryLower bound of a year range, inclusive (1 to 3000). Use with yearTo; the range covers at most 300 years.
yearTointegerqueryUpper bound of a year range, inclusive (1 to 3000).
minRatingnumber (double)queryMinimum rating on a 0 to 10 scale. Items with an unknown rating are excluded.
officialRatingarray of stringqueryReturn only items with any of these official (content) ratings (case-insensitive); unrated items are excluded. May be repeated.
hasSubtitlesbooleanqueryIf true, return only items with subtitle tracks (embedded or external); if false, only items without.
minOfficialRatingstringqueryLower bound for the official (content) rating, inclusive, ordered by rating level (for example "PG-13"). Items with a rating outside the known table or with no rating are excluded.
maxOfficialRatingstringqueryUpper bound for the official (content) rating, inclusive, ordered by rating level. Same rules as minOfficialRating.
resolutionsarray of string:sd|hd|4kqueryMatch items whose primary video track falls in any of these resolution classes (OR): "sd", "hd", "4k" (based on width only). Items without video match none. May be repeated.
dynamicRangesarray of string:sdr|hdr10|hlg|dolbyVisionqueryMatch items whose primary video track has any of these dynamic ranges (OR): "sdr", "hdr10", "hlg", "dolbyVision". For HDR only, use the last three. May be repeated.
containersarray of stringqueryMatch items whose primary version has any of these containers (OR, case-insensitive, exact match). Container names come from probing (TS files are "mpegts"); remote sources not yet probed are "strm". May be repeated.
videoCodecsarray of stringqueryMatch items whose primary version has a video track with any of these codecs (OR, ffprobe codec_name such as "hevc" or "h264"). May be repeated.
audioCodecsarray of stringqueryMatch items whose primary version has an audio track with any of these codecs (OR), for example "aac" or "eac3". May be repeated.
subtitleCodecsarray of stringqueryMatch items whose primary version has a subtitle track (embedded or external) with any of these codecs (OR). "srt" is treated as "subrip", "vtt" as "webvtt", "pgs" as "hdmv_pgs_subtitle". May be repeated.
subtitleLanguagesarray of stringqueryMatch items whose primary version has a subtitle track in any of these languages (OR): ISO 639-2/B three-letter codes ("chi") or BCP 47 tags with base matching ("zh" matches "zh-CN" and "zh-TW"). May be repeated.
hasSpecialFeaturebooleanqueryIf true, return only items with special features (non-missing extras such as behind-the-scenes, excluding trailers and extra parts of split videos); if false, only items without.
Return only items that have at least one image of every listed kind (AND). May be repeated.
Exclude items of these types. May be repeated.
nameFromstringqueryReturn only entries whose sort name is greater than or equal to this value. Combine with nameBefore to select an alphabetical range.
nameBeforestringqueryReturn only entries whose sort name is less than this value (case-insensitive). Only meaningful with the default name sort; combine with limit=1 and includeTotal=true to find the offset of a position.
initialstringqueryFilter by initial letter: "A" to "Z" (case-insensitive) or "#" for names that start with no letter (digits, punctuation, kana, Hangul and so on). Any other value returns 400. Intersected with other name filters.
offsetintegerqueryZero-based index of the first entry to return. Ignored when cursor is given. Use with includeTotal=true to size a scrollbar.
personIdarray of stringqueryReturn only works involving this person ID. May be repeated; see personMatch.
idsstringqueryComma-separated item IDs, at most 200, combinable with other filters. When given, the scope limits of parentId and recursive do not apply. More than 200 IDs or a malformed list returns 400 "field_invalid".
personMatchstring:any|allqueryHow multiple personId values combine: "any" (default; at least one involved) or "all" (every one involved).
Restrict personId and favoritePeople matching to these roles (for example director). May be repeated.
favoritePeoplebooleanqueryIf true, return only items involving people the current user has favorited, across all libraries.
isPlayedbooleanqueryIf true, return only played items; if false, only unplayed items.
isFavoritebooleanqueryIf true, return only favorited entries; if false, only those not favorited.
nameStartsWithstringqueryReturn only entries whose sort name starts with this prefix.
Sort order of the results; see the allowed values for the endpoint.
orderstring:asc|descquerySort direction: "asc" or "desc".
includeTotalbooleanqueryIf true, the response includes totalCount. Counting has a cost on large libraries, so it is off by default; request it on the first page only and reuse it when paging.
cursorstringqueryOpaque pagination cursor taken from the previous response; omit to start from the beginning.
limitintegerqueryMaximum number of entries to return per page.
qstringquerySearch text. Matching is case-insensitive; for lists it is a substring filter and does not rank results.
missingbooleanqueryIf true, return only items marked missing; if omitted or false, missing items are excluded.
Return items in any of these attention states (OR); combined with other filters by AND. Missing items are excluded unless the missing state is requested. Unknown values return 400; 503 "not_enabled" if unsupported. May be repeated.
Return only items in any of these scrape states (OR). May be repeated.
hasPrimaryImagebooleanqueryFilter by whether the item has a Primary image (local or remote from a provider). False selects items without a poster.
hasRemoteSourcebooleanqueryIf true, return only items where any non-missing version is a remote source (pointer file).
probePendingbooleanqueryIf true, return only items where any non-missing version is a remote source that has not been probed yet.
neverPlayedbooleanqueryIf true, return only items with no play record from any member. Returns 503 "not_enabled" if unsupported.
hasOverviewbooleanqueryFilter by whether the overview (trimmed of whitespace) is non-empty: true for items that have one, false for items missing one. Returns 503 "not_enabled" if unsupported.
List the items behind an overview attention card, using exactly the conditions of the card's count: "needsIdentify", "scrapeFailed", "scrapePending", "noPoster" (movies, series, seasons and videos without a primary image; episodes are not counted), "unprobed", "missing" (missing items, including extras) or "scrapeNotQueued" (never scraped and not queued, in libraries that scrape). Takes precedence over type, excludeType, scrapeStates, hasPrimaryImage and probePending, which are ignored; combines with libraryId, search, sorting and paging. Unknown values return 400.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json CursorPageItemSummary |
400 | Bad request | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /items/{id}#
Get an item
Returns the full detail of one item: media sources, credits, genres, studios and tags. Responds 404 when the item does not exist.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/items/42
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json ItemDetail |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /items/{id}/refresh#
Refresh item metadata
Queues a metadata refresh for one item. mode is missing (queue only items that were never scraped, failed or are awaiting recognition; the items picked are scraped normally, so provider-sourced fields are overwritten, not just empty ones) or replaceAll (queue every scrapable item).
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" -H "Content-Type: application/json" -d '{"mode":"missing"}' $KRYSPAL_URL/api/v1/items/42/refresh
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Request body
application/json · RefreshMetadataRequest
modestring:missing|replaceAllRequired"missing" fills in only metadata that is absent; "replaceAll" replaces existing metadata.
recursivebooleanApplies to items only: also processes the children of a series, season or folder. Defaults to false. For a library the whole library is always processed.
replaceImagesbooleanAlso replaces images that came from providers. Defaults to false.
Responses
| Status | Description | Body |
|---|---|---|
202 | Accepted | application/json SimpleSuccess |
400 | Bad request | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /items/{id}/rescan#
Rescan one item
Rescans the directory of one item on disk and updates what changed, without scanning the whole library.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/items/42/rescan
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json SimpleSuccess |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Search#
GET /search#
Search
Instant full-text search across items and people. q is required; limit caps each result list.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" "$KRYSPAL_URL/api/v1/search?q=inception&limit=10"
Parameters
qstringqueryRequiredSearch text. Matching is case-insensitive; for lists it is a substring filter and does not rank results.
limitintegerqueryMaximum number of entries to return per page.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json SearchResult |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Scans#
POST /libraries/{id}/cancel-scan#
Cancel a library scan
Asks the running scan of a library to stop. Responds 409 when no scan is running.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/libraries/3/cancel-scan
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json SimpleSuccess |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | application/json ErrorResponse |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /libraries/{id}/scan#
Start a library scan
Starts a scan of one library. The call returns immediately; follow the progress with GET /scans/status or the GET /scans/events stream. Responds 409 when a scan is already running for the library.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" -H "Content-Type: application/json" -d '{}' $KRYSPAL_URL/api/v1/libraries/3/scan
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Request body
application/json · ScanRequest
modeScanModerewritebooleanAsk the scanner to rewrite directories before scanning (used after the externalAudio switch changed, see Library.rescanRewrite). Ignored when the scanner does not support it.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json SimpleSuccess |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | application/json ErrorResponse |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /scans/errors#
List scan errors
Returns the files that could not be scanned, newest first. Filter by libraryId.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" "$KRYSPAL_URL/api/v1/scans/errors?libraryId=3"
Parameters
libraryIdstringqueryLibrary ID to restrict to. When omitted, all libraries are included. An unknown library returns 404.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of ScanError |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /scans/events#
Stream scan progress
Server-Sent Events stream of scan progress. Reconnect with the Last-Event-ID header to resume without missing events.
Example:
curl -N -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/scans/events
Parameters
Last-Event-IDstringheaderSequence number of the last event received; the server resumes the event stream after it.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | text/event-stream string |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /scans/status#
Get scan status of all libraries
Returns the current scan state of every library: idle, running, cancelling, completed, failed or cancelled, with the number of processed files and errors.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/scans/status
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of ScanStatus |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Users#
GET /users#
List members
Returns every member account (id, name, whether the member is an administrator). Creating or changing members is only possible from the admin web interface.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/users
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of User |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /users/{id}#
Get a member
Returns one member account. Responds 404 when the member does not exist.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/users/2
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json User |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Devices#
GET /devices#
List signed-in devices
Returns the devices (player apps and browsers) that are currently signed in, with member, client, device name and last activity.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/devices
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of Device |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
DELETE /devices/{id}#
Sign a device out
Revokes the sign-in of one device. The device has to sign in again. Responds 404 when the device is already gone.
Example:
curl -X DELETE -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/devices/9f2c1a7b3d4e5f60
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
204 | No content | |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Media#
GET /images/items/{id}#
Get an item image
Returns the poster (or other image) of an item. Use maxWidth/maxHeight or fillWidth/fillHeight to get a resized copy; tag is the image tag from the item and makes the response cacheable. Supports HTTP range requests.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" -o poster.jpg "$KRYSPAL_URL/api/v1/images/items/42?maxWidth=400"
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
tagstringqueryImage tag from the item's metadata, used for cache busting; changes when the image changes.
maxWidthintegerqueryMaximum width in pixels of the returned image; it is scaled down preserving aspect ratio.
maxHeightintegerqueryMaximum height in pixels of the returned image; it is scaled down preserving aspect ratio.
fillWidthintegerqueryTarget width in pixels the image should fill; the image is scaled and cropped to fill it.
fillHeightintegerqueryTarget height in pixels the image should fill; the image is scaled and cropped to fill it.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | image/* string (binary) |
206 | Response | see Errors |
304 | Response | see Errors |
400 | Response | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Response | see Errors |
412 | Response | see Errors |
416 | Response | see Errors |
500 | Response | see Errors |
503 | Service unavailable | see Errors |
Plugins#
GET /plugins/installed#
List installed plugins
Returns the installed plugins with version, status (running, disabled, needs configuration, ...) and capabilities. Installing, enabling and configuring plugins is only possible from the admin web interface.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/plugins/installed
Parameters
langstringqueryLanguage as BCP 47 tag(s), for example "en" or "zh-TW". When omitted, the server uses the user's chosen language, then Accept-Language, then English. For subtitle use, a comma-separated list of at most 8 languages, defaulting to the server's preferred subtitle languages.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of InstalledPlugin |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
503 | Service unavailable | see Errors |
System#
GET /activity#
List activity log
Returns the audit trail of administrative actions, newest first, with cursor paging. Filter by actor, category, target or a time range.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" "$KRYSPAL_URL/api/v1/activity?category=content&limit=50"
Parameters
Return only actions by this kind of actor.
actorUserIdstringqueryReturn only actions by this user ID. Implies actorKind=member.
Category filter. May be repeated; any match is returned (OR). For path usage, the category being addressed.
Kind of the target object to filter by, used together with targetId.
targetIdstringqueryID of the target object to filter by. Requires targetKind.
fromstring (date-time)queryStart of the range, inclusive. A date-time in RFC 3339 format, or a calendar date in the time zone given by tz, depending on the endpoint.
tostring (date-time)queryEnd of the range. Exclusive when a date-time in RFC 3339 format; inclusive of that whole day when a calendar date in the time zone given by tz, depending on the endpoint.
cursorstringqueryOpaque pagination cursor taken from the previous response; omit to start from the beginning.
limitintegerqueryMaximum number of entries to return per page.
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json ActivityPage |
400 | Bad request | see Errors |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /jobs#
List background jobs
Returns the running and recently finished background jobs (scans, scraping, imports, ...). Jobs with cancellable: true can be cancelled with POST /jobs/{id}/cancel.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/jobs
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json array of Job |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
POST /jobs/{id}/cancel#
Cancel a background job
Asks a running job to stop. Responds 409 when the job cannot be cancelled and 404 when it does not exist.
Example:
curl -X POST -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/jobs/scan-3/cancel
Parameters
idstringpathRequiredIdentifier of the resource addressed by the path.
Responses
| Status | Description | Body |
|---|---|---|
204 | No content | |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
404 | Not found | see Errors |
409 | Conflict | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /system/status#
Get server status
Returns the server version, uptime and the result of the health checks; status is ok or degraded. Suitable as a health probe.
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/system/status
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json SystemStatus |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
GET /system/update#
Get update status
Returns the running server version and whether a newer release is available (the update check can be disabled by the administrator).
Example:
curl -H "Authorization: Bearer $KRYSPAL_API_KEY" $KRYSPAL_URL/api/v1/system/update
Responses
| Status | Description | Body |
|---|---|---|
200 | OK | application/json UpdateStatus |
401 | Unauthorized | see Errors |
403 | Forbidden | see Errors |
500 | Internal server error | see Errors |
503 | Service unavailable | see Errors |
Schemas#
ActivityActor
Who performed an audited action.
object
apiKeyIdstringID of the API key that performed the action; present when the actor kind is "apiKey".
namestringDisplay name of the actor, captured at the time the entry was recorded.
pluginIdstringID of the plugin that performed the action; present when the actor kind is "plugin".
userIdstringID of the member that performed the action; present when the actor kind is "member".
ActivityActorKind
Kind of actor behind an activity entry: "system" for the server itself (scheduled or automatic work), "member" for a signed-in account, "apiKey" for a request authenticated with an API key, "plugin" for an installed plugin.
string: system | member | apiKey | plugin
ActivityCategory
Category of an activity entry: "content" for edits to items and metadata, "deletion" for removals, "externalTool" for actions by external tools, "settings" for configuration changes, "security" for authentication and access changes.
string: content | deletion | externalTool | settings | security
ActivityEntry
One record in the activity log.
object
actionstringRequiredAction in the form "target.verb", for example "item.delete" or "missing.confirm".
atstring (date-time)RequiredTime the action happened, in RFC 3339 format (UTC).
detailsobjectStructured details such as field names and paths. Never contains field contents or secrets.
idstringRequiredUnique ID of the activity entry.
remoteAddrstringNetwork address the request came from.
ActivityPage
One page of activity log entries.
object
Entries on this page.
nextCursorstringCursor to pass to fetch the next page. Omitted when there is no further page.
ActivityTarget
The object an audited action was applied to.
object
idstringID of the target object.
kindstringRequiredKind of target object (see ActivityTargetKind). Empty string for actions that have no target.
namestringName of the target object, captured at the time the entry was recorded.
ActivityTargetKind
Kind of object an activity entry refers to: "item" (media item), "library", "person", "user" (member account), "plugin", "apiKey", "server" (server-wide settings), "schedule" (scheduled task), "backup".
string: item | library | person | user | plugin | apiKey | server | schedule | backup
AttributeItem
One extra attribute of an item or person: a provider value that has no dedicated field, shown for display only.
object
keystringRequiredLower-case snake_case key, for example "label" or "height_cm".
labelstringDisplay name declared by an enabled plugin for keys that have no built-in translation, in the requested language. Omitted when there is none.
valuestringRequiredText to display.
CacheUsage
Disk usage of one server cache.
object
clearablebooleanRequiredTrue if the cache can be emptied with POST /system/caches/{name}/clear. Currently only the "remote-images" cache, and only when the server has its dedicated original-image cache attached.
fileCountinteger (int64)RequiredNumber of files in the cache at the last measurement.
measuredAtstring (date-time)RequiredTime the most recent measurement finished, in RFC 3339 format. Null while the status is "pending".
namestringRequiredCache name, for example "images" or "subtitles".
pathstringRequiredDirectory on the server where the cache is stored.
sizeBytesinteger (int64)RequiredTotal size of the cache in bytes at the last measurement.
statusstring:ok|error|pendingRequiredMeasurement status: "ok" if the last measurement succeeded, "error" if it failed (for example the directory is unreadable or the measurement timed out), "pending" if the first measurement has not finished. With "error" or "pending", sizeBytes and fileCount are 0.
CreateLibraryRequest
Request body for creating a media library.
object
accessUserIdsarray of stringIDs of members who get access to the library on creation. If omitted or empty, only administrators can see it. An ID that does not exist or belongs to a disabled user returns 400.
namestringRequiredDisplay name of the library.
optionsLibraryOptionsUpdateComplete library settings applied at creation, with the same fields as PUT /libraries/{id}/options (remoteAllowedHosts is required). The operation is atomic: an invalid field returns 400 and nothing is created, and if saving the settings fails the new library is removed. If both realtimeMonitor and options.realtimeMonitor are set, the latter wins.
pathsarray of stringRequiredAbsolute directory paths that make up the library.
realtimeMonitorbooleanWhether to watch the library for file changes as they happen. Defaults to true. See LibraryOptions.realtimeMonitor.
CursorPageItemSummary
A page of item summaries using cursor pagination.
object
Items on this page.
nextCursorstringCursor for the next page. Null on the last page.
totalCountintegerTotal number of items matching the filters. Present only when the request sets includeTotal=true.
Device
A client device that has signed in to the server.
object
clientstringRequiredName of the client application.
countsTowardLimitbooleanRequiredWhether this device counts toward the plan's device limit, taken from the license's device ranking; the number of rows marked true equals the license page's device usage. Devices that do not count are still listed, with the reason in notCountedReason (over-limit devices use overLimit).
devicestringRequiredName of the device.
idstringRequiredPublic identifier of the device (an irreversible hash of its token).
kindstring:player|web|appRequired"player" for a sign-in from a third-party player (token), "web" for a sign-in from a web browser.
lastSeenstring (date-time)RequiredTime the device was last active, in RFC 3339 format (UTC).
loginCountintegerHow many sign-ins were merged into this row (sign-ins sharing a device ID or browser ID form one row; a sign-in without an identifier counts as its own device and has 1).
notCountedReasonstring:memberDisabled|notPlayedWhy the device does not count when it is not over the limit: "memberDisabled" when every member signed in on it is disabled, "notPlayed" for a web sign-in that never played anything. Omitted when the device counts or is over the limit.
overLimitbooleanRequiredTrue when the device is beyond the plan's device limit. The earliest signed-in devices are kept; new playback on this device is refused with "plan_device_limit" until earlier devices sign out. False when there is no license information or no limit is exceeded.
userIdstringRequiredID of the member the device is signed in as.
userNamestringName of the member the device is signed in as.
usersarray of NamedRefMembers signed in on this device, most recently active first.
versionstringVersion of the client application.
ErrorCode
Machine-readable error code returned in ErrorResponse.code. Clients should branch on the code rather than the message. Some codes carry extra values in the response params (for example field, limit, pluginId, libraryId, reason, retryAfterSeconds). Common codes: "bad_request" (400), "unauthorized" (401: missing, invalid or expired credentials or API key), "forbidden" and "admin_only" (403), "not_found" (404), "conflict" (409), "too_large" (413, params.maxBytes), "too_many_requests" (429, Retry-After header gives seconds to wait), "internal_error" (500), "service_unavailable" and "not_enabled" (503). Validation codes (400): "field_required", "field_invalid", "field_too_long", "path_not_absolute", "host_invalid", "unsupported_language", "public_url_invalid", "discovery_url_invalid", "password_rule", "schedule_" (invalid schedule rule), "backup_" (invalid backup settings, or wrong password for a backup). Other codes cover login ("invalid_credentials", "wrong_pin", "wrong_password", "pin_locked", "password_required", "setup_done"), plugins ("plugin_", "recognizer_not_installed", "provider_not_installed", "image_source_not_installed", "segment_provider_not_installed", "no_person_provider", "no_scrape_provider"), library and metadata operations ("library_", "subtitle_", "writeback_replace_confirm", "nfo_write_disabled", "no_provider_id", "id_owned_by_other", "split_ids_conflict", "item_count_changed", "merge_chain", "last_admin"), playback and casting ("cast_disabled", "cast_not_possible", "hls_busy", "parental_time", "session_not_stoppable"), import ("source_unreachable", "source_unauthorized", "import_source_kind_mismatch"), and licensing and plan limits ("license_", "plan_*").
string: bad_request | unauthorized | forbidden | forbidden_origin | not_found | conflict | too_large | too_many_requests | internal_error | service_unavailable | not_enabled | invalid_credentials | wrong_pin | wrong_password | pin_locked | password_required | setup_done | plugin_needs_configuration | plugin_rate_limited | plugin_builtin | plugin_config_rejected | no_person_provider | no_scrape_provider | no_provider_id | nfo_write_disabled | item_count_changed | scrape_not_cancellable | no_posters | source_unreachable | source_unauthorized | id_owned_by_other | split_ids_conflict | provider_error | invalid_id | unsupported_language | library_delete_blocked | last_admin | merge_chain | admin_only | session_not_stoppable | schedule_trigger_not_allowed | schedule_cron_invalid | schedule_interval_out_of_range | schedule_window_invalid | schedule_rule_invalid | schedule_runner_unavailable | log_retention_invalid | backup_in_progress | backup_restore_pending | backup_password_invalid | backup_wrong_password | backup_too_new | backup_dir_invalid | backup_keep_invalid | update_check_disabled | import_source_kind_mismatch | fonts_loading | hls_busy | public_url_invalid | field_required | field_invalid | field_too_long | path_not_absolute | host_invalid | library_no_providers | writeback_replace_confirm | cast_disabled | cast_not_possible | cast_renderer_failed | cast_session_ended | recognizer_not_installed | provider_not_installed | discovery_url_invalid | segment_provider_not_installed | license_invalid | license_seats_full | license_unavailable | license_unbind_limit | license_rate_limited | license_expired | license_trial_used | trial_used_on_server | license_trial_closed | plan_admin_only | plan_member_limit | plan_device_limit | plan_stream_limit | password_rule | license_required | parental_time | library_not_writable | subtitle_not_downloadable | subtitle_provider_failed | image_source_not_installed | segment_detect_disabled | regex_invalid | cleanup_changed | cleanup_too_slow | cleanup_too_many | library_path_not_allowed | unsupported_media_type | check_running | check_cooldown | check_busy | plugin_not_running
ErrorResponse
Standard error body returned for failed requests.
object
messagestringRequiredHuman-readable explanation in the server's default language. Intended for logs and developers; branch on code instead.
paramsobjectExtra values that go with the error code (numbers, names, fields). See ErrorCode. Omitted when the code has no parameters.
ExtraType
Type of a bonus item: "Trailer", "BehindTheScenes", "DeletedScene", "Featurette", "Interview", "Scene", "Short", "Clip", "Other", or "AdditionalPart". Main features do not carry this field. "AdditionalPart" marks the second and later segments of a multi-part video (-cd2, -cd3 and so on); it is not a bonus item, its indexNumber in the item detail is the part number (starting at 2), and like bonus items it is hidden from item lists by default.
string: Trailer | BehindTheScenes | DeletedScene | Featurette | Interview | Scene | Short | Clip | Other | AdditionalPart
ImageCropHint
A crop suggestion as an aspect ratio plus a position, for when the original size is not known up front.
object
aspectnumber (double)RequiredWanted width divided by height.
xnumber (double)RequiredHorizontal position of the crop frame, like CSS object-position (0 left, 0.5 center, 1 right).
ynumber (double)RequiredVertical position of the crop frame (0 top, 0.5 center, 1 bottom).
ImageCropRect
A crop region as fractions (0 to 1) of the original image width and height.
object
heightnumber (double)RequiredHeight of the region.
widthnumber (double)RequiredWidth of the region.
xnumber (double)RequiredLeft edge of the region.
ynumber (double)RequiredTop edge of the region.
ImageDetail
Crop information for one image, for drawing a crop frame. The image the tag refers to is already cropped.
object
cropImageCropRectcropHintImageCropHintCrop suggestion given by the provider as aspect ratio and position. Omitted when there is none. The crop wins when both are set.
cropManualbooleanTrue when the crop or focus was set by an administrator. Present only when true.
effectiveCropImageCropRectThe crop actually applied; the crop when set, otherwise the crop hint resolved against the original size. Omitted when not known or not needed.
focusImageFocusPointheightintegerHeight of the original image in pixels. Omitted when not known yet.
indexintegerRequiredIndex among images of the same kind, starting at 0.
tagstringRequiredTag of the image.
widthintegerWidth of the original image in pixels. Omitted when not known yet.
ImageFocusPoint
A focus point as fractions (0 to 1) of the original image width and height, for example the center of a face.
object
xnumber (double)RequiredHorizontal position.
ynumber (double)RequiredVertical position.
ImageKind
Kind of image an item can have: "primary" (poster or main image), "backdrop" (background), "logo", "thumb", "banner", "art", "disc".
string: primary | backdrop | logo | thumb | banner | art | disc | photo | still
ImageTags
Tags identifying the images an item has, one field per image kind. A kind the item has no image for is omitted.
object
backdropstringTag of the backdrop image. An item has at most one; additional stills are listed in ItemDetail.stills.
logostringTag of the logo image.
primarystringTag of the primary (poster) image.
thumbstringTag of the thumbnail image.
InstalledPlugin
A plugin installed on the server, with its state and settings.
object
allowedPermissionsarray of stringRequiredPermissions an administrator has allowed for this plugin. A plugin can use a permission only when it declares it and it is listed here. Empty when none.
authorstringAuthor of the plugin. Taken from the plugin catalog entry when there is one, otherwise from what the plugin declares itself. Omitted when neither has it.
authorSourcestring:catalog|pluginWhere author and homepage come from: "catalog" (the plugin catalog entry) or "plugin" (declared by the plugin itself, not reviewed by a catalog). Omitted when neither has them.
bundledbooleanRequiredTrue for plugins shipped with the server image. Uninstalling the bundled version removes the plugin completely (it can be installed again from the catalog); uninstalling an update reverts to the bundled version.
bundledVersionstringVersion shipped with the server image. If version is newer, an update from the official catalog is installed and can be removed to revert to the bundled version.
capabilitiesarray of stringRequiredCapabilities the plugin declares, for example the kinds of metadata or other services it provides.
catalogstringRequiredURL of the plugin catalog it was installed from. Updates are only taken from the same catalog.
concurrencyintegerRequiredEffective maximum number of concurrent requests to the plugin.
concurrencyOverrideintegerConcurrency limit set by an administrator. Omitted when not overridden.
configuredbooleanRequiredTrue when every required setting the plugin declares has a value. A plugin that is not configured can still be selected for a library; it only starts scraping once its settings are complete.
descriptionstringShort description of the plugin.
devbooleanTrue when the plugin was loaded from the developer-mode directory on the server (unsigned, not from any catalog, never updated automatically).
disableReasonstring:manual|crash|not_enabledWhy the plugin is disabled: "manual" (an administrator disabled it), "crash" (it crashed too many times), "not_enabled" (a bundled plugin that was registered but never enabled, usually because it needs configuration first).
enabledbooleanRequiredWhether the plugin is enabled.
extensionbooleanRequiredTrue for a built-in extension, which runs inside the server process and is upgraded with it. It can only be enabled, disabled and configured, not uninstalled or updated on its own.
featuresarray of stringRequiredCodes of paid features the plugin declares it needs; empty when none. May be empty before the plugin has started for the first time.
homepagestring (uri)Project home page of the plugin (https). Same source as author. Omitted when there is none.
idstringRequiredUnique plugin ID.
installedAtstring (date-time)RequiredTime the plugin was installed, in RFC 3339 format (UTC).
lastErrorstringMost recent error text reported by the plugin on start, crash, health check or configuration. Kept for older clients; prefer the error code.
lastErrorCodeProviderErrorCodelicenseRequiredbooleanRequiredFor a plugin, true when any entry of paidFeatures is not entitled; it can still be enabled, but the capabilities behind that feature are not used until the license covers it. For a built-in extension (extension is true), true when a declared feature is not covered; it cannot be enabled (enabling returns 403 "license_required").
missingRequiredarray of stringRequiredKeys of required settings that have no value. When non-empty, status is "needs_configuration".
namestringRequiredDisplay name of the plugin.
needsAttentionbooleanRequiredTrue if the plugin has a problem the administrator should look at - crashed and disabled, needs configuration, incompatible, or the upstream service rejected its credentials.
officialbooleanRequiredTrue for plugins published by the server vendor.
Paid features the plugin uses, derived by the server from the capabilities it declares and the features in its manifest, sorted by feature code. Empty when none, and always empty for a built-in extension.
pausedUntilstring (date-time)Time until which the plugin is paused because it reported an upstream rate limit, in RFC 3339 format.
permissionsarray of stringRequiredPermissions the plugin declares in its manifest: "llm" (use the configured AI service) and "network.lan" (multicast and connections to devices on the local network, disclosure only). Empty when none.
previousVersionstringPreviously installed version that can be rolled back to.
protocolintegerRequiredVersion of the plugin protocol the plugin was built for.
Runtime figures for the plugin; empty when there are none. Each code is stable and the client translates it: "calls" and "errors" (last 24 hours), "last-success" (unit "time"), "quota" (remaining allowance reported upstream). Plugin-specific codes are prefixed with the plugin ID; clients may skip codes they do not recognize.
statusstring:unknown|disabled|crash_disabled|starting|running|needs_configuration|restarting|idle|incompatible|license_required|not_installedRequiredRuntime status: "unknown", "disabled", "crash_disabled" (disabled after repeated crashes), "starting", "running", "needs_configuration" (enabled but required settings are missing), "restarting", "idle" (enabled and configured, process stopped for inactivity and started again on next use), "incompatible" (built for an older protocol and must be updated; not retried and not counted as a crash), "license_required" (paid plugin not covered by the current license; process is stopped, settings and data are kept, and it restarts when the license is restored), "not_installed" (the settings are kept but the plugin binary is gone, for example an official plugin that is no longer shipped with the image; installing it again from a catalog restores it and keeps the settings).
tasksarray of PluginTaskScheduled tasks the plugin registered (only while it is enabled); omitted when it has none. Each can be run with POST /admin/schedules/{task}/run.
updatedAtstring (date-time)RequiredTime the plugin was last updated, in RFC 3339 format (UTC).
versionstringRequiredInstalled version of the plugin.
ItemAttention
Overview attention category that GET /items can expand into a list: "needsIdentify", "scrapeFailed", "scrapePending", "noPoster", "unprobed", "missing" or "scrapeNotQueued".
string: needsIdentify | scrapeFailed | scrapePending | noPoster | unprobed | missing | scrapeNotQueued
ItemDetail
Full details of a media item: everything in ItemSummary plus metadata, credits and media sources.
object
communityRatingnumberCommunity rating of the item, typically on a 0-10 scale.
dateCreatedstring (date-time)RequiredTime the item was first added to the library (UTC, RFC 3339).
extraTypeExtraTypehasPosterbooleanRequiredTrue if the item has a poster image.
idstringRequiredUnique item ID.
imageTagstringShort hash of the primary poster image; use it as the cache-busting tag when fetching the image.
indexNumberintegerEpisode number for an episode, season number for a season.
libraryIdstringRequiredID of the library that contains the item.
lockedbooleanTrue if any metadata field is locked or the whole item is locked.
mergedIntostringFor a series that is a non-primary member of a merged group, the ID of the primary series. Omitted otherwise. Admin lists do not collapse merged series, so this marks them as merged.
missingbooleanTrue if the item's file is missing and the item is waiting to be cleaned up.
namestringRequiredDisplay title of the item.
originalLanguagestringOriginal language of the work as a BCP 47 tag (for example "ja"). Omitted when unknown.
originalTitlestringTitle in the original language.
parentIndexNumberintegerSeason number an episode belongs to.
productCodestringProduct code of the item, for example "ABC-123". Omitted when there is none.
productionYearintegerYear of production or first release.
runtimeTicksinteger (int64)Runtime in ticks (1 tick = 100 nanoseconds).
scrapeStateScrapeStateseasonIdstringID of the season an episode belongs to. Set only for episodes.
seriesIdstringID of the series a season or episode belongs to. Set only for seasons and episodes.
sortNamestringRequiredName used for sorting.
versionMemberCountintegerFor a movie that is the primary entry of a version group, the number of other items merged into it. Omitted when nothing is merged.
versionOfstringFor a movie that is a member of a version group, the ID of the primary item. Omitted when the item is not a member. Admin lists do not collapse merged items.
attributesarray of AttributeItemExtra attributes from the metadata provider (for display only, sorted by key). Omitted when there are none.
People credited on the item (cast and crew).
endDatestring (date-time)Date a series ended.
extrasarray of ItemSummaryLocal bonus items (trailers, behind-the-scenes, interviews and so on), excluding additional parts, ordered by index. Omitted when there are none. Each entry's extraType gives its kind.
genresarray of stringRequiredGenre names.
imageDetailsarray of ImageDetailCrop information for each image, sorted by kind and index. Omitted when the item has no images.
imagesImageTagsPlayable versions of the item, each with its file and stream information.
metadataStateMetadataStateofficialRatingstringContent rating label, for example "PG-13".
overviewstringPlot summary of the item.
partsarray of ItemSummaryAdditional segments of a multi-part video (the first segment is the item itself), ordered by part number. Omitted when there are none.
premiereDatestring (date-time)Premiere or first air date.
productionLocationsarray of stringCountries or places where the item was produced.
providerIdsobjectMetadata provider IDs, keyed by lowercase provider name (for example "imdb", "tmdb").
ratingsarray of ItemRatingRatings from individual sources. Omitted when there are none; communityRating is still provided separately.
recognizedTagsarray of stringTags the name recognizer found in the file name (for example markers that cannot be measured from the file). Read-only; shown, filtered and matched by badge rules together with tags. Omitted when there are none.
remoteTrailersarray of RemoteTrailerRemote trailers in order of preference. Omitted when there are none.
seasonNamestringName of the season an episode belongs to.
seriesNamestringName of the series a season or episode belongs to.
stillsarray of ItemStillStill frames of the item in index order. Only filled in item details, omitted when there are none.
studiosarray of stringRequiredStudio names.
subtitleDownloadBlockedReasonSubtitleDownloadBlockedReasonsubtitleDownloadablebooleanWhether subtitles can be downloaded for the item: a subtitle provider is available, the video's directory is writable and the source is not remote read-only. Set only for movies and episodes.
taglinestringShort tagline of the item.
tagsarray of stringRequiredTags attached to the item.
writeBackWarningstring:unavailable|conflict|failedPresent only in the response of POST /items/{id}/identify. The metadata was applied but writing it back to disk failed: "unavailable" (read-only mount or insufficient permission), "conflict" (a user-owned file was found and left untouched), "failed" (any other reason; see server logs).
ItemRating
A rating of an item from one source.
object
maxnumber (double)RequiredMaximum possible score. 10 when no value is recorded.
sourcestringRequiredLowercase source code, for example "tmdb", "imdb", "douban".
valuenumber (double)RequiredThe score.
votesinteger (int64)Number of votes. Omitted when the source does not provide it.
ItemSort
Field to sort items by. Items with a missing value sort last for date fields (premiereDate, year, datePlayed); numeric and rating fields (rating, criticRating, officialRating, runtime, playCount) treat missing as lowest, so they come first ascending and last descending. Ties are broken by name then ID, so results are reproducible. "lastContentAdded" is when a series or collection last gained content; "path" orders by file name; "played" and "favorite" use the current user's state (true first); "officialRating" orders by rating level (G, PG, PG-13, R...) rather than as text; "seriesDatePlayed" is when a series was last played (series only); "size" and "resolution" use the primary version's file size and pixel count; "container" and "studio" use the primary version's container and the first studio (empty is lowest); "productCode" uses the normalized product code, ignoring case and full-width characters, and items without one are lowest; "childCount" uses the child count (visible members for a collection) and returns 400 if unsupported. When listing only collections (type=BoxSet), "dateAdded" is the time the newest member was added.
string: name | dateAdded | premiereDate | year | rating | runtime | datePlayed | playCount | index | random | criticRating | officialRating | dateModified | lastContentAdded | seriesName | path | played | favorite | seriesDatePlayed | size | container | resolution | studio | productCode | childCount
ItemState
State that needs attention on an item: "unidentified" (awaiting identification or scraping failed), "noPoster" (no primary image), "noMetadata" (no overview and no provider ID), "locked" (any field or the whole item is locked), "missing" (the file is missing).
string: unidentified | noPoster | noMetadata | locked | missing
ItemStill
One still frame of an item.
object
heightintegerHeight of the original image; omitted when the source did not give it.
indexintegerRequiredPosition of the still, starting at 0. Deleting one in the middle does not renumber the rest.
tagstringRequiredTag identifying the image content, used to fetch it and to bust caches.
widthintegerWidth of the original image; omitted when the source did not give it.
ItemSummary
Compact summary of a library item as returned in item lists.
object
communityRatingnumberCommunity rating of the item, typically on a 0-10 scale.
dateCreatedstring (date-time)RequiredTime the item was first added to the library (UTC, RFC 3339).
extraTypeExtraTypehasPosterbooleanRequiredTrue if the item has a poster image.
idstringRequiredUnique item ID.
imageTagstringShort hash of the primary poster image; use it as the cache-busting tag when fetching the image.
indexNumberintegerEpisode number for an episode, or season number for a season.
libraryIdstringRequiredID of the library that contains the item.
lockedbooleanTrue if any metadata field is locked or the whole item is locked.
mergedIntostringFor a series that is a non-primary member of a merged group, the ID of the primary series. Omitted otherwise. Admin lists do not collapse merged series, so this marks them as merged.
missingbooleanTrue if the item's file is missing from disk; the item is cleaned up after the grace period.
namestringRequiredDisplay title of the item.
originalLanguagestringOriginal language of the work as a BCP 47 tag (for example "ja"). Omitted when unknown.
originalTitlestringTitle in the original language.
parentIndexNumberintegerSeason number that an episode belongs to.
productCodestringProduct code of the item, for example "ABC-123". Omitted when there is none.
productionYearintegerYear of production or first release.
runtimeTicksinteger (int64)Runtime in ticks (1 tick = 100 nanoseconds).
scrapeStateScrapeStateseasonIdstringFor an episode, the ID of its season. Omitted for other types and for episodes directly under a series.
seriesIdstringFor an episode or a season, the ID of its series. Omitted for other types.
sortNamestringRequiredName used for sorting.
versionMemberCountintegerFor a movie that is the primary entry of a version group, the number of other items merged into it. Omitted when nothing is merged.
versionOfstringFor a movie that is a member of a version group, the ID of the primary item. Omitted when the item is not a member. Admin lists do not collapse merged items.
ItemType
Type of a library item. "Movie" is a film, "Series" a TV show, "Season" a season of a series, "Episode" a single episode, "Folder" a generic folder, "BoxSet" a collection of items, and "Video" a standalone video such as an extra.
string: Movie | Series | Season | Episode | Folder | BoxSet | Video
Job
A background job (scan, scrape, plugin install, poster pre-generation, and so on) with its progress and state.
object
cancellablebooleanRequiredTrue if the job can currently be cancelled with POST /jobs/{id}/cancel: it is in progress and its kind supports cancellation. Scrape queues, finished jobs, paused queues and jobs already being cancelled are not cancellable.
changedintegerNumber of items in this batch on which work was actually done (for example thumbnails actually generated); items skipped because they were already complete are not counted. Omitted for jobs without progress reporting. Each image counts toward one outcome, so processed is approximately changed + progressCached + progressNoUpscale + progressNoPoster + progressFailed.
currentstringThe item currently being worked on, such as the directory being scanned or the stage of a plugin install.
errorsintegerNumber of errors encountered so far.
etaSecondsintegerEstimated remaining time in seconds, roughly (total - processed) / perMinute minutes. Provided only while running and when the rate is above zero.
finishedAtstring (date-time)Time the job finished (UTC, RFC 3339).
idstringRequiredJob identifier. For scans it is "scan:{libraryId}"; for plugin installs it is the install job ID.
libraryIdstringLibrary the scan belongs to.
massMissingPausedbooleanTrue if the scan triggered the mass-missing protection and is waiting for confirmation.
messagestringShort summary of the failure reason; when state is "paused" it is the reason for the pause. It is the server's default text; clients should localize using messageCode when present.
messageCodeJobMessageCodemessageParamsobjectParameters for the message code (numbers, times, names); the contents depend on the code, see JobMessageCode.
nextRetryAtstring (date-time)The earliest time at which a source waiting to be retried is read again. Only for media info read jobs with waiting greater than 0.
perMinuteintegerNumber of units completed in the last 60 seconds (the rate, in the same unit as "unit"); when the batch is younger than 60 seconds it is scaled from the elapsed time. Omitted for jobs without progress reporting.
phasestring:queued|walk|parse|writeCurrent phase of a scan. "queued" means a start was requested and the job is waiting for a full-scan slot (the number of concurrent scans is limited); "walk" is directory traversal, "parse" is file parsing, "write" is writing results.
processedintegerNumber of units processed so far: directories for scans, bytes for plugin installs, and units of "unit" for pre-generation.
progressCachedintegerNumber of units skipped because they were already cached (same unit as "unit"). Present only for jobs that report progress, such as poster pre-generation.
progressFailedintegerNumber of images that failed to fetch or resize.
progressNoPosterintegerNumber of items skipped because they have no primary poster.
progressNoUpscaleintegerNumber of images skipped because the source is not wider than the pre-generated width (the original is served directly on request).
relatedJobIdstringID of the job that actually performs the work this job handed off to (for example "media_info_read" or "scrape"). Omitted when there is none.
relatedKindJobKindstartedAtstring (date-time)Time the job started (UTC, RFC 3339).
stopLimitBytesinteger (int64)Image cache limit in bytes at the time the batch stopped. Present only when stopReason is set.
stopReasonstring:cacheBudgetReason the batch stopped early (currently only poster pre-generation); omitted otherwise. When set, state is still "succeeded" but the work is incomplete: processed counts only what was done and never reaches total. "cacheBudget" means the image cache reached the pre-generation budget and the remaining images are generated on first request. Kept until the next batch starts.
stopUsedBytesinteger (int64)Image cache bytes in use at the time the batch stopped. Present only when stopReason is set.
subjectstringWhat the job acts on, not meant to be translated: library name, source host (imports may include the current library name and progress), or plugin ID and version. Omitted when there is no subject.
systembooleanTrue for an idle system run: trigger is "auto" and changed is 0, meaning everything was already complete and nothing was done. Clients may hide such jobs.
titlestringRequiredDefault title in Traditional Chinese kept for legacy clients; new clients should localize based on kind and add subject.
totalintegerTotal number of units; omitted when unknown. For pre-generation the total is computed when the batch starts (the sum over all queued libraries).
triggerstring:manual|scan|autoWhat started this batch. "manual" is a manual request, "scan" is the completion of a library scan, and "auto" is the system schedule (after startup and every 6 hours as a backfill). Omitted when the source is unknown.
unitstringUnit of processed and total. Currently only pre-generation reports it, as "images" (number of images). Omitted otherwise.
waitingintegerNumber of sources waiting to be retried after a failed media info read (backing off, not counted as pending). Only for media info read jobs; see nextRetryAt.
JobKind
Kind of background job: library scan, plugin install, metadata scrape, poster pre-generation, upload cleanup, Emby import, NFO sync, media info read, person recheck, collection name fill, person details fill, attention-card action, local re-probe, or rating age refresh.
string: scan | pluginInstall | scrape | posterPregenerate | uploadCleanup | embyImport | nfoSync | mediaInfoRead | personRecheck | collectionNameFill | personDetailsFill | personSourceRefetch | attentionAction | localReprobe | ratingAgeRefresh | backup | scheduledTask
JobMessageCode
Machine-readable code for a job status message; clients localize it using the job's messageParams. Values: scrapeBatchDone, scrapeRunning, scrapeWaiting, paused, noProvider, rateLimited, collectionsFilled, importingItem, nfoWriteFailed, failedSeeLog, peopleDetailsRunning, peopleDetailsFilled, yieldingToScrape, attentionActionRunning, attentionActionDone and attentionActionQueued. Parameters: scrapeBatchDone has processed, applied, failed, needsIdentify; scrapeRunning has processed, pending, approximate, count, name, providers; scrapeWaiting has processed, pending, approximate; paused has an optional code ("no_provider" or "provider_unavailable") and reason; noProvider means no provider plugin is available; rateLimited has retryAt (RFC 3339) and, for remote media info reads limited with 403 or 429, status (state is "paused"); collectionsFilled has filled, skipped; importingItem has name; nfoWriteFailed has failures; failedSeeLog means the job failed and details are in the server log; peopleDetailsRunning has processed, filled, skipped, remaining; peopleDetailsFilled has filled, skipped; yieldingToScrape means person detail filling is yielding to the scrape queue (state is "paused" and resumes automatically); attentionActionRunning has action, processed, total; attentionActionDone has action, done, skipped, failed; attentionActionQueued has action, count, skipped, failed and means the work was only handed to a queue, with progress shown on the job named by relatedJobId.
string: scrapeBatchDone | scrapeRunning | scrapeWaiting | paused | noProvider | rateLimited | collectionsFilled | importingItem | nfoWriteFailed | failedSeeLog | peopleDetailsRunning | peopleDetailsFilled | yieldingToScrape | attentionActionRunning | attentionActionDone | attentionActionQueued | waitingRetry | readFailures | backupDone | backupInProgress | personRecheckRunning | personSourceRefetchRunning | personSourceRefetchDone
JobState
State of a job. "running" is in progress; "paused" means the queue is paused (currently only the scrape queue: paused by an admin, outside the scrape window, or no scrape source available), nothing is being processed, and the reason is in message; a paused job is not running and cannot be cancelled; "cancelling" is being cancelled; "succeeded", "failed" and "cancelled" are final states.
string: running | paused | cancelling | succeeded | failed | cancelled
Library
A media library with its root paths, item count, scan status and related flags.
object
coversLibraryCovershasStrmSourcesbooleanTrue if the library contains .strm (pointer file) sources. Admin UIs use it to show that the strm plugin is needed. The result is cached for about 15 seconds, only non-missing versions are considered, and the field is omitted when it cannot be determined.
idstringRequiredUnique library ID.
itemCountintegerNumber of works in the library: movies and series each count once; seasons, episodes, extras and missing items are excluded. Omitted when the count is temporarily unavailable (never reported as 0).
lastScannedAtstring (date-time)Time the most recent scan completed successfully (UTC), from the scanner's in-memory state. Omitted after a server restart before any scan completes, while a scan is running, when the last scan failed or was cancelled, or when no scanner is attached.
namestringRequiredDisplay name of the library.
nfoSyncSuggestedbooleanTrue only in the response to an update that turned "writeBack" (write NFO files) from off to on, to suggest syncing the whole library to NFO with POST /libraries/{id}/nfo-sync. Not present in other responses.
pathsarray of stringRequiredList of absolute root directory paths of the library.
remoteReadsSuggestedbooleanTrue only in the response to an update that changed the hosts remote sources may connect to (remoteAllowedHosts). Reads that failed permanently (address policy refusal, 404) are given up and not retried automatically, so suggest reading again with POST /libraries/{id}/media-info-reads (given-up reads are re-enabled). Saving settings never starts that work itself. Not present in other responses.
rescanRewritebooleanTrue only together with rescanSuggested when the externalAudio switch changed. Start the scan with rewrite set to true; otherwise a full scan does not rewrite directories whose files are unchanged.
rescanSuggestedbooleanTrue only in the response to an update that changed the exclusion rules (excludeKeywords, excludeExtensions, excludeSmallerThanBytes) or the externalAudio switch. A quick scan does not revisit directories whose modification time is unchanged, so already-indexed files would not follow the new rules; suggest a full scan with POST /libraries/{id}/scan. Saving settings never starts the scan itself. Files that become missing because of the new rules are subject to the usual mass-missing protection. Not present in other responses.
scrapePendingintegerNumber of items in the library waiting to be scraped (same measure as the scrapePending count of the admin attention summary, for this library). Only present in GET /libraries and GET /libraries/{id}; cached for about 5 seconds and omitted when it cannot be counted.
scrapeRequeueCountintegerUsed with scrapeRequeueSuggested - how many items would be queued; omitted when the scraper cannot count.
scrapeRequeueSuggestedbooleanTrue only in the response to an update that changed the library from not scraping (no providers selected or auto scrape off) to scraping. Items already indexed stay "not queued for scraping" until an admin queues them with POST /admin/scrape/requeue; saving settings never queues them itself. Not present in other responses.
strmPluginEnabledbooleanTrue if the strm plugin is enabled. When it is not, background reads (mediaInfoTiming), embedded subtitles and video capture have no effect on .strm items. The server itself still supports .strm indexing, scraping, playback and media info reads during playback.
LibraryCoverSource
Source of the effective library cover. "custom" is a cover uploaded by an admin, "scanned" is an image found in the library (such as folder.jpg), and "auto" is the automatic collage stored by the server. An automatic cover is generated once and kept; use POST /libraries/{id}/cover/{kind}/regenerate to replace it.
string: custom | scanned | auto
LibraryCovers
Library cover images. The effective cover is, in order, the admin-uploaded custom cover, an image from the library, or an automatic collage. Images are fetched with GET /images/{libraryId}/{primary|thumb}?tag=. A version with no source is omitted.
object
customPrimarybooleanRequiredTrue if the portrait cover is currently an admin-uploaded custom cover (it can be reverted to automatic).
customThumbbooleanRequiredTrue if the landscape cover is currently an admin-uploaded custom cover.
primarystringTag of the effective portrait (2:3) cover.
primaryFinalbooleanTrue if the automatic portrait cover is final (it collects 4 different posters); false means a temporary cover that may still change as the library grows. Present only when primarySource is "auto".
primaryGeneratedAtstring (date-time)Time the automatic portrait cover was generated or last regenerated (UTC). Present only when primarySource is "auto".
primarySourceLibraryCoverSourcethumbstringTag of the effective landscape (16:9) cover.
thumbFinalbooleanTrue if the automatic landscape cover is final. Present only when thumbSource is "auto".
thumbGeneratedAtstring (date-time)Time the automatic landscape cover was generated (UTC). Present only when thumbSource is "auto".
thumbSourceLibraryCoverSource
LibraryKind
Content type of a library: "movies", "tvshows", or "mixed" (both).
string: movies | tvshows | mixed
LibraryOptions
Library-level settings: allowed hosts for remote sources, metadata and scraping options, scan exclusions and subtitle options. Per-library settings owned by plugins (such as delivery) are available at GET /libraries/{id}/plugins/{pluginId}/settings.
object
allowDeletionbooleanRequiredAllows deleting this library's items and their files on disk. Off by default, which keeps the library read-only. When enabled, the server test-writes and deletes a temporary file in every root directory and returns 400 naming the directory if it is not writable.
autoScrapebooleanRequiredAutomatically scrape newly added items that have no NFO (default on). When off, new items are not queued; items already queued are unaffected.
autoSubtitleLanguagesarray of stringLanguages (BCP 47, in order) for which subtitles are downloaded automatically when missing. See LibraryOptionsUpdate.autoSubtitleLanguages.
backgroundPluginsarray of stringIDs of the background plugins enabled for this library. They must be installed plugins, and a plugin must itself be enabled to run.
badgesOnPostersbooleanDraw poster badges (per the server settings badge rules) into the main poster served to third-party players (Emby and Jellyfin compatible interface). Off by default. The web and apps always overlay badges.
disableSeriesMergebooleanDisables merged display of series that share the same TMDB ID. Series and mixed libraries merge by default (false); movie libraries ignore this setting. Toggling changes only display, not any item ID, and merge groups are recomputed in the background (eventually consistent).
effectiveEmbeddedSubtitlesbooleanRequiredEffective value of embeddedSubtitles after applying the storage-based default.
effectiveIntroDetectionbooleanRequiredEffective value of introDetection after applying the storage-based default.
effectiveReadConcurrencyintegerRequiredEffective number of concurrent reads: the explicitly set value, otherwise 2 for cloud storage or the global probe limit for local storage.
effectiveSubtitleFullReadLimitBytesinteger (int64)RequiredEffective whole-file read limit in bytes: the explicitly set value, otherwise 8 GiB for local storage and 0 for cloud storage. 0 means files are never read whole.
effectiveVideoCapturebooleanRequiredEffective value of videoCapture after applying the storage-based default.
embeddedSubtitlesbooleanWhether embedded subtitles are extracted from videos during playback. null follows the storage type (on for local, off for cloud). On cloud storage embedded subtitles require reading the whole file.
excludeExtensionsarray of stringRequiredFile extensions skipped during scans, lowercase with a leading dot (for example ".nfo"). Empty by default.
excludeKeywordsarray of stringRequiredFiles skipped during scans: keywords are matched as whole words (word boundaries, case-insensitive) against the file name stem (without extension), never against directory names. Empty by default. Trailers are still classified as extras and the built-in sample rule still applies. Files that become missing because of new rules are subject to the usual mass-missing protection.
excludeSmallerThanBytesinteger (int64)RequiredMedia files smaller than this size in bytes are skipped during scans; 0 disables the filter (default). A file exactly at the threshold is not excluded. Does not apply to .strm files.
externalAudiobooleanScan and serve external audio track files (default true). See LibraryOptionsUpdate.externalAudio.
fillMissingFromProviderbooleanRequiredAlso queue new items that have an NFO for scraping, so providers fill empty fields and missing images without overwriting NFO values. Off by default.
imageSourcesarray of stringSelected image source plugin IDs, in order. See LibraryOptionsUpdate.imageSources.
importCollectionsbooleanRequiredCreate collections from NFO files and providers. On by default.
introDetectionbooleanDetect intros and credits from audio fingerprints, which reads the audio of every episode. null follows the storage type (on for local storage, off for network storage). When off, applying a segment to the season copies the same times, and community segments are checked with a short audio sample.
massMissingThresholdnumber (double)RequiredThreshold of the mass-missing protection, from 0 to 1 (default 0.2). If a scan would mark more than this fraction of items missing, marking pauses until an admin confirms. 1 disables the protection.
mediaInfoTimingMediaInfoTimingWhen media info is read; null follows the storage type (during scan for local, in the background for cloud).
metadataLanguagestringRequiredScrape language as a BCP 47 tag, which must be a language supported by the server (currently en, zh-CN, zh-TW) and is stored in canonical form. An empty string follows the server default language. If a translation is unavailable the language fallback order is used, then the original text.
metadataProvidersarray of stringRequiredIDs of the selected metadata provider plugins. An empty array means no provider is used (no scraping and no manual identify). See LibraryOptionsUpdate.metadataProviders.
missingGraceHoursintegerRequiredGrace period in hours before missing items are purged by the scheduler. Defaults to 168 (7 days) when unset.
readConcurrencyintegerNumber of file reads this library performs at the same time to read media info (scan probing, re-reading media info, background reads, video capture), still bounded by the global limit. null follows the storage type; effectiveReadConcurrency holds the effective value.
realtimeMonitorbooleanRequiredWatch the file system for changes (default on). When on, the scanner watches root directories so additions, renames and deletions show up quickly. Network mounts (NFS, SMB) and some FUSE file systems cannot be watched and rely on scheduled and manual scans; the actual state is in the watch field of GET /scans/status.
recognizersarray of stringIDs of the selected name recognizer plugins, in order. An empty array means no recognizer is used. See LibraryOptionsUpdate.recognizers.
remoteAllowedHostsarray of stringRequiredHosts that remote sources may connect to, optionally with a port (for example "media.example:5678"). Matching is case-insensitive and values are stored in lowercase. Values must not contain a scheme, path, query string, "@" or whitespace. An empty array allows any host, but the server refuses at connect time targets resolving to loopback, link-local (including 169.254.169.254) or unspecified addresses. A non-empty array allows only the listed hosts, which are exempt from those address restrictions. Every redirect hop is checked again, so CDN hosts that a cloud drive redirects to must also be listed.
scansSuspendedbooleanSuspends automatic scans for this library. When true, no initial scan runs after creation and scheduled scans and real-time monitoring are off; manually triggered scans still work. Used by import flows to avoid scanner interruptions.
segmentProvidersarray of stringIDs of the selected segment provider plugins, in order. An empty array means community segments are not queried. See LibraryOptionsUpdate.segmentProviders.
subtitleFullReadLimitBytesinteger (int64)Maximum file size in bytes for which the whole file may be read when embedded subtitles cannot be extracted otherwise (no index allows reading only the subtitle blocks, for example non-mkvmerge muxes or MKV files lacking statistics tags). Larger files are not extracted. 0 never reads whole files; null follows the storage type (8 GiB for local, 0 for cloud). effectiveSubtitleFullReadLimitBytes holds the effective value.
unratedAgeinteger:0|7|12|16|18Age assumed for content in this library that has no rating or an unrecognized one: 0 means all ages (such as home videos) and is the default; set 18 to block unrated content. Affects only members with parental controls. Responses always carry the effective value; omit it on update to keep the current one. Changing it requires the parental-controls license, otherwise 403 "license_required"; an unchanged value is not checked.
useNfobooleanRequiredUse local NFO files as a metadata source (default on). When off the scanner does not read NFO metadata; values already read are kept and can be overwritten by providers.
videoCapturebooleanCapture a frame from the video (or use an embedded cover) as the image for items that have none. null follows the storage type (on for local, off for cloud).
writeBackbooleanRequiredWrite scrape results to NFO files and images, only filling in what is missing and never overwriting existing files. Off by default.
LibraryOptionsUpdate
Request body for updating library options. remoteAllowedHosts is required (it replaces the whole list); other fields keep their current value when omitted. A value of 0 for missingGraceHours or massMissingThreshold is treated as omitted.
object
allowDeletionbooleanAllow deleting this library's items and files on disk; see LibraryOptions.allowDeletion.
autoScrapebooleanAutomatically scrape new items without an NFO; see LibraryOptions.autoScrape.
autoSubtitleLanguagesarray of stringLanguages (BCP 47, in order) for which the background queue automatically downloads subtitles when missing. An empty array (default) disables it. Only videos with no subtitle in that language at all are filled; the work is low priority, limited by the upstream quota, and manual downloads take precedence. Values are normalized by trimming whitespace and removing empty and duplicate entries (case-insensitive). Omit to keep the current value.
backgroundPluginsarray of stringIDs of installed background plugins to enable for the library; omit to keep the current value. See LibraryOptions.backgroundPlugins.
badgesOnPostersbooleanDraw badges into the main poster served to third-party players; see LibraryOptions.badgesOnPosters. Omit to keep the current value.
disableSeriesMergebooleanDisable merged display of series with the same TMDB ID; see LibraryOptions.disableSeriesMerge.
embeddedSubtitlesbooleanExtract embedded subtitles during playback; see LibraryOptions.embeddedSubtitles.
excludeExtensionsarray of stringFile extensions to skip during scans; see LibraryOptions.excludeExtensions. Same rules as excludeKeywords, and a leading dot is added if missing; apart from the leading dot, an extension must not contain dots or whitespace. Invalid values return 400 "field_invalid" with field "excludeExtensions".
excludeKeywordsarray of stringKeywords to skip during scans; see LibraryOptions.excludeKeywords. Omit to keep the current value; an empty array excludes nothing. Values are normalized (trimmed, lowercased, empty and duplicate entries removed) and then validated: at most 50 entries, each at most 64 characters (16 for extensions) and without "/" or backslash, otherwise 400 "field_invalid" with field "excludeKeywords". If the storage does not support exclusion rules yet, writing a non-empty list returns 503 "not_enabled".
excludeSmallerThanBytesinteger (int64)Skip media files smaller than this many bytes; see LibraryOptions.excludeSmallerThanBytes. Omit to keep the current value; 0 disables. Values outside 0 to 1 TiB (1099511627776) return 400 "field_invalid" with field "excludeSmallerThanBytes". Changing it returns rescanSuggested like changing keywords (no scan is started).
externalAudiobooleanScan and serve external audio track files (default true). When off the scanner does not collect external audio files and already collected ones are not served. Omit to keep the current value.
fillMissingFromProviderbooleanAlso scrape items that have an NFO to fill missing fields; see LibraryOptions.fillMissingFromProvider.
followStoragearray of LibraryPresetFieldSettings to reset to the recommended value for the library's storage type (stored as null). Giving a value for a setting and listing it here at the same time returns 400 "field_invalid" with field set to that setting's name.
imageSourcesarray of stringImage source plugin IDs whose image candidates are merged in order when scraping. Each must be an installed plugin that declares images.* (see GET /image-providers), otherwise 400 "image_source_not_installed" (params.field, params.provider). An empty array (default) uses only the images that metadata providers supply. Omit to keep the current value.
importCollectionsbooleanCreate collections from NFO and providers; see LibraryOptions.importCollections.
introDetectionbooleanDetect intros and credits from audio fingerprints; see LibraryOptions.introDetection. Omit to keep the current value; use followStorage to go back to the storage default.
massMissingThresholdnumber (double)Mass-missing protection threshold from 0 to 1; see LibraryOptions.massMissingThreshold. 0 is treated as omitted.
mediaInfoTimingMediaInfoTimingmetadataLanguagestringScrape language (BCP 47); see LibraryOptions.metadataLanguage.
metadataProvidersarray of stringProvider plugin IDs selected for the library and tried in order; each must be an installed provider. An empty array means no provider is used: no scraping, manual identify returns 409 "library_no_providers", and new items are not queued. When creating a library, omitting this (or omitting options) selects all available movie or series providers; an empty array is stored as given. Providers installed later are not added to existing libraries. Providers in the list that are not installed or are disabled are treated as unselected.
missingGraceHoursintegerGrace period in hours before missing items are purged; see LibraryOptions.missingGraceHours. 0 is treated as omitted.
readConcurrencyintegerNumber of concurrent media info reads, 1 to 8. Omit to keep the current value; values out of range return 400 "field_invalid" with field "readConcurrency". To go back to following the storage type use followStorage.
realtimeMonitorbooleanWatch the file system for changes; see LibraryOptions.realtimeMonitor.
recognizersarray of stringName recognizer plugin IDs called in order; each must be an installed plugin that declares media.recognize (see GET /recognizers). When scraping, the first recognizer that returns a result wins. An empty array uses no recognizer, and scraping sends only the name and year inferred by the scanner. When creating a library, omitting this (or omitting options) selects all available recognizers; an empty array is stored as given. Recognizers installed later are not added to existing libraries.
remoteAllowedHostsarray of stringRequiredHosts remote sources may connect to; see LibraryOptions.remoteAllowedHosts. Required; it replaces the whole list.
scansSuspendedbooleanSuspend automatic scans for the library; see LibraryOptions.scansSuspended. Omit to keep the current value.
segmentProvidersarray of stringSegment provider plugin IDs queried in order. Each must be an installed plugin that declares segments.provider (see GET /segment-providers), otherwise 400 "segment_provider_not_installed" (params.field, params.provider). An empty array (the default, also for new libraries) means community segments are not queried. Omit to keep the current value.
storageLibraryStorageStorage type of the library; see LibraryOptions.storage. Omit to keep the current value; invalid values return 400 "field_invalid" with field "storage". When creating a library without it and .strm files are found under the roots (directories are listed, contents are not read), it defaults to "cloud".
subtitleFullReadLimitBytesinteger (int64)Maximum file size in bytes for whole-file reads when extracting embedded subtitles; see LibraryOptions.subtitleFullReadLimitBytes. Range 0 to 1 TiB (1099511627776); omit to keep the current value; out of range returns 400 "field_invalid" with field "subtitleFullReadLimitBytes". To go back to following the storage type use followStorage.
unratedAgeinteger:0|7|12|16|18Age assumed for unrated or unrecognized content in this library: 0 means all ages (such as home videos), the default; set 18 to block unrated content. Affects only members with parental controls. Omit to keep the current value. Changing it requires the parental-controls license, otherwise 403 "license_required"; an unchanged value is not checked.
useNfobooleanUse local NFO files as a metadata source; see LibraryOptions.useNfo.
videoCapturebooleanCapture video frames for items without images; see LibraryOptions.videoCapture.
writeBackbooleanWrite scrape results to NFO files and images; see LibraryOptions.writeBack.
LibraryPresetField
A setting that can follow the recommended value for the library's storage type: readConcurrency, mediaInfoTiming, embeddedSubtitles, videoCapture, subtitleFullReadLimitBytes or introDetection. Used by LibraryOptionsUpdate.followStorage.
string: readConcurrency | mediaInfoTiming | embeddedSubtitles | videoCapture | subtitleFullReadLimitBytes | introDetection
LibraryStorage
Kind of storage the library's files are on, chosen by the user and not auto-detected. "local" is a local or LAN disk; "cloud" is a cloud drive mount (slow or metered reads). .strm libraries can store either value and the server ignores it for them. Creating a "cloud" library without an explicit realtimeMonitor turns real-time monitoring off by default, since cloud mounts do not deliver file change notifications.
string: local | cloud
MediaInfoTiming
When media info is read. "scan" reads it during the scan (recommended for local storage); "background" only creates items during the scan and reads media info slowly in the background according to the read concurrency, yielding when someone is playing (recommended for cloud storage); "playback" reads it only at playback time.
string: scan | background | playback
MediaSource
A playable media file (version) of an item, with its container, size, bitrate and streams.
object
bitrateinteger (int64)RequiredOverall bitrate in bits per second.
containerstringRequiredContainer file extension (mkv, mp4, and so on).
idstringRequiredUnique media source ID.
itemIdstringRequiredID of the item this media source belongs to.
missingbooleanTrue if the file is missing on disk.
namestringRequiredVersion name (for example "4K" or "Director's Cut"); empty by default.
pathstringRequiredFile path or remote URL of the media source.
probeFailureProbeFailureReason probing a local file failed. The file is still indexed but has no media info (streams contain only plugin-provided tracks and the duration is 0). It disappears once a later probe (scan or playback re-probe) succeeds. Omitted for remote sources and for successfully probed files.
sizeinteger (int64)RequiredFile size in bytes.
Video, audio and subtitle streams of the media source.
MediaStream
A single video, audio or subtitle stream in a media source.
object
bitrateinteger (int64)Stream bitrate in bits per second.
channelLayoutstringAudio channel layout, for example "5.1".
channelsintegerNumber of audio channels.
codecstringRequiredCodec name (h264, hevc, aac, subrip, ass, webvtt, and so on).
externalPathstringFile path of an external subtitle file.
heightintegerVideo height in pixels.
indexintegerRequiredStream index: the ffprobe index for embedded streams, or the sequence number for external subtitles.
isDefaultbooleanTrue if the stream is flagged as the default track.
isExternalbooleanTrue if the stream is an external subtitle file.
isForcedbooleanTrue if the stream is flagged as forced.
languagestringISO 639-2/B language code (chi, eng, jpn, and so on).
resolutionNamestringDisplay name of a video stream's resolution (SD, 720p, 1080p, 1440p, 4K, 8K). A stream qualifies if either its width or height reaches the tier. Omitted when width and height are unknown.
sampleRateintegerAudio sample rate in Hz.
titlestringTrack title.
widthintegerVideo width in pixels.
MemberPlanAccess
How far a member can use the server under the plan's member limit: "full" (kept, or within the limit), "admin-only" (an administrator that is not kept; can only open the admin site) or "denied" (a member that is not kept; cannot sign in to the viewer). Disabled members do not count and are always "full".
string: full | admin-only | denied
MetadataState
Scrape status and locks of an item.
object
dateSavedstring (date-time)Time the metadata last actually changed (UTC, RFC 3339).
lockDatabooleanRequiredTrue if the whole item is locked so that only manual edits can change it.
lockedFieldsarray of stringRequiredLocked metadata fields, using the same names as Emby's MetadataFields (for example Name, Overview, Genres, Cast).
providerstringID of the plugin that provided the match. Omitted when there is no match.
providerItemIdstringID of the item at the provider. Omitted for seasons and episodes that have no separate ID.
scrapeErrorstringReason a scrape failed or the item needs identification.
scrapedAtstring (date-time)Time metadata was last fetched from a provider (UTC, RFC 3339).
NamedRef
An ID with its display name.
object
idstringRequiredID of the referenced object.
namestringRequiredDisplay name of the referenced object.
ParentalControls
Parental controls for one member (a paid add-on). Rules are always enforced server-side and blocked content is completely hidden; administrators are not restricted. Values are normalized (tags and genres lowercased, de-duplicated and sorted) and validated before storing; invalid input returns 400.
object
allowedItemsarray of stringItem IDs explicitly allowed regardless of age, tags and genres. Setting it on a series applies to the whole series.
blockedGenresarray of stringGenres that are blocked.
blockedItemsarray of stringItem IDs explicitly blocked; this has the highest priority.
blockedTagsarray of stringTags that are blocked.
dailyLimitMinutesintegerDaily viewing limit in minutes, counted per date in the server time zone and accumulated across devices. 0 means no limit.
maxAgeinteger:0|7|12|16|18RequiredHighest age tier the member may watch (0, 7, 12, 16 or 18); 0 allows only all-ages content. Ratings are converted to an actual age for comparison (PG-13 counts as 13, so a 12 limit blocks it). Content with no rating uses the library's unratedAge.
windowsarray of ParentalWindowTime windows during which viewing is allowed; empty means no time restriction.
ParentalWindow
One allowed viewing window, interpreted in the server time zone. If endMinute is less than or equal to startMinute the window crosses midnight; for example Friday 20:00 to Saturday 01:00 is days=[5], startMinute=1200, endMinute=60.
object
daysarray of integerRequiredDays of the week the window applies to, 0 for Sunday through 6 for Saturday (the day on which the window starts).
endMinuteintegerRequiredEnd of the window as minutes after midnight (0 to 1439).
startMinuteintegerRequiredStart of the window as minutes after midnight (0 to 1439).
PersonCredit
A person credited on a title, with the role they play and their position in the credits.
object
idstringRequiredPerson ID.
imageTagstringTag identifying the current person image, usable for cache busting.
namestringRequiredDisplay name of the cast or crew member.
orderintegerPosition of this person in the title's credits, ascending.
rolestringRequiredCharacter played or job held on the title.
sharedCountintegerOnly present in the
collaboratorslist of a person's detail: the number of titles this person has in common with the person being viewed.
PersonKind
Kind of credit a person has on a title: "Actor", "Director", "Writer", "Producer", "GuestStar" (guest appearance in an episode) or "Composer".
string: Actor | Director | Writer | Producer | GuestStar | Composer
PlayDelivery
How the media is delivered to the player. "direct_play" sends the file as is, "direct_stream" changes only the container, "audio_transcode" converts the audio while copying the video, "proxy" means the server fetches remote content on the player's behalf, and "redirect" sends the player straight to the remote source. Remote sources use "proxy" or "redirect"; other sources use one of the first three.
string: direct_play | direct_stream | audio_transcode | proxy | redirect
PlayHistoryPage
One page of playback history records.
object
Playback records on this page.
nextCursorstringPresent only when another page exists; pass it back as
cursorwith the same filters to fetch the next page.
PlayNetwork
Network the player is on, determined from the request's source address: "lan" for the local network, "wan" for the external network. The rules match the Emby-compatible layer (addresses forwarded by trusted proxies, extra LAN subnets, WAN-only ports). PlaybackInfo.network is omitted when the source address cannot be classified.
string: lan | wan
PlayOrigin
Where the played content lives: "local" for a file on the server's storage, "remote" for a remote source.
string: local | remote
PlayRecord
One playback history record for a member watching an item on a device.
object
atstring (date-time)RequiredTime playback started, in UTC.
devicestringRequiredName of the device that played the item.
deviceIdstringRequiredIdentifier of the device.
durationSecnumber (double)RequiredTotal duration of the item in seconds.
endedAtstring (date-time)RequiredTime playback ended, in UTC.
episodestringEpisode label for episodes, for example
S01E04.finishedbooleanRequiredTrue when the member watched 90% or more of the item.
idstringRequiredRecord ID.
ipstringSource address of the player. Omitted once the record is older than the retention period (90 days by default).
itemDeletedbooleanTrue when the item no longer exists.
itemIdstringRequiredID of the played item.
kindstring:movie|episode|videoRequiredType of the played item: "movie", "episode" or "video".
memberstringRequiredName of the member who played the item.
memberIdstringRequiredID of the member who played the item.
percentnumber (double)RequiredFurthest position reached as a percentage of the item's duration; 0 when the duration is unknown.
playerstringRequiredName of the player application.
sessionsintegerRequiredNumber of playback sessions merged into this record.
titlestringTitle of the played item.
watchedSecnumber (double)RequiredTime actually played in seconds, excluding pauses.
PlaybackSession
A currently active playback session.
object
bandwidthKbpsintegerRequiredActual traffic passing through the server in kbit/s. Always 0 for redirects and direct file reads, because the traffic does not go through the server.
bitrateKbpsintegerBitrate of the media itself in kbit/s, taken from media info. Omitted when unknown.
devicestringRequiredName of the device playing the item.
durationSecnumber (double)RequiredTotal duration of the item in seconds.
episodestringEpisode label, for example
S01E04.idstringRequiredSession ID.
itemDeletedbooleanTrue when the item has been deleted or cannot be read; in that case
titleis absent.itemIdstringRequiredID of the item being played.
memberstringRequiredName of the member playing (user-supplied data, not server text).
memberIdstringRequiredID of the member playing.
pausedbooleanRequiredTrue when playback is currently paused.
playerstringRequiredName of the player application.
positionSecnumber (double)RequiredCurrent playback position in seconds.
progressnumber (double)RequiredPlayback progress as a fraction of the duration, from 0 to 1.
seasonIdstringID of the season an episode belongs to, for showing the season poster. Omitted when the item is not an episode or has no season.
seriesIdstringID of the series an episode belongs to, for showing the series poster. Omitted when the item is not an episode.
startedAtstring (date-time)RequiredTime the session started, in UTC.
stoppablebooleanRequiredWhether the server is able to ask this player to stop.
titlestringTitle of the item; for an episode, the name of its series.
PluginAttribution
Attribution required by a data source, such as the text and logo a provider's terms demand. Clients that display this data must show it.
object
linkstringURL the attribution links to.
logoUrlstringURL of the logo to display.
textstringAttribution text to display.
PluginPaidFeature
A paid feature a plugin uses, derived by the server from the capabilities the plugin declares. The hint shown to the user ("this feature needs a plan to take effect") is the server UI's own text.
object
entitledbooleanRequiredWhether the current license covers the feature. When false the plugin can still be enabled, but the capabilities behind the feature are not used.
featurestringRequiredFeature code.
PluginStat
One runtime figure reported for a plugin.
object
atstring (date-time)Time related to the figure (for example the last success); omitted when there is none.
codestringRequiredStable code naming the figure; clients translate it.
valueinteger (int64)RequiredThe figure itself, in the given unit (0 when the unit is "time").
PluginStatUnit
Unit of PluginStat.value: "count" for counts, "bytes" for sizes, "time" when only "at" is meaningful.
string: count | bytes | time
PluginTask
A schedulable task registered by a plugin, shown on the plugin settings page with a run-now button (POST /admin/schedules/{task}/run).
object
lastFinishedAtstring (date-time)Time the last run finished, in RFC 3339 format.
lastResultScheduleResultnamesobjectRequiredDisplay names keyed by language code (en is always present).
nextRunAtstring (date-time)Next scheduled run time in RFC 3339 format; omitted when paused or when the trigger has no scheduled time.
pausedbooleanRequiredTrue if the schedule is paused.
runningbooleanRequiredTrue if a run of this task is currently in progress.
ProbeFailure
Category of a failed probe of a local file; the raw error goes only to the logs. "invalid" means the file is corrupt or empty, "timeout" means the probe timed out, "permission_denied" means the file cannot be read, "unreachable" means it cannot be reached (for example a network mount that is temporarily down), and "unknown" covers anything else. Missing files and disconnected mounts are not recorded by the scanner, so those cases have no category.
string: permission_denied | unreachable | timeout | invalid | link_gone | not_media | unknown
ProviderErrorCode
Category of the most recent error of a plugin or metadata provider; the raw error goes only to the logs. "crashed" means the provider crashed, "needs_configuration" means its settings are missing or invalid, "auth_failed" means authentication failed (invalid key), "rate_limited" means the upstream throttled requests, "unreachable" means the upstream cannot be reached, "timeout" means a request timed out, and "unknown" covers anything else.
string: crashed | needs_configuration | auth_failed | rate_limited | unreachable | timeout | unknown
RefreshMetadataRequest
Options for refreshing metadata of an item or library.
object
modestring:missing|replaceAllRequired"missing" fills in only metadata that is absent; "replaceAll" replaces existing metadata.
recursivebooleanApplies to items only: also processes the children of a series, season or folder. Defaults to false. For a library the whole library is always processed.
replaceImagesbooleanAlso replaces images that came from providers. Defaults to false.
ReleaseInfo
Information about a software release.
object
notesUrlstringHTTPS URL of the release notes. Omitted when there are none.
publishedAtstring (date-time)Time the release was published, in UTC.
versionstringRequiredVersion string of the release.
RemoteTrailer
A remote trailer: an http(s) URL that can be opened directly (for example a YouTube link). Trailers are listed in order of preference, and the first is the preferred one.
object
kindstringKind of video, such as trailer, teaser, clip, featurette or behind_the_scenes. Unrecognized values are stored as given.
languagestringLanguage as a BCP 47 tag. Omitted when unknown.
namestringDisplay name of the trailer.
officialbooleanTrue when the video was uploaded by the studio.
urlstringRequiredTrailer URL; only http and https are accepted.
RescrapeResult
Result of a request to re-scrape metadata for a set of items.
object
queuedintegerRequiredNumber of items queued for scraping.
skippedintegerRequiredNumber of items skipped because they already have a match and the data layer cannot mark them stale. Normally 0.
RootErrorCode
Reason a library root is offline; the raw error goes only to the logs. Values are "not_found", "permission_denied", "not_directory", "not_mounted", and "unknown" when the cause cannot be classified.
string: not_found | permission_denied | not_directory | not_mounted | unknown
RootStatus
Reachability status of a library root directory.
object
checkedAtstring (date-time)Time of the last reachability check, in UTC.
lastOnlinestring (date-time)Time the root was last reachable, in UTC. Omitted if it has never been reachable.
messagestringRaw server text describing why the root is offline, intended for logs and older clients. Clients should translate
reasonCodeinstead of displaying it.onlinebooleanRequiredTrue when the root is currently reachable.
pathstringRequiredFilesystem path of the root.
reasonCodeRootErrorCode
ScanError
An error recorded during a library scan.
object
errorstringRequiredError message.
idstringRequiredError record ID.
libraryIdstringRequiredID of the library being scanned.
occurredAtstring (date-time)RequiredTime the error occurred, in UTC.
pathstringRequiredPath of the file or directory that caused the error.
ScanMode
Scan mode: "quick" compares directory modification times, "full" checks every file individually.
string: quick | full
ScanRequest
Request body for starting a library scan.
object
modeScanModerewritebooleanAsk the scanner to rewrite directories before scanning (used after the externalAudio switch changed, see Library.rescanRewrite). Ignored when the scanner does not support it.
ScanState
State of a scan: "idle" nothing has run, "running" a scan is in progress, "cancelling" cancellation was requested and is in progress, "completed" finished successfully, "failed" ended with an error, "cancelled" was cancelled.
string: idle | running | cancelling | completed | failed | cancelled
ScanStatus
Live progress and state of the scan for one library.
object
addedintegerNumber of items added so far by the current scan.
changedintegerNumber of existing items updated so far by the current scan.
currentDirstringDirectory the scan is currently walking.
currentPathstringFile or directory currently being processed; more specific than currentDir.
errorsintegerRequiredNumber of errors encountered by the scan.
finishedAtstring (date-time)Time the scan finished, in RFC 3339 format. Omitted while the scan is running.
libraryIdstringRequiredIdentifier of the library this status belongs to.
massMissingPausedbooleanTrue when the mass-missing safeguard has paused marking items as missing until an administrator confirms (see GET /scans/mass-missing).
messagestringHuman-readable status text or the reason for a failure.
missingintegerNumber of items marked missing. While the mass-missing safeguard is paused, this is the number that would be marked.
phasestring:queued|walk|parse|writeCurrent phase of the scan: "queued" (requested and waiting for a full-scan slot, since the number of concurrent scans is limited), "walk" (traversing directories), "parse" (parsing file names and probing media), "write" (writing results to the database).
processedintegerRequiredNumber of directories processed so far.
rootsarray of RootStatusMost recent online-status check for each root directory of the library.
startedAtstring (date-time)Time the scan started, in RFC 3339 format.
totalintegerNumber of directories currently known to need processing, in the same unit as processed. It can grow while walking and is omitted when unknown.
watchstring:watching|disabled|unsupported|limit|pendingState of live file-system watching: "watching" (active), "disabled" (turned off in settings), "unsupported" (the file system does not support it, for example network mounts, so only scheduled scans run), "limit" (the system watch limit was reached, falls back to scheduled scans), "pending" (not ready yet, for example a root is temporarily unreachable). Omitted when not reported.
watchMessagestringRaw server text explaining an "unsupported" or "limit" watch state. Kept for legacy clients; use the watch reason code for display.
watchReasonCodeWatchReasonCode
Schedule
Schedule configuration and run state for one schedulable task kind.
object
Trigger types this task kind supports, in suggested display order.
allowsAfterScanbooleanRequiredTrue if this task kind can be configured to also run after a scan.
descriptionsobjectDescription of a plugin task by language code; omitted for built-in tasks and tasks without one.
isDefaultbooleanRequiredTrue when the schedule has not been changed and follows the built-in default.
lastErrorCodestringError category of the last failed run, present only when the last result is "failed": for example "not_found", "permission_denied", "unreachable", "timeout", "invalid", "unknown". Scan tasks can also report "library_root_unavailable" (a library root is inaccessible, such as a dropped mount) and "scan_failed" (failed for another reason); these two come with lastErrorLibraries.
lastErrorLibrariesarray of stringIDs of the libraries involved in the last failure, in ascending ID order. Omitted when none; present only when the last result is "failed".
lastFinishedAtstring (date-time)Time the last run finished, in RFC 3339 format.
lastMessagestringOne-line result the task reported on its last run (plugin tasks only). Omitted when there is none.
lastResultScheduleResultlastStartedAtstring (date-time)Time the last run started, in RFC 3339 format.
namesobjectDisplay names of a plugin task keyed by language code (en is always present). Omitted for core tasks, which clients translate from the task ID.
nextRunAtstring (date-time)Next scheduled run time in RFC 3339 format. Omitted when paused or when the trigger has no scheduled time (idle, continuous, or only after a scan).
ownerstringID of the plugin that registered the task. Omitted for core tasks.
pausedbooleanRequiredTrue if the schedule is paused.
runningbooleanRequiredTrue if a run of this task kind is currently in progress, whether scheduled or started manually.
ScheduleList
Collection of task schedules plus the time zone they are evaluated in.
object
Schedules, one per task kind.
timeZonestringRequiredIANA name of the server time zone; falls back to the process time zone when the server setting is blank.
ScheduleResult
Outcome of the last run: "succeeded", "failed", "cancelled", or "skipped" (the time came but nothing ran, either because there was nothing to do or a task of the same kind was already running).
string: succeeded | failed | cancelled | skipped
ScheduleRule
Desired schedule for a task kind: a trigger plus its parameters.
object
afterScanbooleanRequiredIf true, also run after every successful full scan. Only allowed for task kinds whose allowsAfterScan is true; can be combined with any trigger.
cronstringRequired when trigger is "cron". Standard five-field expression (minute hour day month weekday) supporting "*", ranges, lists, "/n" steps, English abbreviations and macros such as "@daily". Seconds, years, "L", "W", "#" and "?" are not supported.
everySecondsintegerRequired when trigger is "interval": seconds between runs, from 300 (5 minutes) to 2678400 (31 days).
windowScheduleWindow
ScheduleTask
Schedulable task ID. Core tasks are "library_scan" (incremental scan), "library_full_scan" (full scan), "scrape" (metadata scraping of items that are waiting), "metadata_refresh" (re-fetch provider data that has gone stale, weekly at night by default), "poster_pregenerate" (pre-generate poster images), "cleanup" (clean up temporary data), "backup" (create a backup), "database_maintenance" (online database vacuum, statistics update and index rebuild without downtime; runs weekly on Sunday 04:30 by default and also once after a library is deleted). Plugins can register their own tasks, named "pluginId.taskName" in lowercase; those appear after the core tasks while the plugin is enabled, and an unregistered task returns 404. New values may be added over time.
string
ScheduleTrigger
How a task is triggered: "cron" (cron expression), "interval" (fixed period after the previous start), "idle" (when the server is idle), "continuous" (always in the background, yielding while someone is playing).
string: cron | interval | idle | continuous | manual
ScheduleWindow
Daily time window in server time during which a task may run, as [start, end). If end is less than start the window crosses midnight.
object
endMinuteintegerRequiredEnd of the window, in minutes since midnight (exclusive).
startMinuteintegerRequiredStart of the window, in minutes since midnight (inclusive).
ScrapeState
Metadata scraping state of an item: "none" (not needed: has an NFO, cannot be scraped, or automatic scraping is off), "pending" (waiting to be scraped), "scraped" (matched automatically), "failed" (see scrapeError), "needsIdentify" (no high-confidence candidate, waiting for manual identification), "identified" (identified by a user).
string: none | pending | scraped | failed | needsIdentify | identified
SearchPerson
A person matched by a search.
object
idstringRequiredUnique identifier of the person.
imageTagstringTag identifying the person's image, used for cache busting when fetching it. Absent when there is no image.
namestringRequiredDisplay name of the person.
rolestringRole the person plays in the matched work, such as actor or director.
SearchResult
Search results: matching items and matching people.
object
Items matching the query.
People matching the query.
SimpleSuccess
Generic result of an operation that returns no data.
object
messagestringOptional human-readable message about the result.
successbooleanRequiredTrue if the operation succeeded.
StreamType
Kind of media stream: "Video", "Audio" or "Subtitle".
string: Video | Audio | Subtitle
SubtitleDownloadBlockedReason
Why subtitles cannot be downloaded for an item: "license_required" (no subtitle license; checked first), "no_provider" (no usable subtitle provider: not installed, not enabled or not configured), "not_writable" (the directory holding the video is not writable), "remote_readonly" (the source is a read-only remote source).
string: license_required | no_provider | not_writable | remote_readonly
SystemCheck
Result of one health check.
object
detailstringOn success, a summary supplied by the check (for example the ffprobe version). On failure, a generic message; details are in the server log.
latencyMsinteger (int64)RequiredTime the check took, in milliseconds.
namestringRequiredName of the check, for example "database", "ffprobe" or "mediaRoot".
statusstring:ok|errorRequiredResult of the check: "ok" or "error".
SystemStatus
Server health and runtime information.
object
archstringRequiredCPU architecture the server runs on, for example "amd64".
Disk usage of the server's caches.
Individual health check results.
goVersionstringRequiredGo runtime version the server was built with.
osstringRequiredOperating system the server runs on, for example "linux".
serverIdstringRequiredUnique identifier of this server.
serverNamestringRequiredDisplay name of this server.
startedAtstring (date-time)RequiredTime the server process started, in RFC 3339 format.
statusstring:ok|degradedRequiredOverall health: "ok" when every health check passes, "degraded" when any check fails.
uptimeSecondsinteger (int64)RequiredSeconds since the server started.
versionstringRequiredVersion string injected at build time; "dev" for development builds.
UpdateStatus
State of the server update check.
object
availablebooleanRequiredTrue if the most recently found release is newer than the running version. Always false for development builds.
checkedAtstring (date-time)Time of the most recent update check, in RFC 3339 format. Omitted if never checked.
currentstringRequiredVersion of the running server.
enabledbooleanRequiredTrue if automatic update checking is on and a release information URL is configured.
lastErrorCodestringCategory of the most recent failed check, such as "unreachable", "timeout", "invalid" or "unknown". Omitted when the last check did not fail.
latestReleaseInfo
User
A user account.
object
avatarTagstringTag of the user's avatar, present only when an avatar exists. Fetch the image with GET /images/users/{id}?tag=.
createdAtstring (date-time)Time the account was created, in RFC 3339 format.
hasPasswordbooleanTrue if a password is set.
hasPinbooleanTrue if a PIN is set.
idstringRequiredUnique identifier of the user.
isAdminbooleanRequiredTrue if the user is an administrator.
lastLoginAtstring (date-time)Time of the user's last login, in RFC 3339 format.
namestringRequiredAccount name.
parentalEditablebooleanTrue if the current license allows editing parental controls. When false, parental controls are read-only; rules already set are still enforced.
pinLockedbooleanTrue if PIN login is locked after too many failures (20 within 24 hours). Cleared by a successful password login or a PIN reset.
planAccessMemberPlanAccesspolicyUserPolicy
UserPolicy
Permissions and restrictions of a user.
object
accessibleLibrariesarray of stringIDs of the libraries a non-administrator can access. Administrators can always access all libraries, so this has no effect for them. Libraries not listed are invisible to the user (lists, details, images and streams return 404), and new libraries are not opened automatically. Always present in responses; on update, omit to keep the current value, send an empty array to revoke all. Unknown library IDs are ignored.
allLibrariesbooleanIf true, the user can access all libraries, including ones added later, and accessibleLibraries is ignored (but still stored). Defaults to false. Not relevant for administrators. Always present in responses; on update, omit to keep the current value.
allowDownloadbooleanWhether the user may download media. Responses always carry the effective value: when not set explicitly it is true for administrators and unrestricted users and false for users under parental controls. On update, omit to keep the current value; sending the same value as the current effective one changes nothing and needs no license, while a different value requires a license that permits it.
castDisabledbooleanIf true, the user cannot cast media to other devices. Defaults to false. Not relevant for administrators. Always present in responses; on update, omit to keep the current value. Setting it to true (or disabling the user, or removing administrator rights) revokes the user's currently valid cast authorizations.
clearParentalbooleanOn update, true removes parental controls so the user becomes unrestricted. Sending it together with parental returns 400. Changing it requires a license that permits editing parental controls.
contentDeletionLibrariesarray of stringIDs of the libraries from which the user may delete content. Has no effect when deletion is already allowed for all libraries. On update, omit to keep the current value; an empty array clears it.
enableContentDeletionbooleanIf true, the user can delete items and files in all libraries. Responses carry the effective value (true for administrators and false for others when not set). On update, omit to keep the current value. Deletion also requires the library to have allowDeletion enabled.
isAdminbooleanRequiredTrue if the user has administrator rights.
isDisabledbooleanTrue if the account is disabled.
isHiddenbooleanTrue if the user is hidden from the public login list.
parentalParentalControlsresetAllowDownloadbooleanOn update, true resets the download permission to its default, which depends on whether the user has parental controls. Sending it together with allowDownload returns 400. Changing it requires a license that permits it.
sessionOnlyLoginbooleanIf true, the user must log in every time the browser is opened: web logins last only until the browser is closed, and the user cannot turn this off. Device tokens of third-party players are unaffected. Always present in responses; on update, omit to keep the current value. Turning it on revokes all of the user's existing web logins; turning it off does not revoke them, and they last until the browser closes.
WatchReasonCode
Why live watching is not in the "watching" state: "network_fs" (network file system, scheduled scans only), "watch_limit" (system watch limit reached; raise fs.inotify.max_user_watches), "unknown" (other).
string: network_fs | watch_limit | unknown