Skip to main content
These events fire when participants join or leave the call, when participant state changes, and when waiting room or active speaker status updates.

participant-joined

Fires when a new remote participant joins the call.
This event may fire for a remote participant before the local joined-meeting event fires.
action
string
Always "participant-joined".
callClientId
string
The ID of the call client instance that emitted this event.
participant
DailyParticipant
The participant who joined. See DailyParticipant for the full shape.
// Example event object
{
  "action": "participant-joined",
  "callClientId": "17225364729060.9442072768918943",
  "participant": {
    "session_id": "6f0ce557-e6e4-409f-bae9-fe5663ba4ae7",
    "user_name": "A. User Name",
    "user_id": "user_123",
    "joined_at": "2023-06-01T18:37:59.946Z",
    "local": false,
    "owner": false,
    "networkQualityState": "unknown",
    "permissions": {
      "hasPresence": true,
      "canSend": true,
      "canReceive": { "base": true },
      "canAdmin": false
    },
    "will_eject_at": "1970-01-01T00:00:00.000Z",
    "tracks": {
      "audio": { "subscribed": false, "state": "sendable" },
      "video": { "subscribed": false, "state": "sendable" },
      "screenVideo": { "subscribed": false, "state": "off", "off": { "byUser": true } },
      "screenAudio": { "subscribed": false, "state": "off", "off": { "byUser": true } }
    },
    "record": false
  }
}
call.on('participant-joined', ({ participant }) => {
  console.log(`${participant.user_name || participant.session_id} joined`);
  addParticipantTile(participant);
});

participant-updated

Fires when a local or remote participant’s state changes — for example when their audio or video track state changes, their permissions are updated, or their network quality changes.
action
string
Always "participant-updated".
callClientId
string
The ID of the call client instance that emitted this event.
participant
DailyParticipant
The updated participant. See DailyParticipant for the full shape.
// Example event object
{
  "action": "participant-updated",
  "callClientId": "17225364729060.9442072768918943",
  "participant": {
    "session_id": "6f0ce557-e6e4-409f-bae9-fe5663ba4ae7",
    "..."
  }
}
call.on('participant-updated', ({ participant }) => {
  updateParticipantTile(participant);
});

participant-left

Fires when a remote participant leaves the call. The participant object reflects the participant’s state just before they disconnected.
A participant losing presence is treated as leaving and triggers this event. In that case, the optional reason field will be 'hidden'.
action
string
Always "participant-left".
callClientId
string
The ID of the call client instance that emitted this event.
participant
DailyParticipant
The participant who left, captured just before they disconnected. See DailyParticipant for the full shape.
reason
string
Optional. Present when the participant became hidden rather than truly leaving. Value is 'hidden'.
// Example event object
{
  "action": "participant-left",
  "callClientId": "17225364729060.9442072768918943",
  "participant": {
    "session_id": "6f0ce557-e6e4-409f-bae9-fe5663ba4ae7",
    "..."
  },
  "reason": "hidden"
}
call.on('participant-left', ({ participant }) => {
  removeParticipantTile(participant.session_id);
});

participant-counts-updated

Fires when the count of present or hidden participants in the call changes. See participantCounts() for details.
action
string
Always "participant-counts-updated".
callClientId
string
The ID of the call client instance that emitted this event.
participantCounts
object
Contains present (number of visible participants) and hidden (number of hidden participants).
// Example event object
{
  "action": "participant-counts-updated",
  "callClientId": "17225364729060.9442072768918943",
  "participantCounts": {
    "present": 4,
    "hidden": 1
  }
}
call.on('participant-counts-updated', ({ participantCounts }) => {
  document.getElementById('participant-count').textContent = participantCounts.present;
});

waiting-participant-added

Fires when a participant enters the waiting room and is added to the waitingParticipants() set.
action
string
Always "waiting-participant-added".
callClientId
string
The ID of the call client instance that emitted this event.
participant
object
Contains id, name, and awaitingAccess (with a level field indicating the requested access level).
// Example event object
{
  "action": "waiting-participant-added",
  "callClientId": "17225364729060.9442072768918943",
  "participant": {
    "id": "a64d30f4-5216-4481-a2ef-515d6dd7dfc6",
    "name": "Jane Smith",
    "awaitingAccess": { "level": "full" }
  }
}

waiting-participant-updated

Fires when a participant in the waiting room updates their details — currently this only occurs when their name changes.
action
string
Always "waiting-participant-updated".
callClientId
string
The ID of the call client instance that emitted this event.
participant
object
Contains id, name, and awaitingAccess.
// Example event object
{
  "action": "waiting-participant-updated",
  "callClientId": "17225364729060.9442072768918943",
  "participant": {
    "id": "a64d30f4-5216-4481-a2ef-515d6dd7dfc6",
    "name": "Jane Smith (updated)",
    "awaitingAccess": { "level": "full" }
  }
}

waiting-participant-removed

Fires when a participant is removed from the waitingParticipants() set — either they were granted access, denied, or left on their own.
action
string
Always "waiting-participant-removed".
callClientId
string
The ID of the call client instance that emitted this event.
participant
object
Contains id, name, and awaitingAccess.
// Example event object
{
  "action": "waiting-participant-removed",
  "callClientId": "17225364729060.9442072768918943",
  "participant": {
    "id": "a64d30f4-5216-4481-a2ef-515d6dd7dfc6",
    "name": "Jane Smith",
    "awaitingAccess": { "level": "full" }
  }
}

active-speaker-change

Fires when the active speaker — the participant whose audio input is currently loudest — changes. Use this to highlight the speaking participant in a custom UI.
action
string
Always "active-speaker-change".
callClientId
string
The ID of the call client instance that emitted this event.
activeSpeaker
object
Contains peerId, which is the session_id of the participant currently speaking.
// Example event object
{
  "action": "active-speaker-change",
  "callClientId": "17225364729060.9442072768918943",
  "activeSpeaker": {
    "peerId": "049ebba2-523b-4e6c-9a9f-1f8bb956670d"
  }
}
call.on('active-speaker-change', ({ activeSpeaker }) => {
  highlightSpeaker(activeSpeaker.peerId);
});

See also