Befehle für Ihre Organisation
Alle Befehle von szenera, die mit einem Schlüssel oder Konto Ihrer Organisation laufen: Medien, Szenen, Playlisten, Programme, Geräte, Team, Apps, Abo.
19 Minuten LesezeitCLIStand: 25.10.2026
Auf dieser Seite
- Überall gültige Flaggen
- Umgebung und Ausweis
- Medien und Ordner
- Szenen, Fassungen und Layouts
- Playlisten und Programme
- Wiedergabe und Widgets
- Werbung
- Geräte
- Standorte
- Auswertung
- Nachweise
- Ereignis-Ziele
- Team, Rollen und Erteilungen
- Schlüssel
- Abonnement, Rechnungen und Apps
- Protokoll, Rechte-Katalog und Notausgang
- Weiterführendes
Bevor Sie loslegen
- Für wen
- Wer einen Vorgang seiner Organisation aus einem Skript oder vom Terminal anstoßen will und wissen muss, welcher Befehl welche Route und welches Recht braucht
- Voraussetzung
- ein Profil mit einem Schlüssel oder Konto der Organisation. Die Rechte der Spalte „Recht“ muss der Ausweis tragen.
Alle Befehle der Kommandozeile szenera. Sie laufen mit einem API-Schlüssel ak_… oder einem Konto Ihrer Organisation. Jede Tabelle nennt je Befehl die Route, das nötige Recht, ob ein API-Schlüssel das Recht tragen darf („Schlüssel“) und ob der Befehl etwas verändert. Die Spalte „Schlüssel“ folgt dem Rechte-Katalog der Plattform: Ein Recht, das nur Konten vorbehalten ist, bekommt kein Schlüssel — der Befehl antwortet dann mit 403 (Exit 4), und Sie brauchen ein Profil mit Kennwort-Anmeldung.
szenera <befehl> --help zeigt zu jedem Befehl Stellungen, Flaggen und Beispiele. Die Beschreibung dort ist die Quelle dieser Tabellen. Stand ist das Register von szenera mit 136 Befehlen, alle stehen hier. 21 davon dienen auch dem Plattformbetrieb und nehmen dort zum Teil eine andere Route. Diese Wege und die Befehle, die nur dem Betrieb dienen, stehen unter Befehle für den Plattformbetrieb.
Überall gültige Flaggen
| Flagge | Wirkung |
|---|---|
--help |
Hilfe zum Befehl zeigen und nichts tun, meldet sich nie an |
--profile=<name> |
Welches Profil gilt (Umgebung, Ausweis, Dienst-Adressen) |
--json |
Ausgabe als JSON erzwingen |
--table |
Ausgabe als Tabelle erzwingen |
--raw |
Bricht eine Antwort den Vertrag, die Rohantwort ausgeben |
Eine Flagge trägt ihren Wert am Gleichheitszeichen (--limit=20), --limit 20 gibt es nicht. Eine unbekannte Flagge ist ein Fehler (Exit 1), kein stiller Hinweis. Listen-Befehle blättern mit --limit=<anzahl> (1 bis 200, bei gefilterten Listen bis 100), --cursor=<marke> und --all (allen Seiten folgen). Befehle, die auf einen Vorgang warten, nehmen --timeout=<dauer> (90s, 20m, 2h oder eine Zahl in Sekunden), teils --interval=<dauer> und --no-wait. Unumkehrbare Eingriffe verlangen --yes. Ohne die Flagge bricht der Befehl mit Exit 1 ab und sagt, was geschehen würde.
Umgebung und Ausweis
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
health |
Meldet die Umgebung sich bereit — und welche Prüfung sagt was | GET /health/ready, kein Ausweis nötig, bei 503 Exit 9 |
— | nein |
health public |
Was die Statusseite draußen zeigt: Zustand je Baustein, Wartungsfenster, öffentliche Störungen | GET /v1/public/status, kein Ausweis nötig |
— | nein |
whoami |
Wer der eigene Ausweis ist — Konto, Organisation, Rechte | GET /v1/me, nur Anmeldung, kein eigenes Recht |
ja | nein |
hygiene get |
Was liegen geblieben ist: sechs Zahlen und je Zahl der Befehl, der die Zeilen dahinter zeigt | GET /v1/analytics/hygiene · analytics.query.run. --offline-since (Vorgabe P7D) und --dormant-since (Vorgabe P90D) setzen die beiden Schwellen |
ja | nein |
Medien und Ordner
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
asset list |
Die Medien der Mediathek. --usage=unused findet, was in keiner Szene, keiner Playliste und keinem Markenzeichen steckt |
GET /v1/assets · asset.list |
ja | nein |
asset get <ast_…> |
Ein Medium samt seiner Varianten. --usages nennt, wo es steckt |
GET /v1/assets/{id}, GET /v1/assets/{id}/usage · asset.read |
ja | nein |
asset upload --file=<pfad> |
Eine Datei in die Mediathek laden und warten, bis sie nutzbar ist | POST /v1/assets/upload-precheck → Bytes → POST /v1/assets/upload-complete · asset.upload. Wartet bis ready, Vorgabe --timeout=10m, --no-wait |
ja | ja |
asset download <ast_…> --output=<pfad> |
Ein Medium oder eine seiner Varianten holen | POST /v1/assets/{id}/download-url (Variante: /variant-url) → Bytes · asset.read |
ja | nein |
asset update <ast_…> |
Name, Schlagworte oder Ordner eines Mediums ändern | PATCH /v1/assets/{id} · asset.update |
ja | ja |
asset reprocess <ast_…> |
Die Varianten eines Mediums neu erzeugen und warten | POST /v1/assets/{id}/reprocess · asset.update. Wartet wie beim Hochladen |
ja | ja |
asset delete <ast_…> --yes |
Ein Medium in den Papierkorb legen | DELETE /v1/assets/{id} · asset.delete |
ja | ja |
asset restore <ast_…> |
Ein Medium aus dem Papierkorb zurückholen | POST /v1/assets/{id}/restore · asset.update |
ja | ja |
asset purge <ast_…> --yes |
Ein Medium endgültig löschen | POST /v1/assets/{id}/purge · asset.delete |
ja | ja |
asset bulk-update --assets=<ast_…,…> |
Viele Medien verschieben oder verschlagworten (bis zu 100) | POST /v1/assets/bulk-move bzw. POST /v1/assets/bulk-tag · asset.update |
ja | ja |
folder list |
Der Ordnerbaum der Mediathek | GET /v1/folders · asset.folder.list |
ja | nein |
folder create --name=<name> |
Einen Ordner anlegen | POST /v1/folders · asset.folder.create |
ja | ja |
folder update <fld_…> |
Einen Ordner umbenennen oder verschieben | PATCH /v1/folders/{id} (--name), POST /v1/folders/{id}/move (--parent) · asset.folder.update |
ja | ja |
folder delete <fld_…> --yes |
Einen Ordner löschen. Die Medien rutschen eine Ebene höher | DELETE /v1/folders/{id} · asset.folder.delete |
ja | ja |
Ist derselbe Inhalt schon da, entfällt beim Hochladen der Byte-Strom: Die Vorprüfung erkennt ihn an der sha256-Prüfsumme. Ab 50 MiB läuft der Strom in 8-MiB-Stücken.
Szenen, Fassungen und Layouts
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
scene list |
Die Szenen der Organisation. --assignment=none findet die, auf die kein Programm, kein Zeitplan und keine zugewiesene Playliste zeigt (sinnvoll mit --status=published) |
GET /v1/scenes · scene.list |
ja | nein |
scene get <scn_…> |
Eine Szene samt ihrer offenen Befunde | GET /v1/scenes/{id}, GET /v1/scenes/{id}/integrity-issues · scene.read |
ja | nein |
scene create --name=<name> |
Eine leere Szene anlegen | POST /v1/scenes · scene.create |
ja | ja |
scene create-from-template --template=<sct_…> --name=<name> |
Eine Szene aus einer kuratierten Vorlage anlegen | POST /v1/scenes/from-template · scene.create |
ja | ja |
scene update <scn_…> |
Den Entwurf einer Szene ändern. Ohne --version liest der Befehl die Fassung vorher |
PATCH /v1/scenes/{id} · scene.update |
ja | ja |
scene publish <scn_…> |
Den Entwurf als neue Fassung veröffentlichen. Nennt Befunde statt sie zu verschlucken | POST /v1/scenes/{id}/publish · scene.publish |
ja | ja |
scene recheck <scn_…> |
Die Unversehrtheit neu prüfen und die Befunde nennen | POST /v1/scenes/{id}/integrity-issues/recheck · scene.read |
ja | ja |
scene resolve-issue <sii_…> --scene=<scn_…> --resolution=manual-fixed|ignored |
Einen Befund als behoben oder ignoriert schließen | POST /v1/scenes/{id}/integrity-issues/{iid}/resolve · scene.update |
ja | ja |
scene archive <scn_…> |
Eine Szene archivieren | POST /v1/scenes/{id}/archive · scene.archive |
ja | ja |
scene restore <scn_…> |
Eine archivierte oder gelöschte Szene zurückholen | POST /v1/scenes/{id}/restore · scene.update |
ja | ja |
scene delete <scn_…> --yes |
Eine Szene in den Papierkorb legen | DELETE /v1/scenes/{id} · scene.delete |
ja | ja |
scene bulk-update --entries=<pfad> |
Bis zu 50 Szenen in einem Aufruf ändern | POST /v1/scenes/bulk-update · scene.update |
ja | ja |
layout list |
Die Layout-Vorlagen — eingebaute und eigene | GET /v1/layout-templates · layout-template.list |
ja | nein |
scene-template list |
Die kuratierten Szenen-Vorlagen. --orientation=landscape|portrait filtert |
GET /v1/scene-templates · scene.read |
ja | nein |
scene-version list --scene=<scn_…> |
Die veröffentlichten Fassungen einer Szene | GET /v1/scenes/{id}/versions · scene.read |
ja | nein |
scene-version get <scv_…> --scene=<scn_…> |
Eine Fassung samt ihrer Momentaufnahme | GET /v1/scenes/{id}/versions/{vid} · scene.read |
ja | nein |
scene-version diff <scv_…> --scene=<scn_…> --against=<scv_…> |
Zwei Fassungen gegeneinander stellen | GET /v1/scenes/{id}/versions/{vid}/diff/{vid2} · scene.read |
ja | nein |
scene-version revert <scv_…> --scene=<scn_…> |
Den Entwurf auf eine ältere Fassung zurücksetzen. Veröffentlicht nichts | POST /v1/scenes/{id}/versions/{vid}/revert · scene.publish |
ja | ja |
scene-version thumbnail <scv_…> --scene=<scn_…> |
Das Vorschaubild hinterlegen (--file) oder seine Adresse holen |
POST …/versions/{vid}/thumbnail · scene.update, POST …/thumbnail-url · scene.read |
ja | ja |
Die Fassung einer Szene steht zweimal in der Antwort: als Feld version im Rumpf und als Kopfzeile ETag. Die Kommandozeile liest sie selbst, wenn --version fehlt. Bei scene publish bedeuten zwei Absagen Verschiedenes: Scene.PublishValidationFailed (422, Exit 7) ist eine Ursache zum Beheben, Scene.PublishBlocked (409, Exit 6) sind blockierende Befunde, die --ignore-issues schließt.
Playlisten und Programme
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
playlist list |
Die Wiedergabelisten der Organisation | GET /v1/playlists · playlist.list |
ja | nein |
playlist get <pll_…> |
Eine Wiedergabeliste samt ihrer Punkte | GET /v1/playlists/{id} · playlist.read |
ja | nein |
playlist create --name=<name> |
Eine Wiedergabeliste anlegen: --items (Sequenz) oder --folder/--tags (Regel) |
POST /v1/playlists · playlist.create |
ja | ja |
playlist update <pll_…> |
Eine Wiedergabeliste ändern. --items ersetzt die ganze Sequenz |
PATCH /v1/playlists/{id} · playlist.update |
ja | ja |
playlist delete <pll_…> --yes |
Eine Wiedergabeliste löschen. Zugewiesene weist die API ab | DELETE /v1/playlists/{id} · playlist.delete |
ja | ja |
playlist preview-source |
Eine automatische Quelle probeweise auflösen | POST /v1/playlists/source-preview · playlist.read und asset.read |
ja | nein |
schedule list |
Die Programme der Organisation | GET /v1/schedules · schedule.list |
ja | nein |
schedule get <sch_…> |
Ein Programm samt seiner Punkte. --players nennt die Geräte, die es spielen |
GET /v1/schedules/{id}, GET /v1/schedules/{id}/players · schedule.read |
ja | nein |
schedule create --name=<name> |
Ein Programm anlegen, ohne --base mit Sendepause |
POST /v1/schedules · schedule.create |
ja | ja |
schedule update <sch_…> |
Name oder Basis eines Programms ändern | PATCH /v1/schedules/{id} · schedule.update |
ja | ja |
schedule delete <sch_…> --yes |
Ein Programm löschen. Zugewiesene weist die API ab | DELETE /v1/schedules/{id} · schedule.delete |
ja | ja |
schedule create-item --schedule=<sch_…> --content=… --recurrence=… |
Einen Programmpunkt anlegen (once:, daily:, weekly:, monthly:) |
POST /v1/schedules/{id}/items · schedule.update |
ja | ja |
schedule update-item <sci_…> --schedule=<sch_…> |
Einen Programmpunkt ändern, stilllegen (--disabled) oder anschalten (--enabled) |
PATCH /v1/schedules/{id}/items/{itemId} · schedule.update |
ja | ja |
schedule delete-item <sci_…> --schedule=<sch_…> |
Einen Programmpunkt löschen | DELETE /v1/schedules/{id}/items/{itemId} · schedule.update |
ja | ja |
player get-program <ply_…> |
Was einem Display zugewiesen ist — samt Übersteuerung | GET /v1/players/{id}/program · fleet.player.read |
ja | nein |
player set-program <ply_…> --content=… |
Einem Display etwas zuweisen. --clear entfernt die Zuweisung. Idempotent |
PUT /v1/players/{id}/program · schedule.update |
ja | ja |
display-group set-program <dgr_…> --content=… |
Einer Leinwand — und damit allen ihren Displays — etwas zuweisen. --clear entfernt die Zuweisung. Idempotent |
PUT /v1/display-groups/{id}/program · schedule.update |
ja | ja |
player set-override <ply_…> --content=… |
Auf einem Display jetzt etwas anderes zeigen (--until oder --indefinite) |
PUT /v1/players/{id}/override · schedule.update |
ja | ja |
player clear-override <ply_…> |
Die Übersteuerung eines Displays beenden | DELETE /v1/players/{id}/override · schedule.update |
ja | ja |
Inhalte werden in Kurzform übergeben: schedule:sch_…, scene:scn_…, playlist:pll_…, asset:ast_… — bei der Basis eines Programms auch pause.
Wiedergabe und Widgets
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
playback now |
Was gerade auf allen Displays läuft (play, pause, gap) |
GET /v1/players/now-playing · fleet.player.list |
ja | nein |
playback timeline <ply_…> |
Die aufgelöste Abspiel-Timeline eines Displays (Fenster ab jetzt, 4 Stunden bis 7 Tage) | GET /v1/players/{id}/timeline · fleet.player.read |
ja | nein |
playback history <ply_…> --date=<datum> |
Der aufgezeichnete Tagesverlauf eines Displays (90 Tage aufbewahrt) | GET /v1/players/{id}/playback-history · fleet.playback-history.read |
nein | nein |
playback refresh <ply_…> |
Die Momentaufnahme eines Displays neu berechnen | POST /v1/players/{id}/snapshot/refresh · fleet.player.update |
ja | ja |
widget preview --widget=<pfad> |
Die Daten eines Widgets für eine Vorschau auflösen | POST /v1/widget-data/preview · scene.read |
ja | nein |
Werbung
Werbepartner, Werbekampagnen, Buchungen und Motive des eigenen Werbegeschäfts. Lesen geht in jedem Paket. Anlegen und Freigeben verlangen zusätzlich die Fähigkeit advertisingDirect des Pakets, ohne sie antwortet der Server mit 403 und Billing.FeatureNotEntitled (Exit 4). Werbekampagnen des Werbenetzes stehen in campaign list, sobald sie Displays Ihrer Organisation erreichen, ohne Preis und ohne Notiz des Betreibers.
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
advertiser list |
Die Werbepartner, filterbar nach --status, --industry und --search |
GET /v1/advertising/advertisers · advertising.advertiser.read |
ja | nein |
advertiser get <adv_…> |
Ein Werbepartner mit Marken, Ansprechpersonen und Notiz | GET /v1/advertising/advertisers/{id} · advertising.advertiser.read |
ja | nein |
advertiser create --name=<name> --industry=<branche> |
Einen Werbepartner anlegen. --brand darf sich wiederholen |
POST /v1/advertising/advertisers · advertising.advertiser.manage |
ja | ja |
campaign list |
Die Werbekampagnen mit Phase, Zeitraum, Zahl der Buchungen und erreichten Displays. --owner=tenant oder --owner=network trennt eigenes Geschäft und Netz |
GET /v1/advertising/campaigns · advertising.campaign.read |
ja | nein |
campaign get <acp_…> |
Eine Werbekampagne mit Phase, Zeitraum, Ziel und Preis | GET /v1/advertising/campaigns/{id} · advertising.campaign.read |
ja | nein |
booking list --campaign=<acp_…> |
Die Buchungen einer Werbekampagne mit Spotlänge, Frequenz und Zusage | GET /v1/advertising/campaigns/{id}/booking-lines · advertising.campaign.read |
ja | nein |
creative list |
Die Motive. --approval=pending ist die Liste der Prüfung |
GET /v1/advertising/creatives · advertising.campaign.read, advertising.creative.manage oder advertising.creative.approve |
ja | nein |
creative approve <crv_…> |
Ein Motiv freigeben. Verlangt die Branche einen Pflichttext, bestätigen --text-present und --text-legible, dass er im Motiv steht und lesbar ist |
POST /v1/advertising/creatives/{id}/approval · advertising.creative.approve |
ja | ja |
Abgelehnt wird ein Motiv im Portal, wo die Anmerkung für den Werbepartner entsteht. Welche Displays eine Buchung erreicht und warum andere nicht, beantwortet GET /v1/advertising/booking-lines/{id}/reach über den Notausgang szenera api get.
Geräte
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
player list |
Die Displays der Organisation. --program=none findet die ohne Inhalt, --offline-since=P7D die, die so lange nichts melden (ein nie gemeldetes zählt mit) |
GET /v1/players · fleet.player.list, dazu --status, --search |
ja | nein |
device list |
Die Geräte — was steht draußen, meldet es sich noch | GET /v1/devices · identity.device.list |
nein | nein |
device get <dev_…> |
Ein Gerät im Einzelnen: Zertifikat und Flächen | GET /v1/devices/{id} · identity.device.list |
nein | nein |
device send-command <dev_…> <kind> |
Einen Fernwartungs-Befehl an ein Gerät (reboot, locate, tail-log, mark-good, check-ota) oder eine Fläche (screenshot, identify, set-config, display-power, display-source, refresh-snapshot, mit --screen=<n>) absetzen. Antwort 201 heißt angenommen, --wait bleibt dran |
POST /v1/devices/{id}/commands, POST /v1/players/{id}/commands · fleet.player.command.issue. Flächen-Arten lösen zusätzlich über identity.device.list auf — das ist nicht schlüsselfähig, mit einem Schlüssel laufen deshalb nur die Maschinen-Arten |
ja | ja |
device list-commands <dev_…> |
Die letzten Fernwartungs-Befehle eines Geräts | GET /v1/devices/{id}/commands · fleet.player.read |
ja | nein |
device screenshot <dev_…> |
Ein Bildschirmfoto anfordern, darauf warten und es holen (--file) |
POST /v1/players/{id}/commands → GET …/commands/{cid}/output · fleet.player.command.issue, fleet.player.read und identity.device.list. Das letzte ist nicht schlüsselfähig, deshalb bleibt dieser Befehl Sitzungen vorbehalten. Vorgabe --timeout=5m, --interval=5s |
nein | ja |
Die Suche über die Seriennummer, das Freigeben und Sperren eines Geräts und das Nachlesen eines einzelnen Befehls sind Befehle des Plattformbetriebs und nicht Teil von szenera, siehe Befehle für den Plattformbetrieb.
Ein Gerät neu koppeln, in den Werkszustand versetzen, aus der Organisation entfernen oder als verloren melden: Dafür gibt es unter einem Organisations-Profil keinen eigenen Befehl. Der Weg ist die Karte Lebenszyklus im Portal oder api post gegen POST /v1/devices/{id}/release mit {"reason":"reconnect"}, "factory" oder "removed" bzw. gegen POST /v1/devices/{id}/block mit einem Grund (identity.device.lifecycle, nicht schlüsselfähig). Meldet sich ein gekoppeltes Gerät mit neuem Schlüssel, entscheidet POST /v1/devices/{id}/reregistration mit {"decision":"keep"}, "reconnect" oder {"decision":"block","reason":"…"}. Einen Fernwartungs-Befehl für den Werkszustand gibt es nicht.
Standorte
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
location list |
Die Standorte der Organisation. Die letzte Spalte zählt die Displays am Ort | GET /v1/locations · location.list, vollständig, ohne Blättern |
ja | nein |
location get <loc_…> |
Ein Standort mit Anschrift, Zeitzone, Lage, Notiz und Fassung | GET /v1/locations/{id} · location.read |
ja | nein |
location create --name=<name> --timezone=<IANA> |
Einen Standort anlegen. Die Anschrift kommt über --street, --postal-code, --city, --country, Lage über --latitude/--longitude, dazu --note |
POST /v1/locations · location.create, braucht die Fähigkeit Standorte |
ja | ja |
location update <loc_…> |
Name, Zeitzone, Anschrift, Lage oder Notiz ändern. --clear-address und --clear-coordinates entfernen die Angabe |
PATCH /v1/locations/{id} · location.update |
ja | ja |
location delete <loc_…> --yes |
Einen leeren Standort löschen. Mit Displays daran antwortet die API 409 Location.HasPlayers |
DELETE /v1/locations/{id} · location.delete |
ja | ja |
player assign-location <ply_…> --location=<loc_…> |
Ein Display an einen Ort hängen. Ein zweiter Aufruf hängt um statt zu verdoppeln | PATCH /v1/players/{id} · fleet.player.update |
ja | ja |
player unassign-location <ply_…> |
Ein Display von seinem Ort lösen. Es behält Programm, Einstellungen und Lizenz | PATCH /v1/players/{id} · fleet.player.update |
ja | ja |
Ein Standort ist ein Ordner über Displays: Er trägt keine Rechte und keinen eigenen Bestand, und er reißt beim Löschen nie ein Display mit. Die Felder und die Fehlercodes stehen unter Standorte.
Auswertung
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
analytics overview |
Der Überblick: je Display die Verfügbarkeit in der Planzeit, darüber Lücken, rechtzeitig gemeldete Planstunden und Ausspielungen. --location (wiederholbar) schränkt auf Standorte ein |
GET /v1/analytics/overview · analytics.query.run |
ja | nein |
analytics explore --measure=<kennzahl> |
Kennzahlen frei auswerten: --measure und --by sind wiederholbar, dazu --sort, --ascending, --limit, --perspective und --granularity. --query=<pfad> nimmt die vollständige Abfrage samt Filtern als JSON |
POST /v1/analytics/explore · analytics.query.run |
ja | nein |
analytics delivery <acp_…> |
Die Lieferung einer Werbekampagne: je Buchung Zusage, Geliefertes, Erfüllung, Pacing, Prognose mit Spanne und der Befund | GET /v1/analytics/campaigns/{id}/delivery · advertising.campaign.read |
ja | nein |
Ohne --from und --to gelten die letzten sieben Tage bis gestern; die Werbekampagne zeigt ohne Fenster ihre Laufzeit bis gestern. Die Tabelle nennt Stunden statt Sekunden und Prozent statt Anteil, und neben einem Wert steht seine Obergrenze, solange gemeldete Lücken noch nachkommen können. Welche Kennzahl sich mit welcher Dimension rechnen lässt, zeigt szenera api get /v1/analytics/catalog.
Nachweise
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
proof list |
Die Nachweise der Organisation, die neuesten zuerst: Abschlüsse, Nachträge und Zwischenstände mit Nummer, Zeitraum, Werbekampagne, Buchung, gültigen Ausspielungen und Erfüllung. --campaign, --advertiser, --line, --kind, --from und --to schränken ein |
GET /v1/analytics/proofs · analytics.proof.read |
ja | nein |
proof show <prf_…> |
Ein Nachweis mit Prüfcode, Signatur und seinen Dateien samt Prüfsumme. Zahlen, Nachträge und den Stand jeder Zustellung zeigt --json |
GET /v1/analytics/proofs/{id} · analytics.proof.read |
ja | nein |
proof download <prf_…> --output=<pfad> |
Eine Datei holen: --kind=pdf (Vorgabe), csv, manifest oder capture mit --file=<pfi_…>. Stimmt die Prüfsumme nicht, wird die Datei wieder entfernt |
GET /v1/analytics/proofs/{id}/files/{kind} · analytics.proof.read |
ja | nein |
Mit Nummer und Prüfcode aus proof show prüft jeder einen Nachweis auf der Prüfseite, auch ohne Konto. Zwischenstände und Verweise für Werbepartner entstehen im Portal oder über die API.
Ereignis-Ziele
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
webhook list |
Die Ereignis-Ziele der Organisation. --status=dead zeigt die, welche die Zustellung selbst aufgegeben hat (abgeschaltet und mit einer Fehlerkette über zwanzig) |
GET /v1/webhooks · webhook.list |
nein | nein |
Ein von Hand abgeschaltetes Ziel steht unter --status=disabled und ist etwas anderes. Angelegt und geändert werden Ziele im Portal oder über die API, siehe Einen Webhook-Endpunkt anlegen.
Team, Rollen und Erteilungen
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
user list |
Die Mitglieder der Organisation. --last-login-before=<zeitpunkt mit Zone> findet ruhende Konten, auch nie angemeldete |
GET /v1/users · identity.user.list |
nein | nein |
user get <usr_…> |
Ein Mitglied im Einzelnen | GET /v1/users/{id} · identity.user.read |
nein | nein |
user create --email=… --name=… --role=<rol_…> |
Ein Mitglied direkt anlegen (ohne Einladung), mit --password oder --federated |
POST /v1/users · identity.user.create |
nein | ja |
user update <usr_…> |
Profil eines Mitglieds ändern | PATCH /v1/users/{id} · identity.user.update |
nein | ja |
user set-role <usr_…> --role=<rol_…> --reason=… |
Die Rolle eines Mitglieds setzen — sie ersetzt die bisherige | PATCH /v1/users/{id}/roles · identity.user.assign-roles |
nein | ja |
user suspend <usr_…> --reason=… |
Ein Mitglied sperren | POST /v1/users/{id}/suspend · identity.user.suspend |
nein | ja |
user reactivate <usr_…> |
Die Sperre eines Mitglieds aufheben | POST /v1/users/{id}/reactivate · identity.user.reactivate |
nein | ja |
user delete <usr_…> --reason=<kategorie> --yes |
Ein Mitglied löschen. Der Grund ist eine der fünf Kategorien der API | DELETE /v1/users/{id} · identity.user.delete |
nein | ja |
invitation list |
Die Einladungen der Organisation, mit --pending nur die offenen |
GET /v1/invitations · identity.invitation.list |
nein | nein |
invitation create --email=… --role=<rol_…> |
Jemanden in die Organisation einladen | POST /v1/invitations · identity.user.invite |
nein | ja |
invitation resend <ivt_…> |
Eine Einladung noch einmal verschicken. Das verlängert die Frist | POST /v1/invitations/{id}/resend · identity.user.invite |
nein | ja |
invitation revoke <ivt_…> |
Eine Einladung zurückziehen | DELETE /v1/invitations/{id} · identity.invitation.revoke |
nein | ja |
role list |
Die Rollen der Organisation, eigene und eingebaute | GET /v1/roles · access.role.list |
nein | nein |
role get <rol_…> |
Eine Rolle samt ihrer Rechte | GET /v1/roles/{id} · access.role.read |
nein | nein |
role create --name=… --permissions=<a,b,c> |
Eine Rolle anlegen. Rechte sind exakte Katalog-Schlüssel, keine Platzhalter | POST /v1/roles · access.role.create |
nein | ja |
role update <rol_…> |
Eine Rolle ändern. --permissions ersetzt die Liste, If-Match kommt aus der Fassung, ein Konflikt ist Exit 6 |
PATCH /v1/roles/{id} · access.role.update |
nein | ja |
role delete <rol_…> --yes |
Eine Rolle löschen. Mit Konten daran weist die API ab | DELETE /v1/roles/{id} · access.role.delete |
nein | ja |
grant list |
Rechte, die an einzelnen Ressourcen hängen | GET /v1/grants · access.grant.list |
nein | nein |
grant create --user=<usr_…> --resource-type=… --resource=… --permissions=… |
Ein Recht auf genau einer Ressource geben — oder mit --deny sperren |
POST /v1/grants · access.grant.create |
nein | ja |
grant revoke <grn_…> |
Eine Erteilung zurücknehmen | DELETE /v1/grants/{id} · access.grant.revoke |
nein | ja |
Schlüssel
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
api-key list |
Die eigenen Zugangsschlüssel, mit --organization alle Schlüssel der Organisation |
GET /v1/me/api-keys (nur Sitzung), mit --organization GET /v1/api-keys · identity.api-key.list |
nein | nein |
api-key issue --name=… --permissions=<a,b,c> |
Einen Schlüssel ausstellen — der Geheimwert erscheint genau einmal. --list-allowed zeigt die freigegebenen Rechte |
POST /v1/me/api-keys · identity.api-key.create |
nein | ja |
api-key rotate <akm_…> |
Einen Schlüssel erneuern — der alte gilt noch eine Gnadenfrist (0–72 Stunden) | POST /v1/me/api-keys/{id}/rotate · identity.api-key.create |
nein | ja |
api-key revoke <akm_…> --yes |
Einen Schlüssel zurückziehen — sofort und endgültig. --compromised nennt im Protokoll den Verdacht, dass der Geheimwert in fremde Hände kam |
DELETE /v1/me/api-keys/{id} · identity.api-key.revoke |
nein | ja |
Ein Schlüssel kann nie mehr als sein Aussteller und nie ein Recht tragen, das für Schlüssel nicht freigegeben ist. Das Zweite prüft die CLI schon vor dem Aufruf.
Abonnement, Rechnungen und Apps
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
subscription get |
Das Abonnement und die Lizenzlage der eigenen Organisation | GET /v1/me/subscription · billing.subscription.read, GET /v1/me/licensing · billing.usage.read |
nein | nein |
subscription set-licenses --count=<n> |
Die Zahl gebuchter Lizenzen ändern, nicht unter die belegten | PUT /v1/me/licensing/licenses · billing.subscription.update |
nein | ja |
subscription cancel --yes |
Das Abonnement kündigen — zum Periodenende, mit --immediately jetzt |
POST /v1/me/subscription/cancel · billing.subscription.update |
nein | ja |
subscription reactivate |
Eine vorgemerkte Kündigung zurücknehmen | POST /v1/me/subscription/reactivate · billing.subscription.update |
nein | ja |
app subscribe <app> |
Eine bepreiste App zur Abrechnung buchen | POST /v1/me/licensing/apps/{appId} · billing.subscription.update |
nein | ja |
app unsubscribe <app> --yes |
Eine gebuchte App kündigen, wirkt zum Periodenende | DELETE /v1/me/licensing/apps/{appId} · billing.subscription.update |
nein | ja |
invoice list |
Die eigenen Rechnungen | GET /v1/me/invoices · billing.invoice.read |
nein | nein |
invoice get <inv_…> |
Eine Rechnung samt Positionen. --pdf holt die Adresse des PDF |
GET /v1/me/invoices/{id} · billing.invoice.download |
nein | nein |
app list |
Die Apps im Store, mit --installed nur die installierten |
GET /v1/me/apps/store, kein eigenes Recht |
ja | nein |
app get <app> |
Eine App im Einzelnen: Rechte, Datenzugriff, Widgets | GET /v1/me/apps/store/{appId}, kein eigenes Recht, nur Sitzung |
nein | nein |
app install <app> |
Eine App installieren. Der Manifest-Hash reist als Beweis mit | GET /v1/me/apps/store/{appId} → POST /v1/marketplace/apps/{appId}/install · marketplace.app.install |
nein | ja |
app upgrade <app> --version=<semver> |
Eine installierte App auf eine andere Fassung wechseln | POST /v1/marketplace/apps/{appId}/upgrade · marketplace.app.upgrade |
nein | ja |
app uninstall <app> |
Erst die Vorschau der Folgen, mit --yes die Deinstallation |
POST …/uninstall/preview → POST /v1/marketplace/apps/{appId}/uninstall · marketplace.app.uninstall |
nein | ja |
app accept <app> |
Das Update einer App annehmen. Der Befehl zeigt, wohin es führt und was dazukommt, angenommen wird mit --yes |
GET /v1/me/apps/{appId}/update → POST /v1/me/apps/{appId}/update/accept · marketplace.app.accept |
nein | ja |
app reject <app> --yes |
Das Update einer App ablehnen. Bis eine höhere Fassung erscheint, fragt die Plattform nicht wieder, mit Frist geht es nur bis zu ihr | GET /v1/me/apps/{appId}/update → POST /v1/me/apps/{appId}/update/reject · marketplace.app.accept |
nein | ja |
Protokoll, Rechte-Katalog und Notausgang
| Befehl | Zweck | Route und Recht | Schlüssel | Verändert |
|---|---|---|---|---|
audit list |
Das Prüfprotokoll lesen — anhängend, Nutzlasten geschwärzt | GET /v1/audit · audit.read oder audit.read.self (dann nur eigene Vorgänge) |
nein | nein |
audit get <aud_…> |
Einen Protokoll-Eintrag samt Nutzlast | GET /v1/audit/{id} · audit.read oder audit.read.self |
nein | nein |
permission catalog |
Der Rechte-Katalog, wie ihn die laufende Umgebung kennt, mit --key-eligible die Freigabeliste |
GET /v1/permission-catalog, nur Anmeldung |
nicht belegt | nein |
api get <path> |
Ein GET auf einen beliebigen Pfad der API | die Route des Pfads und ihr Recht | je Route | nein |
api post <path> <body> |
Ein POST auf einen beliebigen Pfad, dazu --idempotency-key=<schluessel> |
die Route des Pfads und ihr Recht | je Route | ja |
api put <path> <body> |
Ein PUT auf einen beliebigen Pfad, dazu --idempotency-key=<schluessel> |
die Route des Pfads und ihr Recht | je Route | ja |
api patch <path> <body> |
Ein PATCH auf einen beliebigen Pfad, dazu --idempotency-key=<schluessel> |
die Route des Pfads und ihr Recht | je Route | ja |
api delete <path> [body] |
Ein DELETE auf einen beliebigen Pfad, dazu --idempotency-key=<schluessel> |
die Route des Pfads und ihr Recht | je Route | ja |
api … ist der Notausgang zu jeder Route, für die es keinen eigenen Befehl gibt. Der Pfad beginnt mit einem Schrägstrich und darf eine Abfrage tragen. Der Rumpf ist JSON direkt oder @datei.json. Auch dieser Weg geht durch den erzeugten Client — Kopfzeilen, Trace-Kennung und die Fehlerarten gelten wie überall —, prüft die Antwort aber nicht gegen einen Vertrag: Welches Schema zu einem frei getippten Pfad gehört, weiß niemand.
szenera api get "/v1/devices?limit=5" --json | jq -r '.items[].id'
szenera api post /v1/playlists @playlist.json --idempotency-key=import-2026-09-08-01