Zum Inhalt springen
Bereich

Betrieb

94 Adressen. Ohne Zusage — sie gehören zum Innenteil der Anwendung und können sich mit jeder Fassung ändern. Wer sich auf etwas verlassen muss, nimmt die zugesagten neunzehn.

94 Adressen

GET /api/about may change

Version and build

Which version of Nexview this is, and whether a newer one is known. 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"
}

POST /api/about/check may change

Check for updates now

Looks for a newer release immediately instead of waiting for the daily check.

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/about/neuigkeiten may change

Is there something new to read

Whether this installation has been updated since the administrator last acknowledged the release notes, and to which version.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
offenja/nein Pflicht
zuletzt_gesehenText oder null

Aufbau der Antwort

{
  "version": "string",
  "offen": "boolean",
  "zuletzt_gesehen": "string | null"
}

POST /api/about/neuigkeiten/gesehen may change

Acknowledge the release notes

"Understood, stop showing this" - until the next update. What is stored is the version, not a tick, so the banner comes back by itself after the next release that has something to say.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
offenja/nein Pflicht
zuletzt_gesehenText oder null

Aufbau der Antwort

{
  "version": "string",
  "offen": "boolean",
  "zuletzt_gesehen": "string | null"
}

GET /api/admin/analyse may change

Everything the analysis page shows

The numbers behind the Statistics & analysis page: every Radarr and Sonarr instance with its state, the disks, what the library holds, how the sources compare, and how Nexview itself is doing. One call rather than five, so switching between the tabs never reloads. Nothing is measured here - everything comes from what the background round has already collected, which is why the answer is immediate even on a large library. Administrators only.

Felder und Aufbau

Antwort

FeldArt
instanzenListe von InstanzZeile Pflicht
traegerListe von TraegerZeile Pflicht
verlauf_tageZahl Pflicht
bibliothekBibliothekZahlen Pflicht
abgleichAbgleichZahlen Pflicht
betriebBetriebZahlen Pflicht

Aufbau der Antwort

{
  "instanzen": [
    {
      "kennung": "string",
      "name": "string",
      "media_type": "string",
      "tier": "string",
      "erreichbar": "boolean",
      "erreichbar_seit": "ISO 8601 | null",
      "gemessen_am": "ISO 8601 | null",
      "version": "string",
      "neuere_version": "string | null",
      "warteschlange": "number | null",
      "warteschlange_haengt": "number | null",
      "luecken": "number | null",
      "luecken_einheit": "string | null",
      "meldungen": [
        {}
      ]
    }
  ],
  "traeger": [
    {
      "gesamt_bytes": "number",
      "frei_bytes": "number",
      "belegt_anteil": "number",
      "ordner": [
        "string"
      ]
    }
  ],
  "verlauf_tage": "number",
  "bibliothek": {
    "posten": "number",
    "medien_bytes": "number",
    "hausbestand_bytes": "number",
    "zugerechnet_bytes": "number",
    "geisterposten": "number",
    "geisterposten_bytes": "number"
  },
  "abgleich": {
    "moeglich": "boolean",
    "arr_ohne_server": "number",
    "server_ohne_arr": "number",
    "nicht_erkannt": "number",
    "doppelt": "number",
    "jahr_widerspruch": "number",
    "anbieter_luecke": "number",
    "je_anbieter": "object",
    "beispiele": "object"
  },
  "betrieb": {
    "sicherungen": "number",
    "sicherung_letzte": "string | null",
    "sicherung_takt": "string",
    "mail_offen": "number",
    "mail_aufgegeben": "number",
    "protokoll_fehler_24h": "number",
    "protokoll_stufe": "string",
    "version": "string",
    "neueste_version": "string | null"
  }
}

GET /api/admin/analyse/laufend may change

What is playing right now

Live sessions across every connected media server: who, what, on which device, how far in, and how hard the server is working for it. Transcoding has three states, not two, and the difference matters. Measured against real servers, both Plex and Emby reported a transcode while passing the video through untouched and only re-encoding the audio - that costs almost nothing. Only bild means the video itself is being re-encoded, and that is the one that eats CPU. This is the only call on the analysis page that contacts the providers live; everything else is read from what the background round already collected. Each provider gets its own short timeout, so one stalled server cannot hold up the rest. Administrators only.

Felder und Aufbau

Antwort

FeldArt
wiedergabenListe von app__routers__analyse__LaufendeZeile Pflicht
bild_umrechnungenZahl Pflicht

Aufbau der Antwort

{
  "wiedergaben": [
    {
      "provider": "string",
      "konto": "string",
      "user_id": "number | null",
      "avatar_url": "string | null",
      "titel": "string",
      "serie": "string",
      "media_type": "string",
      "fortschritt": "number | null",
      "geraet": "string",
      "anwendung": "string",
      "pausiert": "boolean",
      "umrechnung": "string",
      "grund": "string",
      "beschleunigung": "string"
    }
  ],
  "bild_umrechnungen": "number"
}

GET /api/admin/analyse/server-vergleich may change

Which title is on which media server

One row per title, one cell per connected media server: present, missing, listed under a different ID, or the file is there but the server identified it as another title. Titles are matched by TMDB, TVDB and IMDb, then by an ID in the file path, and titles without any ID by title and year. ansicht picks a view (unterschiede, andere_nummer, jahr, ohne_kennung, nur_arr, alle); fehlt_auf, art and suche narrow it, and suche also matches file paths. Paged. Reads only what the last library sync stored; no server is asked. Administrators only.

Felder und Aufbau

Parameter

ansichtunterschiede | andere_nummer | jahr | ohne_kennung | nur_arr | alle query
artalle | movie | tv query
fehlt_aufText oder null query
sucheText oder null query
seiteZahl query
pro_seiteZahl query

Antwort

FeldArt
moeglichja/nein Pflicht
serverListe von VergleichServer Pflicht
anzahlObjekt Pflicht
zeilenListe von VergleichZeile Pflicht
gesamtZahl Pflicht
seiteZahl Pflicht
seitenZahl Pflicht

Aufbau der Antwort

{
  "moeglich": "boolean",
  "server": [
    {
      "anbieter": "string",
      "filme": "number",
      "serien": "number",
      "fehlen": "number"
    }
  ],
  "anzahl": "object",
  "zeilen": [
    {
      "kennung": "string",
      "titel": "string",
      "jahr": "number | null",
      "art": "string",
      "zuordnung": "string",
      "zellen": "object",
      "jahr_uneinig": "boolean",
      "ohne_kennung": "boolean"
    }
  ],
  "gesamt": "number",
  "seite": "number",
  "seiten": "number"
}

GET /api/admin/analyse/server-vergleich/pfade may change

Look up where one title lies on disk

The file or folder paths of one library entry. Plex lists series without their folder, so this asks the server for that one title and remembers the answer until the next library sync. Administrators only.

Felder und Aufbau

Parameter

anbieterText query Pflicht
schluesselText query Pflicht

Antwort

FeldArt
pfadeListe von Text Pflicht

Aufbau der Antwort

{
  "pfade": [
    "string"
  ]
}

POST /api/admin/analyse/server-vergleich/zuordnen may change

Rematch one title on one media server

Changes metadata on the media server: the title is identified again by its TMDB or TVDB ID, the way Identify (Jellyfin, Emby) or Fix Match (Plex) does it. Never by name - a name search is how the wrong match usually came about. Afterwards Nexview asks the server twice whether the new match is there. ergebnis is korrigiert, zurueckgesprungen when the server replaced it again by itself, or nicht_bestaetigt when it did not show up in time. Only runs when an administrator clicks; nothing calls it on its own. Administrators only.

Felder und Aufbau

Anfragekörper

FeldArt
anbieterText Pflicht
schluesselText Pflicht
artmovie | tv Pflicht
tmdbZahl oder null
tvdbZahl oder null

Antwort

FeldArt
ergebnisText Pflicht
titelText oder null Pflicht
jahrZahl oder null Pflicht

Aufbau der Antwort

{
  "ergebnis": "string",
  "titel": "string | null",
  "jahr": "number | null"
}

GET /api/admin/analyse/wiedergabe may change

Who watched what, and how the library grew

Playback figures from the connected media servers, and how the collection has grown over the last eighteen months. This names people. Until 0.24 even an administrator saw only their own watch markers; the operator lifted that deliberately, because a tool meant to help run a household has to be able to say who pulls and who does not. Everything comes from data Nexview already holds - no media server is contacted for this call. Library growth uses the date the file carries, not the day Nexview first saw it; otherwise every grown installation would appear to have sprung into existence on setup day. Administrators only.

Felder und Aufbau

Antwort

FeldArt
monateListe von MonatsPunkt Pflicht
personenListe von SeherZeile Pflicht
beliebtesteListe von GesehenerTitel Pflicht
bestandListe von BestandsPunkt Pflicht
angesehenZahl Pflicht
bestand_gesamtZahl Pflicht
konten_mit_datenZahl Pflicht
spitzenListe von SpitzenTag Pflicht
spitze_gesamtZahl Pflicht

Aufbau der Antwort

{
  "monate": [
    {
      "monat": "string",
      "anzahl": "number"
    }
  ],
  "personen": [
    {
      "user_id": "number | null",
      "name": "string",
      "avatar_url": "string | null",
      "anzahl": "number",
      "zuletzt": "ISO 8601 | null"
    }
  ],
  "beliebteste": [
    {
      "tmdb_id": "number",
      "media_type": "string",
      "titel": "string",
      "anzahl": "number"
    }
  ],
  "bestand": [
    {
      "monat": "string",
      "posten": "number",
      "bytes": "number"
    }
  ],
  "angesehen": "number",
  "bestand_gesamt": "number",
  "konten_mit_daten": "number",
  "spitzen": [
    {
      "tag": "string",
      "gleichzeitig": "number",
      "bild_umrechnungen": "number"
    }
  ],
  "spitze_gesamt": "number"
}

GET /api/admin/befunde may change

Findings, optionally for one area

The same findings the dashboard shows, without the numbers around them. Pass bereich to narrow it down to one area: dienste, platz, nachschub, bibliothek or betrieb. An unknown area returns an empty list rather than an error - the names travel with the interface, and a typo in an address should not produce a broken page.

Felder und Aufbau

Parameter

bereichText oder null query

Antwort

FeldArt
schluesselText Pflicht
kennungText Pflicht
schwereText Pflicht
bereichText Pflicht
werteObjekt Pflicht
zielText oder null Pflicht
wortlautText oder null Pflicht

Aufbau der Antwort

[
  {
    "schluessel": "string",
    "kennung": "string",
    "schwere": "string",
    "bereich": "string",
    "werte": "object",
    "ziel": "string | null",
    "wortlaut": "string | null"
  }
]

GET /api/admin/dashboard may change

The operator dashboard in one call

Everything the operator dashboard shows: the open findings, how many there are of each severity, and the four numbers that are waiting for somebody. Findings and numbers are deliberately two different things. A number like "three requests awaiting approval" is everyday business, not a fault; as a finding it would be a permanent alarm and would devalue the real findings next to it. A finding is an exception and disappears once it is dealt with. Findings carry no ready-made sentence. Each one names an identifier (kennung) plus the values that belong in the text, so the caller can phrase it in the language of whoever is reading. wortlaut is the one exception: it holds what Radarr or Sonarr said, word for word and in English, because it is their statement and not ours. Administrators only. Instance health, disk state and backups are an operator's business, not an approver's.

Felder und Aufbau

Antwort

FeldArt
befundeListe von BefundPublic Pflicht
zaehlerObjekt Pflicht
ungesehenZahl
zahlenHandlungsZahlen Pflicht
verlaufListe von VerlaufsPunkt Pflicht
traegerDatentraeger oder null Pflicht

Aufbau der Antwort

{
  "befunde": [
    {
      "schluessel": "string",
      "kennung": "string",
      "schwere": "string",
      "bereich": "string",
      "werte": "object",
      "ziel": "string | null",
      "wortlaut": "string | null"
    }
  ],
  "zaehler": "object",
  "ungesehen": "number",
  "zahlen": {
    "freigaben_offen": "number",
    "laeuft": "number",
    "tickets_offen": "number",
    "rueckmeldungen_offen": "number"
  },
  "verlauf": [
    {
      "tag": "string",
      "belegt_bytes": "number",
      "frei_bytes": "number"
    }
  ],
  "traeger": {
    "gesamt_bytes": "number",
    "frei_bytes": "number",
    "medien_bytes": "number"
  }
}

POST /api/admin/dashboard/gesehen may change

Mark the findings as seen

Records everything that currently applies as seen by this administrator, which is what puts the badge on the menu back to zero. The findings themselves stay. They are states, not messages: "searching for over 14 days" is just as true tomorrow, and a finding disappears when the situation does, not when somebody reads it. Only the badge is cleared, so that it means "something new" again rather than sitting on the same digit for good. Call this when the dashboard is opened, not when it is polled. The menu asks GET /admin/dashboard once a minute for its badge; if merely asking counted as seen, the badge would clear before anyone had looked at it. A finding that bundles several cases comes back when it grows: the identifier stays the same whether one title is stuck or five, so the number of cases is remembered alongside it. Values that grow by themselves, such as "for X days", are deliberately ignored. What each administrator has seen is kept for them alone.

GET /api/admin/sicherungen may change

All backups

What backups exist, how big they are, when they were made, whether automatic or manual, and whether this version could restore each one.

Felder und Aufbau

Antwort

FeldArt
eintraegeListe von SicherungPublic Pflicht
versionText Pflicht
ordnerText Pflicht

Aufbau der Antwort

{
  "eintraege": [
    {
      "name": "string",
      "groesse": "number",
      "erstellt": "string",
      "art": "string",
      "kommentar": "string",
      "version": "string",
      "einspielbar": "boolean",
      "grund": "string"
    }
  ],
  "version": "string",
  "ordner": "string"
}

POST /api/admin/sicherungen may change

Make a backup now

Writes a fresh backup and marks it as manual. Caches are stripped - they are nine tenths of the database and Nexview fetches them again by itself.

Felder und Aufbau

Anfragekörper

FeldArt
kommentarText

Antwort

FeldArt
nameText Pflicht
groesseZahl Pflicht
erstelltText Pflicht
artText Pflicht
kommentarText Pflicht
versionText Pflicht
einspielbarja/nein Pflicht
grundText Pflicht

Aufbau der Antwort

{
  "name": "string",
  "groesse": "number",
  "erstellt": "string",
  "art": "string",
  "kommentar": "string",
  "version": "string",
  "einspielbar": "boolean",
  "grund": "string"
}

POST /api/admin/sicherungen/einspielen may change

Restore into the running installation

⚠️ Afterwards nobody is signed in any more, including whoever triggered it - the accounts in the backup may not be the ones from a minute ago. A safety copy of the current state is written first.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
erstelltText Pflicht
artText Pflicht
kommentarText Pflicht
einspielbarja/nein Pflicht
grundText Pflicht
schluessel_aus_umgebungja/nein Pflicht
schluessel_im_archivja/nein Pflicht

Aufbau der Antwort

{
  "version": "string",
  "erstellt": "string",
  "art": "string",
  "kommentar": "string",
  "einspielbar": "boolean",
  "grund": "string",
  "schluessel_aus_umgebung": "boolean",
  "schluessel_im_archiv": "boolean"
}

POST /api/admin/sicherungen/pruefen may change

Inspect a backup

Reports what is in it and whether this version can restore it. Nothing is replaced. A backup from a newer version is refused: the database can only be migrated forward.

Felder und Aufbau

Antwort

FeldArt
versionText Pflicht
erstelltText Pflicht
artText Pflicht
kommentarText Pflicht
einspielbarja/nein Pflicht
grundText Pflicht
schluessel_aus_umgebungja/nein Pflicht
schluessel_im_archivja/nein Pflicht

Aufbau der Antwort

{
  "version": "string",
  "erstellt": "string",
  "art": "string",
  "kommentar": "string",
  "einspielbar": "boolean",
  "grund": "string",
  "schluessel_aus_umgebung": "boolean",
  "schluessel_im_archiv": "boolean"
}

DELETE /api/admin/sicherungen/{name} may change

Delete a backup

⚠️ A delete button next to backups removes exactly what matters in an emergency, so callers are expected to ask first.

Felder und Aufbau

Parameter

nameText path Pflicht

POST /api/admin/sicherungen/{name}/archiv may change

Download a backup as an encrypted ZIP

⚠️ Deliberately POST and not GET: the password belongs in the body. In an address it would end up in the browser history and in every proxy log along the way. The archive is a plain AES ZIP - openable with 7-Zip, so nobody depends on Nexview to get at their own data.

Felder und Aufbau

Parameter

nameText path Pflicht

Anfragekörper

FeldArt
passwortText Pflicht

GET /api/admin/stats may change

Numbers for the dashboard

Counts for requests, downloads, quotas and ratings across the installation.

Felder und Aufbau

Antwort

FeldArt
totalsTotalsPublic Pflicht
usersListe von UserStatsPublic Pflicht
historyListe von MonthPoint Pflicht
most_requestedListe von PopularTitle Pflicht

Aufbau der Antwort

{
  "totals": {
    "requests": "number",
    "movies": "number",
    "series": "number",
    "downloaded": "number",
    "downloaded_movies": "number",
    "downloaded_series": "number",
    "pending": "number",
    "rejected": "number",
    "cancelled": "number",
    "failed": "number",
    "active_users": "number",
    "ratings": "number",
    "average_rating": "number | null",
    "poor_ratings": "number"
  },
  "users": [
    {
      "user_id": "number",
      "username": "string",
      "display_name": "string | null",
      "avatar_url": "string | null",
      "role": "string",
      "total": "number",
      "movies": "number",
      "series": "number",
      "downloaded": "number",
      "pending": "number",
      "rejected": "number",
      "cancelled": "number",
      "failed": "number",
      "ratings": "number"
    }
  ],
  "history": [
    {
      "month": "string",
      "movies": "number",
      "series": "number"
    }
  ],
  "most_requested": [
    {
      "media_type": "string",
      "tmdb_id": "number",
      "title": "string",
      "poster_path": "string | null",
      "count": "number"
    }
  ]
}

GET /api/admin/stats/aufraeumen may change

What nobody watches any more

Titles in the whole library that nobody has watched for a long time, largest first - including the house collection. Two clocks decide, not one: an item appears only if nobody watched it in the chosen period and it has been here at least that long. Without the second clock the 60 GiB file that arrived yesterday would top the list before anyone had a chance to watch it. Administrators only, unlike the rest of the statistics: acting on this list is an administrator's job anyway, and the rows name who last watched what.

Felder und Aufbau

Parameter

monateZahl query
grenzeZahl query
sucheText query
artmovie | tv oder null query
nur_vorgemerktja/nein query

Antwort

FeldArt
postenListe von AufraeumPosten Pflicht
gesamt_anzahlZahl Pflicht
gesamt_bytesZahl Pflicht
monateZahl Pflicht
grundlageAufraeumGrundlage Pflicht
ohne_datumZahl Pflicht
gesehen_ohne_datumZahl

Aufbau der Antwort

{
  "posten": [
    {
      "posten_id": "number",
      "media_type": "string",
      "tmdb_id": "number | null",
      "tvdb_id": "number | null",
      "season": "number | null",
      "fassung": "string",
      "title": "string",
      "size_bytes": "number",
      "state": "string",
      "besitzer": "string | null",
      "zuletzt_gesehen": "ISO 8601 | null",
      "gesehen_von": [
        "string"
      ],
      "bewertung": "number | null",
      "bewertungen": "number"
    }
  ],
  "gesamt_anzahl": "number",
  "gesamt_bytes": "number",
  "monate": "number",
  "grundlage": {
    "konten_gesamt": "number",
    "konten_verknuepft": "number",
    "ohne_verknuepfung": [
      "string"
    ],
    "vollstaendig": "boolean"
  },
  "ohne_datum": "number",
  "gesehen_ohne_datum": "number"
}

GET /api/beschaffung/papierkorb may change

What was deleted and can come back

One entry per file, newest first, with who deleted it and when. Two separate kinds of no: the file may be gone (or its disk out of sight), or the title may have left the library - either way it cannot be restored, and both are stated. Answers 409 where procurement keeps a recycle folder instead of a list, because nothing comes back out of a folder.

Felder und Aufbau

Antwort

FeldArt
eintraegeListe von PapierkorbZeile
sprungText

Aufbau der Antwort

{
  "eintraege": [
    {
      "eintrag_id": "number",
      "media_type": "string",
      "tmdb_id": "number | null",
      "name": "string | null",
      "jahr": "number | null",
      "fassung": "string | null",
      "staffel": "number | null",
      "folgen": [
        "number"
      ],
      "dateiname": "string",
      "size_bytes": "number",
      "geloescht_am": "string",
      "geloescht_von": "string",
      "geloescht_von_name": "string | null",
      "datei_da": "boolean"
    }
  ],
  "sprung": "string"
}

POST /api/beschaffung/papierkorb/{eintrag_id}/zurueckholen may change

Restore a deleted file

Hands the entry back to procurement, which puts the file where it belongs and picks the title up again. Whether that is still possible is decided over there, in the same call - a check beforehand would be a second state that ages between question and deed.

Felder und Aufbau

Parameter

eintrag_idZahl path Pflicht

Antwort

FeldArt
createdja/nein

Aufbau der Antwort

{
  "created": "boolean"
}

GET /api/beschaffung/warum/{media_type}/{tmdb_id} may change

Why a title has not arrived yet

One line per version: downloading, nothing found that fits the profile, not released yet, held back by a delay, and so on. Codes, never sentences - the interface builds the wording. ⚠️ The reason sits on the version, not on the title: a title can say 'nothing wanted' while one of its versions is being searched for. Radarr and Sonarr cannot answer this at all; then beantwortbar is false, which is not the same as 'nothing is wrong'.

Felder und Aufbau

Parameter

media_typemovie | tv path Pflicht
tmdb_idZahl path Pflicht

Antwort

FeldArt
beantwortbarja/nein Pflicht
bekanntja/nein
automatischja/nein
suchwunschja/nein
zuletzt_gesuchtText oder null
naechste_sucheText oder null
gruendeListe von GrundZeile

Aufbau der Antwort

{
  "beantwortbar": "boolean",
  "bekannt": "boolean",
  "automatisch": "boolean",
  "suchwunsch": "boolean",
  "zuletzt_gesucht": "string | null",
  "naechste_suche": "string | null",
  "gruende": [
    {
      "fassung": "string",
      "code": "string",
      "werte": "object",
      "darunter": [
        "string"
      ]
    }
  ]
}

GET /api/config may change

Public configuration

What the interface needs to know before anybody signs in: which media-server providers exist, whether watchlists are enabled, the minimum password length, the default region.

Felder und Aufbau

Antwort

FeldArt
default_regionText Pflicht
default_languageText Pflicht
tmdb_configuredja/nein Pflicht
beschaffungText Pflicht
beschaffung_kannObjekt
beschaffung_sprungObjekt
radarr_configuredja/nein Pflicht
sonarr_configuredja/nein Pflicht
using_demo_dataja/nein Pflicht
min_password_lengthZahl Pflicht
mail_configuredja/nein Pflicht
public_url_setja/nein Pflicht
approver_picks_target_movieja/nein Pflicht
approver_picks_target_tvja/nein Pflicht
approver_picks_target_movie_uhdja/nein Pflicht
approver_picks_target_tv_uhdja/nein Pflicht
fassungenListe von FassungOeffentlich Pflicht
radarr_uhd_configuredja/nein Pflicht
sonarr_uhd_configuredja/nein Pflicht
mediaserver_configuredja/nein Pflicht
mediaserver_providersListe von Text Pflicht
mediaserver_availableListe von Text Pflicht
mediaserver_password_loginListe von Text Pflicht
mediaserver_watchlist_availableListe von Text Pflicht
mediaserver_watchlist_connectedListe von Text Pflicht
watchlist_enabledja/nein Pflicht
episode_requests_enabledja/nein Pflicht
hausordnung_vorhandenja/nein
hausordnung_titelText
hausordnung_fassungZahl
hausordnung_quittierbarja/nein
hausordnung_gelesenZahl oder null

Aufbau der Antwort

{
  "default_region": "string",
  "default_language": "string",
  "tmdb_configured": "boolean",
  "beschaffung": "string",
  "beschaffung_kann": "object",
  "beschaffung_sprung": "object",
  "radarr_configured": "boolean",
  "sonarr_configured": "boolean",
  "using_demo_data": "boolean",
  "min_password_length": "number",
  "mail_configured": "boolean",
  "public_url_set": "boolean",
  "approver_picks_target_movie": "boolean",
  "approver_picks_target_tv": "boolean"
}

GET /api/config/regions may change

Selectable regions

The countries somebody can pick as their region. Deliberately fetched from TMDB rather than kept in the source: a fixed list goes stale and silently limits who can use this.

Felder und Aufbau

Antwort

FeldArt
codeText Pflicht
nameText Pflicht

Aufbau der Antwort

[
  {
    "code": "string",
    "name": "string"
  }
]

GET /api/hausordnung may change

Read the house rules

The operator's rule text, as an adult account sees it. Answers 404 while nothing is published - a draft belongs to the operator alone. "gelesen" carries the version this account has acknowledged, or null if it never has.

Felder und Aufbau

Antwort

FeldArt
titelText Pflicht
inhaltText Pflicht
fassungZahl Pflicht
quittierbarja/nein Pflicht
gelesenZahl oder null Pflicht
akzeptiertja/nein oder null Pflicht

Aufbau der Antwort

{
  "titel": "string",
  "inhalt": "string",
  "fassung": "number",
  "quittierbar": "boolean",
  "gelesen": "number | null",
  "akzeptiert": "boolean | null"
}

GET /api/hausordnung/bilder may change

List the images

Administrators only: every image stored for the house rules, oldest first.

Felder und Aufbau

Antwort

FeldArt
nameText Pflicht
bytesZahl Pflicht

Aufbau der Antwort

[
  {
    "name": "string",
    "bytes": "number"
  }
]

POST /api/hausordnung/bilder may change

Upload an image

Administrators only. The file is checked by its first bytes, not by its name or the content type the browser claims; SVG is refused because it can carry scripts. The stored name is random - the one supplied by the caller is never used.

Felder und Aufbau

Antwort

FeldArt
nameText Pflicht
bytesZahl Pflicht

Aufbau der Antwort

{
  "name": "string",
  "bytes": "number"
}

DELETE /api/hausordnung/bilder/{name} may change

Delete one image

Administrators only. Images are never removed automatically when they drop out of the text: taking a paragraph out for a moment should not cost you the image.

Felder und Aufbau

Parameter

nameText path Pflicht

POST /api/hausordnung/entscheidung may change

Accept or decline the house rules

Records the calling account's decision together with the version that is currently published - not the one that happened to be on screen. Declining has no technical consequence: the account keeps every right it had. It is information for the operator, who decides what to do with it. Refused with 409 if the operator has switched the decision off entirely.

Felder und Aufbau

Anfragekörper

FeldArt
akzeptiertja/nein

GET /api/hausordnung/uebersicht may change

Who has decided, and how

Administrators only: every adult account with its decision and the date. Child accounts are left out - they never get to see the rules. An account that decided on an older version counts as undecided again, but the answer still says what it chose back then.

Felder und Aufbau

Antwort

FeldArt
user_idZahl Pflicht
usernameText Pflicht
display_nameText oder null Pflicht
avatar_urlText oder null Pflicht
roleadmin | approver | user | child Pflicht
akzeptiertja/nein oder null Pflicht
entschieden_amZeitpunkt (ISO 8601) oder null Pflicht
fassungZahl oder null Pflicht

Aufbau der Antwort

[
  {
    "user_id": "number",
    "username": "string",
    "display_name": "string | null",
    "avatar_url": "string | null",
    "role": "admin | approver | user | child",
    "akzeptiert": "boolean | null",
    "entschieden_am": "ISO 8601 | null",
    "fassung": "number | null"
  }
]

DELETE /api/hausordnung/verwaltung may change

Remove the house rules

Deletes the text and every image with it. The button and the footer link disappear for everyone. Acknowledgements on the accounts stay; they cost nothing and would be outdated anyway.

GET /api/hausordnung/verwaltung may change

The house rules for editing

Administrators only. Unlike the public path this also returns an unpublished draft, plus how many accounts a "everyone reads it again" would affect.

Felder und Aufbau

Antwort

FeldArt
titelText Pflicht
inhaltText Pflicht
fassungZahl Pflicht
quittierbarja/nein Pflicht
veroeffentlichtja/nein Pflicht
aktualisiert_amZeitpunkt (ISO 8601) oder null Pflicht
betroffene_kontenZahl Pflicht

Aufbau der Antwort

{
  "titel": "string",
  "inhalt": "string",
  "fassung": "number",
  "quittierbar": "boolean",
  "veroeffentlicht": "boolean",
  "aktualisiert_am": "ISO 8601 | null",
  "betroffene_konten": "number"
}

PUT /api/hausordnung/verwaltung may change

Write the house rules

Saves title, text and both switches. The version number only goes up when "erneut_lesen" is set - a corrected typo must not make the notice pop up for everyone again. Publishing an empty text is refused.

Felder und Aufbau

Anfragekörper

FeldArt
titelText
inhaltText
quittierbarja/nein
veroeffentlichtja/nein
erneut_lesenja/nein

Antwort

FeldArt
titelText Pflicht
inhaltText Pflicht
fassungZahl Pflicht
quittierbarja/nein Pflicht
veroeffentlichtja/nein Pflicht
aktualisiert_amZeitpunkt (ISO 8601) oder null Pflicht
betroffene_kontenZahl Pflicht

Aufbau der Antwort

{
  "titel": "string",
  "inhalt": "string",
  "fassung": "number",
  "quittierbar": "boolean",
  "veroeffentlicht": "boolean",
  "aktualisiert_am": "ISO 8601 | null",
  "betroffene_konten": "number"
}

GET /api/health may change

Is Nexview running

Answers without a token - a monitor that has to sign in first is not a monitor. Returns nothing but a status, on purpose: no version, no database state, nothing that would tell an unauthenticated caller about the installation.

DELETE /api/logs may change

Clear the log

Empties the log file. What is gone is gone; there is no second copy.

GET /api/logs may change

The most recent log lines

level means "this level and above". Administrators only - log lines name accounts and addresses.

Felder und Aufbau

Parameter

levelDEBUG | INFO | WARNING | ERROR | CRITICAL oder null query
searchText oder null query
limitZahl query

Antwort

FeldArt
timeText Pflicht
levelText Pflicht
loggerText Pflicht
messageText Pflicht
request_idText oder null
userText oder null

Aufbau der Antwort

[
  {
    "time": "string",
    "level": "string",
    "logger": "string",
    "message": "string",
    "request_id": "string | null",
    "user": "string | null"
  }
]

GET /api/logs/level may change

Current log level

Which level is being written, and until when - the more talkative levels switch themselves off again.

Felder und Aufbau

Antwort

FeldArt
modeText Pflicht
untilText oder null
fixed_by_envja/nein
modesListe von Text
durationsListe von Zahl

Aufbau der Antwort

{
  "mode": "string",
  "until": "string | null",
  "fixed_by_env": "boolean",
  "modes": [
    "string"
  ],
  "durations": [
    "number"
  ]
}

PUT /api/logs/level may change

Change the log level

Takes effect immediately, without a restart. The talkative levels carry an expiry so a debugging session cannot quietly fill the disk for weeks.

Felder und Aufbau

Anfragekörper

FeldArt
modequiet | normal | detailed | trace Pflicht
minutesZahl

Antwort

FeldArt
modeText Pflicht
untilText oder null
fixed_by_envja/nein
modesListe von Text
durationsListe von Zahl

Aufbau der Antwort

{
  "mode": "string",
  "until": "string | null",
  "fixed_by_env": "boolean",
  "modes": [
    "string"
  ],
  "durations": [
    "number"
  ]
}

GET /api/settings may change

All settings

The whole configuration of this installation. Secrets come back masked, never in the clear. Administrators only.

PUT /api/settings may change

Change settings

⚠️ An empty secret field means "unchanged", not "delete". Otherwise the masked value from the interface would be written back over the real one. Use the delete endpoint to actually remove a key. Switching beschaffung from arr to nex is refused with 409 beschaffung_switch_needs_assistant as long as open requests, storage entries, rights, open invitations or rules still carry a Radarr or Sonarr version, or such a version was opened or closed for everyone against its default: only the switch assistant under /api/umstieg carries them over. Nothing from the request is saved then. Switching back from nex to arr is always allowed.

Felder und Aufbau

Parameter

confirm_addressja/nein query

Anfragekörper

FeldArt
tmdb_api_keyText oder null
radarr_urlText oder null
radarr_api_keyText oder null
sonarr_urlText oder null
sonarr_api_keyText oder null
radarr_nameText oder null
sonarr_nameText oder null
radarr_uhd_nameText oder null
sonarr_uhd_nameText oder null
default_regionText oder null
default_languageText oder null
poll_interval_secondsZahl oder null
demo_modeText oder null
beschaffungText oder null
nexcrate_urlText oder null
nexcrate_api_keyText oder null
nexcrate_nameText oder null
nexcrate_anzeigenameja/nein oder null
default_movie_profile_idText oder null
default_series_profile_idText oder null
movie_root_folder_modeText oder null
series_root_folder_modeText oder null
movie_profile_modeText oder null
series_profile_modeText oder null
movie_uhd_root_folder_modeText oder null
series_uhd_root_folder_modeText oder null
movie_uhd_profile_modeText oder null
series_uhd_profile_modeText oder null
default_movie_rootText oder null
default_series_rootText oder null
radarr_uhd_urlText oder null
radarr_uhd_api_keyText oder null
sonarr_uhd_urlText oder null
sonarr_uhd_api_keyText oder null
default_movie_uhd_profile_idText oder null
default_series_uhd_profile_idText oder null
default_movie_uhd_rootText oder null
default_series_uhd_rootText oder null
smtp_hostText oder null
smtp_portZahl oder null
smtp_securityText oder null
smtp_usernameText oder null
smtp_passwordText oder null
smtp_from_addressText oder null
smtp_from_nameText oder null
public_urlText oder null
webhook_basis_urlText oder null
update_checkja/nein oder null
password_loginja/nein oder null
backup_scheduleoff | daily | weekly | monthly oder null
backup_keepZahl oder null
mediaserver_auto_importja/nein oder null
mediaserver_default_roleText oder null
watchlist_enabledja/nein oder null
episode_requests_enabledja/nein oder null
quota_default_moviesZahl oder null
quota_default_seriesZahl oder null
storage_default_limit_gbZahl oder null
quota_periodday | week | month oder null

PUT /api/settings/fassungen may change

Open versions to everyone

Decides per version whether anyone may request it, or whether the right is handed out per account. A version that has no row yet cannot be opened - in nexcrate mode the rows appear when Nexview reads the versions.

Felder und Aufbau

Anfragekörper

FeldArt
kennungText Pflicht
offen_fuer_alleja/nein Pflicht

Antwort

FeldArt
kennungText Pflicht
media_typeText Pflicht
nameText Pflicht
klasseText oder null
quelleText Pflicht
hauptja/nein
bereitja/nein
offen_fuer_alleja/nein
approver_picks_targetja/nein
darf_anfragenja/nein
auto_freigabeja/nein

Aufbau der Antwort

[
  {
    "kennung": "string",
    "media_type": "string",
    "name": "string",
    "klasse": "string | null",
    "quelle": "string",
    "haupt": "boolean",
    "bereit": "boolean",
    "offen_fuer_alle": "boolean",
    "approver_picks_target": "boolean",
    "darf_anfragen": "boolean",
    "auto_freigabe": "boolean"
  }
]

GET /api/settings/instanzen/downloadkollision may change

Do two instances share a download category

Radarr and Sonarr only see what sits in their own category of the download client. If two instances share one, each grabs the downloads the other one queued: requests hang, files land in the wrong place, and no error appears anywhere - so the operator goes looking at the network. Radarr cannot warn about this: it does not know the second instance exists. Nexview does.

Felder und Aufbau

Antwort

FeldArt
kollisionenListe von KollisionOut Pflicht

Aufbau der Antwort

{
  "kollisionen": [
    {
      "schluessel": "string",
      "programm": "string",
      "kategorie": "string",
      "ohne_kategorie": "boolean",
      "instanzen": [
        "string"
      ],
      "kennungen": [
        "string"
      ]
    }
  ]
}

POST /api/settings/instanzen/downloadkollision/ignorieren may change

Stop reporting this collision

Some setups share a category on purpose. Dismissing is permanent, but tied to the instances involved - adding a third one to the same category reports again, because that is a new mistake and not a dismissed old one.

Felder und Aufbau

Anfragekörper

FeldArt
schluesselText Pflicht

GET /api/settings/instanzen/gesundheit may change

Health problems the instances report

The last seen /health state of every configured Radarr/Sonarr instance, refreshed each sync round. Messages are passed on in the instance’s own words.

Felder und Aufbau

Antwort

FeldArt
instanzenListe von GesundheitInstanz Pflicht

Aufbau der Antwort

{
  "instanzen": [
    {
      "kennung": "string",
      "name": "string",
      "probleme": [
        {}
      ],
      "aktualisiert_am": "ISO 8601 | null"
    }
  ]
}

GET /api/settings/instanzen/verbindung may change

Reachability of the instances

Asks every configured Radarr/Sonarr instance for its status, all at once and with a short timeout - the live source of the status light on the instance tiles. Nothing is stored.

Felder und Aufbau

Antwort

FeldArt
instanzenListe von VerbindungInstanz Pflicht

Aufbau der Antwort

{
  "instanzen": [
    {
      "kennung": "string",
      "name": "string",
      "erreichbar": "boolean",
      "version": "string"
    }
  ]
}

DELETE /api/settings/instanzen/{kennung} may change

Remove access to one instance

Clears the stored address, key, name and per-instance rules of one Radarr/Sonarr instance - nothing changes inside the instance itself, except that Nexview removes its own webhook entry first. Running requests of that instance stay put and simply stop updating.

Felder und Aufbau

Parameter

kennungText path Pflicht

POST /api/settings/nexcrate/pairing may change

Ask nexcrate for a key

Starts a pairing request. The operator confirms it in nexcrate; the secret of the request stays in this process and never reaches the browser.

Felder und Aufbau

Anfragekörper

FeldArt
urlText Pflicht

Antwort

FeldArt
pairing_idText Pflicht
codeText Pflicht
poll_secondsZahl Pflicht
expires_atText oder null

Aufbau der Antwort

{
  "pairing_id": "string",
  "code": "string",
  "poll_seconds": "number",
  "expires_at": "string | null"
}

GET /api/settings/nexcrate/pairing/{pairing_id} may change

Ask whether pairing was confirmed

nexcrate hands out the key exactly once, so it is stored before anything else happens. On success the answer also carries the installation and how many versions were found.

Felder und Aufbau

Parameter

pairing_idText path Pflicht

Antwort

FeldArt
stateText Pflicht
gespeichertja/nein
installation_idText
versionText
fassungenZahl
pruefungListe von Objekt

Aufbau der Antwort

{
  "state": "string",
  "gespeichert": "boolean",
  "installation_id": "string",
  "version": "string",
  "fassungen": "number",
  "pruefung": [
    "object"
  ]
}

GET /api/settings/nexcrate/status may change

What nexcrate reports about itself

Version, contract stage, update hint, the versions it offers with their readiness, and its open health findings. A new installation id under the same address drops the stored markers.

Felder und Aufbau

Antwort

FeldArt
eingerichtetja/nein Pflicht
erreichbarja/nein Pflicht
versionText
vertragText
installation_idText
web_urlText
update_verfuegbarja/nein
update_versionText
animeja/nein
fassungenListe von Objekt
problemeListe von Objekt
pruefungListe von Objekt
fehlerText

Aufbau der Antwort

{
  "eingerichtet": "boolean",
  "erreichbar": "boolean",
  "version": "string",
  "vertrag": "string",
  "installation_id": "string",
  "web_url": "string",
  "update_verfuegbar": "boolean",
  "update_version": "string",
  "anime": "boolean",
  "fassungen": [
    "object"
  ],
  "probleme": [
    "object"
  ],
  "pruefung": [
    "object"
  ],
  "fehler": "string"
}

POST /api/settings/nexcrate/test may change

Test the connection to nexcrate

Checks whether a nexcrate answers at that address and accepts the key. Uses the values passed in if they have not been saved yet.

Felder und Aufbau

Anfragekörper

FeldArt
urlText oder null
api_keyText oder null

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "ok": "boolean",
  "message": "string"
}

GET /api/settings/qualitaetsprofile may change

Quality profiles kept in Nexview

The profiles you created here, each with the instances it has been written to. A profile lives in Nexview; the copies on the instances are made from it.

Felder und Aufbau

Antwort

FeldArt
idZahl Pflicht
nameText Pflicht
dienstText Pflicht
rezeptObjekt Pflicht
installationenListe von InstallationOut Pflicht

Aufbau der Antwort

[
  {
    "id": "number",
    "name": "string",
    "dienst": "string",
    "rezept": "object",
    "installationen": [
      {
        "kennung": "string",
        "geschrieben_am": "string | null",
        "trash_stand": "string"
      }
    ]
  }
]

POST /api/settings/qualitaetsprofile may change

Keep a new quality profile

Stores the answers from the guide. Nothing is written to Radarr or Sonarr yet - that is a separate step.

Felder und Aufbau

Anfragekörper

FeldArt
nameText Pflicht
dienstradarr | sonarr Pflicht
rezeptObjekt Pflicht

Antwort

FeldArt
idZahl Pflicht
nameText Pflicht
dienstText Pflicht
rezeptObjekt Pflicht
installationenListe von InstallationOut Pflicht

Aufbau der Antwort

{
  "id": "number",
  "name": "string",
  "dienst": "string",
  "rezept": "object",
  "installationen": [
    {
      "kennung": "string",
      "geschrieben_am": "string | null",
      "trash_stand": "string"
    }
  ]
}

GET /api/settings/qualitaetsprofile/abgleich may change

Do the copies still match

Asks every instance whether the profile written there still looks the way Nexview left it, and whether the guide data has moved on since. Separate from the list so a silent instance cannot hold up the page.

Felder und Aufbau

Antwort

FeldArt
profil_idZahl Pflicht
kennungText Pflicht
standText Pflicht
unterschiedeListe von UnterschiedOut

Aufbau der Antwort

[
  {
    "profil_id": "number",
    "kennung": "string",
    "stand": "string",
    "unterschiede": [
      {
        "art": "string",
        "was": "string",
        "ist": "string",
        "soll": "string"
      }
    ]
  }
]

GET /api/settings/qualitaetsprofile/ausfuhr may change

Take the profile store with you

Every profile kept in Nexview as one file: names, recipes and the instances each was last written to. It carries no credentials and no keys, so it can be handed to somebody else. Needed because Nexview keeps the record of ownership in its own database only - a fresh installation pointed at the same Radarr stands before its own profiles as before strangers.

GET /api/settings/qualitaetsprofile/benennung may change

How each instance names files and folders

What is set right now, next to what the TRaSH Guides recommend for the media server you have connected.

Felder und Aufbau

Antwort

FeldArt
kennungText Pflicht
nameText Pflicht
dienstText Pflicht
umbenennen_anja/nein Pflicht
datei_istText
datei_sollText
ordner_istText
ordner_sollText
fassungText
erreichbarja/nein
meldet_medienserverja/nein
altnamenAltnamenOut
lauf_offenja/nein

Aufbau der Antwort

[
  {
    "kennung": "string",
    "name": "string",
    "dienst": "string",
    "umbenennen_an": "boolean",
    "datei_ist": "string",
    "datei_soll": "string",
    "ordner_ist": "string",
    "ordner_soll": "string",
    "fassung": "string",
    "erreichbar": "boolean",
    "meldet_medienserver": "boolean",
    "altnamen": {
      "gesamt": "number",
      "im_dateinamen": "number",
      "blockiert": "number",
      "beispiele": [
        "string"
      ],
      "blockierte_namen": [
        "string"
      ]
    },
    "lauf_offen": "boolean"
  }
]

PUT /api/settings/qualitaetsprofile/benennung may change

Adopt the recommended naming scheme

Sets the file and/or folder scheme on one instance. It applies to what the instance writes from now on; files already on disk are not touched. Renaming an existing library is a separate step in Radarr or Sonarr, with consequences for seeding and the media server.

Felder und Aufbau

Anfragekörper

FeldArt
kennungText Pflicht
dateija/nein
ordnerja/nein
bestandja/nein

Antwort

FeldArt
kennungText Pflicht
nameText Pflicht
dienstText Pflicht
umbenennen_anja/nein Pflicht
datei_istText
datei_sollText
ordner_istText
ordner_sollText
fassungText
erreichbarja/nein
meldet_medienserverja/nein
altnamenAltnamenOut
lauf_offenja/nein

Aufbau der Antwort

{
  "kennung": "string",
  "name": "string",
  "dienst": "string",
  "umbenennen_an": "boolean",
  "datei_ist": "string",
  "datei_soll": "string",
  "ordner_ist": "string",
  "ordner_soll": "string",
  "fassung": "string",
  "erreichbar": "boolean",
  "meldet_medienserver": "boolean",
  "altnamen": {
    "gesamt": "number",
    "im_dateinamen": "number",
    "blockiert": "number",
    "beispiele": [
      "string"
    ],
    "blockierte_namen": [
      "string"
    ]
  },
  "lauf_offen": "boolean"
}

POST /api/settings/qualitaetsprofile/benennung/{kennung}/altnamen may change

Drop the old prefix from format names

Earlier versions prefixed every custom format Nexview created. That prefix reaches the file name whenever a format is marked to appear there, so a library rename would write it into thousands of files. This renames those formats back, keeping their ids so profiles keep pointing at them. Formats whose plain name is already taken by someone else are left untouched and reported.

Felder und Aufbau

Parameter

kennungText path Pflicht

Antwort

FeldArt
umbenanntZahl
altnamenAltnamenOut

Aufbau der Antwort

{
  "umbenannt": "number",
  "altnamen": {
    "gesamt": "number",
    "im_dateinamen": "number",
    "blockiert": "number",
    "beispiele": [
      "string"
    ],
    "blockierte_namen": [
      "string"
    ]
  }
}

GET /api/settings/qualitaetsprofile/benennung/{kennung}/fortschritt may change

How far the library rename has got

Radarr and Sonarr report only whether a command is running, never how far along it is, so Nexview splits the work into batches and counts them itself. Two phases: checking every title (read only), then renaming the ones that change.

Felder und Aufbau

Parameter

kennungText path Pflicht

Antwort

FeldArt
laeuftja/nein
instanzText
schrittText
erledigtZahl
gesamtZahl
betroffenZahl
beispieleListe von Text
fortgesetztja/nein

Aufbau der Antwort

{
  "laeuft": "boolean",
  "instanz": "string",
  "schritt": "string",
  "erledigt": "number",
  "gesamt": "number",
  "betroffen": "number",
  "beispiele": [
    "string"
  ],
  "fortgesetzt": "boolean"
}

GET /api/settings/qualitaetsprofile/bestand may change

Everything on the instances

Every quality profile and custom format that exists in Radarr and Sonarr, including the ones Nexview did not create, together with what depends on each: media, import lists and collections. The instances themselves refuse a deletion with "in use" without naming who is using it - this answers that question.

Felder und Aufbau

Antwort

FeldArt
kennungText Pflicht
nameText Pflicht
erreichbarja/nein
profileListe von ProfilBestandOut
musterListe von MusterBestandOut

Aufbau der Antwort

[
  {
    "kennung": "string",
    "name": "string",
    "erreichbar": "boolean",
    "profile": [
      {
        "id": "number",
        "name": "string",
        "unser": "boolean",
        "medien": "number",
        "importlisten": "number",
        "sammlungen": "number",
        "loeschbar": "boolean",
        "grund": "string"
      }
    ],
    "muster": [
      {
        "id": "number",
        "name": "string",
        "benutzt_von": [
          "string"
        ],
        "gehoert_zu_plan": "boolean",
        "alter_vorsatz": "boolean",
        "im_dateinamen": "boolean",
        "loeschbar": "boolean"
      }
    ]
  }
]

POST /api/settings/qualitaetsprofile/bestand/{kennung}/aufraeumen may change

Remove selected profiles and formats

Deletes what the operator picked, checking each entry against the instance again immediately beforehand - what is in use by then is refused with the reason instead of forced. Profiles go first so that formats which only hung on them can follow in the same run. This is the one place where Nexview removes things it did not create; the mandate comes from the selection.

Felder und Aufbau

Parameter

kennungText path Pflicht

Anfragekörper

FeldArt
profil_idsListe von Zahl
muster_idsListe von Zahl

Antwort

FeldArt
geloescht_profileListe von Text
geloescht_musterListe von Text
abgelehntObjekt

Aufbau der Antwort

{
  "geloescht_profile": [
    "string"
  ],
  "geloescht_muster": [
    "string"
  ],
  "abgelehnt": "object"
}

POST /api/settings/qualitaetsprofile/bestand/{kennung}/umhaengen may change

Move media to another profile

Reassigns every movie or series that currently sits on one quality profile to another one. Files are not touched - only the assignment changes. This is what makes cleaning up possible at all: a profile cannot be deleted while media sit on it, and in a grown setup almost everything sits on profiles that predate Nexview. Note that the new profile scores differently, so titles whose existing file falls below it will be queued for an upgrade.

Felder und Aufbau

Parameter

kennungText path Pflicht

Anfragekörper

FeldArt
vonZahl Pflicht
nachZahl Pflicht

Antwort

FeldArt
umgehaengtZahl
grundText

Aufbau der Antwort

{
  "umgehaengt": "number",
  "grund": "string"
}

POST /api/settings/qualitaetsprofile/einfuhr may change

Bring the profile store back

Adds the profiles to Nexview and takes over the copies found on the instances by name, recording their id. Nothing is written to Radarr or Sonarr - a copy that differs from its recipe is adopted as it stands and shown as adjusted. A name already in the store is skipped rather than overwritten.

Felder und Aufbau

Anfragekörper

FeldArt
dateiObjekt Pflicht

Antwort

FeldArt
neuListe von Text
schon_daListe von Text
befundeListe von UmzugBefundOut

Aufbau der Antwort

{
  "neu": [
    "string"
  ],
  "schon_da": [
    "string"
  ],
  "befunde": [
    {
      "name": "string",
      "dienst": "string",
      "kennung": "string",
      "instanz": "string",
      "lage": "string",
      "profil_id_extern": "number | null",
      "unterschiede": "number"
    }
  ]
}

POST /api/settings/qualitaetsprofile/einfuhr/vorschau may change

What the import would do

Reads the file and looks at every instance: which profiles would be taken over, which differ from their recipe, which are not there at all. Changes nothing.

Felder und Aufbau

Anfragekörper

FeldArt
dateiObjekt Pflicht

Antwort

FeldArt
neuListe von Text
schon_daListe von Text
befundeListe von UmzugBefundOut

Aufbau der Antwort

{
  "neu": [
    "string"
  ],
  "schon_da": [
    "string"
  ],
  "befunde": [
    {
      "name": "string",
      "dienst": "string",
      "kennung": "string",
      "instanz": "string",
      "lage": "string",
      "profil_id_extern": "number | null",
      "unterschiede": "number"
    }
  ]
}

GET /api/settings/qualitaetsprofile/medienserver may change

Which instance knows which media server

Radarr and Sonarr only tell a media server about imports, upgrades and renames when a connection is set up. This lists where one is missing.

Felder und Aufbau

Antwort

FeldArt
serverListe von MedienserverOut
instanzenListe von VerbindungslageOut
warnungenListe von WarnungOut

Aufbau der Antwort

{
  "server": [
    {
      "id": "number",
      "provider": "string",
      "name": "string",
      "url": "string",
      "braucht_schluessel": "boolean",
      "schluessel_da": "boolean"
    }
  ],
  "instanzen": [
    {
      "kennung": "string",
      "name": "string",
      "erreichbar": "boolean",
      "fehlend": [
        {}
      ],
      "verbunden": [
        "string"
      ]
    }
  ],
  "warnungen": [
    {
      "instanz": "string",
      "provider": "string",
      "grund": "string"
    }
  ]
}

PUT /api/settings/qualitaetsprofile/medienserver/schluessel may change

Store the API key of a media server

Jellyfin and Emby need a key from their own dashboard. It is not the access Nexview itself uses: that one comes from a username and password and ends with the session.

Felder und Aufbau

Anfragekörper

FeldArt
server_idZahl Pflicht
schluesselText

POST /api/settings/qualitaetsprofile/medienserver/verbinden may change

Create the missing connections

Each one is tested from the instance first and only written when the test succeeds. A connection that never worked is worse than none, because nobody questions it later.

Felder und Aufbau

Anfragekörper

FeldArt
kennungenListe von Text

Antwort

FeldArt
hergestelltZahl
gescheitertListe von Text

Aufbau der Antwort

{
  "hergestellt": "number",
  "gescheitert": [
    "string"
  ]
}

GET /api/settings/qualitaetsprofile/quelle may change

Which TRaSH snapshot is in use

Date, origin and licence of the guide data, whether it is still the bundled one, and whether a newer state has been seen.

Felder und Aufbau

Antwort

FeldArt
standText Pflicht
quelleText Pflicht
lizenzText Pflicht
commitText
mitgeliefertja/nein
geholt_amText
pruefung_bekanntja/nein
neuer_stand_daja/nein
neuer_stand_datumText

Aufbau der Antwort

{
  "stand": "string",
  "quelle": "string",
  "lizenz": "string",
  "commit": "string",
  "mitgeliefert": "boolean",
  "geholt_am": "string",
  "pruefung_bekannt": "boolean",
  "neuer_stand_da": "boolean",
  "neuer_stand_datum": "string"
}

POST /api/settings/qualitaetsprofile/quelle/aktualisieren may change

Fetch the current TRaSH state

Downloads the guide data from GitHub and adopts it, but only if every profile you keep can still be built from it. Nothing is written to Radarr or Sonarr by this: afterwards the comparison shows which copies have fallen behind, and you decide.

Felder und Aufbau

Antwort

FeldArt
standText Pflicht
commitText Pflicht
geholt_amText Pflicht

Aufbau der Antwort

{
  "stand": "string",
  "commit": "string",
  "geholt_am": "string"
}

DELETE /api/settings/qualitaetsprofile/{profil_id} may change

Forget a quality profile

Removes it from Nexview. Copies already written to an instance stay there: deleting a profile that titles are assigned to would damage those titles.

Felder und Aufbau

Parameter

profil_idZahl path Pflicht

GET /api/settings/qualitaetsprofile/{profil_id}/fortschritt may change

How far the writing has got

Radarr and Sonarr accept detection patterns one at a time, so writing a profile keeps the connection open for a minute or more. This says which instance is being written and how many patterns are done.

Felder und Aufbau

Parameter

profil_idZahl path Pflicht

Antwort

FeldArt
laeuftja/nein
instanzText
schrittText
erledigtZahl
gesamtZahl
instanz_nummerZahl
von_instanzenZahl

Aufbau der Antwort

{
  "laeuft": "boolean",
  "instanz": "string",
  "schritt": "string",
  "erledigt": "number",
  "gesamt": "number",
  "instanz_nummer": "number",
  "von_instanzen": "number"
}

PUT /api/settings/qualitaetsprofile/{profil_id}/instanzen may change

Decide where the profile lives

Writes the profile and its detection patterns to every instance listed, and stops managing it on the others. The list is the truth, not a set of changes.

Felder und Aufbau

Parameter

profil_idZahl path Pflicht

Anfragekörper

FeldArt
kennungenListe von Text

Antwort

FeldArt
installationenListe von InstallationOut Pflicht
formate_neuZahl
formate_wiederverwendetZahl
hinweiseListe von Text

Aufbau der Antwort

{
  "installationen": [
    {
      "kennung": "string",
      "geschrieben_am": "string | null",
      "trash_stand": "string"
    }
  ],
  "formate_neu": "number",
  "formate_wiederverwendet": "number",
  "hinweise": [
    "string"
  ]
}

GET /api/settings/recyclebin may change

Where deleted files go

The recycle-bin path configured in every Radarr and Sonarr instance. Fetched fresh on every call and stored nowhere - it lives over there, and a copy here would go stale without anybody noticing.

Felder und Aufbau

Antwort

FeldArt
enabledja/nein Pflicht
completeja/nein Pflicht
instancesListe von PapierkorbInstanz Pflicht

Aufbau der Antwort

{
  "enabled": "boolean",
  "complete": "boolean",
  "instances": [
    {
      "media_type": "string",
      "tier": "string",
      "name": "string",
      "reachable": "boolean",
      "path": "string",
      "cleanup_days": "number | null",
      "protected": "boolean"
    }
  ]
}

PUT /api/settings/recyclebin may change

Set the recycle-bin path

⚠️ This writes into Radarr and Sonarr, not into Nexview. The setting applies over there to everything, including deletions that had nothing to do with Nexview.

Felder und Aufbau

Anfragekörper

FeldArt
instancesListe von PapierkorbWunsch Pflicht
cleanup_daysZahl

Antwort

FeldArt
enabledja/nein Pflicht
completeja/nein Pflicht
instancesListe von PapierkorbInstanz Pflicht

Aufbau der Antwort

{
  "enabled": "boolean",
  "complete": "boolean",
  "instances": [
    {
      "media_type": "string",
      "tier": "string",
      "name": "string",
      "reachable": "boolean",
      "path": "string",
      "cleanup_days": "number | null",
      "protected": "boolean"
    }
  ]
}

GET /api/settings/recyclebin/contents may change

What is in the recycle bins

Folder names only - no posters, no tidied-up titles. Resolving the names back to titles would mean a TMDB lookup per folder for something that is, in the end, a list of directories.

Felder und Aufbau

Parameter

media_typemovie | tv oder null query
tierstandard | uhd oder null query
pathText query

Antwort

FeldArt
instancesListe von PapierkorbInhaltInstanz Pflicht

Aufbau der Antwort

{
  "instances": [
    {
      "name": "string",
      "path": "string",
      "entries": [
        "string"
      ],
      "truncated": "boolean"
    }
  ]
}

GET /api/settings/recyclebin/folders may change

Which folders one instance sees

Asked per instance rather than once for all: Sonarr can be mounted entirely differently from Radarr, and a path that exists for one may not exist for the other.

Felder und Aufbau

Parameter

media_typemovie | tv query Pflicht
tierstandard | uhd query
pathText query

Antwort

FeldArt
pathText Pflicht
directoriesListe von Text Pflicht

Aufbau der Antwort

{
  "path": "string",
  "directories": [
    "string"
  ]
}

DELETE /api/settings/secret/{name} may change

Remove a stored secret

The explicit way to delete an API key, because an empty field on save means "unchanged".

Felder und Aufbau

Parameter

nameText path Pflicht

POST /api/settings/test-mail may change

Send a test mail

Sends a fully formatted test message to the given address, so the result shows what a real notification will look like.

Felder und Aufbau

Anfragekörper

FeldArt
recipientText Pflicht

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "ok": "boolean",
  "message": "string"
}

POST /api/settings/test/public-url may change

Is Nexview reachable at this address

The server calls itself from the outside to find out. Deliberately with its own short-lived client, so nothing from the normal connection pool can make an unreachable address look reachable.

Felder und Aufbau

Anfragekörper

FeldArt
urlText Pflicht

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "ok": "boolean",
  "message": "string"
}

POST /api/settings/test/smtp may change

Test the mail server

Checks connection and authentication without sending anything.

Felder und Aufbau

Anfragekörper

FeldArt
hostText oder null
portZahl oder null
securityText oder null
usernameText oder null
passwordText oder null

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "ok": "boolean",
  "message": "string"
}

POST /api/settings/test/tmdb may change

Test the TMDB key

Checks whether the given TMDB API key works.

Felder und Aufbau

Anfragekörper

FeldArt
api_keyText oder null
urlText oder null

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "ok": "boolean",
  "message": "string"
}

POST /api/settings/test/{service} may change

Test Radarr or Sonarr

Checks the connection to the standard or 4K instance. Uses the values passed in if they have not been saved yet, so a connection can be tested before it is stored.

Felder und Aufbau

Parameter

serviceradarr | sonarr | radarr_uhd | sonarr_uhd path Pflicht

Anfragekörper

FeldArt
api_keyText oder null
urlText oder null

Antwort

FeldArt
okja/nein Pflicht
messageText Pflicht

Aufbau der Antwort

{
  "ok": "boolean",
  "message": "string"
}

GET /api/settings/webhooks may change

Notification link status per instance

For every configured Radarr/Sonarr instance: whether the per-instance switch is on, whether the entry currently exists over there, when the reachability proof last arrived, when the last call came in - and, if the link cannot be established, an honest reason code.

Felder und Aufbau

Antwort

FeldArt
basisText Pflicht
instanzenListe von WebhookInstanzStand Pflicht

Aufbau der Antwort

{
  "basis": "string",
  "instanzen": [
    {
      "kennung": "string",
      "name": "string",
      "media_type": "string",
      "tier": "string",
      "aktiv": "boolean",
      "eingetragen": "boolean",
      "bewiesen_am": "ISO 8601 | null",
      "zuletzt_angerufen_am": "ISO 8601 | null",
      "letztes_ereignis": "string",
      "geprueft_am": "ISO 8601 | null",
      "fehler": "string",
      "fehler_info": "string",
      "alter_eintrag": "string"
    }
  ]
}

PATCH /api/settings/webhooks/{kennung} may change

Switch the notification link for one instance

Turning it on runs the proof and creates the entry in Radarr/Sonarr; turning it off removes that entry without leftovers. The response carries the resulting state.

Felder und Aufbau

Parameter

kennungText path Pflicht

Anfragekörper

FeldArt
aktivja/nein Pflicht

Antwort

FeldArt
basisText Pflicht
instanzenListe von WebhookInstanzStand Pflicht

Aufbau der Antwort

{
  "basis": "string",
  "instanzen": [
    {
      "kennung": "string",
      "name": "string",
      "media_type": "string",
      "tier": "string",
      "aktiv": "boolean",
      "eingetragen": "boolean",
      "bewiesen_am": "ISO 8601 | null",
      "zuletzt_angerufen_am": "ISO 8601 | null",
      "letztes_ereignis": "string",
      "geprueft_am": "ISO 8601 | null",
      "fehler": "string",
      "fehler_info": "string",
      "alter_eintrag": "string"
    }
  ]
}

POST /api/settings/webhooks/{kennung}/testen may change

Prove the notification link right now

Asks the instance to send its test event to Nexview and reports whether - and how fast - the call arrived, or why it could not.

Felder und Aufbau

Parameter

kennungText path Pflicht

Antwort

FeldArt
angekommenja/nein Pflicht
dauer_msZahl oder null
fehlerText oder null
infoText oder null

Aufbau der Antwort

{
  "angekommen": "boolean",
  "dauer_ms": "number | null",
  "fehler": "string | null",
  "info": "string | null"
}

GET /api/umstieg/abbildung may change

Vet nexcrate and propose a version mapping

Checks whether this nexcrate can serve Nexview at all - contract, stage, kinds, scopes - and only then reads its versions and proposes one per current version, matched by kind and tier. A blocking finding stops here instead of offering a mapping nobody may use.

Felder und Aufbau

Antwort

FeldArt
pruefungListe von Objekt
sperrtja/nein
arr_fassungenListe von Objekt
nex_fassungenListe von Objekt
vorschlagObjekt

Aufbau der Antwort

{
  "pruefung": [
    "object"
  ],
  "sperrt": "boolean",
  "arr_fassungen": [
    "object"
  ],
  "nex_fassungen": [
    "object"
  ],
  "vorschlag": "object"
}

POST /api/umstieg/nachreichen may change

Hand over approved requests after the switch

A request is handed to procurement exactly once, at approval. After a switch the new way has never heard of the approved ones, so they are handed over again - at most 25 per call, and only versions the new way knows.

Felder und Aufbau

Antwort

FeldArt
gereichtZahl Pflicht
liegenZahl
weiterja/nein Pflicht

Aufbau der Antwort

{
  "gereicht": "number",
  "liegen": "number",
  "weiter": "boolean"
}

POST /api/umstieg/probe may change

Check whether nexcrate knows the titles

For every title with an open request or a storage entry: known with the chosen version, known without it, or unknown. Open requests for unknown titles are no obstacle - they are placed when you switch. Downloaded entries without a counterpart need a decision.

Felder und Aufbau

Anfragekörper

FeldArt
abbildungObjekt Pflicht

Antwort

FeldArt
fehlerListe von Text
bekanntZahl
ohne_fassungZahl
unbekanntZahl
anime_offenZahl
rechte_entfallenZahl
zu_entscheidenListe von Objekt

Aufbau der Antwort

{
  "fehler": [
    "string"
  ],
  "bekannt": "number",
  "ohne_fassung": "number",
  "unbekannt": "number",
  "anime_offen": "number",
  "rechte_entfallen": "number",
  "zu_entscheiden": [
    "object"
  ]
}

GET /api/umstieg/sicherung may change

Find the backup made a moment ago

The newest backup this assistant made in the last hour that still opens as a database, or null. Lets the assistant carry on after a reload or in a new window instead of making a second backup. Reads only.

Felder und Aufbau

Antwort

FeldArt
sicherungSicherungAntwort oder null

Aufbau der Antwort

{
  "sicherung": {
    "name": "string",
    "groesse": "number",
    "erstellt": "string"
  }
}

POST /api/umstieg/sicherung may change

Make the backup before switching

There is no way back except this file, so the switch is refused until it exists. Same format as any other manual backup.

Felder und Aufbau

Antwort

FeldArt
nameText Pflicht
groesseZahl Pflicht
erstelltText Pflicht

Aufbau der Antwort

{
  "name": "string",
  "groesse": "number",
  "erstellt": "string"
}

POST /api/umstieg/umschalten may change

Switch procurement to nexcrate

⚠️ The one step that cannot be taken back. Removes Nexview's webhook entries from Radarr and Sonarr, deletes their credentials, rewrites every version id on requests, storage entries, rights, invitations and rules, and moves series storage keys from TVDB to TMDB. Requires the backup from the previous step; the check of the titles is run again here, because the translation of the storage keys comes out of it.

Felder und Aufbau

Anfragekörper

FeldArt
abbildungObjekt Pflicht
sicherungText Pflicht
posten_ohne_gegenstueck_behaltenja/nein

Antwort

FeldArt
fassungenZahl Pflicht
verlassenListe von Objekt Pflicht
anfragenZahl Pflicht
anfragen_ohne_uebersetzungZahl
postenZahl Pflicht
posten_schluesselZahl Pflicht
posten_ohne_uebersetzungZahl Pflicht
posten_doppeltZahl
rechteZahl Pflicht
rechte_entfallenZahl
einladungenZahl Pflicht
regelnZahl Pflicht
zeilen_entferntZahl Pflicht

Aufbau der Antwort

{
  "fassungen": "number",
  "verlassen": [
    "object"
  ],
  "anfragen": "number",
  "anfragen_ohne_uebersetzung": "number",
  "posten": "number",
  "posten_schluessel": "number",
  "posten_ohne_uebersetzung": "number",
  "posten_doppelt": "number",
  "rechte": "number",
  "rechte_entfallen": "number",
  "einladungen": "number",
  "regeln": "number",
  "zeilen_entfernt": "number"
}

GET /api/umstieg/vorab may change

What switching to nexcrate would change

Numbers before anything happens: downloads currently running in Radarr or Sonarr (they finish there and become invisible to Nexview), open requests, storage entries, and the instances involved. Reads only.

Felder und Aufbau

Antwort

FeldArt
downloads_laufendZahl Pflicht
anfragen_offenZahl Pflicht
postenZahl Pflicht
instanzenListe von Text Pflicht

Aufbau der Antwort

{
  "downloads_laufend": "number",
  "anfragen_offen": "number",
  "posten": "number",
  "instanzen": [
    "string"
  ]
}

POST /api/webhooks/arr/{kennung} may change

Inbound call from Radarr or Sonarr

Receiving end of the notification entry Nexview maintains inside Radarr and Sonarr. Expects the per-instance secret as the Basic auth password. The call only wakes the status sync - its payload is never trusted. A "Test" event records the reachability proof instead of waking anything.

Felder und Aufbau

Parameter

kennungText path Pflicht