> ## 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.

# DailyTrackState

> The state of a single media track for a participant, including subscription status, playback state, and the underlying MediaStreamTrack.

`DailyTrackState` describes the current condition of one media track — camera, microphone, screen share, or custom — from the local participant's point of view. It appears as a value in `DailyParticipant.tracks`.

```typescript theme={null}
interface DailyTrackState {
  subscribed: boolean | 'staged';
  state: 'blocked' | 'off' | 'sendable' | 'loading' | 'interrupted' | 'playable';
  off?: {
    byUser?: boolean;
    byRemoteRequest?: boolean;
    byBandwidth?: boolean;
    byCanSendPermission?: boolean;
    byCanReceivePermission?: boolean;
    byServerLimit?: boolean;
  };
  blocked?: {
    byDeviceMissing?: boolean;
    byDeviceInUse?: boolean;
    byPermissions?: boolean;
  };
  track?: MediaStreamTrack;
  persistentTrack?: MediaStreamTrack;
}
```

## Properties

<ResponseField name="subscribed" type="true | false | 'staged'">
  Whether the local participant is subscribed to this track. Only meaningful for remote participants — local tracks are always implicitly subscribed.

  * `true` — subscribed and receiving
  * `false` — not subscribed
  * `'staged'` — SDP negotiated but no bytes are flowing; track can transition to `playable` faster when set to `true`

  Set via [`updateParticipant()`](/reference/react-native/instance-methods/update-participant) with `setSubscribedTracks`.
</ResponseField>

<ResponseField name="state" type="string">
  The complete, mutually exclusive state of the track from the local participant's point of view.

  | Value           | Meaning                                                                                                           |
  | --------------- | ----------------------------------------------------------------------------------------------------------------- |
  | `'blocked'`     | Track cannot be sent. Check `blocked` for the cause.                                                              |
  | `'off'`         | Track is intentionally not being sent. Check `off` for the cause.                                                 |
  | `'sendable'`    | Track is available to send but the local participant hasn't subscribed to it yet.                                 |
  | `'loading'`     | Track is subscribed and the stream is being established.                                                          |
  | `'playable'`    | Track is live and ready to render.                                                                                |
  | `'interrupted'` | Track was `playable` but has transiently stalled (network fluctuation, iOS background). May return to `playable`. |
</ResponseField>

<ResponseField name="off" type="object">
  Present when `state` is `'off'`. Indicates why the track is off. All sub-fields are optional booleans.

  <Expandable title="off properties">
    <ResponseField name="byUser" type="boolean">
      The sender muted their own track.
    </ResponseField>

    <ResponseField name="byRemoteRequest" type="boolean">
      An admin muted this participant's track remotely.
    </ResponseField>

    <ResponseField name="byBandwidth" type="boolean">
      Daily paused the track due to bandwidth constraints.
    </ResponseField>

    <ResponseField name="byCanSendPermission" type="boolean">
      The participant does not have permission to send this track type.
    </ResponseField>

    <ResponseField name="byCanReceivePermission" type="boolean">
      Remote participants only. The local participant does not have permission to receive this track.
    </ResponseField>

    <ResponseField name="byServerLimit" type="boolean">
      A server-side participant limit has been reached.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="blocked" type="object">
  Present when `state` is `'blocked'`. Indicates why the track cannot be sent. All sub-fields are optional booleans.

  <Expandable title="blocked properties">
    <ResponseField name="byDeviceMissing" type="boolean">
      No device of this type is available.
    </ResponseField>

    <ResponseField name="byDeviceInUse" type="boolean">
      The device is in use by another application.
    </ResponseField>

    <ResponseField name="byPermissions" type="boolean">
      The user has denied browser permissions for this device.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="track" type="MediaStreamTrack | undefined">
  The underlying [`MediaStreamTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack). Only present when `state === 'playable'`. Only available in [call object mode](/docs/daily-js/concepts/call-modes#call-object-mode).

  Prefer `persistentTrack` for attaching to media elements.
</ResponseField>

<ResponseField name="persistentTrack" type="MediaStreamTrack | undefined">
  The underlying [`MediaStreamTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack). Present whenever a track exists, regardless of `state`. Only available in [call object mode](/docs/daily-js/concepts/call-modes#call-object-mode).

  **Recommended over `track`** as a proactive defense against black frames during call disruptions and browser limitations. Use `track` only when you need a guarantee that media is currently flowing.
</ResponseField>

## See also

<CardGroup>
  <Card title="Types" icon="t" iconType="solid">
    * [DailyParticipant](/reference/react-native/types/daily-participant)
  </Card>

  <Card title="Methods" icon="code" iconType="solid">
    * [participants()](/reference/react-native/instance-methods/participants)
    * [setLocalVideo()](/reference/react-native/instance-methods/set-local-video)
    * [setLocalAudio()](/reference/react-native/instance-methods/set-local-audio)
    * [updateParticipant()](/reference/react-native/instance-methods/update-participant)
  </Card>

  <Card title="Events" icon="bolt" iconType="solid">
    * [participant-updated](/reference/react-native/events/participant-events#participant-updated)
    * [track-started](/reference/react-native/events/media-events#track-started)
    * [track-stopped](/reference/react-native/events/media-events#track-stopped)
  </Card>

  <Card title="Guides" icon="book-open" iconType="solid">
    * [Tracks and Media](/docs/daily-js/concepts/tracks)
  </Card>
</CardGroup>
