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' and mediaEncryption: '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 bucket

Completion + 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.