Promised (v1)
These nineteen 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/dashboard
promised
One tile for your home dashboard
Everything a dashboard tile needs, in a single call: how many findings are open, what is waiting, how full the library is and whether the instances are answering.
Findings come as identifiers, not sentences. dringendste holds up to three stable keys such as dienst.nicht_erreichbar. A ready-made sentence would be in the server's language, and it would change whenever somebody improves a wording - which under a promise it never could.
⚠️ This needs a token belonging to an administrator. Instance state and disk figures are an operator's business, and a token inherits the rights of its owner. Mark it read only and it is limited to GET - but an administrator's read-only token can still read the user list, the log and the settings. Worth knowing before you pin it to a screen somebody else can see.
Fields and shape
Response
versionstring requiredbefundeKachelBefunde requiredanfragenKachelAnfragen requiredbibliothekKachelBibliothek requiredinstanzenlist of KachelInstanz requiredtickets_offennumber requiredbeschaffungstringResponse shape
{
"version": "string",
"befunde": {
"fehler": "number",
"warnung": "number",
"hinweis": "number",
"dringendste": [
"string"
]
},
"anfragen": {
"wartend": "number",
"laufend": "number",
"fehlgeschlagen_7d": "number"
},
"bibliothek": {
"filme": "number",
"serien": "number",
"belegt_bytes": "number",
"frei_bytes": "number",
"hausbestand_bytes": "number"
},
"instanzen": [
{
"name": "string",
"erreichbar": "boolean",
"probleme": "number"
}
],
"tickets_offen": "number",
"beschaffung": "string"
}
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/me
promised
Who am I and what may I do
The first call an integration should make. What Nexview hands out depends on the key: an account without administrative rights sees no instances and decides nothing, and a key marked read only changes nothing at all.
darf folds both together and lists what this request is allowed to do, as stable identifiers:
- lesen - read whatever the account can see
- anfragen - create requests
- entscheiden - approve, reject or defer other people's requests
- verwalten - read operator data: instances, users, the dashboard tile
- einrichten - change settings and notification targets
Build against these, not against role. A read-only administrator token has role: admin and still cannot approve anything.
schluessel is null when the call came from a signed-in browser session instead of a personal access key.
Fields and shape
Response
versionstring requiredkontoMeinKonto requiredschluesselMeinSchluessel or null requireddarflist of string requiredResponse shape
{
"version": "string",
"konto": {
"id": "number",
"username": "string",
"name": "string",
"role": "string",
"betreiber": "boolean"
},
"schluessel": {
"name": "string",
"nur_lesen": "boolean"
},
"darf": [
"string"
]
}
DELETE
/api/v1/me/push
promised
Stop calling back
Removes the callback address of this key. Nexview keeps sending the same information, but only when the integration asks for it.
GET
/api/v1/me/push
promised
Is Nexview able to notify this integration
Whether a callback address is registered for this key, and whether it has been confirmed. An unconfirmed target receives nothing.
Fields and shape
Response
eingerichtetboolean requiredbestaetigtbooleanurlstring or nullnamestring or nulllanguagestring or nullletzter_fehlerstring or nullResponse shape
{
"eingerichtet": "boolean",
"bestaetigt": "boolean",
"url": "string | null",
"name": "string | null",
"language": "string | null",
"letzter_fehler": "string | null"
}
POST
/api/v1/me/push
promised
Confirm the callback address
Hands back the four-digit code from the test message. Only after this does Nexview send anything to the address.
Fields and shape
Request body
codestring requiredResponse
okboolean requiredmessagestring requiredResponse shape
{
"ok": "boolean",
"message": "string"
}
PUT
/api/v1/me/push
promised
Register where Nexview should call back
Registers a webhook address for this key and immediately sends a test message to it. That message carries a four-digit code in its own field; hand it back with POST /api/v1/me/push to switch the target on.
One target per key. Calling this again replaces the previous address instead of adding a second one, so an integration can be set up twice without leaving a dead address behind.
A key marked read only may use this address. It is the one exception to that rule: what it registers concerns nobody but its own owner, and the alternative would be to make people use a more powerful key.
Fields and shape
Request body
urlstring requirednamestringlanguagestringResponse
okboolean requiredmessagestring requiredResponse shape
{
"ok": "boolean",
"message": "string"
}
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 stringgenre_idslist of numberruntime_minutesnumber or nullcertificationstring or nulloriginal_languagestring or nullorigin_countrylist of stringseasonslist of SeasonInfostatusstringstatus_uhdstring or nullfassungenlist of FassungAchsewatchedbooleanwatched_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"
],
"genre_ids": [
"number"
],
"runtime_minutes": "number | 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 requiredfassungstring or nulltierstandard | uhdtmdb_idnumber requiredquality_profile_idnumber or nullroot_folder_pathstring or nullmonitor_futurebooleantvdb_idnumber or nullseasonnumber or nullepisodeslist of number or nullfrom_watchlistbooleanResponse
idnumber requiredmedia_typemovie | tv requiredfassungstring or null 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 requiredquality_profile_uhdbooleanroot_folder_pathstring or null requiredseasonnumber or null requiredepisodeslist of number or nullfrom_watchlistboolean requiredarr_linkedbooleanrequested_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 nulllaedt_fortschrittnumber or nulllaedt_seittimestamp (ISO 8601) or nullrejection_reasonstring or null requiredregel_namestring or nulldarf_trotzdem_fragenbooleantrotzdem_gefragtbooleanerror_messagestring or null requirederror_detailobject or nullratingnumber 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",
"fassung": "string | null",
"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",
"quality_profile_uhd": "boolean",
"root_folder_path": "string | null",
"season": "number | null",
"episodes": [
"number"
]
}
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 requiredfassungstring or null 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 requiredquality_profile_uhdbooleanroot_folder_pathstring or null requiredseasonnumber or null requiredepisodeslist of number or nullfrom_watchlistboolean requiredarr_linkedbooleanrequested_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 nulllaedt_fortschrittnumber or nulllaedt_seittimestamp (ISO 8601) or nullrejection_reasonstring or null requiredregel_namestring or nulldarf_trotzdem_fragenbooleantrotzdem_gefragtbooleanerror_messagestring or null requirederror_detailobject or nullratingnumber 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",
"fassung": "string | null",
"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",
"quality_profile_uhd": "boolean",
"root_folder_path": "string | null",
"season": "number | null",
"episodes": [
"number"
]
}
]
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 requiredfassungstring or null 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 requiredquality_profile_uhdbooleanroot_folder_pathstring or null requiredseasonnumber or null requiredepisodeslist of number or nullfrom_watchlistboolean requiredarr_linkedbooleanrequested_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 nulllaedt_fortschrittnumber or nulllaedt_seittimestamp (ISO 8601) or nullrejection_reasonstring or null requiredregel_namestring or nulldarf_trotzdem_fragenbooleantrotzdem_gefragtbooleanerror_messagestring or null requirederror_detailobject or nullratingnumber 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",
"fassung": "string | null",
"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",
"quality_profile_uhd": "boolean",
"root_folder_path": "string | null",
"season": "number | null",
"episodes": [
"number"
]
}
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"
],
"genre_ids": [
"number"
],
"runtime_minutes": "number | 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 requiredzurechenbarbooleanwatched_availablebooleanmatchesnumberper_pagenumberentrieslist of StoragePosten requiredResponse shape
{
"used_bytes": "number",
"items": "number",
"limit_bytes": "number | null",
"pending_bytes": "number",
"zurechenbar": "boolean",
"watched_available": "boolean",
"matches": "number",
"per_page": "number",
"entries": [
{
"id": "number",
"media_type": "string",
"fassung": "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"
}
]
}
GET
/api/v1/tickets/open-count
promised
Number of open tickets
How many tickets are still open. A plain number, meant for a dashboard.