IMPORTANT: Please upgrade to the latest version of twilio-video.js to avoid breaking changes in Chrome in early 2020 (removal of Plan B). See this advisory for details.


NPM CircleCI Windows Build status

For 1.x, go here.

twilio-video.js allows you to add real-time voice and video to your web apps.

We want your feedback! Email with suggested improvements, feature requests and general feedback, or feel free to open a GitHub issue. If you need technical support, contact

Browser Support

Chrome Edge (Chromium) Firefox Safari
Android - -
iOS * - *
Linux - -
macOS ✓ **
Windows ✓ ** -

* Chrome and Firefox for iOS do not have access to WebRTC APIs, unlike Safari for iOS.

** twilio-video.js supports the Chromium-based Edge browser.



npm install twilio-video --save

Using this method, you can require twilio-video.js like so:

const Video = require('twilio-video');


Releases of twilio-video.js are hosted on a CDN, and you can include these directly in your web app using a <script> tag.

<script src="//"></script>

Using this method, twilio-video.js will set a browser global:

const Video = Twilio.Video;


The following is a simple example for connecting to a Room. For more information, refer to the API Docs.

const Video = require('twilio-video');

Video.connect('$TOKEN', { name: 'room-name' }).then(room => {
  console.log('Connected to Room "%s"',;

  room.on('participantConnected', participantConnected);

  room.on('participantDisconnected', participantDisconnected);
  room.once('disconnected', error => room.participants.forEach(participantDisconnected));

function participantConnected(participant) {
  console.log('Participant "%s" connected', participant.identity);

  const div = document.createElement('div'); = participant.sid;
  div.innerText = participant.identity;

  participant.on('trackSubscribed', track => trackSubscribed(div, track));
  participant.on('trackUnsubscribed', trackUnsubscribed);

  participant.tracks.forEach(publication => {
    if (publication.isSubscribed) {
      trackSubscribed(div, publication.track);


function participantDisconnected(participant) {
  console.log('Participant "%s" disconnected', participant.identity);

function trackSubscribed(div, track) {

function trackUnsubscribed(track) {
  track.detach().forEach(element => element.remove());



Content Security Policy (CSP)

Want to enable CSP in a way that's compatible with twilio-video.js? Use the following policy directives:

connect-src wss:// wss://
media-src mediastream:

If you're loading twilio-video.js from, you should also include the following script-src directive:


Keep in mind, you may need to merge these policy directives with your own if you're using other services.




Fork and clone the repository. Then, install dependencies with

npm install

Then run the build script:

npm run build

The builds and docs will be placed in the dist/ directory.


Bug fixes welcome! If you're not familiar with the GitHub pull request/contribution process, this is a nice tutorial.