Skip to main content
Daily’s permissions system lets you control exactly what each participant is allowed to do in a call: which media they can publish, which streams they can receive, and which administrative actions they can perform. Permissions can be set at join time via a meeting token or updated dynamically at runtime.

DailyParticipantPermissions

Every participant object exposes a permissions field of type DailyParticipantPermissions:
hasPresence
boolean
When false, the participant is hidden from all other participants. They do not appear in participants() for others, cannot be seen, and their events are not broadcast. Useful for silent observers or bots. Hidden participants require SFU topology.
canSend
Set<string> | boolean
Controls which media tracks the participant may publish.Pass true to allow all, false to block all, or a Set of specific values.
canReceive
DailyParticipantCanReceivePermission
Controls which participants’ media streams this participant may subscribe to.Override resolution order (highest to lowest): byParticipantIdbyUserIdbase.
canAdmin
Set<string> | boolean
Controls which administrative capabilities the participant holds.Pass true to grant all admin rights, false to grant none, or a Set of specific values.

Reading permissions

Use usePermissions to reactively read the local participant’s permissions. It returns convenience booleans for each permission type:
To read another participant’s permissions, pass their sessionId to usePermissions:

Updating permissions at runtime

Use useDaily to get the call object and call updateParticipant(). The caller must themselves have canAdmin: 'participants' (or canAdmin: true).
The updatePermissions object is partial — only the fields you provide are changed:

Restricting what a participant can send

Restrict a participant to audio-only (no camera or screen share):

Restricting what a participant can receive

Allow a participant to receive audio from everyone but video only from a specific user:

Granting admin permissions

Grant a participant transcription admin rights so they can start and stop transcription:

Waiting room (knock-to-join)

When a room has knocking enabled, participants who attempt to join land in a waiting room until a host admits or denies them. Use useWaitingParticipants to manage the waiting room from the host side.

Host: managing waiting participants

useWaitingParticipants returns waitingParticipants, grantAccess, and denyAccess. Pass callbacks to react to participants entering or leaving the lobby:
To admit or deny all waiting participants at once, pass '*':

Guest: checking access state

Use useDaily and useDailyEvent to track the local participant’s access state:

Example: setting up a waiting room

1

Enable knocking on the room

Create or configure a Daily room with enable_knocking: true via the Daily REST API or dashboard.
2

Listen for waiting participants (host)

3

Handle access state changes (guest)

Participants with hasPresence: false require SFU network topology. Daily automatically switches to SFU mode when hidden participants are present, but your room must support SFU.