Skip to main content
participants() Returns an object keyed by 'local' for the local participant and by session_id for each remote participant.

Return value

interface DailyParticipantsObject {
  local: DailyParticipant;
  [sessionId: string]: DailyParticipant;
}
session_id
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.
user_id
string
The participant’s user ID if set via a meeting token; otherwise defaults to session_id.
user_name
string
The participant’s display name. Set via a meeting token, DailyCallOptions, or setUserName().
userData
object
Optional custom data associated with the participant. Only present if explicitly set via DailyCallOptions or setUserData().
local
boolean
true for the local participant.
owner
boolean
true if the participant was granted owner status via a meeting token or was granted owner permissions.
joined_at
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.
networkQualityState
'good' | 'warning' | 'bad' | 'unknown'
The current network quality state of the participant. For the local participant, this matches the networkState value returned by getNetworkStats() and in the network-quality-change events.
participantType
string | undefined
Describes the participant type for SIP, PSTN, and remote media player participants. Not set for standard web participants.
tracks
DailyParticipantTracks
An object whose keys are track types ('audio', 'video', 'screenAudio', 'screenVideo', plus any custom track names) and whose values are DailyTrackState objects describing subscription status, playback state, and the underlying MediaStreamTrack.
permissions
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 for the full field reference.

Example return value

{
  "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

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

A note about the audio, video, and screen propertiesThese 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.
A note about the audioTrack, videoTrack, and screenVideoTrack properties in call object modeThese properties expose the raw MediaStreamTrack a participant is sending, if available. Use tracks[type].persistentTrack instead for more reliable behavior.
A note about the networkThreshold propertyThis property corresponds to the deprecated threshold value in getNetworkStats(). Use networkQualityState instead.

See also