SFU Recording
Server-side recording for SFU-mode rooms. The platform's media server captures the room composite and uploads the finalized file directly to a storage bucket you control (S3, Google Cloud Storage, or Azure Blob); the platform never holds the recorded bytes. Storage destinations are registered once in the panel and referenced from the SDK by an opaque destinationId.
Pre-conditions
- The room's policy must set both
mediaMode: 'SFU'andmediaEncryption: 'SFU'. - E2EE-encrypted SFU rooms cannot be server-recorded by design; the media server forwards traffic it cannot decrypt. For those, use the client-side call recording path instead.
- A recording destination must be configured in the panel for the app (Settings → Recording destinations).
SDK methods
const rec = await client.startSfuRecording(room.roomId, 'dst_aBc123');
// { recordingId, status: 'STARTING', startedAt, ... }
await client.stopSfuRecording(room.roomId, rec.recordingId);
const history = await client.listSfuRecordings(room.roomId);
// finalized recordings carry locationUri pointing into your bucketCompletion + webhooks
The Egress upload typically lands within minutes of the call ending. The platform fires three HMAC-signed runtime webhooks to your backend:
sfu-recording.started— { recordingId, roomId, destinationId, startedBy }sfu-recording.completed— { recordingId, roomId, locationUri, durationSeconds, fileSizeBytes }sfu-recording.failed— { recordingId, roomId, errorMessage }
Verify support via GET /api/info, the features array includes "sfu_recording". Requires SDK 0.18.0+ on JavaScript, Android, and iOS.