---
source_url: https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation-user
title: Moderate misbehaving users
updated_at: 2026-06-15T12:12:02.204Z
---

> Documentation Index
> For a curated overview of PubNub documentation, see: https://www.pubnub.com/docs/llms.txt
> For the full list of all documentation pages, see: https://www.pubnub.com/docs/llms-full.txt


# Moderate misbehaving users

Regular chat users (without `SecretKey`) can mute undesirable users to hide their messages. For admin moderation, see [Moderation as admin](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation).

**Mute list behavior:**

* Soft limit: 200 users
* Default: session-only persistence
* Optional: persist across sessions (32 KiB server limit applies)

:::warning Mute list limit
Persisted lists exceeding 32 KiB (~200 users) trigger HTTP 413 errors. Users remain muted for the session but won't persist.
:::

**Affected methods:**

* [channel.Connect()](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/channels/watch)
* [channel.Join()](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/channels/join)
* [channel.GetMessageHistory()](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/messages/history)
* [chat.ListenForEvents()](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/custom-events#receive-current-events)
* [chat.GetEventsHistory()](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/custom-events#get-historical-events)

:::note
Enable [App Context](https://youtu.be/9UEoSlngpYI) in the [Admin Portal](https://admin.pubnub.com/) to mute users.
:::

## Mute users as a regular chat user

Mute a specific user on all channels.

### Method signature

```csharp
chat.MutedUsersManager.MuteUser(string userId)
```

#### Input

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| userId | string | Yes |  | [User ID](https://www.pubnub.com/docs/general/setup/users-and-devices) of the user you want to mute. |

#### Output

This method returns a `Task<ChatOperationResult>` that succeeds when the data has been synced with the server. If [SyncMutedUsers](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/configuration#pubnubchatconfig) is not enabled, the `Task<ChatOperationResult>` always succeeds.

#### Errors

If the size of the mute list exceeds 32 KiB (roughly 200 users), you'll get the `HTTP 413 (Request Entity Too Large)` error.

### Sample code

```csharp
using System.Threading.Tasks;
using PubnubApi;
using PubnubChatApi;
using UnityEngine;

// Configuration
PubnubChatConfig chatConfig = new PubnubChatConfig();
        
PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId"))
{
    SubscribeKey = "demo",
    PublishKey = "demo",
    Secure = true
};

// Initialize Unity Chat
var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration);
if (!chatResult.Error)
{
    chat = chatResult.Result;
}
            
var mutedUsersManager = chat.MutedUsersManager;
var muteResult = await mutedUsersManager.MuteUser("some_user");
if (muteResult.Error)
{
    Debug.LogError($"Error when trying to mute user: {muteResult.Exception.Message}");
}
```

## Unmute users as a regular chat user

Remove a user from the mute list to see their messages and events again.

### Method signature

```csharp
chat.MutedUsersManager.UnMuteUser(string userId)
```

#### Input

| Parameter | Description |
| --- | --- |
| `userId` *Type: `string` | [User ID](https://www.pubnub.com/docs/general/setup/users-and-devices) of the user you want to unmute. |

#### Output

This method returns a `Task<ChatOperationResult>` that succeeds when the data has been synced with the server. If [SyncMutedUsers](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/configuration#pubnubchatconfig) is not enabled, the `Task<ChatOperationResult>` always succeeds.

### Sample code

```csharp
using System.Threading.Tasks;
using PubnubApi;
using PubnubChatApi;
using UnityEngine;

// Configuration
PubnubChatConfig chatConfig = new PubnubChatConfig();
        
PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId"))
{
    SubscribeKey = "demo",
    PublishKey = "demo",
    Secure = true
};

// Initialize Unity Chat
var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration);
if (!chatResult.Error)
{
    chat = chatResult.Result;
}
            
var mutedUsersManager = chat.MutedUsersManager;
var muteResult = await mutedUsersManager.UnMuteUser("some_user");
if (muteResult.Error)
{
    Debug.LogError($"Error when trying to unmute user: {muteResult.Exception.Message}");
}
```

## Check muted users

Inspect the mute list to see which users are muted.

### Method signature

```csharp
chat.MutedUsersManager.MutedUsers
```

#### Output

This property returns a `List<string>` where each `string` is a user ID of a muted user.

### Sample code

```csharp
using System.Threading.Tasks;
using PubnubApi;
using PubnubChatApi;
using UnityEngine;

// Configuration
PubnubChatConfig chatConfig = new PubnubChatConfig();
        
PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId"))
{
    SubscribeKey = "demo",
    PublishKey = "demo",
    Secure = true
};

// Initialize Unity Chat
var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration);
if (!chatResult.Error)
{
    chat = chatResult.Result;
}
            
var mutedUsersManager = chat.MutedUsersManager;
var mutedUsers = mutedUsersManager.MutedUsers;
foreach (var mutedUserId in mutedUsers)
{
    Debug.Log($"Muted user: {mutedUserId}");
}
```

## Persist the mute list

Set `SyncMutedUsers: true` during [client initialization](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/configuration#pubnubchatconfig) to persist the mute list across sessions.

:::warning Mute list and Access Manager
If you use Access Manager for [user moderation](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation) within your chat app and `SyncMutedUsers` is enabled, you must grant the Chat SDK user the following permissions:
* `read` permission to the `PN_PRV.$currentUserId.mute1` channel.
* `update`, `delete`, and `get` permissions for the `PN_PRV.$currentUserId.mute1` user.
Make sure to change `$currentUserId` to the user ID of the chat user that will use the mute list functionality.
:::

## Check restrictions

Check admin-imposed `mute` or `ban` restrictions:

* [Single user on one channel](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#one-user-on-one-channel)
* [Single user on all channels](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#one-user-on-all-channels)
* [All users on one channel](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#all-users-on-one-channel)

#### Sample code

##### Single user on a single channel

```csharp
using System.Threading.Tasks;
using PubnubApi;
using PubnubChatApi;
using UnityEngine;

// Configuration
PubnubChatConfig chatConfig = new PubnubChatConfig();
        
PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId"))
{
    SubscribeKey = "demo",
    PublishKey = "demo",
    Secure = true
};

// Initialize Unity Chat
var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration);
if (!chatResult.Error)
{
    chat = chatResult.Result;
}
var channelResult = await chat.GetChannel("support");
if (channelResult.Error)
{
    Debug.Log("Couldn't find channel!");
    return;
}
var channel = channelResult.Result;

var userResult = await chat.GetUser("support_agent_15");
if (userResult.Error)
{
    Debug.Log("Couldn't find user!");
    return;
}
var user = userResult.Result;

// check user restrictions
var restrictionResult = await user.GetChannelRestrictions(channel);
var restriction = restrictionResult.Result;
```

##### All users on a single channel

```csharp
using System.Threading.Tasks;
using PubnubApi;
using PubnubChatApi;
using UnityEngine;

// Configuration
PubnubChatConfig chatConfig = new PubnubChatConfig();
        
PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId"))
{
    SubscribeKey = "demo",
    PublishKey = "demo",
    Secure = true
};

// Initialize Unity Chat
var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration);
if (!chatResult.Error)
{
    chat = chatResult.Result;
}
var channelResult = await chat.GetChannel("support");
if (channelResult.Error) return;
var channel = channelResult.Result;
        
var restrictionsWrapperResult = await channel.GetUsersRestrictions();
if (!restrictionsWrapperResult.Error)
{
    foreach(var userRestriction in restrictionsWrapperResult.Result.Restrictions)
    {
        Debug.Log(
                    $"User: {userRestriction.UserId}, " +
                    $"Banned: {userRestriction.Ban}, " +
                    $"Muted: {userRestriction.Mute}, " +
                    $"Reason: {userRestriction.Reason}");
    }
}
```

##### Single user on all channels

```csharp
using System.Threading.Tasks;
using PubnubApi;
using PubnubChatApi;
using UnityEngine;

// Configuration
PubnubChatConfig chatConfig = new PubnubChatConfig();
        
PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId"))
{
    SubscribeKey = "demo",
    PublishKey = "demo",
    Secure = true
};

// Initialize Unity Chat
var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration);
if (!chatResult.Error)
{
    chat = chatResult.Result;
}
var userResult = await chat.GetUser("support_agent_15");
if(userResult.Error){
    return;    
}
var user = userResult.Result;
var restrictionsWrapperResult = await user.GetChannelsRestrictions();
if (!restrictionsWrapperResult.Error)
{
    foreach(var restriction in restrictionsWrapperResult.Result.Restrictions)
    {
        Debug.Log($"Channel: {restriction.ChannelId}, Ban: {restriction.Ban}, Mute: {restriction.Mute}");
    }
}
```

## Secure moderation

Client-side restrictions can be bypassed without [server-side logic](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#server-side-restrictions) using Access Manager. Combine with [client-side UI feedback](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#client-side-restrictions) to inform users of restrictions.

### Client-side restrictions

With [server-side permissions](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#server-side-restrictions) enforced via Access Manager, [read moderation restrictions](https://www.pubnub.com/docs/chat/unity-chat-sdk/build/features/users/moderation#check-restrictions) on the frontend to show users their status (e.g., popup messages, disabled input fields).

To react to permission changes in real-time:

1. Listen for moderation events. Set up a listener to listen for the moderation event type ("banned," "muted," or "lifted") generated when UI restrictions are added or removed. using System.Threading.Tasks; using PubnubApi; using PubnubChatApi; using UnityEngine; // Configuration PubnubChatConfig chatConfig = new PubnubChatConfig(); PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) { SubscribeKey = "demo", PublishKey = "demo", Secure = true }; // Initialize Unity Chat var chatResult = await UnityChat.CreateInstance(chatConfig, pnConfiguration); if (!chatResult.Error) { chat = chatResult.Result; } var userResult = await chat.GetUser("support_agent_15"); if(userResult.Error){ Debug.Log("Couldn't find user!"); return; } var user = userResult.Result; user.StreamModerationEvents(true); user.OnRestrictionChanged += OnModerationEventHandler; // or use lambda void OnModerationEventHandler(ChannelRestriction restriction) { Debug.Log($"New restriction status for {restriction.ChannelId} received, " + $"ban: {restriction.Ban}, mute: {restriction.Mute}, reason: {restriction.Reason}"); }
2. Remove the event listener. Remember to unsubscribe from the event when you're done: 1user.OnRestrictionChanged -= OnModerationEventHandler;2user.StreamModerationEvents(false);