Thanks — I’ll explain the difference between the two ParticipantKind values and when you’d use each.
•
rtc.ParticipantKind.PARTICIPANT_KIND_STANDARD
◦ Represents a normal WebRTC participant (browser, mobile app, SDK client).
◦ Connects via standard WebRTC signaling and can publish/subscribe to audio, video, and data tracks.
◦ Used for human users in typical real-time apps (video calls, screen share, chat).
◦ Billing and metrics are handled as regular connection minutes.
•
rtc.ParticipantKind.PARTICIPANT_KIND_SIP
◦ Represents a participant that joined the room via SIP (telephony/PSTN integration).
◦ Used for phone callers or other SIP endpoints bridging into a LiveKit room.
◦ Exposes SIP-specific metadata such as call status, phone number, and trunk ID.
◦ Telephony usage is billed differently (per-minute SIP telephony fees) compared with standard connection minutes.
◦ Can be treated like other participants for media (publish/subscribe), but there are SIP-specific behaviors and options (for example, different noise-cancellation settings or telephony lifecycle handling).
If you’d like, tell me which scenario you’re implementing (pure WebRTC users, a SIP PSTN bridge, or a mix) and I’ll suggest the best practices for handling media, metadata, or billing-related settings.
Sources:
SIP Lifecycle Management Agent | LiveKit Documentation |
livekit/livekit_composite | DeepWiki |
Using Noise Cancellation for SIP and WebRTC Participants, with interactive elements