Skip to content
Area

Operations

94 addresses. Not promised — they belong to the internals and can change with any release. If you need something to stay put, use the promised nineteen.

94 addresses

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.

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"
}

POST /api/about/check may change

Check for updates now

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

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

Fields and shape

Response

FieldType
versionstring required
offenboolean required
zuletzt_gesehenstring or null

Response shape

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

Fields and shape

Response

FieldType
versionstring required
offenboolean required
zuletzt_gesehenstring or null

Response shape

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

Fields and shape

Response

FieldType
instanzenlist of InstanzZeile required
traegerlist of TraegerZeile required
verlauf_tagenumber required
bibliothekBibliotheknumberen required
abgleichAbgleichnumberen required
betriebBetriebnumberen required

Response shape

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

Fields and shape

Response

FieldType
wiedergabenlist of app__routers__analyse__LaufendeZeile required
bild_umrechnungennumber required

Response shape

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

Fields and shape

Parameters

ansichtunterschiede | andere_nummer | jahr | ohne_kennung | nur_arr | alle query
artalle | movie | tv query
fehlt_aufstring or null query
suchestring or null query
seitenumber query
pro_seitenumber query

Response

FieldType
moeglichboolean required
serverlist of VergleichServer required
anzahlobject required
zeilenlist of VergleichZeile required
gesamtnumber required
seitenumber required
seitennumber required

Response shape

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

Fields and shape

Parameters

anbieterstring query required
schluesselstring query required

Response

FieldType
pfadelist of string required

Response shape

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

Fields and shape

Request body

FieldType
anbieterstring required
schluesselstring required
artmovie | tv required
tmdbnumber or null
tvdbnumber or null

Response

FieldType
ergebnisstring required
titelstring or null required
jahrnumber or null required

Response shape

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

Fields and shape

Response

FieldType
monatelist of MonatsPunkt required
personenlist of SeherZeile required
beliebtestelist of GesehenerTitel required
bestandlist of BestandsPunkt required
angesehennumber required
bestand_gesamtnumber required
konten_mit_datennumber required
spitzenlist of SpitzenTag required
spitze_gesamtnumber required

Response shape

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

Fields and shape

Parameters

bereichstring or null query

Response

FieldType
schluesselstring required
kennungstring required
schwerestring required
bereichstring required
werteobject required
zielstring or null required
wortlautstring or null required

Response shape

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

Fields and shape

Response

FieldType
befundelist of BefundPublic required
zaehlerobject required
ungesehennumber
zahlenHandlungsnumberen required
verlauflist of VerlaufsPunkt required
traegerDatentraeger or null required

Response shape

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

Fields and shape

Response

FieldType
eintraegelist of SicherungPublic required
versionstring required
ordnerstring required

Response shape

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

Fields and shape

Request body

FieldType
kommentarstring

Response

FieldType
namestring required
groessenumber required
erstelltstring required
artstring required
kommentarstring required
versionstring required
einspielbarboolean required
grundstring required

Response shape

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

Fields and shape

Response

FieldType
versionstring required
erstelltstring required
artstring required
kommentarstring required
einspielbarboolean required
grundstring required
schluessel_aus_umgebungboolean required
schluessel_im_archivboolean required

Response shape

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

Fields and shape

Response

FieldType
versionstring required
erstelltstring required
artstring required
kommentarstring required
einspielbarboolean required
grundstring required
schluessel_aus_umgebungboolean required
schluessel_im_archivboolean required

Response shape

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

Fields and shape

Parameters

namestring path required

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.

Fields and shape

Parameters

namestring path required

Request body

FieldType
passwortstring required

GET /api/admin/stats may change

Numbers for the dashboard

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

Fields and shape

Response

FieldType
totalsTotalsPublic required
userslist of UserStatsPublic required
historylist of MonthPoint required
most_requestedlist of PopularTitle required

Response shape

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

Fields and shape

Parameters

monatenumber query
grenzenumber query
suchestring query
artmovie | tv or null query
nur_vorgemerktboolean query

Response

FieldType
postenlist of AufraeumPosten required
gesamt_anzahlnumber required
gesamt_bytesnumber required
monatenumber required
grundlageAufraeumGrundlage required
ohne_datumnumber required
gesehen_ohne_datumnumber

Response shape

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

Fields and shape

Response

FieldType
eintraegelist of PapierkorbZeile
sprungstring

Response shape

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

Fields and shape

Parameters

eintrag_idnumber path required

Response

FieldType
createdboolean

Response shape

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

Fields and shape

Parameters

media_typemovie | tv path required
tmdb_idnumber path required

Response

FieldType
beantwortbarboolean required
bekanntboolean
automatischboolean
suchwunschboolean
zuletzt_gesuchtstring or null
naechste_suchestring or null
gruendelist of GrundZeile

Response shape

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

Fields and shape

Response

FieldType
default_regionstring required
default_languagestring required
tmdb_configuredboolean required
beschaffungstring required
beschaffung_kannobject
beschaffung_sprungobject
radarr_configuredboolean required
sonarr_configuredboolean required
using_demo_databoolean required
min_password_lengthnumber required
mail_configuredboolean required
public_url_setboolean required
approver_picks_target_movieboolean required
approver_picks_target_tvboolean required
approver_picks_target_movie_uhdboolean required
approver_picks_target_tv_uhdboolean required
fassungenlist of FassungOeffentlich required
radarr_uhd_configuredboolean required
sonarr_uhd_configuredboolean required
mediaserver_configuredboolean required
mediaserver_providerslist of string required
mediaserver_availablelist of string required
mediaserver_password_loginlist of string required
mediaserver_watchlist_availablelist of string required
mediaserver_watchlist_connectedlist of string required
watchlist_enabledboolean required
episode_requests_enabledboolean required
hausordnung_vorhandenboolean
hausordnung_titelstring
hausordnung_fassungnumber
hausordnung_quittierbarboolean
hausordnung_gelesennumber or null

Response shape

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

Fields and shape

Response

FieldType
codestring required
namestring required

Response shape

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

Fields and shape

Response

FieldType
titelstring required
inhaltstring required
fassungnumber required
quittierbarboolean required
gelesennumber or null required
akzeptiertboolean or null required

Response shape

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

Fields and shape

Response

FieldType
namestring required
bytesnumber required

Response shape

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

Fields and shape

Response

FieldType
namestring required
bytesnumber required

Response shape

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

Fields and shape

Parameters

namestring path required

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.

Fields and shape

Request body

FieldType
akzeptiertboolean

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.

Fields and shape

Response

FieldType
user_idnumber required
usernamestring required
display_namestring or null required
avatar_urlstring or null required
roleadmin | approver | user | child required
akzeptiertboolean or null required
entschieden_amtimestamp (ISO 8601) or null required
fassungnumber or null required

Response shape

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

Fields and shape

Response

FieldType
titelstring required
inhaltstring required
fassungnumber required
quittierbarboolean required
veroeffentlichtboolean required
aktualisiert_amtimestamp (ISO 8601) or null required
betroffene_kontennumber required

Response shape

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

Fields and shape

Request body

FieldType
titelstring
inhaltstring
quittierbarboolean
veroeffentlichtboolean
erneut_lesenboolean

Response

FieldType
titelstring required
inhaltstring required
fassungnumber required
quittierbarboolean required
veroeffentlichtboolean required
aktualisiert_amtimestamp (ISO 8601) or null required
betroffene_kontennumber required

Response shape

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

Fields and shape

Parameters

levelDEBUG | INFO | WARNING | ERROR | CRITICAL or null query
searchstring or null query
limitnumber query

Response

FieldType
timestring required
levelstring required
loggerstring required
messagestring required
request_idstring or null
userstring or null

Response shape

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

Fields and shape

Response

FieldType
modestring required
untilstring or null
fixed_by_envboolean
modeslist of string
durationslist of number

Response shape

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

Fields and shape

Request body

FieldType
modequiet | normal | detailed | trace required
minutesnumber

Response

FieldType
modestring required
untilstring or null
fixed_by_envboolean
modeslist of string
durationslist of number

Response shape

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

Fields and shape

Parameters

confirm_addressboolean query

Request body

FieldType
tmdb_api_keystring or null
radarr_urlstring or null
radarr_api_keystring or null
sonarr_urlstring or null
sonarr_api_keystring or null
radarr_namestring or null
sonarr_namestring or null
radarr_uhd_namestring or null
sonarr_uhd_namestring or null
default_regionstring or null
default_languagestring or null
poll_interval_secondsnumber or null
demo_modestring or null
beschaffungstring or null
nexcrate_urlstring or null
nexcrate_api_keystring or null
nexcrate_namestring or null
nexcrate_anzeigenameboolean or null
default_movie_profile_idstring or null
default_series_profile_idstring or null
movie_root_folder_modestring or null
series_root_folder_modestring or null
movie_profile_modestring or null
series_profile_modestring or null
movie_uhd_root_folder_modestring or null
series_uhd_root_folder_modestring or null
movie_uhd_profile_modestring or null
series_uhd_profile_modestring or null
default_movie_rootstring or null
default_series_rootstring or null
radarr_uhd_urlstring or null
radarr_uhd_api_keystring or null
sonarr_uhd_urlstring or null
sonarr_uhd_api_keystring or null
default_movie_uhd_profile_idstring or null
default_series_uhd_profile_idstring or null
default_movie_uhd_rootstring or null
default_series_uhd_rootstring or null
smtp_hoststring or null
smtp_portnumber or null
smtp_securitystring or null
smtp_usernamestring or null
smtp_passwordstring or null
smtp_from_addressstring or null
smtp_from_namestring or null
public_urlstring or null
webhook_basis_urlstring or null
update_checkboolean or null
password_loginboolean or null
backup_scheduleoff | daily | weekly | monthly or null
backup_keepnumber or null
mediaserver_auto_importboolean or null
mediaserver_default_rolestring or null
watchlist_enabledboolean or null
episode_requests_enabledboolean or null
quota_default_moviesnumber or null
quota_default_seriesnumber or null
storage_default_limit_gbnumber or null
quota_periodday | week | month or 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.

Fields and shape

Request body

FieldType
kennungstring required
offen_fuer_alleboolean required

Response

FieldType
kennungstring required
media_typestring required
namestring required
klassestring or null
quellestring required
hauptboolean
bereitboolean
offen_fuer_alleboolean
approver_picks_targetboolean
darf_anfragenboolean
auto_freigabeboolean

Response shape

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

Fields and shape

Response

FieldType
kollisionenlist of KollisionOut required

Response shape

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

Fields and shape

Request body

FieldType
schluesselstring required

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.

Fields and shape

Response

FieldType
instanzenlist of GesundheitInstanz required

Response shape

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

Fields and shape

Response

FieldType
instanzenlist of VerbindungInstanz required

Response shape

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

Fields and shape

Parameters

kennungstring path required

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.

Fields and shape

Request body

FieldType
urlstring required

Response

FieldType
pairing_idstring required
codestring required
poll_secondsnumber required
expires_atstring or null

Response shape

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

Fields and shape

Parameters

pairing_idstring path required

Response

FieldType
statestring required
gespeichertboolean
installation_idstring
versionstring
fassungennumber
pruefunglist of object

Response shape

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

Fields and shape

Response

FieldType
eingerichtetboolean required
erreichbarboolean required
versionstring
vertragstring
installation_idstring
web_urlstring
update_verfuegbarboolean
update_versionstring
animeboolean
fassungenlist of object
problemelist of object
pruefunglist of object
fehlerstring

Response shape

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

Fields and shape

Request body

FieldType
urlstring or null
api_keystring or null

Response

FieldType
okboolean required
messagestring required

Response shape

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

Fields and shape

Response

FieldType
idnumber required
namestring required
dienststring required
rezeptobject required
installationenlist of InstallationOut required

Response shape

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

Fields and shape

Request body

FieldType
namestring required
dienstradarr | sonarr required
rezeptobject required

Response

FieldType
idnumber required
namestring required
dienststring required
rezeptobject required
installationenlist of InstallationOut required

Response shape

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

Fields and shape

Response

FieldType
profil_idnumber required
kennungstring required
standstring required
unterschiedelist of UnterschiedOut

Response shape

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

Fields and shape

Response

FieldType
kennungstring required
namestring required
dienststring required
umbenennen_anboolean required
datei_iststring
datei_sollstring
ordner_iststring
ordner_sollstring
fassungstring
erreichbarboolean
meldet_medienserverboolean
altnamenAltnamenOut
lauf_offenboolean

Response shape

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

Fields and shape

Request body

FieldType
kennungstring required
dateiboolean
ordnerboolean
bestandboolean

Response

FieldType
kennungstring required
namestring required
dienststring required
umbenennen_anboolean required
datei_iststring
datei_sollstring
ordner_iststring
ordner_sollstring
fassungstring
erreichbarboolean
meldet_medienserverboolean
altnamenAltnamenOut
lauf_offenboolean

Response shape

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

Fields and shape

Parameters

kennungstring path required

Response

FieldType
umbenanntnumber
altnamenAltnamenOut

Response shape

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

Fields and shape

Parameters

kennungstring path required

Response

FieldType
laeuftboolean
instanzstring
schrittstring
erledigtnumber
gesamtnumber
betroffennumber
beispielelist of string
fortgesetztboolean

Response shape

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

Fields and shape

Response

FieldType
kennungstring required
namestring required
erreichbarboolean
profilelist of ProfilBestandOut
musterlist of MusterBestandOut

Response shape

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

Fields and shape

Parameters

kennungstring path required

Request body

FieldType
profil_idslist of number
muster_idslist of number

Response

FieldType
geloescht_profilelist of string
geloescht_musterlist of string
abgelehntobject

Response shape

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

Fields and shape

Parameters

kennungstring path required

Request body

FieldType
vonnumber required
nachnumber required

Response

FieldType
umgehaengtnumber
grundstring

Response shape

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

Fields and shape

Request body

FieldType
dateiobject required

Response

FieldType
neulist of string
schon_dalist of string
befundelist of UmzugBefundOut

Response shape

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

Fields and shape

Request body

FieldType
dateiobject required

Response

FieldType
neulist of string
schon_dalist of string
befundelist of UmzugBefundOut

Response shape

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

Fields and shape

Response

FieldType
serverlist of MedienserverOut
instanzenlist of VerbindungslageOut
warnungenlist of WarnungOut

Response shape

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

Fields and shape

Request body

FieldType
server_idnumber required
schluesselstring

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.

Fields and shape

Request body

FieldType
kennungenlist of string

Response

FieldType
hergestelltnumber
gescheitertlist of string

Response shape

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

Fields and shape

Response

FieldType
standstring required
quellestring required
lizenzstring required
commitstring
mitgeliefertboolean
geholt_amstring
pruefung_bekanntboolean
neuer_stand_daboolean
neuer_stand_datumstring

Response shape

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

Fields and shape

Response

FieldType
standstring required
commitstring required
geholt_amstring required

Response shape

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

Fields and shape

Parameters

profil_idnumber path required

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.

Fields and shape

Parameters

profil_idnumber path required

Response

FieldType
laeuftboolean
instanzstring
schrittstring
erledigtnumber
gesamtnumber
instanz_nummernumber
von_instanzennumber

Response shape

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

Fields and shape

Parameters

profil_idnumber path required

Request body

FieldType
kennungenlist of string

Response

FieldType
installationenlist of InstallationOut required
formate_neunumber
formate_wiederverwendetnumber
hinweiselist of string

Response shape

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

Fields and shape

Response

FieldType
enabledboolean required
completeboolean required
instanceslist of PapierkorbInstanz required

Response shape

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

Fields and shape

Request body

FieldType
instanceslist of PapierkorbWunsch required
cleanup_daysnumber

Response

FieldType
enabledboolean required
completeboolean required
instanceslist of PapierkorbInstanz required

Response shape

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

Fields and shape

Parameters

media_typemovie | tv or null query
tierstandard | uhd or null query
pathstring query

Response

FieldType
instanceslist of PapierkorbInhaltInstanz required

Response shape

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

Fields and shape

Parameters

media_typemovie | tv query required
tierstandard | uhd query
pathstring query

Response

FieldType
pathstring required
directorieslist of string required

Response shape

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

Fields and shape

Parameters

namestring path required

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.

Fields and shape

Request body

FieldType
recipientstring required

Response

FieldType
okboolean required
messagestring required

Response shape

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

Fields and shape

Request body

FieldType
urlstring required

Response

FieldType
okboolean required
messagestring required

Response shape

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

POST /api/settings/test/smtp may change

Test the mail server

Checks connection and authentication without sending anything.

Fields and shape

Request body

FieldType
hoststring or null
portnumber or null
securitystring or null
usernamestring or null
passwordstring or null

Response

FieldType
okboolean required
messagestring required

Response shape

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

POST /api/settings/test/tmdb may change

Test the TMDB key

Checks whether the given TMDB API key works.

Fields and shape

Request body

FieldType
api_keystring or null
urlstring or null

Response

FieldType
okboolean required
messagestring required

Response shape

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

Fields and shape

Parameters

serviceradarr | sonarr | radarr_uhd | sonarr_uhd path required

Request body

FieldType
api_keystring or null
urlstring or null

Response

FieldType
okboolean required
messagestring required

Response shape

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

Fields and shape

Response

FieldType
basisstring required
instanzenlist of WebhookInstanzStand required

Response shape

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

Fields and shape

Parameters

kennungstring path required

Request body

FieldType
aktivboolean required

Response

FieldType
basisstring required
instanzenlist of WebhookInstanzStand required

Response shape

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

Fields and shape

Parameters

kennungstring path required

Response

FieldType
angekommenboolean required
dauer_msnumber or null
fehlerstring or null
infostring or null

Response shape

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

Fields and shape

Response

FieldType
pruefunglist of object
sperrtboolean
arr_fassungenlist of object
nex_fassungenlist of object
vorschlagobject

Response shape

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

Fields and shape

Response

FieldType
gereichtnumber required
liegennumber
weiterboolean required

Response shape

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

Fields and shape

Request body

FieldType
abbildungobject required

Response

FieldType
fehlerlist of string
bekanntnumber
ohne_fassungnumber
unbekanntnumber
anime_offennumber
rechte_entfallennumber
zu_entscheidenlist of object

Response shape

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

Fields and shape

Response

FieldType
sicherungSicherungAntwort or null

Response shape

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

Fields and shape

Response

FieldType
namestring required
groessenumber required
erstelltstring required

Response shape

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

Fields and shape

Request body

FieldType
abbildungobject required
sicherungstring required
posten_ohne_gegenstueck_behaltenboolean

Response

FieldType
fassungennumber required
verlassenlist of object required
anfragennumber required
anfragen_ohne_uebersetzungnumber
postennumber required
posten_schluesselnumber required
posten_ohne_uebersetzungnumber required
posten_doppeltnumber
rechtenumber required
rechte_entfallennumber
einladungennumber required
regelnnumber required
zeilen_entferntnumber required

Response shape

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

Fields and shape

Response

FieldType
downloads_laufendnumber required
anfragen_offennumber required
postennumber required
instanzenlist of string required

Response shape

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

Fields and shape

Parameters

kennungstring path required