Anmeldung: Schlüssel und Sitzungen
Bearer-Kopfzeile, Schlüssel-Präfixe, Rechteumfang, Ablauf und Rotation eines Schlüssels — und wann eine Sitzung statt eines Schlüssels sinnvoll ist.
7 Minuten LesezeitAPIStand: 25.10.2026
Auf dieser Seite
Bevor Sie loslegen
- Für wen
- Wer einen Ausweis in eine Integration einbaut oder einen 401 einordnen muss.
- Voraussetzung
- ein Konto in einer Organisation, deren Paket den API-Zugang enthält
Jeder Aufruf weist sich mit der Kopfzeile Authorization: Bearer <wert> aus; die API erkennt die Art des Ausweises am Präfix des Werts. Für Integrationen ist der API-Schlüssel der Regelweg. Diese Seite nennt die Präfixe, die Regeln für Schlüssel, ihren Lebenszyklus und wann eine Sitzung die bessere Wahl ist.
Die Präfixe
| Präfix | Ausweis | Für Integrationen |
|---|---|---|
ak_ |
API-Schlüssel einer Organisation | ja — der Regelweg für den eigenen Server |
oat_ |
Zugriffstoken eines delegierten Zugangs | ja — wenn ein Mensch Ihrer Anwendung Rechte gibt, siehe Delegierter Zugang mit OAuth 2.1 |
eyJ |
Zugriffstoken einer Sitzung | für Oberflächen und die Kommandozeile mit Kennwort |
sct_ |
SCIM-Zugang einer Organisation | nur für /scim/v2, siehe Provisionierung mit SCIM 2.0 |
opk_ |
Betreiber-Schlüssel | nur Plattformbetrieb |
rdr_ |
Abspieler-Token eines gekoppelten Geräts | nein |
inv_ |
Einladungs-Token vor der ersten Anmeldung | nein |
dev_ |
Geräteausweis bei der Erst-Registrierung | nein |
ak_ und opk_ sind eigenständige Präfixe: opk_ beginnt nicht mit ak_. Ein Schlüssel sagt damit selbst, welcher Sorte er angehört. Nicht zu verwechseln sind die Geheimwerte mit den Kennungen ihrer Datensätze (akm_, sctm_, oac_): Die stehen in Listen und Protokollen, der Geheimwert selbst nur ein einziges Mal in der Antwort auf seine Ausstellung.
Ein sct_ kommt auf keine andere Route als /scim/v2 — überall sonst wird er mit 403 abgewiesen. Umgekehrt erreicht kein ak_ und kein oat_ die SCIM-Fläche.
Ein Wert mit unbekanntem Präfix gilt als unbekannt, nicht als anonym: Die Antwort ist 401, nicht 404. Ohne Kopfzeile erreichen Sie nur öffentliche Routen — etwa GET /v1/openapi.json, GET /health/ready oder POST /v1/auth/login. In der Referenz erkennen Sie sie an einer leeren security-Liste und dem Satz „Öffentlich — keine Anmeldung erforderlich“. Genau 46 der 443 Operationen sind so.
Der API-Schlüssel
| Regel | Wert |
|---|---|
| Form | ak_ und 26 Zeichen, z. B. ak_01KQRWJRC0APKEY00000000001 |
| Klartext | erscheint genau einmal — in der Antwort auf POST /v1/me/api-keys (Feld plainKey) |
| Wiedererkennung | Listen zeigen nur keyPrefix (ak_ und 9 Zeichen) und die Kennung akm_… |
| Lebensdauer | läuft nicht nach 15 Minuten ab; expiresAt setzt ein Ablaufdatum, null heißt unbefristet |
| Rechte | eine Liste konkreter Rechte (scope); eine Klasse (read-only, media-automation, content-authoring, playout-control, full) wählt diese Liste nur aus, custom ist die freie Auswahl. Gesendet wird immer scope; die Liste wird danach nicht nachgeführt |
| Obergrenze | ein Schlüssel kann nie mehr als sein Ersteller (403 ApiKey.ScopeEscalationBlocked) |
| Schlüsselfähigkeit | nur Rechte, die der Katalog für Schlüssel vorsieht (422 ApiKey.ScopeNotKeyCapable) |
| Organisation | ein Schlüssel gehört genau einer Organisation |
Welche Rechte ein Schlüssel tragen kann, sagt GET /v1/permission-catalog — ohne besonderes Recht, nur mit Anmeldung. Jeder Eintrag trägt appliesTo; nur Rechte mit apiKey in dieser Liste sind schlüsselfähig. Im Kern-Katalog sind das heute 56 Rechte: Medien (asset.*), Szenen und Layout-Vorlagen (scene.*, layout-template.*), Playlisten und Programme (playlist.*, schedule.*), Standorte (location.*), die Displays (fleet.player.list, fleet.player.read, fleet.player.update, fleet.player.command.issue), die Web-Displays (fleet.web-display.manage), die Werbung (alle acht advertising.*), die Nachweise (analytics.proof.read, analytics.proof.manage) sowie billing.usage.read und analytics.query.run. Nicht schlüsselfähig sind unter anderem die Geräteliste identity.device.list, die Wiedergabe-Rückschau fleet.playback-history.read, das Anlegen und Entfernen von Displays (fleet.player.pair, fleet.player.delete), die Kontoverwaltung identity.*, die Webhook-Verwaltung webhook.* und alles unter platform.*. Was dort steht, bleibt Sitzungen vorbehalten.
Die Kommandozeile zeigt die Freigabeliste: szenera api-key issue --list-allowed; den ganzen Katalog: szenera permission catalog.
Ein Schlüssel handelt mit den Rechten des Kontos, das ihn erstellt hat. Ist dieses Konto gesperrt, ruht der Schlüssel: Die Anmeldung antwortet 401 Auth.UserSuspended, und nach dem Aufheben der Sperre arbeitet er wieder. Wird das Konto gelöscht, ist der Schlüssel widerrufen (Grund user-deleted-cascade). Dasselbe gilt für eine verbundene Anwendung und das Konto, das ihr zugestimmt hat.
Unter /v1/me erreicht ein Schlüssel nur die Lesewege, die ein Programm braucht: GET /v1/me (wer der Ausweis ist), GET /v1/me/permissions, GET /v1/me/capabilities, GET /v1/me/apps/store und GET /v1/me/licensing. Alles Übrige dort gehört der Person und verlangt eine Sitzung.
lastUsedAt zeigt die letzte Nutzung. Der Wert wird höchstens einmal je Minute fortgeschrieben.
Lebenszyklus eines Schlüssels
| Vorgang | Route | Recht | Bemerkung |
|---|---|---|---|
| Anlegen | POST /v1/me/api-keys |
identity.api-key.create |
Rumpf: name, scope (Pflicht, Liste schlüsselfähiger Rechte), expiresAt (Pflicht, null = unbefristet); optional originClass (Etikett der gewählten Klasse, Vorgabe custom), rotationGraceHours (0–72, Vorgabe 24) und rateLimit (eigenes Kontingent in der Form 600/1m, null = die Vorgabe der Umgebung, siehe Drosselung). Die Klasse wählt nur die Rechte-Liste aus, gesendet wird immer scope |
| Eigene Schlüssel lesen | GET /v1/me/api-keys |
Sitzung | nur selbst erstellte; mit einem Schlüssel antwortet die Route 401 |
| Alle Schlüssel der Organisation | GET /v1/api-keys |
identity.api-key.list |
auch die ausgeschiedener Mitglieder; includeRevoked, createdById, search, sort, order |
| Rotieren | POST /v1/me/api-keys/{id}/rotate |
identity.api-key.create |
Rumpf graceHours 0–72; der Nachfolger übernimmt Name, Rechte und Kontingent, der alte Schlüssel gilt bis oldRevokesAt |
| Widerrufen | DELETE /v1/me/api-keys/{id} |
identity.api-key.revoke |
Rumpf reason: owner-rotation (nicht mehr gebraucht oder ersetzt) oder compromised (vermutlich in fremden Händen); sofort und nicht umkehrbar |
curl -sS -X POST "$SZENERA_API/v1/me/api-keys/akm_01KQRWJRC0APKEY00000000001/rotate" \
-H "Authorization: Bearer $SZENERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "graceHours": 24 }'
Die Antwort — beide Schlüsselobjekte hier auf die Felder gekürzt, die eine Integration braucht:
{
"newApiKey": {
"id": "akm_01KQRWJRC0APKEY00000000002",
"keyPrefix": "ak_APKEY0002",
"name": "Warenwirtschaft-Anbindung",
"originClass": "read-only",
"scope": ["asset.read", "playlist.read"],
"expiresAt": "2027-05-04T07:00:00.000Z",
"revokesAt": null
},
"newPlainKey": "ak_01KQRWJRC0APKEY00000000002",
"oldApiKey": {
"id": "akm_01KQRWJRC0APKEY00000000001",
"keyPrefix": "ak_APKEY0001",
"name": "Warenwirtschaft-Anbindung",
"originClass": "read-only",
"scope": ["asset.read", "playlist.read"],
"expiresAt": "2027-05-04T07:00:00.000Z",
"revokesAt": "2026-07-21T09:15:00.000Z"
},
"oldRevokesAt": "2026-07-21T09:15:00.000Z"
}
Im Portal finden Sie dieselben Vorgänge unter Einstellungen › Organisation › API-Schlüssel mit den Schaltflächen Schlüssel erstellen, Rotieren und Widerrufen; die Gnadenfrist heißt dort Alter Schlüssel gültig bis mit den Stufen Sofort ungültig, 1 Stunde, 24 Stunden und 3 Tage. Wie Sie den ersten Schlüssel anlegen, steht unter Einen API-Schlüssel erzeugen.
Die Antworten auf einen ungültigen Schlüssel: 401 Auth.ApiKeyUnknown, 401 Auth.ApiKeyExpired, 401 Auth.ApiKeyRevoked — alle unter Fehlercodes: auf jeder Route möglich.
Die Sitzung
Eine Sitzung ist der Weg für Oberflächen und für Menschen an der Kommandozeile — dort heißt sie Ausweisart password. Sie braucht Auffrischung, ein Schlüssel nicht.
| Schritt | Route | Rumpf | Ergebnis |
|---|---|---|---|
| Anmelden | POST /v1/auth/login |
email, password, audience (tenant), deviceFingerprint |
201 mit outcome: session, mfa-required oder organization-choice |
| Zweiter Faktor | POST /v1/auth/mfa/verify |
mfaSessionId, code |
outcome: session |
| Auffrischen | POST /v1/auth/refresh |
kein Rumpf; das Cookie reist mit | neues Zugriffstoken |
| Bestandteil | Regel |
|---|---|
| Zugriffstoken | accessToken im Rumpf, expiresAt nennt den Ablauf; Lebensdauer 15 Minuten; reist als Authorization: Bearer eyJ… |
| Auffrisch-Cookie | refresh_token, httpOnly, Pfad /v1/auth, SameSite=Lax, 7 Tage; nur POST /v1/auth/refresh liest es und setzt es neu |
| Cookie-Regel | Ein Cookie wird nur gesetzt, wenn die Antwort tatsächlich eine Sitzung ist (outcome: session) |
| Andere Ursprünge | Browser-Clients senden credentials: 'include', sonst bleibt das Cookie zu Hause |
| Wirt des Cookies | Das Cookie trägt kein Domain-Attribut und gehört dem Wirt, der es setzt: Anmelden und Auffrischen gehen an denselben Wirt. Hat Ihre Umgebung einen Anmelde-Wirt (auth.<ihre-domain>), ist es dieser |
Fachliche Anfragen werden nicht über Cookies authentisiert — der Bearer-Kopf ist immer der Ausweis. Gehört ein Konto zu mehreren Organisationen, endet die Anmeldung in organization-choice; ein Schlüssel kennt diese Frage nicht, er gehört genau einer Organisation.
Die Unternehmens-Anmeldung über den Anbieter Ihrer Organisation und die plattformweiten Anbieter sind Rundläufe durch den Browser, keine Integrationswege; wie Sie sie einrichten, steht im Handbuch unter Organisation.
Schlüssel oder Sitzung?
| Situation | Wahl |
|---|---|
| Server-zu-Server, Skripte, CI | Schlüssel |
| Rechte aus Medien, Szenen, Playlisten, Programmen, Standorten, Werbung und Nachweisen | Schlüssel |
| Geräte steuern, Konten oder Webhooks verwalten | Sitzung — diese Rechte trägt kein Schlüssel |
| Kurz etwas nachsehen, ohne einen Schlüssel anzulegen | Sitzung über die Kommandozeile mit Ausweisart password |
| Ihre Anwendung läuft bei fremden Kunden und soll deren Bestand sehen | delegierter Zugang oat_… — ein Mensch willigt ein, statt einen Schlüssel herauszugeben |
| Konten aus einem Personalverzeichnis pflegen | SCIM-Zugang sct_… |