API für die Windows-Anwendung. Alle Antworten haben das Format `{ ok, data }` bzw. `{ ok: false, error: { code, message, details? } }`.
**Authentifizierung:** `POST /licenses/activate` benötigt keine Authentifizierung – der Lizenzschlüssel im Body ist das Geheimnis. Die Antwort enthält ein Aktivierungs-Credential (`<activationId>.<secret>`), das der Client sicher speichert (z. B. Electron safeStorage/DPAPI) und für alle weiteren Aufrufe als `Authorization: Bearer <credential>` sendet. Der Einmal-Token wird danach nie wieder übertragen.
**Lizenznachweis:** `proof` ist eine kompakte JWS (alg EdDSA/Ed25519). Der Client prüft sie lokal mit den Schlüsseln aus `GET /public/license-keys`, vergleicht `dev` mit SHA-256(installationId) (base64url) und akzeptiert sie bis `exp` (Offline-Toleranz, Standard 7 Tage). Eine serverseitige Sperrung erkennt ein Offline-Client erst bei der nächsten Synchronisierung bzw. spätestens mit Ablauf des Nachweises.
Lizenzschlüssel werden nie in URLs übertragen. Rate-Limits antworten mit HTTP 429 und `Retry-After`.
POST/licenses/activate
Lizenzschlüssel einlösen und Gerät aktivieren
Erste Einlösung erzeugt eine Lizenz. Ein bereits eingelöster Schlüssel erzeugt NIE eine weitere Lizenz, kann aber im Rahmen des Gerätelimits weitere Geräte derselben Lizenz aktivieren. Dasselbe Gerät erneut aktivieren rotiert nur das Credential.
201Aktiviert400VALIDATION_ERROR / INVALID_JSON403LICENSE_EXPIRED / LICENSE_REVOKED / LICENSE_SUSPENDED404INVALID_TOKEN409DEVICE_LIMIT_REACHED410TOKEN_EXPIRED / TOKEN_DISABLED429RATE_LIMITED
POST/licenses/refreshBearer-Credential
Neuen Lizenznachweis abrufen (Synchronisierung)
200Erfolg401INVALID_ACTIVATION – Credential ungültig oder Aktivierung zurückgesetzt403LICENSE_EXPIRED / LICENSE_REVOKED / LICENSE_SUSPENDED – details.license enthält den Status; Client muss auf Free zurückfallen429RATE_LIMITED
POST/licenses/usageBearer-Credential
Prepaid: Aufnahmezeit buchen
Meldet die tatsächlich aufgenommenen Sekunden einer Aufnahme. usageKey (z. B. die Aufnahme-ID) macht die Meldung idempotent; das Guthaben wird nie negativ. Lizenzen ohne Guthaben (unbegrenzt) buchen nichts. Antwort enthält einen neuen Nachweis mit der Restzeit (Claim rec, null = unbegrenzt).
200{ ok: true, data: { booked, license, proof, proofExpiresAt, refreshAfter, offlineDays } }401INVALID_ACTIVATION403LICENSE_EXPIRED / LICENSE_REVOKED / LICENSE_SUSPENDED429RATE_LIMITED
POST/licenses/deactivateBearer-Credential
Dieses Gerät abmelden (Geräteplatz freigeben)
200{ ok: true, data: { deactivated: true } }401INVALID_ACTIVATION
GET/licenses/statusBearer-Credential
Lizenzstatus dieser Aktivierung
200{ license, activation }401INVALID_ACTIVATION
GET/licenses/featuresBearer-Credential
Gültige Entitlements
Ohne Authorization-Header: Features des Free-Plans (keine Registrierung nötig). Mit Credential: Features der Lizenz bzw. Free bei inaktiver Lizenz.
200Erfolg401INVALID_ACTIVATION
GET/public/license-keys
Öffentliche Signaturschlüssel (aktuell + vorherige für Rotation)
GET/releases/latest
Neueste veröffentlichte Version