Promised (v1)
These thirteen addresses are a promise: as long as v1 is in the address, nothing disappears from their answers. If something has to break, /api/v2 appears beside it and v1 keeps running. Expand any address for its fields.
GET
/api/v1/about
promised
Version and build
Which version of Nexview this is. Useful for telling deployments apart and for deciding whether a feature you rely on exists yet.
Fields and shape
Response
versionstring requiredrepo_urlstring requiredrelease_urlstring requiredlicensestringupdate_checkedbooleanlatest_versionstring or nullupdate_availablebooleanchecked_attimestamp (ISO 8601) or nullResponse shape
{
"version": "string",
"repo_url": "string",
"release_url": "string",
"license": "string",
"update_checked": "boolean",
"latest_version": "string | null",
"update_available": "boolean",
"checked_at": "ISO 8601 | null"
}
GET
/api/v1/admin/requests/pending/count
promised
Number of requests awaiting a decision
How many requests are waiting for approval. Restricted to accounts that may decide - a token inherits that from its owner, so an ordinary account gets 403 here.
GET
/api/v1/health
promised
Is Nexview running
Answers without a token. A monitor that has to sign in before it may ask "are you still alive" is not a monitor. Returns {"status": "ok"} and nothing else - deliberately no version, no database state, nothing that would tell an unauthenticated caller about the installation.
GET
/api/v1/home/recent
promised
Recently arrived
Titles that finished downloading recently - the list a dashboard tile shows. Note that each entry also names who requested it. That is wanted inside a household and may not be wanted on a wall-mounted screen.
Fields and shape
Response
request_idnumber requiredmedia_typemovie | tv requiredtmdb_idnumber requiredtitlestring requiredoverviewstringposter_urlstring or nullbackdrop_urlstring or nullrelease_datestring or nullvote_averagenumberruntime_minutesnumber or nullgenreslist of stringcompleted_attimestamp (ISO 8601) or nullrequested_bystring requiredrequester_avatarstring or nullseasonslist of numberResponse shape
[
{
"request_id": "number",
"media_type": "movie | tv",
"tmdb_id": "number",
"title": "string",
"overview": "string",
"poster_url": "string | null",
"backdrop_url": "string | null",
"release_date": "string | null",
"vote_average": "number",
"runtime_minutes": "number | null",
"genres": [
"string"
],
"completed_at": "ISO 8601 | null",
"requested_by": "string",
"requester_avatar": "string | null"
}
]
GET
/api/v1/media/{media_type}/{tmdb_id}
promised
Details for one title
Everything about a single title: overview, cast, ratings, runtime, and whether it is already in the library.
Fields and shape
Parameters
media_typemovie | tv path requiredtmdb_idnumber path requiredResponse
media_typemovie | tv requiredtmdb_idnumber requiredtvdb_idnumber or nulltitlestring requiredoriginal_titlestring or nulloverviewstringposter_urlstring or nullbackdrop_urlstring or nullrelease_datestring or nullvote_averagenumbervote_countnumbergenreslist of stringruntime_minutesnumber or nullcertificationstring or nulloriginal_languagestring or nullorigin_countrylist of stringseasonslist of SeasonInfostatusstringstatus_uhdstring or nullwatchedbooleanwatched_onlist of stringwatched_not_onlist of stringpathstring or nullpath_uhdstring or nulluhd_in_standardbooleanResponse shape
{
"media_type": "movie | tv",
"tmdb_id": "number",
"tvdb_id": "number | null",
"title": "string",
"original_title": "string | null",
"overview": "string",
"poster_url": "string | null",
"backdrop_url": "string | null",
"release_date": "string | null",
"vote_average": "number",
"vote_count": "number",
"genres": [
"string"
],
"runtime_minutes": "number | null",
"certification": "string | null"
}
GET
/api/v1/notifications/unread/count
promised
Number of unread notifications
Unread notifications for the calling account.
POST
/api/v1/requests
promised
Request a title
Ask for a title to be added. The request goes through exactly the same checks as one made in the browser: quota, blocklist and approval all apply to the account the token belongs to. A request that needs approval comes back as pending, not as an error.
Fields and shape
Request body
media_typemovie | tv requiredtierstandard | uhdtmdb_idnumber requiredquality_profile_idnumber or nullroot_folder_pathstring or nullmonitor_futurebooleanseasonnumber or nullfrom_watchlistbooleanResponse
idnumber requiredmedia_typemovie | tv requiredtierstandard | uhd requiredtmdb_idnumber requiredtitlestring requiredposter_pathstring or null requiredrelease_datestring or null requiredstatuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred requiredquality_profile_idnumber or null requiredroot_folder_pathstring or null requiredseasonnumber or null requiredfrom_watchlistboolean requiredrequested_attimestamp (ISO 8601) requiredapproved_attimestamp (ISO 8601) or null requiredcompleted_attimestamp (ISO 8601) or null requiredapproved_by_namestring or nulllast_checked_attimestamp (ISO 8601) or nullrejection_reasonstring or null requirederror_messagestring or null requiredratingnumber or null requiredfeedbackstring or null requiredrated_attimestamp (ISO 8601) or null requiredrating_outdatedbooleanfeedback_replystring or null requiredreplied_attimestamp (ISO 8601) or null requiredResponse shape
{
"id": "number",
"media_type": "movie | tv",
"tier": "standard | uhd",
"tmdb_id": "number",
"title": "string",
"poster_path": "string | null",
"release_date": "string | null",
"status": "pending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred",
"quality_profile_id": "number | null",
"root_folder_path": "string | null",
"season": "number | null",
"from_watchlist": "boolean",
"requested_at": "ISO 8601",
"approved_at": "ISO 8601 | null"
}
GET
/api/v1/requests/mine
promised
Your own requests
Every request made by the calling account, newest first, with its current state.
Fields and shape
Response
idnumber requiredmedia_typemovie | tv requiredtierstandard | uhd requiredtmdb_idnumber requiredtitlestring requiredposter_pathstring or null requiredrelease_datestring or null requiredstatuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred requiredquality_profile_idnumber or null requiredroot_folder_pathstring or null requiredseasonnumber or null requiredfrom_watchlistboolean requiredrequested_attimestamp (ISO 8601) requiredapproved_attimestamp (ISO 8601) or null requiredcompleted_attimestamp (ISO 8601) or null requiredapproved_by_namestring or nulllast_checked_attimestamp (ISO 8601) or nullrejection_reasonstring or null requirederror_messagestring or null requiredratingnumber or null requiredfeedbackstring or null requiredrated_attimestamp (ISO 8601) or null requiredrating_outdatedbooleanfeedback_replystring or null requiredreplied_attimestamp (ISO 8601) or null requiredResponse shape
[
{
"id": "number",
"media_type": "movie | tv",
"tier": "standard | uhd",
"tmdb_id": "number",
"title": "string",
"poster_path": "string | null",
"release_date": "string | null",
"status": "pending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred",
"quality_profile_id": "number | null",
"root_folder_path": "string | null",
"season": "number | null",
"from_watchlist": "boolean",
"requested_at": "ISO 8601",
"approved_at": "ISO 8601 | null"
}
]
GET
/api/v1/requests/quota
promised
How much you may still request
What the calling account has used in the current period and what is left. An account without a limit reports no ceiling rather than a very large one.
Fields and shape
Response
movieQuotaInfo requiredtvQuotaInfo requiredauto_approveboolean requiredResponse shape
{
"movie": {
"limit": "number | null",
"used": "number",
"remaining": "number | null",
"unlimited": "boolean",
"exhausted": "boolean",
"period": "day | week | month",
"resets_at": "ISO 8601 | null"
},
"tv": {
"limit": "number | null",
"used": "number",
"remaining": "number | null",
"unlimited": "boolean",
"exhausted": "boolean",
"period": "day | week | month",
"resets_at": "ISO 8601 | null"
},
"auto_approve": "boolean"
}
POST
/api/v1/requests/{request_id}/cancel
promised
Cancel your own request
Withdraw a request you made yourself. Only works while it is still open - once something has been downloaded there is nothing left to cancel.
Fields and shape
Parameters
request_idnumber path requiredResponse
idnumber requiredmedia_typemovie | tv requiredtierstandard | uhd requiredtmdb_idnumber requiredtitlestring requiredposter_pathstring or null requiredrelease_datestring or null requiredstatuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred requiredquality_profile_idnumber or null requiredroot_folder_pathstring or null requiredseasonnumber or null requiredfrom_watchlistboolean requiredrequested_attimestamp (ISO 8601) requiredapproved_attimestamp (ISO 8601) or null requiredcompleted_attimestamp (ISO 8601) or null requiredapproved_by_namestring or nulllast_checked_attimestamp (ISO 8601) or nullrejection_reasonstring or null requirederror_messagestring or null requiredratingnumber or null requiredfeedbackstring or null requiredrated_attimestamp (ISO 8601) or null requiredrating_outdatedbooleanfeedback_replystring or null requiredreplied_attimestamp (ISO 8601) or null requiredResponse shape
{
"id": "number",
"media_type": "movie | tv",
"tier": "standard | uhd",
"tmdb_id": "number",
"title": "string",
"poster_path": "string | null",
"release_date": "string | null",
"status": "pending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred",
"quality_profile_id": "number | null",
"root_folder_path": "string | null",
"season": "number | null",
"from_watchlist": "boolean",
"requested_at": "ISO 8601",
"approved_at": "ISO 8601 | null"
}
GET
/api/v1/search/{media_type}
promised
Search movies or shows
Find titles by name. media_type is movie or tv. Results are paged and come from TMDB in the language of the calling account.
Fields and shape
Parameters
media_typemovie | tv path requiredqstring query requiredpagenumber queryResponse
pagenumber requiredtotal_pagesnumber requiredtotal_resultsnumber requireditemslist of MediaItem requireddemobooleanarr_warningstring or nullResponse shape
{
"page": "number",
"total_pages": "number",
"total_results": "number",
"items": [
{
"media_type": "movie | tv",
"tmdb_id": "number",
"tvdb_id": "number | null",
"title": "string",
"original_title": "string | null",
"overview": "string",
"poster_url": "string | null",
"backdrop_url": "string | null",
"release_date": "string | null",
"vote_average": "number",
"vote_count": "number",
"genres": [
"string"
],
"runtime_minutes": "number | null",
"certification": "string | null"
}
],
"demo": "boolean",
"arr_warning": "string | null"
}
GET
/api/v1/storage/me
promised
Your own storage use
How much space the titles attributed to the calling account take up, and against which allowance.
Fields and shape
Parameters
qstring querypagenumber querygesehenboolean queryResponse
used_bytesnumber requireditemsnumber requiredlimit_bytesnumber or nullpending_bytesnumber requiredwatched_availablebooleanmatchesnumberper_pagenumberentrieslist of StoragePosten requiredResponse shape
{
"used_bytes": "number",
"items": "number",
"limit_bytes": "number | null",
"pending_bytes": "number",
"watched_available": "boolean",
"matches": "number",
"per_page": "number",
"entries": [
{
"id": "number",
"media_type": "string",
"tier": "string",
"tmdb_id": "number | null",
"tvdb_id": "number | null",
"season": "number | null",
"title": "string",
"size_bytes": "number",
"state": "string",
"measured_at": "ISO 8601",
"path": "string",
"released_at": "ISO 8601 | null",
"release_wish": "string | null",
"watched": "boolean | null"
}
]
}
GET
/api/v1/tickets/open-count
promised
Number of open tickets
How many tickets are still open. A plain number, meant for a dashboard.