Skip to content
The promise

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.

19 addresses

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

FieldType
versionstring required
repo_urlstring required
release_urlstring required
licensestring
update_checkedboolean
latest_versionstring or null
update_availableboolean
checked_attimestamp (ISO 8601) or null

Response 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

FieldType
versionstring required
befundeKachelBefunde required
anfragenKachelAnfragen required
bibliothekKachelBibliothek required
instanzenlist of KachelInstanz required
tickets_offennumber required
beschaffungstring

Response 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

FieldType
request_idnumber required
media_typemovie | tv required
tmdb_idnumber required
titlestring required
overviewstring
poster_urlstring or null
backdrop_urlstring or null
release_datestring or null
vote_averagenumber
runtime_minutesnumber or null
genreslist of string
completed_attimestamp (ISO 8601) or null
requested_bystring required
requester_avatarstring or null
seasonslist of number

Response 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

FieldType
versionstring required
kontoMeinKonto required
schluesselMeinSchluessel or null required
darflist of string required

Response 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

FieldType
eingerichtetboolean required
bestaetigtboolean
urlstring or null
namestring or null
languagestring or null
letzter_fehlerstring or null

Response 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

FieldType
codestring required

Response

FieldType
okboolean required
messagestring required

Response 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

FieldType
urlstring required
namestring
languagestring

Response

FieldType
okboolean required
messagestring required

Response 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 required
tmdb_idnumber path required

Response

FieldType
media_typemovie | tv required
tmdb_idnumber required
tvdb_idnumber or null
titlestring required
original_titlestring or null
overviewstring
poster_urlstring or null
backdrop_urlstring or null
release_datestring or null
vote_averagenumber
vote_countnumber
genreslist of string
genre_idslist of number
runtime_minutesnumber or null
certificationstring or null
original_languagestring or null
origin_countrylist of string
seasonslist of SeasonInfo
statusstring
status_uhdstring or null
fassungenlist of FassungAchse
watchedboolean
watched_onlist of string
watched_not_onlist of string
pathstring or null
path_uhdstring or null
uhd_in_standardboolean

Response 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

FieldType
media_typemovie | tv required
fassungstring or null
tierstandard | uhd
tmdb_idnumber required
quality_profile_idnumber or null
root_folder_pathstring or null
monitor_futureboolean
tvdb_idnumber or null
seasonnumber or null
episodeslist of number or null
from_watchlistboolean

Response

FieldType
idnumber required
media_typemovie | tv required
fassungstring or null required
tierstandard | uhd required
tmdb_idnumber required
titlestring required
poster_pathstring or null required
release_datestring or null required
statuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred required
quality_profile_idnumber or null required
quality_profile_uhdboolean
root_folder_pathstring or null required
seasonnumber or null required
episodeslist of number or null
from_watchlistboolean required
arr_linkedboolean
requested_attimestamp (ISO 8601) required
approved_attimestamp (ISO 8601) or null required
completed_attimestamp (ISO 8601) or null required
approved_by_namestring or null
last_checked_attimestamp (ISO 8601) or null
laedt_fortschrittnumber or null
laedt_seittimestamp (ISO 8601) or null
rejection_reasonstring or null required
regel_namestring or null
darf_trotzdem_fragenboolean
trotzdem_gefragtboolean
error_messagestring or null required
error_detailobject or null
ratingnumber or null required
feedbackstring or null required
rated_attimestamp (ISO 8601) or null required
rating_outdatedboolean
feedback_replystring or null required
replied_attimestamp (ISO 8601) or null required

Response 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

FieldType
idnumber required
media_typemovie | tv required
fassungstring or null required
tierstandard | uhd required
tmdb_idnumber required
titlestring required
poster_pathstring or null required
release_datestring or null required
statuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred required
quality_profile_idnumber or null required
quality_profile_uhdboolean
root_folder_pathstring or null required
seasonnumber or null required
episodeslist of number or null
from_watchlistboolean required
arr_linkedboolean
requested_attimestamp (ISO 8601) required
approved_attimestamp (ISO 8601) or null required
completed_attimestamp (ISO 8601) or null required
approved_by_namestring or null
last_checked_attimestamp (ISO 8601) or null
laedt_fortschrittnumber or null
laedt_seittimestamp (ISO 8601) or null
rejection_reasonstring or null required
regel_namestring or null
darf_trotzdem_fragenboolean
trotzdem_gefragtboolean
error_messagestring or null required
error_detailobject or null
ratingnumber or null required
feedbackstring or null required
rated_attimestamp (ISO 8601) or null required
rating_outdatedboolean
feedback_replystring or null required
replied_attimestamp (ISO 8601) or null required

Response 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

FieldType
movieQuotaInfo required
tvQuotaInfo required
auto_approveboolean required

Response 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 required

Response

FieldType
idnumber required
media_typemovie | tv required
fassungstring or null required
tierstandard | uhd required
tmdb_idnumber required
titlestring required
poster_pathstring or null required
release_datestring or null required
statuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred required
quality_profile_idnumber or null required
quality_profile_uhdboolean
root_folder_pathstring or null required
seasonnumber or null required
episodeslist of number or null
from_watchlistboolean required
arr_linkedboolean
requested_attimestamp (ISO 8601) required
approved_attimestamp (ISO 8601) or null required
completed_attimestamp (ISO 8601) or null required
approved_by_namestring or null
last_checked_attimestamp (ISO 8601) or null
laedt_fortschrittnumber or null
laedt_seittimestamp (ISO 8601) or null
rejection_reasonstring or null required
regel_namestring or null
darf_trotzdem_fragenboolean
trotzdem_gefragtboolean
error_messagestring or null required
error_detailobject or null
ratingnumber or null required
feedbackstring or null required
rated_attimestamp (ISO 8601) or null required
rating_outdatedboolean
feedback_replystring or null required
replied_attimestamp (ISO 8601) or null required

Response 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 required
qstring query required
pagenumber query

Response

FieldType
pagenumber required
total_pagesnumber required
total_resultsnumber required
itemslist of MediaItem required
demoboolean
arr_warningstring or null

Response 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 query
pagenumber query
gesehenboolean query

Response

FieldType
used_bytesnumber required
itemsnumber required
limit_bytesnumber or null
pending_bytesnumber required
zurechenbarboolean
watched_availableboolean
matchesnumber
per_pagenumber
entrieslist of StoragePosten required

Response 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.