Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

Using the Network Quality API


This guide introduces the Network Quality API and provides guidance on how to use it effectively in your Twilio Video applications. The Network Quality API is only available in Group Rooms.


What's the Network Quality API

In a video application, the perceptual quality experienced by a Participant can be greatly influenced by the network. Degradation of available bandwidth, packet loss, or network jitter may reduce the usability of a video conferencing link causing end-user frustration. To tackle this, the Network Quality API monitors the Participant's network and provides quality metrics. Displaying quality scores in your UI can aid users in diagnosing problems as their network environment changes (such as due to a Wifi to Cellular handoff).

How the Network Quality API works

For this, the Network Quality API uses an algorithm that ingests both Client and Server metrics and computes a Network Quality Level on the following Likert scale:

Network Quality Level Meaning
5 Very good network
4 Good network
3 Average network
2 Bad network
1 Very bad network
0 Network broken (reconnecting)

Remark that the Network Quality Level is not an absolute metric but a score relative to what you are demanding from the network. For example, it may happen that your Quality Level is 5 while you are communicating low quality video but it drops to 1 as soon as you change the video to be HD even if the network does not change at all in the process.

This also means that when you are not using the network at all (i.e. you are neither publishing nor subscribing to any Tracks) your quality level will be always 5 given that any network will be capable of complying with a zero communications demand.

Using the Network Quality API

Enabling Network Quality Reporting

The Network Quality API is disabled by default, and is requested at connect time. The following table illustrates the currently supported platforms:

Twilio Video SDK NQ Levels for LocalParticipant NQ Levels for RemoteParticipants NQ Statistics
Android Yes (v4.4.0+) Coming soon Not Available
iOS Yes (v2.9.0+) Yes (v3.2.0+) Not Available
JavaScript Yes (v1.14.0+) Yes (v1.18.0+) Yes (v1.18.0+)

The Network Quality API is only available Group Rooms (including Small Group Rooms).


When building ConnectOptions.Builder, invoke the enableNetworkQuality method and pass true as a parameter.

ConnectOptions connectOptions =
                new ConnectOptions.Builder(token)


When building TVIConnectOptions, set the property networkQualityEnabled to true. By default this enables network quality level changes to be reported for the Local Participant. To also receive network quality level changes for the Remote Participants, a configured TVINetworkQualityConfiguration object needs to be supplied to the TVIConnectOptions.networkQualityConfiguration property.

let connectOptions = ConnectOptions(token: accessToken) { (builder) in
    builder.isNetworkQualityEnabled = true
    builder.networkQualityConfiguration = NetworkQualityConfiguration(localVerbosity: .minimal,
                                                                      remoteVerbosity: .minimal)
    builder.roomName = "my-room"

room = TwilioVideoSDK.connect(options: connectOptions, delegate: self)


In JavaScript (v1.18.0+), you can use the following code snippet for configuring the Network Quality API:

var Video = require('twilio-video');
var token = getAccessToken();

Video.connect(token, {
  name: 'my-room',
  audio: { name: 'microphone' },
  video: { name: 'camera' },
  networkQuality: {
    local: 1, // LocalParticipant's Network Quality verbosity [1 - 3]
    remote: 2 // RemoteParticipants' Network Quality verbosity [0 - 3]
}).then(function(room) {
  // Change Network Quality verbosity levels after joining the Room
    local: 2,
    remote: 1

networkQuality will now accept Network Quality verbosity levels for the LocalParticipant and RemoteParticipants. The following table describes the different verbosity levels:

Verbosity Value Description
none 0 Nothing is reported for the Participant. This has no effect and defaults to minimal for the LocalParticipant.
minimal 1 Reports NQ Level for the Participant.
moderate 2 Reports NQ Level and NetworkQualityStats for the Participant. NetworkQualityStats is populated with audio and video NQ Levels based on which the Participant's NQ Level is calculated.
detailed 3 Reports NQ Level and NetworkQualityStats for the Participant. NetworkQualityStats is populated with audio and video NQ Levels and their corresponding NetworkQualityMediaStats based on which the Participant's NQ Level is calculated.

Setting networkQuality to true is equivalent to setting the Network Quality verbosity for the LocalParticipant to 1 (minimal) and the Network Quality verbosity for RemoteParticipants to 0 (none).


Receiving the Network Quality Level

Once the Network Quality API is enabled through the connect method as shown above, the SDK will start receiving Network Quality Level events. That Network Quality Level is a value from 0–5, inclusive, representing the quality of the network connection of the Participant, as illustrated in the table above. Note that while a Room is in the reconnecting state, a LocalParticipant's Network Quality Level is set to 0.

The specific value of the Network Quality Level can be obtained at any time using the networkQualityLevel property of the LocalParticipant object. Also note that while a Room is in reconnecting state, the LocalParticipant's Network Quality Level is 0.

In addition, applications can get notified of changes on the networkQualityLevel by subscribing to the networkQualityLevelChanged event that is published by the LocalParticipant.


Implementing the onNetworkQualityLevelChanged method on the LocalParticipant.Listener interface will allow you to receive Network Quality Level updates.

LocalParticipant.Listener localParticipantListener = new LocalParticipant.Listener() {

    public void onNetworkQualityLevelChanged(
        @NonNull LocalParticipant localParticipant,
        @NonNull NetworkQualityLevel networkQualityLevel) {}


Implement -[TVILocalParticipantDelegate localParticipant:networkQualityLevelDidChange:] in order to respond to network quality level changes for the local participant.

// MARK: LocalParticipantDelegate
func localParticipantNetworkQualityLevelDidChange(participant: LocalParticipant, networkQualityLevel: NetworkQualityLevel) {
    print("Local Participant Network Quality Level Changed: \(networkQualityLevel)")

Implement -[TVIRemoteParticipantDelegate remoteParticipant:networkQualityLevelDidChange:] in order to respond to network quality level changes for remote participants.

// MARK: RemoteParticipantDelegate
func remoteParticipantNetworkQualityLevelDidChange(participant: RemoteParticipant, networkQualityLevel: NetworkQualityLevel) {
    print("Remote Participant (\(participant.identity)) Network Quality Level Changed: \(networkQualityLevel)")


A typical way of using the Network Quality Level is to represent a Participant's Network Quality as cell phone-style signal-strength bars. The following snippet shows how to do it in JavaScript:

function printNetworkQualityStats(networkQualityLevel, networkQualityStats) {
  // Print in console the networkQualityLevel using bars
    1: '▃',
    2: '▃▄',
    3: '▃▄▅',
    4: '▃▄▅▆',
    5: '▃▄▅▆▇'
  }[networkQualityLevel] || '');

  if (networkQualityStats) {
    // Print in console the networkQualityStats, which is non-null only if Network Quality
    // verbosity is 2 (moderate) or greater
    console.log('Network Quality statistics:', networkQualityStats);

// Print the initial Network Quality Level and statistics
printNetworkQualityStats(participant.networkQualityLevel, participant.networkQualityStats);

// Print changes to Network Quality Level and statistics
participant.on('networkQualityLevelChanged', printNetworkQualityStats);
Rate this page:

Need some help?

We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.