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

# participants()

> Returns an object containing all current participants in the call, keyed by participant ID.

`participants()`

Returns an object keyed by `'local'` for the local participant and by `session_id` for each remote participant.

## Return value

```typescript theme={null}
interface DailyParticipantsObject {
  local: DailyParticipant;
  [sessionId: string]: DailyParticipant;
}
```

<ResponseField name="session_id" type="string">
  A unique identifier for this specific join event. This is Daily's internal identifier, randomly generated on every `join()` call. It is the key used in `participants()` and `updateParticipant()` as well as REST API endpoints. It is not stable across reconnects — if a participant leaves and rejoins, they will have a new `session_id`.
</ResponseField>

<ResponseField name="user_id" type="string">
  The participant's user ID if set via a meeting token; otherwise defaults to `session_id`.
</ResponseField>

<ResponseField name="user_name" type="string">
  The participant's display name. Set via a meeting token, [`DailyCallOptions`](/reference/react-native/types/daily-call-options), or [`setUserName()`](/reference/react-native/instance-methods/set-user-name).
</ResponseField>

<ResponseField name="userData" type="object">
  Optional custom data associated with the participant. Only present if explicitly set via [`DailyCallOptions`](/reference/react-native/types/daily-call-options) or [`setUserData()`](/reference/react-native/instance-methods/set-user-data).
</ResponseField>

<ResponseField name="local" type="boolean">
  `true` for the local participant.
</ResponseField>

<ResponseField name="owner" type="boolean">
  `true` if the participant was granted owner status via a meeting token or was granted owner permissions.
</ResponseField>

<ResponseField name="joined_at" type="Date">
  A JavaScript `Date` object representing the time the participant joined the room. Not set until after the joined-meeting event. Note that the timestamp is set to the server’s clock time when the participant joins, so it may be slightly different from the local client’s clock.
</ResponseField>

<ResponseField name="networkQualityState" type="'good' | 'warning' | 'bad' | 'unknown'">
  The current network quality state of the participant. For the local participant, this matches the `networkState` value returned by [`getNetworkStats()`](/reference/react-native/instance-methods/get-network-stats) and in the `network-quality-change` events.
</ResponseField>

<ResponseField name="participantType" type="string | undefined">
  Describes the participant type for SIP, PSTN, and remote media player participants. Not set for standard web participants.

  <Expandable title="participantType values">
    | Value                 | Description                                                              |
    | --------------------- | ------------------------------------------------------------------------ |
    | `remote-media-player` | Participant is a remote media player                                     |
    | `sip-dial-in`         | Participant joined via a SIP device dialing into the Daily room          |
    | `sip-dial-out`        | Participant joined when a SIP endpoint was called using the dial-out API |
    | `pstn-dial-in`        | Participant joined via dialing a PIN-based phone number                  |
    | `pstn-dial-out`       | Participant joined when a phone number was called using the dial-out API |
    | `unknown`             | Participant is SIP/PSTN but Daily cannot determine the exact type        |
  </Expandable>
</ResponseField>

<ResponseField name="tracks" type="DailyParticipantTracks">
  An object whose keys are track types (`'audio'`, `'video'`, `'screenAudio'`, `'screenVideo'`, plus any custom track names) and whose values are [`DailyTrackState`](/reference/react-native/types/daily-track-state) objects describing subscription status, playback state, and the underlying `MediaStreamTrack`.
</ResponseField>

<ResponseField name="permissions" type="DailyParticipantPermissions">
  An object describing what the participant is permitted to do — which media they can send, which streams they can receive, and which admin actions they can perform. See [`DailyParticipantPermissions`](/reference/react-native/types/daily-participant-permissions) for the full field reference.
</ResponseField>

### Example return value

```json theme={null}
{
  "local": {
    "session_id": "3c9ba1ea-baab-4876-d501-21a1d49c0902",
    "user_name": "A. User Name",
    "user_id": "user_123",
    "local": true,
    "owner": true,
    "networkQualityState": "good",
    "joined_at": "Mon Oct 18 2021 13:39:56 GMT-0700 (Pacific Daylight Time)",
    "userData": {},
    "tracks": {
      "audio": {
        "state": "playable",
        "track": MediaStreamTrack,
        "persistentTrack": MediaStreamTrack
      },
      "video": {
        "state": "playable",
        "track": MediaStreamTrack,
        "persistentTrack": MediaStreamTrack
      }
    },
    "permissions": {
      "hasPresence": true,
      "canSend": ["video", "audio"],
      "canReceive": { "base": true },
      "canAdmin": false
    }
  },
  "e20b7ead-54c3-459e-800a-ca4f21882f2f": {
    "session_id": "e20b7ead-54c3-459e-800a-ca4f21882f2f",
    "user_name": "",
    "user_id": "e20b7ead-54c3-459e-800a-ca4f21882f2f",
    "local": false,
    "owner": false,
    "networkQualityState": "warning",
    "joined_at": "Mon Oct 18 2021 13:39:56 GMT-0700 (Pacific Daylight Time)",
    "tracks": {
      "audio": {
        "subscribed": true,
        "state": "playable",
        "track": MediaStreamTrack,
        "persistentTrack": MediaStreamTrack
      },
      "video": {
        "subscribed": false,
        "state": "sendable",
      },
      "screenAudio": {
        "subscribed": true,
        "state": "off",
        "off": { "byUser": true }
      },
      "screenVideo": {
        "subscribed": true,
        "state": "off",
        "off": { "byUser": true }
      },
    },
    "permissions": {
      "hasPresence": true,
      "canSend": ["video", "audio"],
      "canReceive": {
        "base": true,
        "byUserId": { "foo": false },
        "byParticipantId": {
          "42fb115a-6d42-4155-ae4f-c96629f5217d": {
            "audio": false
          }
        }
      },
      "canAdmin": ["participants", "streaming"]
    }
  }
}
```

## Example

```javascript theme={null}
const participants = call.participants();

// Access the local participant
const { session_id, user_name, tracks } = participants.local;

// Iterate over all remote participants
Object.values(participants).forEach((participant) => {
  if (!participant.local) {
    console.log(participant.session_id, participant.networkQualityState);
  }
});
```

## Deprecated properties

<Warning>
  **A note about the `audio`, `video`, and `screen` properties**

  These boolean properties indicate whether the corresponding track is available and ready to send. However, the value briefly becomes `false` when a track is loading. Use the `tracks` property for accurate, detailed track state instead.
</Warning>

<Warning>
  **A note about the `audioTrack`, `videoTrack`, and `screenVideoTrack` properties in call object mode**

  These properties expose the raw `MediaStreamTrack` a participant is sending, if available. Use `tracks[type].persistentTrack` instead for more reliable behavior.
</Warning>

<Warning>
  **A note about the `networkThreshold` property**

  This property corresponds to the deprecated `threshold` value in [`getNetworkStats()`](/reference/react-native/instance-methods/get-network-stats). Use `networkQualityState` instead.
</Warning>

## See also

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

  <Card title="Methods" icon="code" iconType="solid">
    * [updateParticipant()](/reference/react-native/instance-methods/update-participant)
    * [updateParticipants()](/reference/react-native/instance-methods/update-participants)
  </Card>

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

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