> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daily.co/llms.txt
> Use this file to discover all available pages before exploring further.

# getNetworkStats()

> Returns current network quality stats and per-interval send/receive metrics.

`getNetworkStats()`

Returns a snapshot of the current network statistics, calculated from [WebRTC stats](https://www.w3.org/TR/webrtc-stats/). Stats in `stats.latest` are updated approximately every two seconds — poll this method to monitor network performance over time.

If a value cannot be determined for a given interval, it is set to `null`. This most commonly occurs for `packetLoss` calculations due to the values it relies upon being missing or stale, or media not being transmitted. For instance, if you join a call with audio and video off, your bitrates will be 0 and `packetLoss` will be `null` because it is unknown.

## Return value

Returns a `Promise<DailyNetworkStats>`:

<ResponseField name="networkState" type="string">
  Current network quality assessment: `'good'`, `'warning'`, `'bad'`, or `'unknown'`. Calculated from send/receive packet loss, round trip time, and available outgoing bitrate, averaged over a \~30-second rolling window. In Prebuilt, Daily lowers bandwidth at `'warning'` and disables the local camera at `'bad'`.
</ResponseField>

<ResponseField name="networkStateReasons" type="string[]">
  Reasons for the current `networkState`. Possible values: `'sendPacketLoss'`, `'recvPacketLoss'`, `'roundTripTime'`, `'availableOutgoingBitrate'`. Empty when state is `'good'` or `'unknown'`.
</ResponseField>

<ResponseField name="stats" type="DailyNetworkStatsData | {}">
  Network statistics. Empty object (`{}`) when stats are not yet available.

  <Expandable title="stats fields">
    <ResponseField name="averageNetworkRoundTripTime" type="number">Average round trip time over the course of the call.</ResponseField>
    <ResponseField name="worstAudioRecvPacketLoss" type="number">Highest audio receive packet loss seen during any reporting interval.</ResponseField>
    <ResponseField name="worstAudioSendPacketLoss" type="number">Highest audio send packet loss seen during any reporting interval.</ResponseField>
    <ResponseField name="worstVideoRecvPacketLoss" type="number">Highest video receive packet loss seen during any reporting interval.</ResponseField>
    <ResponseField name="worstVideoSendPacketLoss" type="number">Highest video send packet loss seen during any reporting interval.</ResponseField>
    <ResponseField name="worstVideoRecvJitter" type="number">Highest video receive jitter seen during any reporting interval.</ResponseField>
    <ResponseField name="worstVideoSendJitter" type="number">Highest video send jitter seen during any reporting interval.</ResponseField>
    <ResponseField name="worstAudioRecvJitter" type="number">Highest audio receive jitter seen during any reporting interval.</ResponseField>
    <ResponseField name="worstAudioSendJitter" type="number">Highest audio send jitter seen during any reporting interval.</ResponseField>

    <ResponseField name="latest" type="object">
      Statistics from the most recent reporting interval (\~2s).

      <Expandable title="latest fields">
        <ResponseField name="timestamp" type="number">Unix timestamp (ms) of when the stats were recorded.</ResponseField>
        <ResponseField name="recvBitsPerSecond" type="number | null">Total incoming bits per second (audio + video).</ResponseField>
        <ResponseField name="sendBitsPerSecond" type="number | null">Total outgoing bits per second (audio + video).</ResponseField>
        <ResponseField name="networkRoundTripTime" type="number | null">Average round trip time across all connections.</ResponseField>
        <ResponseField name="availableOutgoingBitrate" type="number | null">Average available outgoing bitrate across all connections.</ResponseField>
        <ResponseField name="audioRecvBitsPerSecond" type="number | null">Incoming audio payload bits per second.</ResponseField>
        <ResponseField name="audioSendBitsPerSecond" type="number | null">Outgoing audio payload bits per second.</ResponseField>
        <ResponseField name="audioRecvPacketLoss" type="number | null">Estimated packet loss percentage for incoming audio.</ResponseField>
        <ResponseField name="audioSendPacketLoss" type="number | null">Estimated packet loss percentage for outgoing audio. Always `null` in Firefox.</ResponseField>
        <ResponseField name="videoRecvBitsPerSecond" type="number | null">Incoming video payload bits per second.</ResponseField>
        <ResponseField name="videoSendBitsPerSecond" type="number | null">Outgoing video payload bits per second.</ResponseField>
        <ResponseField name="videoRecvPacketLoss" type="number | null">Estimated packet loss percentage for incoming video.</ResponseField>
        <ResponseField name="videoSendPacketLoss" type="number | null">Estimated packet loss percentage for outgoing video.</ResponseField>
        <ResponseField name="totalRecvPacketLoss" type="number | null">Overall estimated packet loss for all incoming media.</ResponseField>
        <ResponseField name="totalSendPacketLoss" type="number | null">Overall estimated packet loss for all outgoing media.</ResponseField>
        <ResponseField name="videoRecvJitter" type="number | null">Average jitter across inbound video streams.</ResponseField>
        <ResponseField name="videoSendJitter" type="number | null">Average jitter across outbound video streams.</ResponseField>
        <ResponseField name="audioRecvJitter" type="number | null">Average jitter across inbound audio streams.</ResponseField>
        <ResponseField name="audioSendJitter" type="number | null">Average jitter across outbound audio streams. Always `null` in Firefox.</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="threshold" type="string" deprecated>
  Deprecated in 0.77.0. Use `networkState` instead. Was `'good'`, `'low'`, or `'very-low'`.
</ResponseField>

<ResponseField name="quality" type="number" deprecated>
  Deprecated in 0.77.0. Was a subjective 1–100 quality score.
</ResponseField>

<Warning>
  Firefox does not report send-side packet loss or jitter for audio (`audioSendPacketLoss` and `audioSendJitter` are always `null`), and does not provide `availableOutgoingBitrate`, `networkRoundTripTime`, or `averageNetworkRoundTripTime`.
</Warning>

## Example

<CodeGroup>
  ```javascript Example Usage theme={null}
  const { networkState, networkStateReasons, stats } = await call.getNetworkStats();

  if (networkState === 'bad') {
    console.log('Poor network. Reasons:', networkStateReasons);
  }

  if (stats.latest) {
    console.log('Packet loss (send):', stats.latest.totalSendPacketLoss);
    console.log('Round trip time:', stats.latest.networkRoundTripTime);
  }
  ```

  ```JSON Sample response theme={null}
  {
    "networkState": "bad",
    "networkStateReasons": ["sendPacketLoss", "recvPacketLoss"],
    "threshold": "good",
    "quality": 37,
    "stats": {
      "averageNetworkRoundTripTime": 0.01992261904761905,
      "latest": {
        "audioRecvBitsPerSecond": 23050.048937297845,
        "audioRecvJitter": 0.026,
        "audioRecvPacketLoss": 0.15053763440860216,
        "audioSendBitsPerSecond": 30177.83704675053,
        "audioSendJitter": null,
        "audioSendPacketLoss": null,
        "availableOutgoingBitrate": 2889866,
        "networkRoundTripTime": 0.02,
        "recvBitsPerSecond": 1700344.1895481267,
        "sendBitsPerSecond": 1724499.7493844875,
        "timestamp": 1743011906315,
        "totalRecvPacketLoss": 0.11670020120724346,
        "totalSendPacketLoss": 0.08984375,
        "videoRecvBitsPerSecond": 1567291.2594309496,
        "videoRecvJitter": 0.036,
        "videoRecvPacketLoss": 0.10891089108910891,
        "videoSendBitsPerSecond": 1589251.349980054,
        "videoSendJitter": 0.008922,
        "videoSendPacketLoss": 0.08984375
      },
      "worstAudioRecvJitter": 0.026,
      "worstAudioRecvPacketLoss": 0.23232323232323232,
      "worstAudioSendJitter": 0.003166,
      "worstAudioSendPacketLoss": 0.1953125,
      "worstVideoRecvJitter": 0.036,
      "worstVideoRecvPacketLoss": 0.10891089108910891,
      "worstVideoSendJitter": 0.014355,
      "worstVideoSendPacketLoss": 0.13671875
    }
  }
  ```
</CodeGroup>

## See also

<CardGroup>
  <Card title="Methods" icon="code" iconType="solid">
    * [getCpuLoadStats()](/reference/react-native/instance-methods/get-cpu-load-stats)
    * [updateSendSettings()](/reference/react-native/instance-methods/update-send-settings)
    * [updateReceiveSettings()](/reference/react-native/instance-methods/update-receive-settings)
  </Card>

  <Card title="Events" icon="bolt" iconType="solid">
    * [network-quality-change](/reference/react-native/events/network-events#network-quality-change)
    * [network-connection](/reference/react-native/events/network-events#network-connection)
  </Card>

  <Card title="Guides" icon="book-open" iconType="solid">
    * [Call quality](/docs/daily-js/guides/network-quality)
    * [Logging and metrics](/docs/guides/architecture-and-monitoring/logging-and-metrics)
  </Card>
</CardGroup>
