# Permission and Moderation

In some types of calls, there's a requirement to moderate the behaviour of the participants.

Examples include muting a participant, or ending the call for everyone. Those capabilities are usually reserved for the hosts of the call (users with elevated capabilities). They usually have additional moderation controls in their UI, that allow them to achieve these actions.

The Flutter SDK for Stream Video has support for such capabilities, with the usage of the permissions features for the `Call` class.

### Current Permissions

To check if a user has certain permissions, such as transmitting audio, video, or screen sharing, you can use the `hasPermission` method on the `Call` class:

```dart
final canScreenShare = call.hasPermission(CallPermission.screenshare);
```

### Requesting and Granting Permissions

If a user does not have permission for an action, it can be requested by calling `requestPermissions()` on the current `Call` object.

This method accepts a list of `CallPermission` allowing for multiple permission requests to be batched into a single call:

```dart
call.requestPermissions([CallPermission.screenshare, CallPermission.sendVideo]);
```

As a call admin, you can grant permission to other users by calling `call.grantPermissions` along with the user’s `id` and the list of permissions you would like to grant:

```dart
call.grantPermissions(userId: 'nash', permissions: [CallPermission.screenshare, CallPermission.sendVideo]);
```

During a call, it is advised to set up a handler to listen and react to permission requests as they arrive. This can be done by passing a callback function to the `onPermissionRequest` property present on the `Call` object:

```dart
@override
void initState() {
  super.initState();
  widget.call.onPermissionRequest = (StreamCallPermissionRequestEvent request) {
    // TODO Handle Permission requests
    // For example: widget.call.grantPermissions(userId: request.user.id, permissions: request.permissions);
  };
}
```

The `StreamCallPermissionRequestEvent` includes the following attributes which can be used to either grant or reject permission requests:

- Call Cid
- Created At
- Permissions
- User

### Moderation Capabilities

As with all calls, there may be times when user permissions need to be revoked, or the user needs to be banned, muted, or subjected to other actions to limit their interaction.

To facilitate these requests, the SDK provides several methods for limiting user interaction during the call lifecycle.

**Revoke Permissions**

Similar to its sister method `grantPermissions`, the `revokePermissions` method exists on the current `Call` object. It enables users to easily remove permissions assigned to a specific user by providing their user ID and the list of permissions to be revoked..

```dart
call.revokePermissions(userId: 'nash', permissions: [CallPermission.screenshare, CallPermission.sendVideo]);
```

**Mute Users**

To disable the audio tracks of all users on a call or a specific user in a call, the `muteOthers` and `muteUser` functions can be called, respectively.

```dart
call.muteAllUsers();
```

```dart
call.muteUsers(userIds: ['thierry']);
```

<admonition type="note">

In the above example, we are only muting a single user. However, `muteUsers` does allow us to mute multiple users since it accepts a list of user IDs.

</admonition>

**Blocking and Unblocking**

In some cases, a moderator or host may want to block a participant from joining the call.
Blocking and unblocking users can be done by calling `blockUser` or `unblockUser` on the current `Call` object.

```dart
call.blockUser('deven');

call.unblockUser('deven');
```

**Kicking**

Kicking a participant is a softer version of blocking.
The participant will be disconnected from the call, but they will be able to re-join the call.

```dart
call.kickUser('deven');
```

As a shortcut you can also set `block` to true to also block the user from rejoining.

```dart
call.kickUser('deven', block: true);
```

**Ending the Call for everyone**

As a host, you are able to end the current call for everyone using the `call.end` method.

```dart
await call.end();
```

This operation will emit `call.ended` event to every participant in the call.
Ended calls can't be re-joined.


---

This page was last updated at 2026-05-19T10:49:04.396Z.

For the most recent version of this documentation, visit [https://getstream.io/video/docs/flutter/guides/permissions-and-moderation/](https://getstream.io/video/docs/flutter/guides/permissions-and-moderation/).