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.
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
versionstring requiredrepo_urlstring requiredrelease_urlstring requiredlicensestringupdate_checkedbooleanlatest_versionstring or nullupdate_availablebooleanchecked_attimestamp (ISO 8601) or nullResponse shape
{
"version": "string",
"repo_url": "string",
"release_url": "string",
"license": "string",
"update_checked": "boolean",
"latest_version": "string | null",
"update_available": "boolean",
"checked_at": "ISO 8601 | null"
}
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
versionstring requiredrepo_urlstring requiredrelease_urlstring requiredlicensestringupdate_checkedbooleanlatest_versionstring or nullupdate_availablebooleanchecked_attimestamp (ISO 8601) or nullResponse shape
{
"version": "string",
"repo_url": "string",
"release_url": "string",
"license": "string",
"update_checked": "boolean",
"latest_version": "string | null",
"update_available": "boolean",
"checked_at": "ISO 8601 | null"
}
GET
/api/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
versionstring requiredoffenboolean requiredzuletzt_gesehenstring or nullResponse 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
versionstring requiredoffenboolean requiredzuletzt_gesehenstring or nullResponse 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
instanzenlist of InstanzZeile requiredtraegerlist of TraegerZeile requiredverlauf_tagenumber requiredbibliothekBibliotheknumberen requiredabgleichAbgleichnumberen requiredbetriebBetriebnumberen requiredResponse 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
wiedergabenlist of app__routers__analyse__LaufendeZeile requiredbild_umrechnungennumber requiredResponse 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 queryartalle | movie | tv queryfehlt_aufstring or null querysuchestring or null queryseitenumber querypro_seitenumber queryResponse
moeglichboolean requiredserverlist of VergleichServer requiredanzahlobject requiredzeilenlist of VergleichZeile requiredgesamtnumber requiredseitenumber requiredseitennumber requiredResponse 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 requiredschluesselstring query requiredResponse
pfadelist of string requiredResponse 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
anbieterstring requiredschluesselstring requiredartmovie | tv requiredtmdbnumber or nulltvdbnumber or nullResponse
ergebnisstring requiredtitelstring or null requiredjahrnumber or null requiredResponse 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
monatelist of MonatsPunkt requiredpersonenlist of SeherZeile requiredbeliebtestelist of GesehenerTitel requiredbestandlist of BestandsPunkt requiredangesehennumber requiredbestand_gesamtnumber requiredkonten_mit_datennumber requiredspitzenlist of SpitzenTag requiredspitze_gesamtnumber requiredResponse 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 queryResponse
schluesselstring requiredkennungstring requiredschwerestring requiredbereichstring requiredwerteobject requiredzielstring or null requiredwortlautstring or null requiredResponse 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
befundelist of BefundPublic requiredzaehlerobject requiredungesehennumberzahlenHandlungsnumberen requiredverlauflist of VerlaufsPunkt requiredtraegerDatentraeger or null requiredResponse 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
eintraegelist of SicherungPublic requiredversionstring requiredordnerstring requiredResponse 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
kommentarstringResponse
namestring requiredgroessenumber requirederstelltstring requiredartstring requiredkommentarstring requiredversionstring requiredeinspielbarboolean requiredgrundstring requiredResponse 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
versionstring requirederstelltstring requiredartstring requiredkommentarstring requiredeinspielbarboolean requiredgrundstring requiredschluessel_aus_umgebungboolean requiredschluessel_im_archivboolean requiredResponse 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
versionstring requirederstelltstring requiredartstring requiredkommentarstring requiredeinspielbarboolean requiredgrundstring requiredschluessel_aus_umgebungboolean requiredschluessel_im_archivboolean requiredResponse 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 requiredRequest body
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
totalsTotalsPublic requireduserslist of UserStatsPublic requiredhistorylist of MonthPoint requiredmost_requestedlist of PopularTitle requiredResponse 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 querygrenzenumber querysuchestring queryartmovie | tv or null querynur_vorgemerktboolean queryResponse
postenlist of AufraeumPosten requiredgesamt_anzahlnumber requiredgesamt_bytesnumber requiredmonatenumber requiredgrundlageAufraeumGrundlage requiredohne_datumnumber requiredgesehen_ohne_datumnumberResponse 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
eintraegelist of PapierkorbZeilesprungstringResponse 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 requiredResponse
createdbooleanResponse 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 requiredtmdb_idnumber path requiredResponse
beantwortbarboolean requiredbekanntbooleanautomatischbooleansuchwunschbooleanzuletzt_gesuchtstring or nullnaechste_suchestring or nullgruendelist of GrundZeileResponse 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
default_regionstring requireddefault_languagestring requiredtmdb_configuredboolean requiredbeschaffungstring requiredbeschaffung_kannobjectbeschaffung_sprungobjectradarr_configuredboolean requiredsonarr_configuredboolean requiredusing_demo_databoolean requiredmin_password_lengthnumber requiredmail_configuredboolean requiredpublic_url_setboolean requiredapprover_picks_target_movieboolean requiredapprover_picks_target_tvboolean requiredapprover_picks_target_movie_uhdboolean requiredapprover_picks_target_tv_uhdboolean requiredfassungenlist of FassungOeffentlich requiredradarr_uhd_configuredboolean requiredsonarr_uhd_configuredboolean requiredmediaserver_configuredboolean requiredmediaserver_providerslist of string requiredmediaserver_availablelist of string requiredmediaserver_password_loginlist of string requiredmediaserver_watchlist_availablelist of string requiredmediaserver_watchlist_connectedlist of string requiredwatchlist_enabledboolean requiredepisode_requests_enabledboolean requiredhausordnung_vorhandenbooleanhausordnung_titelstringhausordnung_fassungnumberhausordnung_quittierbarbooleanhausordnung_gelesennumber or nullResponse 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
codestring requirednamestring requiredResponse 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
titelstring requiredinhaltstring requiredfassungnumber requiredquittierbarboolean requiredgelesennumber or null requiredakzeptiertboolean or null requiredResponse 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
namestring requiredbytesnumber requiredResponse 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
namestring requiredbytesnumber requiredResponse 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
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
user_idnumber requiredusernamestring requireddisplay_namestring or null requiredavatar_urlstring or null requiredroleadmin | approver | user | child requiredakzeptiertboolean or null requiredentschieden_amtimestamp (ISO 8601) or null requiredfassungnumber or null requiredResponse 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
titelstring requiredinhaltstring requiredfassungnumber requiredquittierbarboolean requiredveroeffentlichtboolean requiredaktualisiert_amtimestamp (ISO 8601) or null requiredbetroffene_kontennumber requiredResponse 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
titelstringinhaltstringquittierbarbooleanveroeffentlichtbooleanerneut_lesenbooleanResponse
titelstring requiredinhaltstring requiredfassungnumber requiredquittierbarboolean requiredveroeffentlichtboolean requiredaktualisiert_amtimestamp (ISO 8601) or null requiredbetroffene_kontennumber requiredResponse 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 querysearchstring or null querylimitnumber queryResponse
timestring requiredlevelstring requiredloggerstring requiredmessagestring requiredrequest_idstring or nulluserstring or nullResponse 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
modestring requireduntilstring or nullfixed_by_envbooleanmodeslist of stringdurationslist of numberResponse 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
modequiet | normal | detailed | trace requiredminutesnumberResponse
modestring requireduntilstring or nullfixed_by_envbooleanmodeslist of stringdurationslist of numberResponse 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 queryRequest body
tmdb_api_keystring or nullradarr_urlstring or nullradarr_api_keystring or nullsonarr_urlstring or nullsonarr_api_keystring or nullradarr_namestring or nullsonarr_namestring or nullradarr_uhd_namestring or nullsonarr_uhd_namestring or nulldefault_regionstring or nulldefault_languagestring or nullpoll_interval_secondsnumber or nulldemo_modestring or nullbeschaffungstring or nullnexcrate_urlstring or nullnexcrate_api_keystring or nullnexcrate_namestring or nullnexcrate_anzeigenameboolean or nulldefault_movie_profile_idstring or nulldefault_series_profile_idstring or nullmovie_root_folder_modestring or nullseries_root_folder_modestring or nullmovie_profile_modestring or nullseries_profile_modestring or nullmovie_uhd_root_folder_modestring or nullseries_uhd_root_folder_modestring or nullmovie_uhd_profile_modestring or nullseries_uhd_profile_modestring or nulldefault_movie_rootstring or nulldefault_series_rootstring or nullradarr_uhd_urlstring or nullradarr_uhd_api_keystring or nullsonarr_uhd_urlstring or nullsonarr_uhd_api_keystring or nulldefault_movie_uhd_profile_idstring or nulldefault_series_uhd_profile_idstring or nulldefault_movie_uhd_rootstring or nulldefault_series_uhd_rootstring or nullsmtp_hoststring or nullsmtp_portnumber or nullsmtp_securitystring or nullsmtp_usernamestring or nullsmtp_passwordstring or nullsmtp_from_addressstring or nullsmtp_from_namestring or nullpublic_urlstring or nullwebhook_basis_urlstring or nullupdate_checkboolean or nullpassword_loginboolean or nullbackup_scheduleoff | daily | weekly | monthly or nullbackup_keepnumber or nullmediaserver_auto_importboolean or nullmediaserver_default_rolestring or nullwatchlist_enabledboolean or nullepisode_requests_enabledboolean or nullquota_default_moviesnumber or nullquota_default_seriesnumber or nullstorage_default_limit_gbnumber or nullquota_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
kennungstring requiredoffen_fuer_alleboolean requiredResponse
kennungstring requiredmedia_typestring requirednamestring requiredklassestring or nullquellestring requiredhauptbooleanbereitbooleanoffen_fuer_allebooleanapprover_picks_targetbooleandarf_anfragenbooleanauto_freigabebooleanResponse 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
kollisionenlist of KollisionOut requiredResponse 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
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
instanzenlist of GesundheitInstanz requiredResponse 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
instanzenlist of VerbindungInstanz requiredResponse 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
urlstring requiredResponse
pairing_idstring requiredcodestring requiredpoll_secondsnumber requiredexpires_atstring or nullResponse 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 requiredResponse
statestring requiredgespeichertbooleaninstallation_idstringversionstringfassungennumberpruefunglist of objectResponse 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
eingerichtetboolean requirederreichbarboolean requiredversionstringvertragstringinstallation_idstringweb_urlstringupdate_verfuegbarbooleanupdate_versionstringanimebooleanfassungenlist of objectproblemelist of objectpruefunglist of objectfehlerstringResponse 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
urlstring or nullapi_keystring or nullResponse
okboolean requiredmessagestring requiredResponse 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
idnumber requirednamestring requireddienststring requiredrezeptobject requiredinstallationenlist of InstallationOut requiredResponse 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
namestring requireddienstradarr | sonarr requiredrezeptobject requiredResponse
idnumber requirednamestring requireddienststring requiredrezeptobject requiredinstallationenlist of InstallationOut requiredResponse 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
profil_idnumber requiredkennungstring requiredstandstring requiredunterschiedelist of UnterschiedOutResponse 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
kennungstring requirednamestring requireddienststring requiredumbenennen_anboolean requireddatei_iststringdatei_sollstringordner_iststringordner_sollstringfassungstringerreichbarbooleanmeldet_medienserverbooleanaltnamenAltnamenOutlauf_offenbooleanResponse 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
kennungstring requireddateibooleanordnerbooleanbestandbooleanResponse
kennungstring requirednamestring requireddienststring requiredumbenennen_anboolean requireddatei_iststringdatei_sollstringordner_iststringordner_sollstringfassungstringerreichbarbooleanmeldet_medienserverbooleanaltnamenAltnamenOutlauf_offenbooleanResponse 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 requiredResponse
umbenanntnumberaltnamenAltnamenOutResponse 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 requiredResponse
laeuftbooleaninstanzstringschrittstringerledigtnumbergesamtnumberbetroffennumberbeispielelist of stringfortgesetztbooleanResponse 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
kennungstring requirednamestring requirederreichbarbooleanprofilelist of ProfilBestandOutmusterlist of MusterBestandOutResponse 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 requiredRequest body
profil_idslist of numbermuster_idslist of numberResponse
geloescht_profilelist of stringgeloescht_musterlist of stringabgelehntobjectResponse 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 requiredRequest body
vonnumber requirednachnumber requiredResponse
umgehaengtnumbergrundstringResponse 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
dateiobject requiredResponse
neulist of stringschon_dalist of stringbefundelist of UmzugBefundOutResponse 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
dateiobject requiredResponse
neulist of stringschon_dalist of stringbefundelist of UmzugBefundOutResponse 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
serverlist of MedienserverOutinstanzenlist of VerbindungslageOutwarnungenlist of WarnungOutResponse 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
server_idnumber requiredschluesselstring
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
kennungenlist of stringResponse
hergestelltnumbergescheitertlist of stringResponse 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
standstring requiredquellestring requiredlizenzstring requiredcommitstringmitgeliefertbooleangeholt_amstringpruefung_bekanntbooleanneuer_stand_dabooleanneuer_stand_datumstringResponse 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
standstring requiredcommitstring requiredgeholt_amstring requiredResponse 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 requiredResponse
laeuftbooleaninstanzstringschrittstringerledigtnumbergesamtnumberinstanz_nummernumbervon_instanzennumberResponse 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 requiredRequest body
kennungenlist of stringResponse
installationenlist of InstallationOut requiredformate_neunumberformate_wiederverwendetnumberhinweiselist of stringResponse 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
enabledboolean requiredcompleteboolean requiredinstanceslist of PapierkorbInstanz requiredResponse 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
instanceslist of PapierkorbWunsch requiredcleanup_daysnumberResponse
enabledboolean requiredcompleteboolean requiredinstanceslist of PapierkorbInstanz requiredResponse 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 querytierstandard | uhd or null querypathstring queryResponse
instanceslist of PapierkorbInhaltInstanz requiredResponse 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 requiredtierstandard | uhd querypathstring queryResponse
pathstring requireddirectorieslist of string requiredResponse 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
recipientstring requiredResponse
okboolean requiredmessagestring requiredResponse 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
urlstring requiredResponse
okboolean requiredmessagestring requiredResponse 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
hoststring or nullportnumber or nullsecuritystring or nullusernamestring or nullpasswordstring or nullResponse
okboolean requiredmessagestring requiredResponse 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
api_keystring or nullurlstring or nullResponse
okboolean requiredmessagestring requiredResponse 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 requiredRequest body
api_keystring or nullurlstring or nullResponse
okboolean requiredmessagestring requiredResponse 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
basisstring requiredinstanzenlist of WebhookInstanzStand requiredResponse 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 requiredRequest body
aktivboolean requiredResponse
basisstring requiredinstanzenlist of WebhookInstanzStand requiredResponse 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 requiredResponse
angekommenboolean requireddauer_msnumber or nullfehlerstring or nullinfostring or nullResponse 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
pruefunglist of objectsperrtbooleanarr_fassungenlist of objectnex_fassungenlist of objectvorschlagobjectResponse 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
gereichtnumber requiredliegennumberweiterboolean requiredResponse 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
abbildungobject requiredResponse
fehlerlist of stringbekanntnumberohne_fassungnumberunbekanntnumberanime_offennumberrechte_entfallennumberzu_entscheidenlist of objectResponse 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
sicherungSicherungAntwort or nullResponse 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
namestring requiredgroessenumber requirederstelltstring requiredResponse 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
abbildungobject requiredsicherungstring requiredposten_ohne_gegenstueck_behaltenbooleanResponse
fassungennumber requiredverlassenlist of object requiredanfragennumber requiredanfragen_ohne_uebersetzungnumberpostennumber requiredposten_schluesselnumber requiredposten_ohne_uebersetzungnumber requiredposten_doppeltnumberrechtenumber requiredrechte_entfallennumbereinladungennumber requiredregelnnumber requiredzeilen_entferntnumber requiredResponse 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
downloads_laufendnumber requiredanfragen_offennumber requiredpostennumber requiredinstanzenlist of string requiredResponse 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