Zum Inhalt springen
Die Zusage

Zugesagt (v1)

Diese neunzehn Adressen sind ein Versprechen: Solange v1 in der Adresse steht, verschwindet aus ihren Antworten nichts. Muss doch etwas brechen, entsteht /api/v2 daneben, und v1 läuft weiter. Jede Adresse zeigt aufgeklappt ihre Felder und ein Beispiel.

19 Adressen

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.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
repo_urlText Pflicht
release_urlText Pflicht
licenseText
update_checkedja/nein
latest_versionText oder null
update_availableja/nein
checked_atZeitpunkt (ISO 8601) oder null

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
befundeKachelBefunde Pflicht
anfragenKachelAnfragen Pflicht
bibliothekKachelBibliothek Pflicht
instanzenListe von KachelInstanz Pflicht
tickets_offenZahl Pflicht
beschaffungText

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Antwort

FeldArt
request_idZahl Pflicht
media_typemovie | tv Pflicht
tmdb_idZahl Pflicht
titleText Pflicht
overviewText
poster_urlText oder null
backdrop_urlText oder null
release_dateText oder null
vote_averageZahl
runtime_minutesZahl oder null
genresListe von Text
completed_atZeitpunkt (ISO 8601) oder null
requested_byText Pflicht
requester_avatarText oder null
seasonsListe von Zahl

Aufbau der Antwort

[
  {
    "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.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
kontoMeinKonto Pflicht
schluesselMeinSchluessel oder null Pflicht
darfListe von Text Pflicht

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Antwort

FeldArt
eingerichtetja/nein Pflicht
bestaetigtja/nein
urlText oder null
nameText oder null
languageText oder null
letzter_fehlerText oder null

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Anfragekörper

FeldArt
codeText Pflicht

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Anfragekörper

FeldArt
urlText Pflicht
nameText
languageText

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Parameter

media_typemovie | tv path Pflicht
tmdb_idZahl path Pflicht

Antwort

FeldArt
media_typemovie | tv Pflicht
tmdb_idZahl Pflicht
tvdb_idZahl oder null
titleText Pflicht
original_titleText oder null
overviewText
poster_urlText oder null
backdrop_urlText oder null
release_dateText oder null
vote_averageZahl
vote_countZahl
genresListe von Text
genre_idsListe von Zahl
runtime_minutesZahl oder null
certificationText oder null
original_languageText oder null
origin_countryListe von Text
seasonsListe von SeasonInfo
statusText
status_uhdText oder null
fassungenListe von FassungAchse
watchedja/nein
watched_onListe von Text
watched_not_onListe von Text
pathText oder null
path_uhdText oder null
uhd_in_standardja/nein

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Anfragekörper

FeldArt
media_typemovie | tv Pflicht
fassungText oder null
tierstandard | uhd
tmdb_idZahl Pflicht
quality_profile_idZahl oder null
root_folder_pathText oder null
monitor_futureja/nein
tvdb_idZahl oder null
seasonZahl oder null
episodesListe von Zahl oder null
from_watchlistja/nein

Antwort

FeldArt
idZahl Pflicht
media_typemovie | tv Pflicht
fassungText oder null Pflicht
tierstandard | uhd Pflicht
tmdb_idZahl Pflicht
titleText Pflicht
poster_pathText oder null Pflicht
release_dateText oder null Pflicht
statuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred Pflicht
quality_profile_idZahl oder null Pflicht
quality_profile_uhdja/nein
root_folder_pathText oder null Pflicht
seasonZahl oder null Pflicht
episodesListe von Zahl oder null
from_watchlistja/nein Pflicht
arr_linkedja/nein
requested_atZeitpunkt (ISO 8601) Pflicht
approved_atZeitpunkt (ISO 8601) oder null Pflicht
completed_atZeitpunkt (ISO 8601) oder null Pflicht
approved_by_nameText oder null
last_checked_atZeitpunkt (ISO 8601) oder null
laedt_fortschrittZahl oder null
laedt_seitZeitpunkt (ISO 8601) oder null
rejection_reasonText oder null Pflicht
regel_nameText oder null
darf_trotzdem_fragenja/nein
trotzdem_gefragtja/nein
error_messageText oder null Pflicht
error_detailObjekt oder null
ratingZahl oder null Pflicht
feedbackText oder null Pflicht
rated_atZeitpunkt (ISO 8601) oder null Pflicht
rating_outdatedja/nein
feedback_replyText oder null Pflicht
replied_atZeitpunkt (ISO 8601) oder null Pflicht

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Antwort

FeldArt
idZahl Pflicht
media_typemovie | tv Pflicht
fassungText oder null Pflicht
tierstandard | uhd Pflicht
tmdb_idZahl Pflicht
titleText Pflicht
poster_pathText oder null Pflicht
release_dateText oder null Pflicht
statuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred Pflicht
quality_profile_idZahl oder null Pflicht
quality_profile_uhdja/nein
root_folder_pathText oder null Pflicht
seasonZahl oder null Pflicht
episodesListe von Zahl oder null
from_watchlistja/nein Pflicht
arr_linkedja/nein
requested_atZeitpunkt (ISO 8601) Pflicht
approved_atZeitpunkt (ISO 8601) oder null Pflicht
completed_atZeitpunkt (ISO 8601) oder null Pflicht
approved_by_nameText oder null
last_checked_atZeitpunkt (ISO 8601) oder null
laedt_fortschrittZahl oder null
laedt_seitZeitpunkt (ISO 8601) oder null
rejection_reasonText oder null Pflicht
regel_nameText oder null
darf_trotzdem_fragenja/nein
trotzdem_gefragtja/nein
error_messageText oder null Pflicht
error_detailObjekt oder null
ratingZahl oder null Pflicht
feedbackText oder null Pflicht
rated_atZeitpunkt (ISO 8601) oder null Pflicht
rating_outdatedja/nein
feedback_replyText oder null Pflicht
replied_atZeitpunkt (ISO 8601) oder null Pflicht

Aufbau der Antwort

[
  {
    "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.

Felder und Aufbau

Antwort

FeldArt
movieQuotaInfo Pflicht
tvQuotaInfo Pflicht
auto_approveja/nein Pflicht

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Parameter

request_idZahl path Pflicht

Antwort

FeldArt
idZahl Pflicht
media_typemovie | tv Pflicht
fassungText oder null Pflicht
tierstandard | uhd Pflicht
tmdb_idZahl Pflicht
titleText Pflicht
poster_pathText oder null Pflicht
release_dateText oder null Pflicht
statuspending_approval | approved | searching | downloaded | rejected | failed | cancelled | deleted | deferred Pflicht
quality_profile_idZahl oder null Pflicht
quality_profile_uhdja/nein
root_folder_pathText oder null Pflicht
seasonZahl oder null Pflicht
episodesListe von Zahl oder null
from_watchlistja/nein Pflicht
arr_linkedja/nein
requested_atZeitpunkt (ISO 8601) Pflicht
approved_atZeitpunkt (ISO 8601) oder null Pflicht
completed_atZeitpunkt (ISO 8601) oder null Pflicht
approved_by_nameText oder null
last_checked_atZeitpunkt (ISO 8601) oder null
laedt_fortschrittZahl oder null
laedt_seitZeitpunkt (ISO 8601) oder null
rejection_reasonText oder null Pflicht
regel_nameText oder null
darf_trotzdem_fragenja/nein
trotzdem_gefragtja/nein
error_messageText oder null Pflicht
error_detailObjekt oder null
ratingZahl oder null Pflicht
feedbackText oder null Pflicht
rated_atZeitpunkt (ISO 8601) oder null Pflicht
rating_outdatedja/nein
feedback_replyText oder null Pflicht
replied_atZeitpunkt (ISO 8601) oder null Pflicht

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Parameter

media_typemovie | tv path Pflicht
qText query Pflicht
pageZahl query

Antwort

FeldArt
pageZahl Pflicht
total_pagesZahl Pflicht
total_resultsZahl Pflicht
itemsListe von MediaItem Pflicht
demoja/nein
arr_warningText oder null

Aufbau der Antwort

{
  "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.

Felder und Aufbau

Parameter

qText query
pageZahl query
gesehenja/nein query

Antwort

FeldArt
used_bytesZahl Pflicht
itemsZahl Pflicht
limit_bytesZahl oder null
pending_bytesZahl Pflicht
zurechenbarja/nein
watched_availableja/nein
matchesZahl
per_pageZahl
entriesListe von StoragePosten Pflicht

Aufbau der Antwort

{
  "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.