---
source_url: https://www.pubnub.com/docs/data-storage/metadata/manage-members
title: Set, get, and remove members
updated_at: 2026-09-30T07:20:08.000Z
---

# Set, get, and remove members

## Documentation index

To discover more PubNub resources:

1. Fetch [PubNub's llms.txt](https://www.pubnub.com/llms-full.txt) for a list of available pages in Markdown format.
2. Identify relevant URLs from that index.
3. Fetch the target pages.

Do not assume a path exists, always check the index first.

:::note Starting a new app? Use DataSync
[DataSync](https://www.pubnub.com/docs/data-storage/structured-data/overview.md) is the successor to App Context. It does everything App Context does for users, channels, and memberships, and adds typed schemas, partial updates with ETags, field-level access control, and per-class expiry. Refer to [How DataSync compares to App Context](https://www.pubnub.com/docs/data-storage/structured-data/overview.md) for a feature-by-feature comparison.
DataSync is currently available to new accounts and to accounts that are not actively using App Context. If your keysets already use App Context, keep using it for now. App Context remains fully supported and these pages stay accurate.
:::

This guide shows you how to manage a channel's user roster from the channel's side: add users as members, read the current roster, and remove members. App Context must be enabled on the keyset before you call it, and new keysets don't enable it by default. This is the [members direction](https://www.pubnub.com/docs/data-storage/metadata/overview.md#membership-connects-users-and-channels) of a membership, which starts from the channel. To manage the same relationship from a user's side instead, refer to [Set, get, and remove memberships](https://www.pubnub.com/docs/data-storage/metadata/manage-memberships.md).

:::note User ID / UUID
User ID is also referred to as **UUID/uuid** in some APIs and server responses but **holds the value** of the **userId** parameter you [set during initialization](https://www.pubnub.com/docs/architecture/core-concepts.md).
:::

Platform limits apply: up to 50,000 memberships per user and up to 5,000 members per channel.

A single set or remove call also caps how many members it can change at once. Refer to [App Context API limits](https://www.pubnub.com/docs/data-storage/metadata/api-limits.md) for the current maximum.

## Add members to a channel

Call `Set Channel Members` with the channel's name and a list of User IDs to add them as members, creating a membership record for each. Pass an object instead of a plain ID string to attach `custom` fields to that member's membership record. Setting members this way is more efficient for bulk adds than [setting memberships](https://www.pubnub.com/docs/data-storage/metadata/manage-memberships.md#add-a-user-to-channels) one user at a time.

### JavaScript

```javascript
try {
  const response = await pubnub.objects.setChannelMembers({
    channel: 'myChannel',
    uuids: ['uuid-1', 'uuid-2', { id: 'uuid-3', custom: { role: 'Super Admin' } }],
  });
  console.log('setChannelMembers response:', response);
} catch (error) {
  console.error(`Set channel members error: ${error}`);
}
```

### Java

```java
final Map<String, Object> customMap = new HashMap<>();
customMap.putIfAbsent("members_param1", "val1");
customMap.putIfAbsent("members_param2", "val2");

final Collection<PNUser> channelMembers = Arrays.asList(
        PNUser.builder("userId1").status("status01").type("typeR").build(),
        PNUser.builder("userId2").custom(customMap).status("status02").type("typeS").build());

pubNub.setChannelMembers("testChannelId", channelMembers)
        .include(MemberInclude.builder()
                .includeCustom(true)
                .includeStatus(true)
                .includeType(true)
                .includeTotalCount(true)
                .includeUser(true)
                .includeUserCustom(true)
                .includeUserStatus(true)
                .includeUserType(true)
                .build())
        .sort(Arrays.asList(PNSortKey.asc(PNSortKey.Key.STATUS)))
        .async(result -> { /* check result */ });
```

### Kotlin

```kotlin
pubnub.setChannelMembers(
    channel = "myChannel",
    users = listOf(
        PNMember.Partial(
            uuidId = "myUserId",
            custom = mapOf("custom" to "customValue"),
            status = "status",
            type = "typeABC"
        )
    ),
    include = MemberInclude(includeUser = true, includeStatus = true, includeType = true),
    sort = listOf(PNSortKey.PNAsc(PNMemberKey.STATUS)),
).async { result ->
    result.onFailure { exception ->
        // Handle error
    }.onSuccess { value ->
        // Handle successful method result
    }
}
```

### C#

```csharp
using PubnubApi;

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

// Initialize PubNub
Pubnub pubnub = new Pubnub(pnConfiguration);
        
// Add Members (UUID) for a specific channel
List<PNChannelMember> setMemberChannelList =
[
    new PNChannelMember()
        { Uuid = "my-uuid", Custom = new Dictionary<string, object>() { { "planet", "earth" } } }
];
        
PNResult<PNChannelMembersResult> setChannelMembersResponse = await pubnub.SetChannelMembers()
    .Channel("my-channel")
    .Uuids(setMemberChannelList)
    .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM })
    .IncludeCount(true)
    .ExecuteAsync();

PNChannelMembersResult setChannelMembersResult = setChannelMembersResponse.Result;
PNStatus status2 = setChannelMembersResponse.Status;
```

### Go

```go
// Replace with your package name (usually "main")
package pubnub_samples_test

import (
	"fmt"
	"time"

	pubnub "github.com/pubnub/go/v10"
)

// Example_setChannelMembers demonstrates adding users to a channel (channel members)
func Example_setChannelMembers() {
	config := pubnub.NewConfigWithUserId(pubnub.UserId("demo-user"))
	config.SubscribeKey = "demo"
	config.PublishKey = "demo"

	pn := pubnub.NewPubNub(config)

	// Add multiple users to a channel with custom metadata
	response, status, err := pn.SetChannelMembers().
		Channel("team-channel-555").      // Channel ID
		Set([]pubnub.PNChannelMembersSet{ // Users to add
			{
				UUID: pubnub.PNChannelMembersUUID{ID: "team-member-1"},
				Custom: map[string]interface{}{
					"role": "admin",
				},
			},
			{
				UUID: pubnub.PNChannelMembersUUID{ID: "team-member-2"},
				Custom: map[string]interface{}{
					"role": "member",
				},
			},
		}).
		Execute()

	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	if status.StatusCode == 200 {
		fmt.Printf("Added %d member(s) to channel\n", len(response.Data))
	}

	// Output:
	// Added 2 member(s) to channel
}
```

### Swift

```swift
let userToSet = PubNubMembershipMetadataBase(
  userMetadataId: "my_user",
  channelMetadataId: "my_channel"
)

// Set members for a specific channel
pubnub.setMembers(
  channel: userToSet.channelMetadataId,
  users: [userToSet]
) { result in
  switch result {
  case let .success(response):
    print("The user members for the channel: \(response.memberships)")
    print("The next page used for pagination: \(String(describing: response.next))")
  case let .failure(error):
    print("Update Memberships request failed with error: \(error.localizedDescription)")
  }
}
```

### PHP

```php
$channelMembers = [
    new PNChannelMember($sampleUsers[0]['id']),
    new PNChannelMember($sampleUsers[1]['id'])
];

$setMembersResult = $pubnub->setMembers()
    ->channel($sampleChannels[0]['id'])
    ->members($channelMembers)
    ->sync();
assert(count($setMembersResult->getData()) >= 1);
```

### Unity

```csharp
using PubnubApi;
using PubnubApi.Unity;

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

// Initialize PubNub
Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration);

// If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour
// For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub
/*
[SerializeField] private PNManagerBehaviour pubnubManager;
Pubnub pubnub = pubnubManager.pubnub;
*/

// Add Members (UUID) for a specific channel
List<PNChannelMember> setMemberChannelList =
 new() {
  new PNChannelMember()
   { Uuid = "my-uuid", Custom = new Dictionary<string, object>() { { "planet", "earth" } } }
 };

PNResult<PNChannelMembersResult> setChannelMembersResponse = await pubnub.SetChannelMembers()
    .Channel("my-channel")
    .Uuids(setMemberChannelList)
    .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM })
    .IncludeCount(true)
    .ExecuteAsync();

PNChannelMembersResult setChannelMembersResult = setChannelMembersResponse.Result;
PNStatus status2 = setChannelMembersResponse.Status;
```

If [Access Manager](https://www.pubnub.com/docs/security/access-control/overview.md) is enabled, this call requires only a `manage` permission grant on the channel. Setting a membership from the user's side also needs a grant on the User ID. Refer to [App Context and access control](https://www.pubnub.com/docs/data-storage/metadata/overview.md#app-context-and-access-control) for the full permission model. On success, the call also fires the membership `set` [App Context event](https://www.pubnub.com/docs/data-storage/metadata/events.md) other subscribers receive.

Turning on **Enforce referential integrity for memberships** in the Admin Portal changes what this call allows. With it on, every User ID and the channel need their own metadata record before you can add a member. Leaving it off lets you add a member for a User ID or channel that has no metadata record yet.

## Get a channel's members

Call `Get Channel Members` with the channel's name to list its current members. Pass `include.UUIDFields` to receive each member's full user metadata alongside their custom membership fields, instead of only their User ID.

### JavaScript

```javascript
try {
  const response = await pubnub.objects.getChannelMembers({
    channel: 'myChannel',
    include: {
      UUIDFields: true,
    },
  });
  console.log('getChannelMembers response:', response);
} catch (error) {
  console.error(`Get channel members error: ${error}`);
}

// Get all channel members with "admin" in the description
try {
  const response = await pubnub.objects.getChannelMembers({
    channel: 'myChannel',
    filter: 'description LIKE "*admin*"',
  });
  console.log('getChannelMembers response:', response);
} catch (error) {
  console.error(`Get channel members error: ${error}`);
}
```

### Java

```java
PNGetChannelMembersResult pnGetChannelMembersResult = pubNub.getChannelMembers("testChannelId")
        .include(MemberInclude.builder()
                .includeTotalCount(true)
                .includeStatus(true)
                .includeType(true)
                .includeCustom(true)
                .includeUser(true)
                .includeUserCustom(true)
                .build())
        .sort(Arrays.asList(PNSortKey.desc(PNSortKey.Key.STATUS)))
        .sync();
```

### Kotlin

```kotlin
pubnub.getChannelMembers("myChannel")
    .async { result ->
        result.onFailure { exception ->
            // Handle error
        }.onSuccess { value ->
            // Handle successful method result
        }
    }
```

### C#

```csharp
using PubnubApi;

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

// Initialize PubNub
Pubnub pubnub = new Pubnub(pnConfiguration);
        
// Get Members (uuids) for a specific channel
PNResult<PNChannelMembersResult> getChannelMembersResponse = await pubnub.GetChannelMembers()
    .Channel("my-channel")
    .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM })
    .IncludeCount(true)
    .ExecuteAsync();

PNChannelMembersResult getChannelMembersResult = getChannelMembersResponse.Result;
PNStatus status2 = getChannelMembersResponse.Status;
```

### Go

```go
// Replace with your package name (usually "main")
package pubnub_samples_test

import (
	"fmt"
	"time"

	pubnub "github.com/pubnub/go/v10"
)

// Example_getChannelMembersWithAllIncludes demonstrates getting channel members with all include options
func Example_getChannelMembersWithAllIncludes() {
	config := pubnub.NewConfigWithUserId(pubnub.UserId("demo-user"))
	config.SubscribeKey = "demo"
	config.PublishKey = "demo"

	pn := pubnub.NewPubNub(config)

	// Create channel and user with all fields
	pn.SetChannelMetadata().
		Channel("channel-full-members").
		Name("Complete Team").
		Status("active").
		Type("team").
		Execute()

	pn.SetUUIDMetadata().
		UUID("user-full-member").
		Name("Complete Member").
		Custom(map[string]interface{}{"department": "dev"}).
		Status("active").
		Type("employee").
		Execute()

	// Add user to channel with custom member data
	pn.SetChannelMembers().
		Channel("channel-full-members").
		Set([]pubnub.PNChannelMembersSet{
			{
				UUID: pubnub.PNChannelMembersUUID{ID: "user-full-member"},
				Custom: map[string]interface{}{
					"access": "admin",
				},
				Status: "active",
				Type:   "member",
			},
		}).
		Execute()

	// Small delay to ensure metadata is persisted before retrieval
	time.Sleep(2 * time.Second)

	// Get channel members with all include options
	response, status, err := pn.GetChannelMembers().
		Channel("channel-full-members").
		Include([]pubnub.PNChannelMembersInclude{
			pubnub.PNChannelMembersIncludeCustom,     // Include member custom data
			pubnub.PNChannelMembersIncludeUUID,       // Include user details
			pubnub.PNChannelMembersIncludeUUIDCustom, // Include user custom data
			pubnub.PNChannelMembersIncludeUUIDStatus, // Include user status
			pubnub.PNChannelMembersIncludeUUIDType,   // Include user type
			pubnub.PNChannelMembersIncludeStatus,     // Include member status
			pubnub.PNChannelMembersIncludeType,       // Include member type
		}).
		Execute()

	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	if status.StatusCode == 200 && len(response.Data) > 0 {
		member := response.Data[0]
		fmt.Printf("Member: %s\n", member.UUID.Name)
		fmt.Printf("User Status: %s\n", member.UUID.Status)
		fmt.Printf("Member Status: %s\n", member.Status)
		if access, ok := member.Custom["access"].(string); ok {
			fmt.Printf("Access: %s\n", access)
		}
	}

	// Output:
	// Member: Complete Member
	// User Status: active
	// Member Status: active
	// Access: admin
}
```

### Swift

```swift
// Retrieve members for a specific channel
pubnub.fetchMembers(channel: "my_channel_id") { result in
  switch result {
  case let .success(response):
    print("The user members for the channel: \(response.memberships)")
    print("The next page used for pagination: \(String(describing: response.next))")
  case let .failure(error):
    print("Fetch Memberships request failed with error: \(error.localizedDescription)")
  }
}
```

### PHP

```php
$memberIncludes = new PNMemberIncludes();
$memberIncludes->custom()->user()->userCustom();

$getMembersResult = $pubnub->getMembers()
    ->channel($sampleChannels[0]['id'])
    ->include($memberIncludes)
    ->sync();
assert(count($getMembersResult->getData()) >= 1);
```

### Unity

```csharp
using PubnubApi;
using PubnubApi.Unity;

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

// Initialize PubNub
Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration);

// If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour
// For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub
/*
[SerializeField] private PNManagerBehaviour pubnubManager;
Pubnub pubnub = pubnubManager.pubnub;
*/

// Get Members (uuids) for a specific channel
PNResult<PNChannelMembersResult> getChannelMembersResponse = await pubnub.GetChannelMembers()
    .Channel("my-channel")
    .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM })
    .IncludeCount(true)
    .ExecuteAsync();

PNChannelMembersResult getChannelMembersResult = getChannelMembersResponse.Result;
PNStatus status2 = getChannelMembersResponse.Status;
```

If Access Manager is enabled, this call requires only a `get` permission grant on the channel. This call returns a list, so it accepts the same `filter`, `sort`, and `page` parameters as [Get metadata for all channels](https://www.pubnub.com/docs/data-storage/metadata/get-metadata-for-all-channels.md#page-through-the-list). Refer to [App Context filtering](https://www.pubnub.com/docs/data-storage/metadata/filtering.md) for the `uuid.*` fields a members call accepts.

Every paginated App Context call takes the same three parameters. `limit` caps how many records come back in one call. It defaults to 100, and 100 is also the maximum. `page.next` and `page.prev` are opaque cursor strings copied from a previous response: pass the one you want to continue from, and PubNub returns the adjacent page in that direction. If you supply both, PubNub uses `next` and ignores `prev`.

## Remove members from a channel

Call `Remove Channel Members` with the channel's name and a list of User IDs to remove their membership to that channel.

### JavaScript

```javascript
try {
  const response = await pubnub.objects.removeChannelMembers({
    channel: 'myChannel',
    uuids: ['uuid-1', 'uuid-2'],
  });
} catch (error) {
  console.error(`Remove channel members error: ${error}`);
}
```

### Java

```java
pubNub.removeChannelMembers("channelId", Collections.singletonList("userId"))
        .include(MemberInclude.builder()
                .includeTotalCount(true)
                .includeStatus(true)
                .includeType(true)
                .includeCustom(true)
                .includeUser(true)
                .includeUserCustom(true)
                .build())
        .async(result -> { /* check result */ });
```

### Kotlin

```kotlin
pubnub.removeChannelMembers(
    channel = "myChannel",
    userIds = listOf("myUserId"),
    include = MemberInclude(includeUser = true, includeStatus = true, includeType = true),
).async { result ->
    result.onFailure { exception ->
        // Handle error
    }.onSuccess { value ->
        // Handle successful method result
    }
}
```

### C#

```csharp
using PubnubApi;

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

// Initialize PubNub
Pubnub pubnub = new Pubnub(pnConfiguration);
        
// Remove Members (UUID) for a specific channel
List<string> removeChannelMemberList =
[
    "my-uuid",
    "your-uuid"
];

PNResult<PNChannelMembersResult> removeChannelMembersResponse = await pubnub.RemoveChannelMembers()
    .Channel("my-channel")
    .Uuids(removeChannelMemberList)
    .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM })
    .IncludeCount(true)
    .ExecuteAsync();

PNChannelMembersResult removeChannelMembersResult = removeChannelMembersResponse.Result;
PNStatus status = removeChannelMembersResponse.Status;
```

### Go

```go
// Replace with your package name (usually "main")
package pubnub_samples_test

import (
	"fmt"
	"time"

	pubnub "github.com/pubnub/go/v10"
)

// Example_removeChannelMembers demonstrates removing users from a channel
func Example_removeChannelMembers() {
	config := pubnub.NewConfigWithUserId(pubnub.UserId("demo-user"))
	config.SubscribeKey = "demo"
	config.PublishKey = "demo"

	pn := pubnub.NewPubNub(config)

	// Remove specific users from the channel
	response, status, err := pn.RemoveChannelMembers().
		Channel("remove-members-channel").      // Channel ID
		Remove([]pubnub.PNChannelMembersRemove{ // Users to remove
			{UUID: pubnub.PNChannelMembersUUID{ID: "remove-member-1"}},
		}).
		Execute()

	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	if status.StatusCode == 200 {
		fmt.Printf("Removed %d member(s) from channel\n", len(response.Data))
	}

	// Output:
	// Removed 1 member(s) from channel
}
```

### Swift

```swift
let memberToRemove = PubNubMembershipMetadataBase(
  userMetadataId: "my_user",
  channelMetadataId: "my_channel"
)

// Remove members for a specific channel
pubnub.removeMembers(
  channel: memberToRemove.channelMetadataId,
  users: [memberToRemove]
) { result in
  switch result {
  case let .success(response):
    print("The user members of the channel: \(response.memberships)")
    print("The next page used for pagination: \(String(describing: response.next))")
  case let .failure(error):
    print("Update Memberships request failed with error: \(error.localizedDescription)")
  }
}
```

### PHP

```php
$removeMembersList = [new PNChannelMember($sampleUsers[0]['id'])];

$removeMembersResult = $pubnub->removeMembers()
    ->channel($sampleChannels[0]['id'])
    ->members($removeMembersList)
    ->sync();
assert($removeMembersResult);
```

### Unity

```csharp
using PubnubApi;
using PubnubApi.Unity;

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

// Initialize PubNub
Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration);

// If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour
// For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub
/*
[SerializeField] private PNManagerBehaviour pubnubManager;
Pubnub pubnub = pubnubManager.pubnub;
*/

// Remove Members (UUID) for a specific channel
List<string> removeChannelMemberList =
 new() {
  "my-uuid",
  "your-uuid"
 };

PNResult<PNChannelMembersResult> removeChannelMembersResponse = await pubnub.RemoveChannelMembers()
    .Channel("my-channel")
    .Uuids(removeChannelMemberList)
    .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM })
    .IncludeCount(true)
    .ExecuteAsync();

PNChannelMembersResult removeChannelMembersResult = removeChannelMembersResponse.Result;
PNStatus status = removeChannelMembersResponse.Status;
```

If Access Manager is enabled, this call requires only a `manage` permission grant on the channel. On success, the call also fires the membership `delete` [App Context event](https://www.pubnub.com/docs/data-storage/metadata/events.md) other subscribers receive. Removing a member deletes the membership record. It doesn't delete the user's or the channel's own metadata.

## Manage a channel's members without code

[BizOps Workspace](https://www.pubnub.com/docs/data-storage/metadata/overview.md)'s **Channel Management** module manages the same roster from the Admin Portal, with no SDK call required:

* [Add membership](https://www.pubnub.com/docs/data-storage/metadata/manage-channel-metadata.md). Assign one or more users to a channel.
* [Update membership](https://www.pubnub.com/docs/data-storage/metadata/manage-channel-metadata.md). Change a member's custom membership fields.
* [Delete membership](https://www.pubnub.com/docs/data-storage/metadata/manage-channel-metadata.md). Remove one member, or several at once.

A membership you create, edit, or delete in BizOps Workspace is the same record your SDK calls read and write. Changes in either place are immediately visible in the other, and from either direction: a member you add here also appears when you [get that user's memberships](https://www.pubnub.com/docs/data-storage/metadata/manage-memberships.md#get-a-users-memberships).

## Related tasks

* [App Context](https://www.pubnub.com/docs/data-storage/metadata/overview.md). The two directions of a membership and how they relate to [Presence](https://www.pubnub.com/docs/presence/overview.md).
* [Set, get, and remove memberships](https://www.pubnub.com/docs/data-storage/metadata/manage-memberships.md). Manage the same relationship from a user's side.
* [Set, get, and remove channel metadata](https://www.pubnub.com/docs/data-storage/metadata/manage-channel-metadata.md). Give this channel its own name, description, and custom fields.
* [App Context filtering](https://www.pubnub.com/docs/data-storage/metadata/filtering.md). Filter a members list by `uuid.*` fields.
* [App Context API limits](https://www.pubnub.com/docs/data-storage/metadata/api-limits.md). Members per channel and members per write.

Last updated at: 2026-09-30T07:20:08.000Z
