> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daily.co/llms.txt
> Use this file to discover all available pages before exploring further.

# updateParticipant()

> Modifies a participant in a Daily call — muting, ejecting, updating permissions, or controlling track subscriptions.

`updateParticipant(sessionId, updates)`

<Badge color="green">{"✓"} Prebuilt</Badge> <Badge color="green">{"✓"} Custom</Badge>

Modifies a participant, either by sending a message to change their state, or by changing how you see them locally. Returns `this` for chaining.

## Parameters

<ParamField body="sessionId" type="string" required>
  The participant's `session_id`, or `'local'` for the local participant.
</ParamField>

<ParamField body="updates" type="DailyParticipantUpdateOptions" required>
  An object describing what to update. All fields are optional.

  <Expandable title="properties" defaultOpen="true">
    <ParamField body="setAudio" type="boolean">
      Mute (`false`) or unmute (`true`) the participant's microphone. Requires the caller to be a **participant admin** (`'participants'` in `canAdmin`). Silently ignored if not possible or if there is no active meeting.

      <Note>
        For the local participant, prefer [`setLocalAudio()`](/reference/daily-js/instance-methods/set-local-audio) — though both work. For remote participants, admins can mute (`false`) but only meeting owners can unmute (`true`), and doing so is strongly discouraged as a privacy concern.
      </Note>
    </ParamField>

    <ParamField body="setVideo" type="boolean">
      Enable (`true`) or disable (`false`) the participant's camera. Requires participant admin permission. Silently ignored if not possible.

      <Note>
        For the local participant, prefer [`setLocalVideo()`](/reference/daily-js/instance-methods/set-local-video) — though both work.
      </Note>

      <Warning>
        Remotely controlling another participant's camera or microphone is a potential privacy issue. Use deliberately. Browsers require the user to have explicitly allowed mic/camera access at least once.
      </Warning>
    </ParamField>

    <ParamField body="setScreenShare" type="false">
      Stop the participant's active screen share. Only `false` is accepted. Requires participant admin permission. Has no effect when `sessionId` is `'local'`.
    </ParamField>

    <ParamField body="eject" type="true">
      Remove the participant from the call. Only `true` is accepted. Requires participant admin permission.
    </ParamField>

    <ParamField body="setSubscribedTracks" type="DailyTrackSubscriptionOptions">
      Controls which tracks you receive from this participant. **SFU mode only** — not supported in Daily Prebuilt. Requires [`subscribeToTracksAutomatically`](/reference/daily-js/types/daily-call-options#param-subscribe-to-tracks-automatically) to be `false`; throws an error if it is `true`.

      Accepts `true`, `false`, `'staged'`, `'avatar'`, or a per-track object:

      ```javascript theme={null}
      call.updateParticipant('session-id', {
        setSubscribedTracks: {
          audio: true,
          video: 'staged',
          screenVideo: false,
          screenAudio: false,
        },
      });
      ```

      * `true` — subscribe: set up a consumer connection and start transmitting data
      * `false` — unsubscribe: tear down the consumer connection
      * `'staged'` — set up the consumer connection but pause data transmission; no bandwidth cost, but going from `'staged'` → `true` is faster than subscribing from scratch
      * `'avatar'` — subscribe to audio only, receive a placeholder for video

      When supporting large calls, subscribe to tracks you're rendering, stage tracks on adjacent pages, and unsubscribe from everything else.
    </ParamField>

    <ParamField body="updatePermissions" type="DailyParticipantPermissionsUpdate">
      Updates the participant's in-call permissions (`canSend`, `canReceive`, `hasPresence`, `canAdmin`). Requires the caller to be a participant admin. See [`DailyParticipantPermissions`](/reference/daily-js/types/daily-participant-permissions) for the full shape and behavior of each field.

      ```javascript theme={null}
      call.updateParticipant('session-id', {
        updatePermissions: {
          canSend: new Set(['video', 'audio']),
          canReceive: { byUserId: { foo: false } },
          hasPresence: false,
          canAdmin: new Set(['participants', 'streaming']),
        },
      });
      ```
    </ParamField>
  </Expandable>
</ParamField>

## Return value

Returns `this` (the `DailyCall` instance) for chaining.

## See also

<CardGroup>
  <Card title="Types" icon="t" iconType="solid">
    * [DailyParticipantPermissions](/reference/daily-js/types/daily-participant-permissions)
  </Card>

  <Card title="Methods" icon="code" iconType="solid">
    * [updateParticipants()](/reference/daily-js/instance-methods/update-participants)
    * [participants()](/reference/daily-js/instance-methods/participants)
    * [participantCounts()](/reference/daily-js/instance-methods/participant-counts)
    * [setLocalAudio()](/reference/daily-js/instance-methods/set-local-audio)
    * [setLocalVideo()](/reference/daily-js/instance-methods/set-local-video)
  </Card>

  <Card title="Events" icon="bolt" iconType="solid">
    * [participant-updated](/reference/daily-js/events/participant-events#participant-updated)
    * [participant-left](/reference/daily-js/events/participant-events#participant-left)
  </Card>

  <Card title="Guides" icon="book-open" iconType="solid">
    * [Participants](/docs/daily-js/concepts/participants)
    * [Tracks and media](/docs/daily-js/concepts/tracks)
  </Card>

  <Card title="REST API" icon="server" iconType="solid">
    * [Meeting token: permissions](/reference/rest-api/meeting-tokens/create-meeting-token#body-properties-permissions)
  </Card>
</CardGroup>
