Skip to main content
JitsiParticipant represents a remote participant in a conference. It provides access to participant properties, tracks, and features.

Overview

Participant objects are created automatically by the conference and provided through events. You cannot construct them directly.
conference.on(
  JitsiMeetJS.events.conference.USER_JOINED,
  (id, participant) => {
    console.log('Participant:', participant.getDisplayName());
  }
);

Identity Information

getId()

Returns the unique identifier of the participant.
const id = participant.getId();
id
string
Participant’s unique ID (typically 8 hex characters)

getJid()

Returns the full XMPP JID of the participant.
const jid = participant.getJid();
jid
string
Full JID (e.g., [email protected]/participantId)

getDisplayName()

Returns the participant’s display name.
const name = participant.getDisplayName();
name
string
The participant’s display name, or empty string if not set

getStatsID()

Returns the statistics ID for this participant.
const statsId = participant.getStatsID();
statsId
string
Statistics identifier for analytics

getStatus()

Returns the participant’s status text.
const status = participant.getStatus();
status
string
Participant’s status text

getIdentity()

Returns the XMPP identity object (defined in JWT context claims).
const identity = participant.getIdentity();
identity
object | undefined
Identity object from JWT, or undefined if not available

Role & Permissions

getRole()

Returns the participant’s role.
const role = participant.getRole();
role
string
Role: 'moderator', 'participant', or 'none'

isModerator()

Checks if the participant is a moderator.
const isMod = participant.isModerator();
isModerator
boolean
true if participant is a moderator

Track Information

getTracks()

Returns all media tracks for this participant.
const tracks = participant.getTracks();
tracks
Array<JitsiRemoteTrack>
Array of all remote tracks from this participant
Example:
const tracks = participant.getTracks();
tracks.forEach(track => {
  if (track.getType() === 'video') {
    track.attach(videoElement);
  }
});

getTracksByMediaType()

Returns tracks filtered by media type.
const videoTracks = participant.getTracksByMediaType('video');
const audioTracks = participant.getTracksByMediaType('audio');
mediaType
'audio' | 'video'
required
Media type to filter
tracks
Array<JitsiRemoteTrack>
Array of tracks of the specified media type

isAudioMuted()

Checks if the participant’s audio is muted.
const muted = participant.isAudioMuted();
muted
boolean
true if audio is muted

isVideoMuted()

Checks if the participant’s video is muted.
const muted = participant.isVideoMuted();
muted
boolean
true if video is muted

Source Information

getSources()

Returns source information for all media tracks.
const sources = participant.getSources();
sources
Map<MediaType, Map<string, object>>
Nested map structure:
  • Outer key: Media type ('audio' or 'video')
  • Inner key: Source name
  • Inner value: Source info object with muted (boolean) and videoType (string) properties
Example:
const sources = participant.getSources();
const videoSources = sources.get('video');

if (videoSources) {
  videoSources.forEach((sourceInfo, sourceName) => {
    console.log(`Source: ${sourceName}`);
    console.log(`Muted: ${sourceInfo.muted}`);
    console.log(`Video Type: ${sourceInfo.videoType}`);
  });
}

Features & Capabilities

getFeatures()

Returns the set of features supported by this participant.
const features = await participant.getFeatures();
features
Promise<Set<string>>
Promise resolving to a Set of feature URNs
Example:
const features = await participant.getFeatures();
if (features.has('urn:xmpp:jingle:dtmf:0')) {
  console.log('Participant supports DTMF');
}

hasFeature()

Checks if the participant has a specific feature.
const hasDTMF = participant.hasFeature('urn:xmpp:jingle:dtmf:0');
feature
string
required
Feature URN to check
hasFeature
boolean
true if participant has the feature

supportsDTMF()

Checks if the participant supports DTMF.
const supportsDTMF = participant.supportsDTMF();
supports
boolean
true if DTMF is supported

Custom Properties

getProperty()

Gets a custom property value.
const value = participant.getProperty('customKey');
name
string
required
Property name
value
any
Property value, or undefined if not set
Common Properties:
// Region information
const region = participant.getProperty('region');

// Feature flags
const supportsE2EE = participant.getProperty('features_e2ee');
const isJigasi = participant.getProperty('features_jigasi');

// Codec preferences
const codecList = participant.getProperty('codecList');

Special Participant Types

isHidden()

Checks if this is a hidden participant (e.g., recorder, transcriber).
const hidden = participant.isHidden();
hidden
boolean
true if participant is hidden from UI

isHiddenFromRecorder()

Checks if participant should be hidden from recordings.
const hiddenFromRecorder = participant.isHiddenFromRecorder();
hidden
boolean
true if participant should not appear in recordings

getBotType()

Returns the bot type if this participant is a bot.
const botType = participant.getBotType();
botType
string | undefined
Bot type (e.g., 'poltergeist' for load testing bots), or undefined for human participants

isSilent()

Checks if participant joined without audio.
const silent = participant.isSilent();
silent
boolean
true if participant joined silently (no audio capability)

isReplacing()

Checks if this participant is replacing another participant.
const replacing = participant.isReplacing();
replacing
boolean
true if participant is replacing another

isReplaced()

Checks if this participant is being replaced.
const replaced = participant.isReplaced();
replaced
boolean
true if participant will be replaced and kicked

Connection Information

getConnectionJid()

Returns the connection JID (useful for visitors/observers).
const connectionJid = participant.getConnectionJid();
jid
string | undefined
Connection JID, or undefined if not available

getConference()

Returns the conference this participant belongs to.
const conference = participant.getConference();
conference
JitsiConference
The parent conference object

Events

Participant changes are communicated through conference events:
// Participant joined
conference.on(
  JitsiMeetJS.events.conference.USER_JOINED,
  (id, participant) => {
    console.log(`${participant.getDisplayName()} joined`);
  }
);

// Participant left
conference.on(
  JitsiMeetJS.events.conference.USER_LEFT,
  (id, participant) => {
    console.log(`${participant.getDisplayName()} left`);
  }
);

// Display name changed
conference.on(
  JitsiMeetJS.events.conference.DISPLAY_NAME_CHANGED,
  (id, displayName) => {
    const participant = conference.getParticipantById(id);
    console.log(`Name changed to: ${displayName}`);
  }
);

// Property changed
conference.on(
  JitsiMeetJS.events.conference.PARTICIPANT_PROPERTY_CHANGED,
  (participant, propertyName, oldValue, newValue) => {
    console.log(`${propertyName} changed from ${oldValue} to ${newValue}`);
  }
);

// Role changed
conference.on(
  JitsiMeetJS.events.conference.USER_ROLE_CHANGED,
  (id, role) => {
    const participant = conference.getParticipantById(id);
    console.log(`${participant.getDisplayName()} is now ${role}`);
  }
);

Build docs developers (and LLMs) love