Room recording
Records the whole room, composed into one file. start requires a live session. To stop the recording, pass the value returned by start to stop, or simply pass the room id.
- Node.js
- Go
const rec = await client.recordings.start(roomId, {
composition: { layout: "grid", quality: "high" },
fileFormat: "mp4",
});
await client.recordings.stop(rec); // or client.recordings.stop(roomId)
rec, err := client.Recordings.Start(ctx, roomID, videosdk.RecordingStartParams{
Composition: &videosdk.Composition{Layout: videosdk.CompositionLayoutGrid, Quality: videosdk.Ptr(videosdk.CompositionQualityHigh)},
FileFormat: videosdk.RecordingFormatMP4,
})
client.Recordings.Stop(ctx, rec) // or videosdk.EgressHandle{RoomID: roomID}
Only the roomId passed to start is required. Everything below is optional. Pass it when the described behavior applies to your case.
| Option | Description |
|---|---|
composition | Controls the recording's layout and rendering (grid, spotlight, quality, and so on). See Composition. Defaults are applied if you omit it. |
transcription | Generates a transcription, and optionally a summary, after the recording finishes. Pass it when you want a transcript of the meeting. |
onFailure | What to do if the composition fails while recording. Pass it when you need explicit failure handling instead of the default. |
fileFormat | Output file format: mp4 (default) or webm. Pass it when you need webm. |
webhookUrl | Your endpoint to receive status updates (started, stopped, uploaded) for this recording. Pass it when you want to be notified instead of polling. |
dirPath | Path prefix for the output files in storage. Pass it to organize recordings under your own folder structure. |
resourceId | Id of a recording resource you reserved ahead of time. A recording normally allocates a resource on demand, which adds a short start-up delay. Passing a pre-reserved resource removes that delay, so recording begins immediately. Available on Enterprise plans with resource pooling. |
preSignedUrl | A pre-signed URL to upload the finished file to your own storage instead of VideoSDK's. Pass it when you store recordings in your own bucket. |
Manage finished recordings:
- Node.js
- Go
await client.recordings.list({ roomId, withTranscription: true });
await client.recordings.get(recordingId, { withTranscription: true });
await client.recordings.delete(recordingId);
client.Recordings.List(ctx, videosdk.RecordingListParams{RoomID: videosdk.String(roomID), WithTranscription: videosdk.Bool(true)})
client.Recordings.Get(ctx, recordingID, videosdk.RecordingGetParams{WithTranscription: videosdk.Bool(true)})
client.Recordings.Delete(ctx, recordingID)
The recording object
recordings.list and get return this object.
| Field | Type | Description |
|---|---|---|
id | string | Recording id. |
roomId | string | Room this recording belongs to. |
file | object | Output file (contains fileUrl). |
webhook | object | Webhook delivery summary. |
start | string | Start time (ISO-8601). |
end | string | End time, null while still recording. |
links | object | Related resource links. |
Composition
The composition option controls the layout and rendering of the recorded video. Provide a named layout or a custom template URL.
| Field | Values |
|---|---|
layout | grid, spotlight, sidebar, or a custom template URL |
priority | SPEAKER or PIN |
gridSize | tiles in grid, 0-25 (default 25) |
orientation | portrait or landscape |
theme | DARK, LIGHT, or DEFAULT |
quality | low, med, high, or ultra |
There is no resolution option. Use quality.
Got a Question? Ask us on discord

