Betrieb
94 Adressen. Ohne Zusage — sie gehören zum Innenteil der Anwendung und können sich mit jeder Fassung ändern. Wer sich auf etwas verlassen muss, nimmt die zugesagten neunzehn.
GET
/api/about
may change
Version and build
Which version of Nexview this is, and whether a newer one is known. Useful for telling deployments apart and for deciding whether a feature you rely on exists yet.
Felder und Aufbau
Antwort
versionText Pflichtrepo_urlText Pflichtrelease_urlText PflichtlicenseTextupdate_checkedja/neinlatest_versionText oder nullupdate_availableja/neinchecked_atZeitpunkt (ISO 8601) oder nullAufbau der Antwort
{
"version": "string",
"repo_url": "string",
"release_url": "string",
"license": "string",
"update_checked": "boolean",
"latest_version": "string | null",
"update_available": "boolean",
"checked_at": "ISO 8601 | null"
}
POST
/api/about/check
may change
Check for updates now
Looks for a newer release immediately instead of waiting for the daily check.
Felder und Aufbau
Antwort
versionText Pflichtrepo_urlText Pflichtrelease_urlText PflichtlicenseTextupdate_checkedja/neinlatest_versionText oder nullupdate_availableja/neinchecked_atZeitpunkt (ISO 8601) oder nullAufbau der Antwort
{
"version": "string",
"repo_url": "string",
"release_url": "string",
"license": "string",
"update_checked": "boolean",
"latest_version": "string | null",
"update_available": "boolean",
"checked_at": "ISO 8601 | null"
}
GET
/api/about/neuigkeiten
may change
Is there something new to read
Whether this installation has been updated since the administrator last acknowledged the release notes, and to which version.
Felder und Aufbau
Antwort
versionText Pflichtoffenja/nein Pflichtzuletzt_gesehenText oder nullAufbau der Antwort
{
"version": "string",
"offen": "boolean",
"zuletzt_gesehen": "string | null"
}
POST
/api/about/neuigkeiten/gesehen
may change
Acknowledge the release notes
"Understood, stop showing this" - until the next update. What is stored is the version, not a tick, so the banner comes back by itself after the next release that has something to say.
Felder und Aufbau
Antwort
versionText Pflichtoffenja/nein Pflichtzuletzt_gesehenText oder nullAufbau der Antwort
{
"version": "string",
"offen": "boolean",
"zuletzt_gesehen": "string | null"
}
GET
/api/admin/analyse
may change
Everything the analysis page shows
The numbers behind the Statistics & analysis page: every Radarr and Sonarr instance with its state, the disks, what the library holds, how the sources compare, and how Nexview itself is doing. One call rather than five, so switching between the tabs never reloads. Nothing is measured here - everything comes from what the background round has already collected, which is why the answer is immediate even on a large library. Administrators only.
Felder und Aufbau
Antwort
instanzenListe von InstanzZeile PflichttraegerListe von TraegerZeile Pflichtverlauf_tageZahl PflichtbibliothekBibliothekZahlen PflichtabgleichAbgleichZahlen PflichtbetriebBetriebZahlen PflichtAufbau der Antwort
{
"instanzen": [
{
"kennung": "string",
"name": "string",
"media_type": "string",
"tier": "string",
"erreichbar": "boolean",
"erreichbar_seit": "ISO 8601 | null",
"gemessen_am": "ISO 8601 | null",
"version": "string",
"neuere_version": "string | null",
"warteschlange": "number | null",
"warteschlange_haengt": "number | null",
"luecken": "number | null",
"luecken_einheit": "string | null",
"meldungen": [
{}
]
}
],
"traeger": [
{
"gesamt_bytes": "number",
"frei_bytes": "number",
"belegt_anteil": "number",
"ordner": [
"string"
]
}
],
"verlauf_tage": "number",
"bibliothek": {
"posten": "number",
"medien_bytes": "number",
"hausbestand_bytes": "number",
"zugerechnet_bytes": "number",
"geisterposten": "number",
"geisterposten_bytes": "number"
},
"abgleich": {
"moeglich": "boolean",
"arr_ohne_server": "number",
"server_ohne_arr": "number",
"nicht_erkannt": "number",
"doppelt": "number",
"jahr_widerspruch": "number",
"anbieter_luecke": "number",
"je_anbieter": "object",
"beispiele": "object"
},
"betrieb": {
"sicherungen": "number",
"sicherung_letzte": "string | null",
"sicherung_takt": "string",
"mail_offen": "number",
"mail_aufgegeben": "number",
"protokoll_fehler_24h": "number",
"protokoll_stufe": "string",
"version": "string",
"neueste_version": "string | null"
}
}
GET
/api/admin/analyse/laufend
may change
What is playing right now
Live sessions across every connected media server: who, what, on which device, how far in, and how hard the server is working for it.
Transcoding has three states, not two, and the difference matters. Measured against real servers, both Plex and Emby reported a transcode while passing the video through untouched and only re-encoding the audio - that costs almost nothing. Only bild means the video itself is being re-encoded, and that is the one that eats CPU.
This is the only call on the analysis page that contacts the providers live; everything else is read from what the background round already collected. Each provider gets its own short timeout, so one stalled server cannot hold up the rest.
Administrators only.
Felder und Aufbau
Antwort
wiedergabenListe von app__routers__analyse__LaufendeZeile Pflichtbild_umrechnungenZahl PflichtAufbau der Antwort
{
"wiedergaben": [
{
"provider": "string",
"konto": "string",
"user_id": "number | null",
"avatar_url": "string | null",
"titel": "string",
"serie": "string",
"media_type": "string",
"fortschritt": "number | null",
"geraet": "string",
"anwendung": "string",
"pausiert": "boolean",
"umrechnung": "string",
"grund": "string",
"beschleunigung": "string"
}
],
"bild_umrechnungen": "number"
}
GET
/api/admin/analyse/server-vergleich
may change
Which title is on which media server
One row per title, one cell per connected media server: present, missing, listed under a different ID, or the file is there but the server identified it as another title.
Titles are matched by TMDB, TVDB and IMDb, then by an ID in the file path, and titles without any ID by title and year. ansicht picks a view (unterschiede, andere_nummer, jahr, ohne_kennung, nur_arr, alle); fehlt_auf, art and suche narrow it, and suche also matches file paths. Paged.
Reads only what the last library sync stored; no server is asked.
Administrators only.
Felder und Aufbau
Parameter
ansichtunterschiede | andere_nummer | jahr | ohne_kennung | nur_arr | alle queryartalle | movie | tv queryfehlt_aufText oder null querysucheText oder null queryseiteZahl querypro_seiteZahl queryAntwort
moeglichja/nein PflichtserverListe von VergleichServer PflichtanzahlObjekt PflichtzeilenListe von VergleichZeile PflichtgesamtZahl PflichtseiteZahl PflichtseitenZahl PflichtAufbau der Antwort
{
"moeglich": "boolean",
"server": [
{
"anbieter": "string",
"filme": "number",
"serien": "number",
"fehlen": "number"
}
],
"anzahl": "object",
"zeilen": [
{
"kennung": "string",
"titel": "string",
"jahr": "number | null",
"art": "string",
"zuordnung": "string",
"zellen": "object",
"jahr_uneinig": "boolean",
"ohne_kennung": "boolean"
}
],
"gesamt": "number",
"seite": "number",
"seiten": "number"
}
GET
/api/admin/analyse/server-vergleich/pfade
may change
Look up where one title lies on disk
The file or folder paths of one library entry. Plex lists series without their folder, so this asks the server for that one title and remembers the answer until the next library sync. Administrators only.
Felder und Aufbau
Parameter
anbieterText query PflichtschluesselText query PflichtAntwort
pfadeListe von Text PflichtAufbau der Antwort
{
"pfade": [
"string"
]
}
POST
/api/admin/analyse/server-vergleich/zuordnen
may change
Rematch one title on one media server
Changes metadata on the media server: the title is identified again by its TMDB or TVDB ID, the way Identify (Jellyfin, Emby) or Fix Match (Plex) does it. Never by name - a name search is how the wrong match usually came about.
Afterwards Nexview asks the server twice whether the new match is there. ergebnis is korrigiert, zurueckgesprungen when the server replaced it again by itself, or nicht_bestaetigt when it did not show up in time. Only runs when an administrator clicks; nothing calls it on its own.
Administrators only.
Felder und Aufbau
Anfragekörper
anbieterText PflichtschluesselText Pflichtartmovie | tv PflichttmdbZahl oder nulltvdbZahl oder nullAntwort
ergebnisText PflichttitelText oder null PflichtjahrZahl oder null PflichtAufbau der Antwort
{
"ergebnis": "string",
"titel": "string | null",
"jahr": "number | null"
}
GET
/api/admin/analyse/wiedergabe
may change
Who watched what, and how the library grew
Playback figures from the connected media servers, and how the collection has grown over the last eighteen months. This names people. Until 0.24 even an administrator saw only their own watch markers; the operator lifted that deliberately, because a tool meant to help run a household has to be able to say who pulls and who does not. Everything comes from data Nexview already holds - no media server is contacted for this call. Library growth uses the date the file carries, not the day Nexview first saw it; otherwise every grown installation would appear to have sprung into existence on setup day. Administrators only.
Felder und Aufbau
Antwort
monateListe von MonatsPunkt PflichtpersonenListe von SeherZeile PflichtbeliebtesteListe von GesehenerTitel PflichtbestandListe von BestandsPunkt PflichtangesehenZahl Pflichtbestand_gesamtZahl Pflichtkonten_mit_datenZahl PflichtspitzenListe von SpitzenTag Pflichtspitze_gesamtZahl PflichtAufbau der Antwort
{
"monate": [
{
"monat": "string",
"anzahl": "number"
}
],
"personen": [
{
"user_id": "number | null",
"name": "string",
"avatar_url": "string | null",
"anzahl": "number",
"zuletzt": "ISO 8601 | null"
}
],
"beliebteste": [
{
"tmdb_id": "number",
"media_type": "string",
"titel": "string",
"anzahl": "number"
}
],
"bestand": [
{
"monat": "string",
"posten": "number",
"bytes": "number"
}
],
"angesehen": "number",
"bestand_gesamt": "number",
"konten_mit_daten": "number",
"spitzen": [
{
"tag": "string",
"gleichzeitig": "number",
"bild_umrechnungen": "number"
}
],
"spitze_gesamt": "number"
}
GET
/api/admin/befunde
may change
Findings, optionally for one area
The same findings the dashboard shows, without the numbers around them. Pass bereich to narrow it down to one area: dienste, platz, nachschub, bibliothek or betrieb.
An unknown area returns an empty list rather than an error - the names travel with the interface, and a typo in an address should not produce a broken page.
Felder und Aufbau
Parameter
bereichText oder null queryAntwort
schluesselText PflichtkennungText PflichtschwereText PflichtbereichText PflichtwerteObjekt PflichtzielText oder null PflichtwortlautText oder null PflichtAufbau der Antwort
[
{
"schluessel": "string",
"kennung": "string",
"schwere": "string",
"bereich": "string",
"werte": "object",
"ziel": "string | null",
"wortlaut": "string | null"
}
]
GET
/api/admin/dashboard
may change
The operator dashboard in one call
Everything the operator dashboard shows: the open findings, how many there are of each severity, and the four numbers that are waiting for somebody.
Findings and numbers are deliberately two different things. A number like "three requests awaiting approval" is everyday business, not a fault; as a finding it would be a permanent alarm and would devalue the real findings next to it. A finding is an exception and disappears once it is dealt with.
Findings carry no ready-made sentence. Each one names an identifier (kennung) plus the values that belong in the text, so the caller can phrase it in the language of whoever is reading. wortlaut is the one exception: it holds what Radarr or Sonarr said, word for word and in English, because it is their statement and not ours.
Administrators only. Instance health, disk state and backups are an operator's business, not an approver's.
Felder und Aufbau
Antwort
befundeListe von BefundPublic PflichtzaehlerObjekt PflichtungesehenZahlzahlenHandlungsZahlen PflichtverlaufListe von VerlaufsPunkt PflichttraegerDatentraeger oder null PflichtAufbau der Antwort
{
"befunde": [
{
"schluessel": "string",
"kennung": "string",
"schwere": "string",
"bereich": "string",
"werte": "object",
"ziel": "string | null",
"wortlaut": "string | null"
}
],
"zaehler": "object",
"ungesehen": "number",
"zahlen": {
"freigaben_offen": "number",
"laeuft": "number",
"tickets_offen": "number",
"rueckmeldungen_offen": "number"
},
"verlauf": [
{
"tag": "string",
"belegt_bytes": "number",
"frei_bytes": "number"
}
],
"traeger": {
"gesamt_bytes": "number",
"frei_bytes": "number",
"medien_bytes": "number"
}
}
POST
/api/admin/dashboard/gesehen
may change
Mark the findings as seen
Records everything that currently applies as seen by this administrator, which is what puts the badge on the menu back to zero.
The findings themselves stay. They are states, not messages: "searching for over 14 days" is just as true tomorrow, and a finding disappears when the situation does, not when somebody reads it. Only the badge is cleared, so that it means "something new" again rather than sitting on the same digit for good.
Call this when the dashboard is opened, not when it is polled. The menu asks GET /admin/dashboard once a minute for its badge; if merely asking counted as seen, the badge would clear before anyone had looked at it.
A finding that bundles several cases comes back when it grows: the identifier stays the same whether one title is stuck or five, so the number of cases is remembered alongside it. Values that grow by themselves, such as "for X days", are deliberately ignored.
What each administrator has seen is kept for them alone.
GET
/api/admin/sicherungen
may change
All backups
What backups exist, how big they are, when they were made, whether automatic or manual, and whether this version could restore each one.
Felder und Aufbau
Antwort
eintraegeListe von SicherungPublic PflichtversionText PflichtordnerText PflichtAufbau der Antwort
{
"eintraege": [
{
"name": "string",
"groesse": "number",
"erstellt": "string",
"art": "string",
"kommentar": "string",
"version": "string",
"einspielbar": "boolean",
"grund": "string"
}
],
"version": "string",
"ordner": "string"
}
POST
/api/admin/sicherungen
may change
Make a backup now
Writes a fresh backup and marks it as manual. Caches are stripped - they are nine tenths of the database and Nexview fetches them again by itself.
Felder und Aufbau
Anfragekörper
kommentarTextAntwort
nameText PflichtgroesseZahl PflichterstelltText PflichtartText PflichtkommentarText PflichtversionText Pflichteinspielbarja/nein PflichtgrundText PflichtAufbau der Antwort
{
"name": "string",
"groesse": "number",
"erstellt": "string",
"art": "string",
"kommentar": "string",
"version": "string",
"einspielbar": "boolean",
"grund": "string"
}
POST
/api/admin/sicherungen/einspielen
may change
Restore into the running installation
⚠️ Afterwards nobody is signed in any more, including whoever triggered it - the accounts in the backup may not be the ones from a minute ago. A safety copy of the current state is written first.
Felder und Aufbau
Antwort
versionText PflichterstelltText PflichtartText PflichtkommentarText Pflichteinspielbarja/nein PflichtgrundText Pflichtschluessel_aus_umgebungja/nein Pflichtschluessel_im_archivja/nein PflichtAufbau der Antwort
{
"version": "string",
"erstellt": "string",
"art": "string",
"kommentar": "string",
"einspielbar": "boolean",
"grund": "string",
"schluessel_aus_umgebung": "boolean",
"schluessel_im_archiv": "boolean"
}
POST
/api/admin/sicherungen/pruefen
may change
Inspect a backup
Reports what is in it and whether this version can restore it. Nothing is replaced. A backup from a newer version is refused: the database can only be migrated forward.
Felder und Aufbau
Antwort
versionText PflichterstelltText PflichtartText PflichtkommentarText Pflichteinspielbarja/nein PflichtgrundText Pflichtschluessel_aus_umgebungja/nein Pflichtschluessel_im_archivja/nein PflichtAufbau der Antwort
{
"version": "string",
"erstellt": "string",
"art": "string",
"kommentar": "string",
"einspielbar": "boolean",
"grund": "string",
"schluessel_aus_umgebung": "boolean",
"schluessel_im_archiv": "boolean"
}
DELETE
/api/admin/sicherungen/{name}
may change
Delete a backup
⚠️ A delete button next to backups removes exactly what matters in an emergency, so callers are expected to ask first.
Felder und Aufbau
Parameter
nameText path Pflicht
POST
/api/admin/sicherungen/{name}/archiv
may change
Download a backup as an encrypted ZIP
⚠️ Deliberately POST and not GET: the password belongs in the body. In an address it would end up in the browser history and in every proxy log along the way. The archive is a plain AES ZIP - openable with 7-Zip, so nobody depends on Nexview to get at their own data.
Felder und Aufbau
Parameter
nameText path PflichtAnfragekörper
passwortText Pflicht
GET
/api/admin/stats
may change
Numbers for the dashboard
Counts for requests, downloads, quotas and ratings across the installation.
Felder und Aufbau
Antwort
totalsTotalsPublic PflichtusersListe von UserStatsPublic PflichthistoryListe von MonthPoint Pflichtmost_requestedListe von PopularTitle PflichtAufbau der Antwort
{
"totals": {
"requests": "number",
"movies": "number",
"series": "number",
"downloaded": "number",
"downloaded_movies": "number",
"downloaded_series": "number",
"pending": "number",
"rejected": "number",
"cancelled": "number",
"failed": "number",
"active_users": "number",
"ratings": "number",
"average_rating": "number | null",
"poor_ratings": "number"
},
"users": [
{
"user_id": "number",
"username": "string",
"display_name": "string | null",
"avatar_url": "string | null",
"role": "string",
"total": "number",
"movies": "number",
"series": "number",
"downloaded": "number",
"pending": "number",
"rejected": "number",
"cancelled": "number",
"failed": "number",
"ratings": "number"
}
],
"history": [
{
"month": "string",
"movies": "number",
"series": "number"
}
],
"most_requested": [
{
"media_type": "string",
"tmdb_id": "number",
"title": "string",
"poster_path": "string | null",
"count": "number"
}
]
}
GET
/api/admin/stats/aufraeumen
may change
What nobody watches any more
Titles in the whole library that nobody has watched for a long time, largest first - including the house collection. Two clocks decide, not one: an item appears only if nobody watched it in the chosen period and it has been here at least that long. Without the second clock the 60 GiB file that arrived yesterday would top the list before anyone had a chance to watch it. Administrators only, unlike the rest of the statistics: acting on this list is an administrator's job anyway, and the rows name who last watched what.
Felder und Aufbau
Parameter
monateZahl querygrenzeZahl querysucheText queryartmovie | tv oder null querynur_vorgemerktja/nein queryAntwort
postenListe von AufraeumPosten Pflichtgesamt_anzahlZahl Pflichtgesamt_bytesZahl PflichtmonateZahl PflichtgrundlageAufraeumGrundlage Pflichtohne_datumZahl Pflichtgesehen_ohne_datumZahlAufbau der Antwort
{
"posten": [
{
"posten_id": "number",
"media_type": "string",
"tmdb_id": "number | null",
"tvdb_id": "number | null",
"season": "number | null",
"fassung": "string",
"title": "string",
"size_bytes": "number",
"state": "string",
"besitzer": "string | null",
"zuletzt_gesehen": "ISO 8601 | null",
"gesehen_von": [
"string"
],
"bewertung": "number | null",
"bewertungen": "number"
}
],
"gesamt_anzahl": "number",
"gesamt_bytes": "number",
"monate": "number",
"grundlage": {
"konten_gesamt": "number",
"konten_verknuepft": "number",
"ohne_verknuepfung": [
"string"
],
"vollstaendig": "boolean"
},
"ohne_datum": "number",
"gesehen_ohne_datum": "number"
}
GET
/api/beschaffung/papierkorb
may change
What was deleted and can come back
One entry per file, newest first, with who deleted it and when. Two separate kinds of no: the file may be gone (or its disk out of sight), or the title may have left the library - either way it cannot be restored, and both are stated. Answers 409 where procurement keeps a recycle folder instead of a list, because nothing comes back out of a folder.
Felder und Aufbau
Antwort
eintraegeListe von PapierkorbZeilesprungTextAufbau der Antwort
{
"eintraege": [
{
"eintrag_id": "number",
"media_type": "string",
"tmdb_id": "number | null",
"name": "string | null",
"jahr": "number | null",
"fassung": "string | null",
"staffel": "number | null",
"folgen": [
"number"
],
"dateiname": "string",
"size_bytes": "number",
"geloescht_am": "string",
"geloescht_von": "string",
"geloescht_von_name": "string | null",
"datei_da": "boolean"
}
],
"sprung": "string"
}
POST
/api/beschaffung/papierkorb/{eintrag_id}/zurueckholen
may change
Restore a deleted file
Hands the entry back to procurement, which puts the file where it belongs and picks the title up again. Whether that is still possible is decided over there, in the same call - a check beforehand would be a second state that ages between question and deed.
Felder und Aufbau
Parameter
eintrag_idZahl path PflichtAntwort
createdja/neinAufbau der Antwort
{
"created": "boolean"
}
GET
/api/beschaffung/warum/{media_type}/{tmdb_id}
may change
Why a title has not arrived yet
One line per version: downloading, nothing found that fits the profile, not released yet, held back by a delay, and so on. Codes, never sentences - the interface builds the wording. ⚠️ The reason sits on the version, not on the title: a title can say 'nothing wanted' while one of its versions is being searched for. Radarr and Sonarr cannot answer this at all; then beantwortbar is false, which is not the same as 'nothing is wrong'.
Felder und Aufbau
Parameter
media_typemovie | tv path Pflichttmdb_idZahl path PflichtAntwort
beantwortbarja/nein Pflichtbekanntja/neinautomatischja/neinsuchwunschja/neinzuletzt_gesuchtText oder nullnaechste_sucheText oder nullgruendeListe von GrundZeileAufbau der Antwort
{
"beantwortbar": "boolean",
"bekannt": "boolean",
"automatisch": "boolean",
"suchwunsch": "boolean",
"zuletzt_gesucht": "string | null",
"naechste_suche": "string | null",
"gruende": [
{
"fassung": "string",
"code": "string",
"werte": "object",
"darunter": [
"string"
]
}
]
}
GET
/api/config
may change
Public configuration
What the interface needs to know before anybody signs in: which media-server providers exist, whether watchlists are enabled, the minimum password length, the default region.
Felder und Aufbau
Antwort
default_regionText Pflichtdefault_languageText Pflichttmdb_configuredja/nein PflichtbeschaffungText Pflichtbeschaffung_kannObjektbeschaffung_sprungObjektradarr_configuredja/nein Pflichtsonarr_configuredja/nein Pflichtusing_demo_dataja/nein Pflichtmin_password_lengthZahl Pflichtmail_configuredja/nein Pflichtpublic_url_setja/nein Pflichtapprover_picks_target_movieja/nein Pflichtapprover_picks_target_tvja/nein Pflichtapprover_picks_target_movie_uhdja/nein Pflichtapprover_picks_target_tv_uhdja/nein PflichtfassungenListe von FassungOeffentlich Pflichtradarr_uhd_configuredja/nein Pflichtsonarr_uhd_configuredja/nein Pflichtmediaserver_configuredja/nein Pflichtmediaserver_providersListe von Text Pflichtmediaserver_availableListe von Text Pflichtmediaserver_password_loginListe von Text Pflichtmediaserver_watchlist_availableListe von Text Pflichtmediaserver_watchlist_connectedListe von Text Pflichtwatchlist_enabledja/nein Pflichtepisode_requests_enabledja/nein Pflichthausordnung_vorhandenja/neinhausordnung_titelTexthausordnung_fassungZahlhausordnung_quittierbarja/neinhausordnung_gelesenZahl oder nullAufbau der Antwort
{
"default_region": "string",
"default_language": "string",
"tmdb_configured": "boolean",
"beschaffung": "string",
"beschaffung_kann": "object",
"beschaffung_sprung": "object",
"radarr_configured": "boolean",
"sonarr_configured": "boolean",
"using_demo_data": "boolean",
"min_password_length": "number",
"mail_configured": "boolean",
"public_url_set": "boolean",
"approver_picks_target_movie": "boolean",
"approver_picks_target_tv": "boolean"
}
GET
/api/config/regions
may change
Selectable regions
The countries somebody can pick as their region. Deliberately fetched from TMDB rather than kept in the source: a fixed list goes stale and silently limits who can use this.
Felder und Aufbau
Antwort
codeText PflichtnameText PflichtAufbau der Antwort
[
{
"code": "string",
"name": "string"
}
]
GET
/api/hausordnung
may change
Read the house rules
The operator's rule text, as an adult account sees it. Answers 404 while nothing is published - a draft belongs to the operator alone. "gelesen" carries the version this account has acknowledged, or null if it never has.
Felder und Aufbau
Antwort
titelText PflichtinhaltText PflichtfassungZahl Pflichtquittierbarja/nein PflichtgelesenZahl oder null Pflichtakzeptiertja/nein oder null PflichtAufbau der Antwort
{
"titel": "string",
"inhalt": "string",
"fassung": "number",
"quittierbar": "boolean",
"gelesen": "number | null",
"akzeptiert": "boolean | null"
}
GET
/api/hausordnung/bilder
may change
List the images
Administrators only: every image stored for the house rules, oldest first.
Felder und Aufbau
Antwort
nameText PflichtbytesZahl PflichtAufbau der Antwort
[
{
"name": "string",
"bytes": "number"
}
]
POST
/api/hausordnung/bilder
may change
Upload an image
Administrators only. The file is checked by its first bytes, not by its name or the content type the browser claims; SVG is refused because it can carry scripts. The stored name is random - the one supplied by the caller is never used.
Felder und Aufbau
Antwort
nameText PflichtbytesZahl PflichtAufbau der Antwort
{
"name": "string",
"bytes": "number"
}
DELETE
/api/hausordnung/bilder/{name}
may change
Delete one image
Administrators only. Images are never removed automatically when they drop out of the text: taking a paragraph out for a moment should not cost you the image.
Felder und Aufbau
Parameter
nameText path Pflicht
POST
/api/hausordnung/entscheidung
may change
Accept or decline the house rules
Records the calling account's decision together with the version that is currently published - not the one that happened to be on screen. Declining has no technical consequence: the account keeps every right it had. It is information for the operator, who decides what to do with it. Refused with 409 if the operator has switched the decision off entirely.
Felder und Aufbau
Anfragekörper
akzeptiertja/nein
GET
/api/hausordnung/uebersicht
may change
Who has decided, and how
Administrators only: every adult account with its decision and the date. Child accounts are left out - they never get to see the rules. An account that decided on an older version counts as undecided again, but the answer still says what it chose back then.
Felder und Aufbau
Antwort
user_idZahl PflichtusernameText Pflichtdisplay_nameText oder null Pflichtavatar_urlText oder null Pflichtroleadmin | approver | user | child Pflichtakzeptiertja/nein oder null Pflichtentschieden_amZeitpunkt (ISO 8601) oder null PflichtfassungZahl oder null PflichtAufbau der Antwort
[
{
"user_id": "number",
"username": "string",
"display_name": "string | null",
"avatar_url": "string | null",
"role": "admin | approver | user | child",
"akzeptiert": "boolean | null",
"entschieden_am": "ISO 8601 | null",
"fassung": "number | null"
}
]
DELETE
/api/hausordnung/verwaltung
may change
Remove the house rules
Deletes the text and every image with it. The button and the footer link disappear for everyone. Acknowledgements on the accounts stay; they cost nothing and would be outdated anyway.
GET
/api/hausordnung/verwaltung
may change
The house rules for editing
Administrators only. Unlike the public path this also returns an unpublished draft, plus how many accounts a "everyone reads it again" would affect.
Felder und Aufbau
Antwort
titelText PflichtinhaltText PflichtfassungZahl Pflichtquittierbarja/nein Pflichtveroeffentlichtja/nein Pflichtaktualisiert_amZeitpunkt (ISO 8601) oder null Pflichtbetroffene_kontenZahl PflichtAufbau der Antwort
{
"titel": "string",
"inhalt": "string",
"fassung": "number",
"quittierbar": "boolean",
"veroeffentlicht": "boolean",
"aktualisiert_am": "ISO 8601 | null",
"betroffene_konten": "number"
}
PUT
/api/hausordnung/verwaltung
may change
Write the house rules
Saves title, text and both switches. The version number only goes up when "erneut_lesen" is set - a corrected typo must not make the notice pop up for everyone again. Publishing an empty text is refused.
Felder und Aufbau
Anfragekörper
titelTextinhaltTextquittierbarja/neinveroeffentlichtja/neinerneut_lesenja/neinAntwort
titelText PflichtinhaltText PflichtfassungZahl Pflichtquittierbarja/nein Pflichtveroeffentlichtja/nein Pflichtaktualisiert_amZeitpunkt (ISO 8601) oder null Pflichtbetroffene_kontenZahl PflichtAufbau der Antwort
{
"titel": "string",
"inhalt": "string",
"fassung": "number",
"quittierbar": "boolean",
"veroeffentlicht": "boolean",
"aktualisiert_am": "ISO 8601 | null",
"betroffene_konten": "number"
}
GET
/api/health
may change
Is Nexview running
Answers without a token - a monitor that has to sign in first is not a monitor. Returns nothing but a status, on purpose: no version, no database state, nothing that would tell an unauthenticated caller about the installation.
DELETE
/api/logs
may change
Clear the log
Empties the log file. What is gone is gone; there is no second copy.
GET
/api/logs
may change
The most recent log lines
level means "this level and above". Administrators only - log lines name accounts and addresses.
Felder und Aufbau
Parameter
levelDEBUG | INFO | WARNING | ERROR | CRITICAL oder null querysearchText oder null querylimitZahl queryAntwort
timeText PflichtlevelText PflichtloggerText PflichtmessageText Pflichtrequest_idText oder nulluserText oder nullAufbau der Antwort
[
{
"time": "string",
"level": "string",
"logger": "string",
"message": "string",
"request_id": "string | null",
"user": "string | null"
}
]
GET
/api/logs/level
may change
Current log level
Which level is being written, and until when - the more talkative levels switch themselves off again.
Felder und Aufbau
Antwort
modeText PflichtuntilText oder nullfixed_by_envja/neinmodesListe von TextdurationsListe von ZahlAufbau der Antwort
{
"mode": "string",
"until": "string | null",
"fixed_by_env": "boolean",
"modes": [
"string"
],
"durations": [
"number"
]
}
PUT
/api/logs/level
may change
Change the log level
Takes effect immediately, without a restart. The talkative levels carry an expiry so a debugging session cannot quietly fill the disk for weeks.
Felder und Aufbau
Anfragekörper
modequiet | normal | detailed | trace PflichtminutesZahlAntwort
modeText PflichtuntilText oder nullfixed_by_envja/neinmodesListe von TextdurationsListe von ZahlAufbau der Antwort
{
"mode": "string",
"until": "string | null",
"fixed_by_env": "boolean",
"modes": [
"string"
],
"durations": [
"number"
]
}
GET
/api/settings
may change
All settings
The whole configuration of this installation. Secrets come back masked, never in the clear. Administrators only.
PUT
/api/settings
may change
Change settings
⚠️ An empty secret field means "unchanged", not "delete". Otherwise the masked value from the interface would be written back over the real one. Use the delete endpoint to actually remove a key.
Switching beschaffung from arr to nex is refused with 409 beschaffung_switch_needs_assistant as long as open requests, storage entries, rights, open invitations or rules still carry a Radarr or Sonarr version, or such a version was opened or closed for everyone against its default: only the switch assistant under /api/umstieg carries them over. Nothing from the request is saved then. Switching back from nex to arr is always allowed.
Felder und Aufbau
Parameter
confirm_addressja/nein queryAnfragekörper
tmdb_api_keyText oder nullradarr_urlText oder nullradarr_api_keyText oder nullsonarr_urlText oder nullsonarr_api_keyText oder nullradarr_nameText oder nullsonarr_nameText oder nullradarr_uhd_nameText oder nullsonarr_uhd_nameText oder nulldefault_regionText oder nulldefault_languageText oder nullpoll_interval_secondsZahl oder nulldemo_modeText oder nullbeschaffungText oder nullnexcrate_urlText oder nullnexcrate_api_keyText oder nullnexcrate_nameText oder nullnexcrate_anzeigenameja/nein oder nulldefault_movie_profile_idText oder nulldefault_series_profile_idText oder nullmovie_root_folder_modeText oder nullseries_root_folder_modeText oder nullmovie_profile_modeText oder nullseries_profile_modeText oder nullmovie_uhd_root_folder_modeText oder nullseries_uhd_root_folder_modeText oder nullmovie_uhd_profile_modeText oder nullseries_uhd_profile_modeText oder nulldefault_movie_rootText oder nulldefault_series_rootText oder nullradarr_uhd_urlText oder nullradarr_uhd_api_keyText oder nullsonarr_uhd_urlText oder nullsonarr_uhd_api_keyText oder nulldefault_movie_uhd_profile_idText oder nulldefault_series_uhd_profile_idText oder nulldefault_movie_uhd_rootText oder nulldefault_series_uhd_rootText oder nullsmtp_hostText oder nullsmtp_portZahl oder nullsmtp_securityText oder nullsmtp_usernameText oder nullsmtp_passwordText oder nullsmtp_from_addressText oder nullsmtp_from_nameText oder nullpublic_urlText oder nullwebhook_basis_urlText oder nullupdate_checkja/nein oder nullpassword_loginja/nein oder nullbackup_scheduleoff | daily | weekly | monthly oder nullbackup_keepZahl oder nullmediaserver_auto_importja/nein oder nullmediaserver_default_roleText oder nullwatchlist_enabledja/nein oder nullepisode_requests_enabledja/nein oder nullquota_default_moviesZahl oder nullquota_default_seriesZahl oder nullstorage_default_limit_gbZahl oder nullquota_periodday | week | month oder null
PUT
/api/settings/fassungen
may change
Open versions to everyone
Decides per version whether anyone may request it, or whether the right is handed out per account. A version that has no row yet cannot be opened - in nexcrate mode the rows appear when Nexview reads the versions.
Felder und Aufbau
Anfragekörper
kennungText Pflichtoffen_fuer_alleja/nein PflichtAntwort
kennungText Pflichtmedia_typeText PflichtnameText PflichtklasseText oder nullquelleText Pflichthauptja/neinbereitja/neinoffen_fuer_alleja/neinapprover_picks_targetja/neindarf_anfragenja/neinauto_freigabeja/neinAufbau der Antwort
[
{
"kennung": "string",
"media_type": "string",
"name": "string",
"klasse": "string | null",
"quelle": "string",
"haupt": "boolean",
"bereit": "boolean",
"offen_fuer_alle": "boolean",
"approver_picks_target": "boolean",
"darf_anfragen": "boolean",
"auto_freigabe": "boolean"
}
]
GET
/api/settings/instanzen/downloadkollision
may change
Do two instances share a download category
Radarr and Sonarr only see what sits in their own category of the download client. If two instances share one, each grabs the downloads the other one queued: requests hang, files land in the wrong place, and no error appears anywhere - so the operator goes looking at the network. Radarr cannot warn about this: it does not know the second instance exists. Nexview does.
Felder und Aufbau
Antwort
kollisionenListe von KollisionOut PflichtAufbau der Antwort
{
"kollisionen": [
{
"schluessel": "string",
"programm": "string",
"kategorie": "string",
"ohne_kategorie": "boolean",
"instanzen": [
"string"
],
"kennungen": [
"string"
]
}
]
}
POST
/api/settings/instanzen/downloadkollision/ignorieren
may change
Stop reporting this collision
Some setups share a category on purpose. Dismissing is permanent, but tied to the instances involved - adding a third one to the same category reports again, because that is a new mistake and not a dismissed old one.
Felder und Aufbau
Anfragekörper
schluesselText Pflicht
GET
/api/settings/instanzen/gesundheit
may change
Health problems the instances report
The last seen /health state of every configured Radarr/Sonarr instance, refreshed each sync round. Messages are passed on in the instance’s own words.
Felder und Aufbau
Antwort
instanzenListe von GesundheitInstanz PflichtAufbau der Antwort
{
"instanzen": [
{
"kennung": "string",
"name": "string",
"probleme": [
{}
],
"aktualisiert_am": "ISO 8601 | null"
}
]
}
GET
/api/settings/instanzen/verbindung
may change
Reachability of the instances
Asks every configured Radarr/Sonarr instance for its status, all at once and with a short timeout - the live source of the status light on the instance tiles. Nothing is stored.
Felder und Aufbau
Antwort
instanzenListe von VerbindungInstanz PflichtAufbau der Antwort
{
"instanzen": [
{
"kennung": "string",
"name": "string",
"erreichbar": "boolean",
"version": "string"
}
]
}
DELETE
/api/settings/instanzen/{kennung}
may change
Remove access to one instance
Clears the stored address, key, name and per-instance rules of one Radarr/Sonarr instance - nothing changes inside the instance itself, except that Nexview removes its own webhook entry first. Running requests of that instance stay put and simply stop updating.
Felder und Aufbau
Parameter
kennungText path Pflicht
POST
/api/settings/nexcrate/pairing
may change
Ask nexcrate for a key
Starts a pairing request. The operator confirms it in nexcrate; the secret of the request stays in this process and never reaches the browser.
Felder und Aufbau
Anfragekörper
urlText PflichtAntwort
pairing_idText PflichtcodeText Pflichtpoll_secondsZahl Pflichtexpires_atText oder nullAufbau der Antwort
{
"pairing_id": "string",
"code": "string",
"poll_seconds": "number",
"expires_at": "string | null"
}
GET
/api/settings/nexcrate/pairing/{pairing_id}
may change
Ask whether pairing was confirmed
nexcrate hands out the key exactly once, so it is stored before anything else happens. On success the answer also carries the installation and how many versions were found.
Felder und Aufbau
Parameter
pairing_idText path PflichtAntwort
stateText Pflichtgespeichertja/neininstallation_idTextversionTextfassungenZahlpruefungListe von ObjektAufbau der Antwort
{
"state": "string",
"gespeichert": "boolean",
"installation_id": "string",
"version": "string",
"fassungen": "number",
"pruefung": [
"object"
]
}
GET
/api/settings/nexcrate/status
may change
What nexcrate reports about itself
Version, contract stage, update hint, the versions it offers with their readiness, and its open health findings. A new installation id under the same address drops the stored markers.
Felder und Aufbau
Antwort
eingerichtetja/nein Pflichterreichbarja/nein PflichtversionTextvertragTextinstallation_idTextweb_urlTextupdate_verfuegbarja/neinupdate_versionTextanimeja/neinfassungenListe von ObjektproblemeListe von ObjektpruefungListe von ObjektfehlerTextAufbau der Antwort
{
"eingerichtet": "boolean",
"erreichbar": "boolean",
"version": "string",
"vertrag": "string",
"installation_id": "string",
"web_url": "string",
"update_verfuegbar": "boolean",
"update_version": "string",
"anime": "boolean",
"fassungen": [
"object"
],
"probleme": [
"object"
],
"pruefung": [
"object"
],
"fehler": "string"
}
POST
/api/settings/nexcrate/test
may change
Test the connection to nexcrate
Checks whether a nexcrate answers at that address and accepts the key. Uses the values passed in if they have not been saved yet.
Felder und Aufbau
Anfragekörper
urlText oder nullapi_keyText oder nullAntwort
okja/nein PflichtmessageText PflichtAufbau der Antwort
{
"ok": "boolean",
"message": "string"
}
GET
/api/settings/qualitaetsprofile
may change
Quality profiles kept in Nexview
The profiles you created here, each with the instances it has been written to. A profile lives in Nexview; the copies on the instances are made from it.
Felder und Aufbau
Antwort
idZahl PflichtnameText PflichtdienstText PflichtrezeptObjekt PflichtinstallationenListe von InstallationOut PflichtAufbau der Antwort
[
{
"id": "number",
"name": "string",
"dienst": "string",
"rezept": "object",
"installationen": [
{
"kennung": "string",
"geschrieben_am": "string | null",
"trash_stand": "string"
}
]
}
]
POST
/api/settings/qualitaetsprofile
may change
Keep a new quality profile
Stores the answers from the guide. Nothing is written to Radarr or Sonarr yet - that is a separate step.
Felder und Aufbau
Anfragekörper
nameText Pflichtdienstradarr | sonarr PflichtrezeptObjekt PflichtAntwort
idZahl PflichtnameText PflichtdienstText PflichtrezeptObjekt PflichtinstallationenListe von InstallationOut PflichtAufbau der Antwort
{
"id": "number",
"name": "string",
"dienst": "string",
"rezept": "object",
"installationen": [
{
"kennung": "string",
"geschrieben_am": "string | null",
"trash_stand": "string"
}
]
}
GET
/api/settings/qualitaetsprofile/abgleich
may change
Do the copies still match
Asks every instance whether the profile written there still looks the way Nexview left it, and whether the guide data has moved on since. Separate from the list so a silent instance cannot hold up the page.
Felder und Aufbau
Antwort
profil_idZahl PflichtkennungText PflichtstandText PflichtunterschiedeListe von UnterschiedOutAufbau der Antwort
[
{
"profil_id": "number",
"kennung": "string",
"stand": "string",
"unterschiede": [
{
"art": "string",
"was": "string",
"ist": "string",
"soll": "string"
}
]
}
]
GET
/api/settings/qualitaetsprofile/ausfuhr
may change
Take the profile store with you
Every profile kept in Nexview as one file: names, recipes and the instances each was last written to. It carries no credentials and no keys, so it can be handed to somebody else. Needed because Nexview keeps the record of ownership in its own database only - a fresh installation pointed at the same Radarr stands before its own profiles as before strangers.
GET
/api/settings/qualitaetsprofile/benennung
may change
How each instance names files and folders
What is set right now, next to what the TRaSH Guides recommend for the media server you have connected.
Felder und Aufbau
Antwort
kennungText PflichtnameText PflichtdienstText Pflichtumbenennen_anja/nein Pflichtdatei_istTextdatei_sollTextordner_istTextordner_sollTextfassungTexterreichbarja/neinmeldet_medienserverja/neinaltnamenAltnamenOutlauf_offenja/neinAufbau der Antwort
[
{
"kennung": "string",
"name": "string",
"dienst": "string",
"umbenennen_an": "boolean",
"datei_ist": "string",
"datei_soll": "string",
"ordner_ist": "string",
"ordner_soll": "string",
"fassung": "string",
"erreichbar": "boolean",
"meldet_medienserver": "boolean",
"altnamen": {
"gesamt": "number",
"im_dateinamen": "number",
"blockiert": "number",
"beispiele": [
"string"
],
"blockierte_namen": [
"string"
]
},
"lauf_offen": "boolean"
}
]
PUT
/api/settings/qualitaetsprofile/benennung
may change
Adopt the recommended naming scheme
Sets the file and/or folder scheme on one instance. It applies to what the instance writes from now on; files already on disk are not touched. Renaming an existing library is a separate step in Radarr or Sonarr, with consequences for seeding and the media server.
Felder und Aufbau
Anfragekörper
kennungText Pflichtdateija/neinordnerja/neinbestandja/neinAntwort
kennungText PflichtnameText PflichtdienstText Pflichtumbenennen_anja/nein Pflichtdatei_istTextdatei_sollTextordner_istTextordner_sollTextfassungTexterreichbarja/neinmeldet_medienserverja/neinaltnamenAltnamenOutlauf_offenja/neinAufbau der Antwort
{
"kennung": "string",
"name": "string",
"dienst": "string",
"umbenennen_an": "boolean",
"datei_ist": "string",
"datei_soll": "string",
"ordner_ist": "string",
"ordner_soll": "string",
"fassung": "string",
"erreichbar": "boolean",
"meldet_medienserver": "boolean",
"altnamen": {
"gesamt": "number",
"im_dateinamen": "number",
"blockiert": "number",
"beispiele": [
"string"
],
"blockierte_namen": [
"string"
]
},
"lauf_offen": "boolean"
}
POST
/api/settings/qualitaetsprofile/benennung/{kennung}/altnamen
may change
Drop the old prefix from format names
Earlier versions prefixed every custom format Nexview created. That prefix reaches the file name whenever a format is marked to appear there, so a library rename would write it into thousands of files. This renames those formats back, keeping their ids so profiles keep pointing at them. Formats whose plain name is already taken by someone else are left untouched and reported.
Felder und Aufbau
Parameter
kennungText path PflichtAntwort
umbenanntZahlaltnamenAltnamenOutAufbau der Antwort
{
"umbenannt": "number",
"altnamen": {
"gesamt": "number",
"im_dateinamen": "number",
"blockiert": "number",
"beispiele": [
"string"
],
"blockierte_namen": [
"string"
]
}
}
GET
/api/settings/qualitaetsprofile/benennung/{kennung}/fortschritt
may change
How far the library rename has got
Radarr and Sonarr report only whether a command is running, never how far along it is, so Nexview splits the work into batches and counts them itself. Two phases: checking every title (read only), then renaming the ones that change.
Felder und Aufbau
Parameter
kennungText path PflichtAntwort
laeuftja/neininstanzTextschrittTexterledigtZahlgesamtZahlbetroffenZahlbeispieleListe von Textfortgesetztja/neinAufbau der Antwort
{
"laeuft": "boolean",
"instanz": "string",
"schritt": "string",
"erledigt": "number",
"gesamt": "number",
"betroffen": "number",
"beispiele": [
"string"
],
"fortgesetzt": "boolean"
}
GET
/api/settings/qualitaetsprofile/bestand
may change
Everything on the instances
Every quality profile and custom format that exists in Radarr and Sonarr, including the ones Nexview did not create, together with what depends on each: media, import lists and collections. The instances themselves refuse a deletion with "in use" without naming who is using it - this answers that question.
Felder und Aufbau
Antwort
kennungText PflichtnameText Pflichterreichbarja/neinprofileListe von ProfilBestandOutmusterListe von MusterBestandOutAufbau der Antwort
[
{
"kennung": "string",
"name": "string",
"erreichbar": "boolean",
"profile": [
{
"id": "number",
"name": "string",
"unser": "boolean",
"medien": "number",
"importlisten": "number",
"sammlungen": "number",
"loeschbar": "boolean",
"grund": "string"
}
],
"muster": [
{
"id": "number",
"name": "string",
"benutzt_von": [
"string"
],
"gehoert_zu_plan": "boolean",
"alter_vorsatz": "boolean",
"im_dateinamen": "boolean",
"loeschbar": "boolean"
}
]
}
]
POST
/api/settings/qualitaetsprofile/bestand/{kennung}/aufraeumen
may change
Remove selected profiles and formats
Deletes what the operator picked, checking each entry against the instance again immediately beforehand - what is in use by then is refused with the reason instead of forced. Profiles go first so that formats which only hung on them can follow in the same run. This is the one place where Nexview removes things it did not create; the mandate comes from the selection.
Felder und Aufbau
Parameter
kennungText path PflichtAnfragekörper
profil_idsListe von Zahlmuster_idsListe von ZahlAntwort
geloescht_profileListe von Textgeloescht_musterListe von TextabgelehntObjektAufbau der Antwort
{
"geloescht_profile": [
"string"
],
"geloescht_muster": [
"string"
],
"abgelehnt": "object"
}
POST
/api/settings/qualitaetsprofile/bestand/{kennung}/umhaengen
may change
Move media to another profile
Reassigns every movie or series that currently sits on one quality profile to another one. Files are not touched - only the assignment changes. This is what makes cleaning up possible at all: a profile cannot be deleted while media sit on it, and in a grown setup almost everything sits on profiles that predate Nexview. Note that the new profile scores differently, so titles whose existing file falls below it will be queued for an upgrade.
Felder und Aufbau
Parameter
kennungText path PflichtAnfragekörper
vonZahl PflichtnachZahl PflichtAntwort
umgehaengtZahlgrundTextAufbau der Antwort
{
"umgehaengt": "number",
"grund": "string"
}
POST
/api/settings/qualitaetsprofile/einfuhr
may change
Bring the profile store back
Adds the profiles to Nexview and takes over the copies found on the instances by name, recording their id. Nothing is written to Radarr or Sonarr - a copy that differs from its recipe is adopted as it stands and shown as adjusted. A name already in the store is skipped rather than overwritten.
Felder und Aufbau
Anfragekörper
dateiObjekt PflichtAntwort
neuListe von Textschon_daListe von TextbefundeListe von UmzugBefundOutAufbau der Antwort
{
"neu": [
"string"
],
"schon_da": [
"string"
],
"befunde": [
{
"name": "string",
"dienst": "string",
"kennung": "string",
"instanz": "string",
"lage": "string",
"profil_id_extern": "number | null",
"unterschiede": "number"
}
]
}
POST
/api/settings/qualitaetsprofile/einfuhr/vorschau
may change
What the import would do
Reads the file and looks at every instance: which profiles would be taken over, which differ from their recipe, which are not there at all. Changes nothing.
Felder und Aufbau
Anfragekörper
dateiObjekt PflichtAntwort
neuListe von Textschon_daListe von TextbefundeListe von UmzugBefundOutAufbau der Antwort
{
"neu": [
"string"
],
"schon_da": [
"string"
],
"befunde": [
{
"name": "string",
"dienst": "string",
"kennung": "string",
"instanz": "string",
"lage": "string",
"profil_id_extern": "number | null",
"unterschiede": "number"
}
]
}
GET
/api/settings/qualitaetsprofile/medienserver
may change
Which instance knows which media server
Radarr and Sonarr only tell a media server about imports, upgrades and renames when a connection is set up. This lists where one is missing.
Felder und Aufbau
Antwort
serverListe von MedienserverOutinstanzenListe von VerbindungslageOutwarnungenListe von WarnungOutAufbau der Antwort
{
"server": [
{
"id": "number",
"provider": "string",
"name": "string",
"url": "string",
"braucht_schluessel": "boolean",
"schluessel_da": "boolean"
}
],
"instanzen": [
{
"kennung": "string",
"name": "string",
"erreichbar": "boolean",
"fehlend": [
{}
],
"verbunden": [
"string"
]
}
],
"warnungen": [
{
"instanz": "string",
"provider": "string",
"grund": "string"
}
]
}
PUT
/api/settings/qualitaetsprofile/medienserver/schluessel
may change
Store the API key of a media server
Jellyfin and Emby need a key from their own dashboard. It is not the access Nexview itself uses: that one comes from a username and password and ends with the session.
Felder und Aufbau
Anfragekörper
server_idZahl PflichtschluesselText
POST
/api/settings/qualitaetsprofile/medienserver/verbinden
may change
Create the missing connections
Each one is tested from the instance first and only written when the test succeeds. A connection that never worked is worse than none, because nobody questions it later.
Felder und Aufbau
Anfragekörper
kennungenListe von TextAntwort
hergestelltZahlgescheitertListe von TextAufbau der Antwort
{
"hergestellt": "number",
"gescheitert": [
"string"
]
}
GET
/api/settings/qualitaetsprofile/quelle
may change
Which TRaSH snapshot is in use
Date, origin and licence of the guide data, whether it is still the bundled one, and whether a newer state has been seen.
Felder und Aufbau
Antwort
standText PflichtquelleText PflichtlizenzText PflichtcommitTextmitgeliefertja/neingeholt_amTextpruefung_bekanntja/neinneuer_stand_daja/neinneuer_stand_datumTextAufbau der Antwort
{
"stand": "string",
"quelle": "string",
"lizenz": "string",
"commit": "string",
"mitgeliefert": "boolean",
"geholt_am": "string",
"pruefung_bekannt": "boolean",
"neuer_stand_da": "boolean",
"neuer_stand_datum": "string"
}
POST
/api/settings/qualitaetsprofile/quelle/aktualisieren
may change
Fetch the current TRaSH state
Downloads the guide data from GitHub and adopts it, but only if every profile you keep can still be built from it. Nothing is written to Radarr or Sonarr by this: afterwards the comparison shows which copies have fallen behind, and you decide.
Felder und Aufbau
Antwort
standText PflichtcommitText Pflichtgeholt_amText PflichtAufbau der Antwort
{
"stand": "string",
"commit": "string",
"geholt_am": "string"
}
DELETE
/api/settings/qualitaetsprofile/{profil_id}
may change
Forget a quality profile
Removes it from Nexview. Copies already written to an instance stay there: deleting a profile that titles are assigned to would damage those titles.
Felder und Aufbau
Parameter
profil_idZahl path Pflicht
GET
/api/settings/qualitaetsprofile/{profil_id}/fortschritt
may change
How far the writing has got
Radarr and Sonarr accept detection patterns one at a time, so writing a profile keeps the connection open for a minute or more. This says which instance is being written and how many patterns are done.
Felder und Aufbau
Parameter
profil_idZahl path PflichtAntwort
laeuftja/neininstanzTextschrittTexterledigtZahlgesamtZahlinstanz_nummerZahlvon_instanzenZahlAufbau der Antwort
{
"laeuft": "boolean",
"instanz": "string",
"schritt": "string",
"erledigt": "number",
"gesamt": "number",
"instanz_nummer": "number",
"von_instanzen": "number"
}
PUT
/api/settings/qualitaetsprofile/{profil_id}/instanzen
may change
Decide where the profile lives
Writes the profile and its detection patterns to every instance listed, and stops managing it on the others. The list is the truth, not a set of changes.
Felder und Aufbau
Parameter
profil_idZahl path PflichtAnfragekörper
kennungenListe von TextAntwort
installationenListe von InstallationOut Pflichtformate_neuZahlformate_wiederverwendetZahlhinweiseListe von TextAufbau der Antwort
{
"installationen": [
{
"kennung": "string",
"geschrieben_am": "string | null",
"trash_stand": "string"
}
],
"formate_neu": "number",
"formate_wiederverwendet": "number",
"hinweise": [
"string"
]
}
GET
/api/settings/recyclebin
may change
Where deleted files go
The recycle-bin path configured in every Radarr and Sonarr instance. Fetched fresh on every call and stored nowhere - it lives over there, and a copy here would go stale without anybody noticing.
Felder und Aufbau
Antwort
enabledja/nein Pflichtcompleteja/nein PflichtinstancesListe von PapierkorbInstanz PflichtAufbau der Antwort
{
"enabled": "boolean",
"complete": "boolean",
"instances": [
{
"media_type": "string",
"tier": "string",
"name": "string",
"reachable": "boolean",
"path": "string",
"cleanup_days": "number | null",
"protected": "boolean"
}
]
}
PUT
/api/settings/recyclebin
may change
Set the recycle-bin path
⚠️ This writes into Radarr and Sonarr, not into Nexview. The setting applies over there to everything, including deletions that had nothing to do with Nexview.
Felder und Aufbau
Anfragekörper
instancesListe von PapierkorbWunsch Pflichtcleanup_daysZahlAntwort
enabledja/nein Pflichtcompleteja/nein PflichtinstancesListe von PapierkorbInstanz PflichtAufbau der Antwort
{
"enabled": "boolean",
"complete": "boolean",
"instances": [
{
"media_type": "string",
"tier": "string",
"name": "string",
"reachable": "boolean",
"path": "string",
"cleanup_days": "number | null",
"protected": "boolean"
}
]
}
GET
/api/settings/recyclebin/contents
may change
What is in the recycle bins
Folder names only - no posters, no tidied-up titles. Resolving the names back to titles would mean a TMDB lookup per folder for something that is, in the end, a list of directories.
Felder und Aufbau
Parameter
media_typemovie | tv oder null querytierstandard | uhd oder null querypathText queryAntwort
instancesListe von PapierkorbInhaltInstanz PflichtAufbau der Antwort
{
"instances": [
{
"name": "string",
"path": "string",
"entries": [
"string"
],
"truncated": "boolean"
}
]
}
GET
/api/settings/recyclebin/folders
may change
Which folders one instance sees
Asked per instance rather than once for all: Sonarr can be mounted entirely differently from Radarr, and a path that exists for one may not exist for the other.
Felder und Aufbau
Parameter
media_typemovie | tv query Pflichttierstandard | uhd querypathText queryAntwort
pathText PflichtdirectoriesListe von Text PflichtAufbau der Antwort
{
"path": "string",
"directories": [
"string"
]
}
DELETE
/api/settings/secret/{name}
may change
Remove a stored secret
The explicit way to delete an API key, because an empty field on save means "unchanged".
Felder und Aufbau
Parameter
nameText path Pflicht
POST
/api/settings/test-mail
may change
Send a test mail
Sends a fully formatted test message to the given address, so the result shows what a real notification will look like.
Felder und Aufbau
Anfragekörper
recipientText PflichtAntwort
okja/nein PflichtmessageText PflichtAufbau der Antwort
{
"ok": "boolean",
"message": "string"
}
POST
/api/settings/test/public-url
may change
Is Nexview reachable at this address
The server calls itself from the outside to find out. Deliberately with its own short-lived client, so nothing from the normal connection pool can make an unreachable address look reachable.
Felder und Aufbau
Anfragekörper
urlText PflichtAntwort
okja/nein PflichtmessageText PflichtAufbau der Antwort
{
"ok": "boolean",
"message": "string"
}
POST
/api/settings/test/smtp
may change
Test the mail server
Checks connection and authentication without sending anything.
Felder und Aufbau
Anfragekörper
hostText oder nullportZahl oder nullsecurityText oder nullusernameText oder nullpasswordText oder nullAntwort
okja/nein PflichtmessageText PflichtAufbau der Antwort
{
"ok": "boolean",
"message": "string"
}
POST
/api/settings/test/tmdb
may change
Test the TMDB key
Checks whether the given TMDB API key works.
Felder und Aufbau
Anfragekörper
api_keyText oder nullurlText oder nullAntwort
okja/nein PflichtmessageText PflichtAufbau der Antwort
{
"ok": "boolean",
"message": "string"
}
POST
/api/settings/test/{service}
may change
Test Radarr or Sonarr
Checks the connection to the standard or 4K instance. Uses the values passed in if they have not been saved yet, so a connection can be tested before it is stored.
Felder und Aufbau
Parameter
serviceradarr | sonarr | radarr_uhd | sonarr_uhd path PflichtAnfragekörper
api_keyText oder nullurlText oder nullAntwort
okja/nein PflichtmessageText PflichtAufbau der Antwort
{
"ok": "boolean",
"message": "string"
}
GET
/api/settings/webhooks
may change
Notification link status per instance
For every configured Radarr/Sonarr instance: whether the per-instance switch is on, whether the entry currently exists over there, when the reachability proof last arrived, when the last call came in - and, if the link cannot be established, an honest reason code.
Felder und Aufbau
Antwort
basisText PflichtinstanzenListe von WebhookInstanzStand PflichtAufbau der Antwort
{
"basis": "string",
"instanzen": [
{
"kennung": "string",
"name": "string",
"media_type": "string",
"tier": "string",
"aktiv": "boolean",
"eingetragen": "boolean",
"bewiesen_am": "ISO 8601 | null",
"zuletzt_angerufen_am": "ISO 8601 | null",
"letztes_ereignis": "string",
"geprueft_am": "ISO 8601 | null",
"fehler": "string",
"fehler_info": "string",
"alter_eintrag": "string"
}
]
}
PATCH
/api/settings/webhooks/{kennung}
may change
Switch the notification link for one instance
Turning it on runs the proof and creates the entry in Radarr/Sonarr; turning it off removes that entry without leftovers. The response carries the resulting state.
Felder und Aufbau
Parameter
kennungText path PflichtAnfragekörper
aktivja/nein PflichtAntwort
basisText PflichtinstanzenListe von WebhookInstanzStand PflichtAufbau der Antwort
{
"basis": "string",
"instanzen": [
{
"kennung": "string",
"name": "string",
"media_type": "string",
"tier": "string",
"aktiv": "boolean",
"eingetragen": "boolean",
"bewiesen_am": "ISO 8601 | null",
"zuletzt_angerufen_am": "ISO 8601 | null",
"letztes_ereignis": "string",
"geprueft_am": "ISO 8601 | null",
"fehler": "string",
"fehler_info": "string",
"alter_eintrag": "string"
}
]
}
POST
/api/settings/webhooks/{kennung}/testen
may change
Prove the notification link right now
Asks the instance to send its test event to Nexview and reports whether - and how fast - the call arrived, or why it could not.
Felder und Aufbau
Parameter
kennungText path PflichtAntwort
angekommenja/nein Pflichtdauer_msZahl oder nullfehlerText oder nullinfoText oder nullAufbau der Antwort
{
"angekommen": "boolean",
"dauer_ms": "number | null",
"fehler": "string | null",
"info": "string | null"
}
GET
/api/umstieg/abbildung
may change
Vet nexcrate and propose a version mapping
Checks whether this nexcrate can serve Nexview at all - contract, stage, kinds, scopes - and only then reads its versions and proposes one per current version, matched by kind and tier. A blocking finding stops here instead of offering a mapping nobody may use.
Felder und Aufbau
Antwort
pruefungListe von Objektsperrtja/neinarr_fassungenListe von Objektnex_fassungenListe von ObjektvorschlagObjektAufbau der Antwort
{
"pruefung": [
"object"
],
"sperrt": "boolean",
"arr_fassungen": [
"object"
],
"nex_fassungen": [
"object"
],
"vorschlag": "object"
}
POST
/api/umstieg/nachreichen
may change
Hand over approved requests after the switch
A request is handed to procurement exactly once, at approval. After a switch the new way has never heard of the approved ones, so they are handed over again - at most 25 per call, and only versions the new way knows.
Felder und Aufbau
Antwort
gereichtZahl PflichtliegenZahlweiterja/nein PflichtAufbau der Antwort
{
"gereicht": "number",
"liegen": "number",
"weiter": "boolean"
}
POST
/api/umstieg/probe
may change
Check whether nexcrate knows the titles
For every title with an open request or a storage entry: known with the chosen version, known without it, or unknown. Open requests for unknown titles are no obstacle - they are placed when you switch. Downloaded entries without a counterpart need a decision.
Felder und Aufbau
Anfragekörper
abbildungObjekt PflichtAntwort
fehlerListe von TextbekanntZahlohne_fassungZahlunbekanntZahlanime_offenZahlrechte_entfallenZahlzu_entscheidenListe von ObjektAufbau der Antwort
{
"fehler": [
"string"
],
"bekannt": "number",
"ohne_fassung": "number",
"unbekannt": "number",
"anime_offen": "number",
"rechte_entfallen": "number",
"zu_entscheiden": [
"object"
]
}
GET
/api/umstieg/sicherung
may change
Find the backup made a moment ago
The newest backup this assistant made in the last hour that still opens as a database, or null. Lets the assistant carry on after a reload or in a new window instead of making a second backup. Reads only.
Felder und Aufbau
Antwort
sicherungSicherungAntwort oder nullAufbau der Antwort
{
"sicherung": {
"name": "string",
"groesse": "number",
"erstellt": "string"
}
}
POST
/api/umstieg/sicherung
may change
Make the backup before switching
There is no way back except this file, so the switch is refused until it exists. Same format as any other manual backup.
Felder und Aufbau
Antwort
nameText PflichtgroesseZahl PflichterstelltText PflichtAufbau der Antwort
{
"name": "string",
"groesse": "number",
"erstellt": "string"
}
POST
/api/umstieg/umschalten
may change
Switch procurement to nexcrate
⚠️ The one step that cannot be taken back. Removes Nexview's webhook entries from Radarr and Sonarr, deletes their credentials, rewrites every version id on requests, storage entries, rights, invitations and rules, and moves series storage keys from TVDB to TMDB. Requires the backup from the previous step; the check of the titles is run again here, because the translation of the storage keys comes out of it.
Felder und Aufbau
Anfragekörper
abbildungObjekt PflichtsicherungText Pflichtposten_ohne_gegenstueck_behaltenja/neinAntwort
fassungenZahl PflichtverlassenListe von Objekt PflichtanfragenZahl Pflichtanfragen_ohne_uebersetzungZahlpostenZahl Pflichtposten_schluesselZahl Pflichtposten_ohne_uebersetzungZahl Pflichtposten_doppeltZahlrechteZahl Pflichtrechte_entfallenZahleinladungenZahl PflichtregelnZahl Pflichtzeilen_entferntZahl PflichtAufbau der Antwort
{
"fassungen": "number",
"verlassen": [
"object"
],
"anfragen": "number",
"anfragen_ohne_uebersetzung": "number",
"posten": "number",
"posten_schluessel": "number",
"posten_ohne_uebersetzung": "number",
"posten_doppelt": "number",
"rechte": "number",
"rechte_entfallen": "number",
"einladungen": "number",
"regeln": "number",
"zeilen_entfernt": "number"
}
GET
/api/umstieg/vorab
may change
What switching to nexcrate would change
Numbers before anything happens: downloads currently running in Radarr or Sonarr (they finish there and become invisible to Nexview), open requests, storage entries, and the instances involved. Reads only.
Felder und Aufbau
Antwort
downloads_laufendZahl Pflichtanfragen_offenZahl PflichtpostenZahl PflichtinstanzenListe von Text PflichtAufbau der Antwort
{
"downloads_laufend": "number",
"anfragen_offen": "number",
"posten": "number",
"instanzen": [
"string"
]
}
POST
/api/webhooks/arr/{kennung}
may change
Inbound call from Radarr or Sonarr
Receiving end of the notification entry Nexview maintains inside Radarr and Sonarr. Expects the per-instance secret as the Basic auth password. The call only wakes the status sync - its payload is never trusted. A "Test" event records the reachability proof instead of waking anything.
Felder und Aufbau
Parameter
kennungText path Pflicht