End-to-End Encryption (E2EE) - Javascript
Overview
End-to-end encryption (E2EE) ensures that your media content remains private and secure by encrypting it on the sender's device and decrypting it only on the receiver's device. This prevents intermediaries, including VideoSDK servers, from accessing or modifying the content.
E2EE is particularly important for applications in security-critical domains such as telehealth, finance, and legal services.
How E2EE Works
-
E2EE is applied at the room level, where a single shared key encrypts and decrypts all media tracks during a session.
-
Participants without the key cannot access the media.
-
The entire encryption process is handled client-side. VideoSDK does not access or store any encryption keys.
Key Management & Distribution
You are fully responsible for generating, managing, and securely distributing encryption keys to all participants. VideoSDK never stores, accesses, or transfers your encryption keys.
-
Common Key Distribution Approaches:
-
Generate the key on your server when creating a meeting.
-
Send the key securely along with the meeting access token.
-
Use HTTPS-secured API calls to fetch the key on the client.
⚠️ Ensure that all participants have access to the correct encryption key before joining the room.
The table below shows the minimum SDK versions that support E2EE. All subsequent versions also include E2EE support.
| React Native | iOS | Flutter | React | Android | JavaScript |
|---|---|---|---|---|---|
| 0.2.1 | 2.2.2 | 2.1.0 | 0.3.5 | 0.5.0 | 0.2.6 |
Enabling E2EE in VideoSDK Javascript
To enable E2EE in VideoSDK for Javascript, follow these steps:
const keyProvider = new ExternalE2EEKeyProvider();
keyProvider.setSharedKey("<Secret_Key>");
// Setting key before initalizing meeting
// If you set key before initalize then e2ee will automatically enabled.
VideoSDK.setKeyProvider(keyProvider);
meeting = window.VideoSDK.initMeeting({
meetingId: "pbow-6vec-vahn" || meetingId, // required
micEnabled: true,
webcamEnabled: true,
});
Additional Configuration Options
You can customize the encryption behavior by passing parameters while creating the BaseKeyProvider instance:
| Parameter | Type | Description |
|---|---|---|
discardFrameWhenCryptorNotReady | bool | If true, frames will be discarded when the cryptor is not ready, ensuring no unencrypted content is sent. |
Event for E2EE State Changes
To monitor encryption state changes for each participant's media stream:
participant.on("e2ee-state-change", (data) => {
console.log("Media Kind ", data.kind);
console.log("State changed to ", data.state);
});
The possible values for state are:
| State | Description |
|---|---|
| EncryptionSuccess | Media encryption is successfully applied. |
| DecryptionSuccess | Incoming media is successfully decrypted. |
| EncryptionFailed | Encryption encountered an error. |
| DecryptionFailed | Decryption encountered an error. |
| InternalError | Internal processing error occurred. |
| MissingKey | When key is missing. |
| InvalidKey | Invalid key is passed. |
To Check Whether E2EE enable not
You can check whether E2EE is enabled by using e2eeEnabled property of Meeting class.
console.log("isE2EEEnabled ", meeting.isE2EEEnabled);
Limitations
E2EE only applies to media. It does not apply to:
-
Chat messages or metadata
-
API calls and signaling data
These communications are still protected by TLS but are not encrypted end-to-end.
Recording and transcription features are not supported when End-to-End Encryption (E2EE) is enabled.
If E2EE is enabled and you want to record or transcribe the session, use a custom recording template. See Custom Template.
- Recording: Build the template with the React or JavaScript SDK and enable E2EE in it using the same key provider and shared key as your application, so the template can decrypt the media for recording. Deliver the key securely from your backend to the template over HTTPS rather than including it in the
templateUrl, then start the recording using the template'stemplateUrl. - Transcription: Use the same template recording for the post-call transcript and summary, since post transcription runs on the recording file. Realtime transcription is not available when E2EE is enabled.
Got a Question? Ask us on discord

