Bedrud Dokumentation

Die Raumverwaltungs-Endpunkte befinden sich unter /api/room/. Alle Endpunkte erfordern Authentifizierung.

Übersicht

EndpunktMethodeBeschreibung
/api/room/createPOSTNeuen Raum erstellen
/api/room/joinPOSTEinem Raum beitreten und ein LiveKit-Token erhalten
/api/room/listGETVerfügbare Räume auflisten
/api/room/:roomId/kick/:identityPOSTTeilnehmer entfernen (Admin)
/api/room/:roomId/mute/:identityPOSTTeilnehmer stumm schalten (Admin)
/api/room/:roomId/video/:identity/offPOSTVideo eines Teilnehmers deaktivieren (Admin)

Endpunkte

Raum erstellen

Einen neuen Besprechungsraum erstellen. Der authentifizierte Benutzer wird Raum-Admin.

POST /api/room/create

Header: Authorization: Bearer <accessToken>

Anfrage-Body:

{
  "name": "team-standup",
  "isPublic": true,
  "mode": "standard",
  "settings": {
    "allowChat": true,
    "allowVideo": true,
    "allowAudio": true,
    "requireApproval": false,
    "e2ee": false
  }
}

Hinweis: Das Feld name ist optional. Wenn es weggelassen wird oder leer ist, generiert der Server automatisch einen zufälligen URL-sicheren Namen im Format xxx-xxxx-xxx (z. B. bkf-qmzl-rja).

Regeln für Raumnamen:

Raumnamen erscheinen in der URL als https://bedrud.xyz/m/NAME und müssen daher URL-sicher sein:

RegelBeschreibung
Erlaubte ZeichenKleinbuchstaben (a-z), Ziffern (0-9) und Bindestriche (-)
Minimale Länge3 Zeichen
Maximale Länge63 Zeichen
Keine Sonderzeichen#, @, _, ., /, \, <, >, &, %, +, =, ;, :, ', ", ?, !, Leerzeichen usw. sind nicht erlaubt
Keine führenden/abschließenden Bindestriche-room und room- sind ungültig
Keine aufeinanderfolgenden Bindestricheroom--name ist ungültig
Nur KleinbuchstabenGroßbuchstaben werden abgelehnt; die Eingabe wird automatisch in Kleinbuchstaben umgewandelt
EindeutigJeder Raumname muss eindeutig sein

Antwort (200):

{
  "id": "uuid",
  "name": "team-standup",
  "createdBy": "user-uuid",
  "isActive": true,
  "isPublic": true,
  "maxParticipants": 0,
  "settings": {
    "allowChat": true,
    "allowVideo": true,
    "allowAudio": true,
    "requireApproval": false,
    "e2ee": false
  },
  "livekitHost": "wss://lk.bedrud.xyz",
  "mode": "standard"
}

Felder

FeldTypErforderlichBeschreibung
namestringNeinURL-sicherer Raumname (wird automatisch generiert, wenn weggelassen)
isPublicbooleanNeinOb der Raum in öffentlichen Listen erscheint
modestringNeinRaummodus (z. B. "standard")
maxParticipantsnumberNeinMaximale Anzahl an Teilnehmern
settings.allowChatbooleanNeinOb der Textchat aktiviert ist
settings.allowVideobooleanNeinOb Video aktiviert ist
settings.allowAudiobooleanNeinOb Audio aktiviert ist
settings.requireApprovalbooleanNeinOb Teilnehmer die Genehmigung des Admins benötigen
settings.e2eebooleanNeinOb Ende-zu-Ende-Verschlüsselung aktiviert ist

Raum beitreten

Einem bestehenden Raum beitreten und ein LiveKit-Token für die Medienverbindung erhalten.

POST /api/room/join

Header: Authorization: Bearer <accessToken>

Anfrage-Body:

{
  "roomName": "team-standup"
}

Antwort (200):

{
  "id": "uuid",
  "name": "team-standup",
  "token": "eyJ...",
  "createdBy": "user-uuid",
  "adminId": "user-uuid",
  "isActive": true,
  "isPublic": true,
  "maxParticipants": 20,
  "expiresAt": "2026-02-16T12:00:00Z",
  "settings": { ... },
  "livekitHost": "wss://lk.bedrud.xyz",
  "mode": "standard"
}

Das token ist ein signiertes LiveKit-Zugriffstoken. Verwenden Sie es, um sich über WebSocket mit dem LiveKit-Server zu verbinden:

import { Room } from 'livekit-client';
 
const room = new Room();
await room.connect(livekitUrl, token);

Räume auflisten

Eine Liste der vom Benutzer erstellten Räume abrufen.

GET /api/room/list

Header: Authorization: Bearer <accessToken>

Antwort (200):

[
  {
    "id": "uuid",
    "name": "team-standup",
    "createdBy": "user-uuid",
    "isActive": true,
    "maxParticipants": 20,
    "expiresAt": "2026-02-16T12:00:00Z",
    "settings": { ... },
    "mode": "standard",
    "relationship": "creator"
  }
]

Teilnehmer entfernen

Einen Teilnehmer aus dem Raum entfernen. Dies kann nur der Raum-Admin.

POST /api/room/:roomId/kick/:identity

Header: Authorization: Bearer <accessToken>

Antwort (200):

{
  "status": "success"
}

Teilnehmer stumm schalten

Das Mikrofon eines Teilnehmers stumm schalten. Dies kann nur der Raum-Admin.

POST /api/room/:roomId/mute/:identity

Header: Authorization: Bearer <accessToken>

Antwort (200):

{
  "status": "success"
}

Video eines Teilnehmers deaktivieren

Die Kamera eines Teilnehmers ausschalten. Dies kann nur der Raum-Admin.

POST /api/room/:roomId/video/:identity/off

Header: Authorization: Bearer <accessToken>

Antwort (200):

{
  "status": "success"
}

Admin-Kontrolle

Raum-Admin-Aktionen (entfernen, stumm schalten, Video aus) stehen nur dem Benutzer zur Verfügung, der den Raum erstellt hat (adminId). Der Versuch dieser Aktionen als Nicht-Admin gibt einen 403-Fehler zurück.

Berechtigungsmatrix

AktionRaum-AdminSuper AdminRegulärer BenutzerGast
Raum erstellenJaJaJaNein
Raum beitretenJaJaJaJa
Räume auflistenJaJaJaJa
EntfernenJaJaNeinNein
Stumm schaltenJaJaNeinNein
Video ausJaJaNeinNein

Fehlerantworten

Alle Fehler folgen einem einheitlichen Format:

{
  "error": "human-readable error message"
}

Fehler beim Raum erstellen

StatusFehlermeldungBeschreibung
400"Invalid request body"Ungültiges JSON
400"room name must contain only lowercase letters, numbers, and hyphens"Name enthält Sonderzeichen (#, @, _ usw.)
400"room name must be at least 3 characters"Name zu kurz
400"room name must be at most 63 characters"Name zu lang
409"a room with this name already exists"Doppelter Name
500"Failed to create media room"LiveKit-Serverfehler
500"Failed to create room"Datenbankfehler

Allgemeine Fehler

StatusBedeutung
400Ungültige Anfrage (fehlende/ungültige Daten)
401Nicht authentifiziert
403Nicht autorisiert (Nicht-Admin versucht Admin-Aktion)
404Raum nicht gefunden
409Konflikt (doppelte Ressource)
500Interner Serverfehler

Siehe auch