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

# Query Channel Members

> Retrieve and search chat channel members with the current SDK filters, roles, deletion, and sorting APIs.

Use member queries for member lists, mention pickers, moderation screens, and channel participant management. All current SDKs expose channel member query and search APIs, but the filter names are not identical across platforms.

## Platform Surface

| Capability            | TypeScript                                                  | iOS                                               | Android                              | Flutter                                                                 |
| --------------------- | ----------------------------------------------------------- | ------------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------- |
| Query members         | `ChannelRepository.Membership.getMembers(params, callback)` | `AmityChannelMembership.getMembers(...)`          | `membership(channelId).getMembers()` | `membership(channelId).getMembers()`                                    |
| Search members        | `searchMembers({ search })`                                 | `searchMembers(displayName:filterBuilder:roles:)` | `searchMembers(keyword)`             | `searchMembers(keyword)`                                                |
| Status filter         | `memberships`                                               | `AmityChannelMembershipFilter`                    | `AmityChannelMembershipFilter`       | Query: `AmityChannelMembershipFilter`; search: `AmityChannelMembership` |
| Role filter           | `roles`                                                     | `roles`                                           | `roles(...)`                         | `roles(...)`                                                            |
| Include deleted users | `includeDeleted`                                            | `includeDeleted`                                  | `includeDeleted(...)`                | `includeDeleted(...)`                                                   |
| Sort                  | `firstCreated`, `lastCreated`                               | `.firstCreated`, `.lastCreated`                   | `FIRST_CREATED`, `LAST_CREATED`      | `FIRST_CREATED`, `LAST_CREATED`                                         |

## Parameters

| Operation      | Parameter                            | Required | Description                                                                            |
| -------------- | ------------------------------------ | -------- | -------------------------------------------------------------------------------------- |
| Query members  | `channelId`                          | Yes      | Channel ID whose members should be queried.                                            |
| Query members  | `memberships` / `filter`             | No       | Membership status filter, such as member, banned, muted, or all depending on platform. |
| Query members  | `roles`                              | No       | Channel role filters, such as `moderator`.                                             |
| Query members  | `includeDeleted`                     | No       | Whether deleted user records should be included.                                       |
| Query members  | `sortBy`                             | No       | Member ordering, such as first-created or last-created.                                |
| Query members  | `limit` / page size                  | No       | Page size for paginated member lists.                                                  |
| Search members | `search` / `displayName` / `keyword` | Yes      | Search term used to find members by display name.                                      |
| Search members | `memberships` / `membershipFilter`   | No       | Membership status filter for search results.                                           |
| Search members | `roles`                              | No       | Role filters applied to search results.                                                |

## Query Members

Query members when you need a paginated channel member list. The default sort is newest first on platforms that define a default.

<CodeGroup>
  ```typescript TypeScript theme={null}
  import { ChannelRepository } from '@amityco/ts-sdk';

  const unsubscribe = ChannelRepository.Membership.getMembers(
    {
      channelId,
      memberships: ['member'],
      roles: ['moderator'],
      sortBy: 'lastCreated',
      includeDeleted: false,
      limit: 20,
    },
    ({ data: members, loading, error, hasNextPage, onNextPage }) => {
      if (error) handleError(error);

      if (!loading && members) {
        renderResults({ members, hasNextPage, onNextPage });
      }
    },
  );

  unsubscribe();
  ```

  ```swift iOS theme={null}
  var token: AmityNotificationToken?

  let membership = AmityChannelMembership(channelId: channelId)
  let members = membership.getMembers(
      filter: .all,
      sortBy: .lastCreated,
      roles: ["moderator"],
      includeDeleted: false
  )

  token = members.observe { collection, error in
      if let error {
          handleError(error)
          return
      }

      showSuccessMessage(collection.snapshots.count)
  }
  ```

  ```kotlin Android theme={null}
  val disposable = AmityChatClient.newChannelRepository()
      .membership(channelId = channelId)
      .getMembers()
      .filter(filter = AmityChannelMembershipFilter.ALL)
      .roles(roles = listOf("moderator"))
      .includeDeleted(includeDeleted = false)
      .sortBy(sortOption = AmityChannelMembershipSortOption.LAST_CREATED)
      .build()
      .query()
      .subscribe(
          { members: PagingData<AmityChannelMember> -> showSuccessMessage(members) },
          { error -> handleGeneralError(error) },
      )
  ```

  ```dart Flutter theme={null}
  final controller = PagingController<AmityChannelMember>(
    pageFuture: (token) => AmityChatClient.newChannelRepository()
        .membership(channelId)
        .getMembers()
        .filter(AmityChannelMembershipFilter.ALL)
        .roles(['moderator'])
        .includeDeleted(false)
        .sortBy(AmityMembershipSortOption.LAST_CREATED)
        .getPagingData(token: token, limit: 20),
    pageSize: 20,
  );

  controller.fetchNextPage();
  ```
</CodeGroup>

## Search Members

Search members when the user enters a display-name keyword, such as in a mention picker. TypeScript names this parameter `search`; Android and Flutter name it `keyword`; iOS names it `displayName`.

<CodeGroup>
  ```typescript TypeScript theme={null}
  import { ChannelRepository } from '@amityco/ts-sdk';

  const unsubscribe = ChannelRepository.Membership.searchMembers(
    {
      channelId,
      search: 'alex',
      memberships: ['member'],
      roles: ['moderator'],
      includeDeleted: false,
      limit: 20,
    },
    ({ data: members, error }) => {
      if (error) handleError(error);

      if (members) {
        renderResults(members);
      }
    },
  );

  unsubscribe();
  ```

  ```swift iOS theme={null}
  var token: AmityNotificationToken?

  let membership = AmityChannelMembership(channelId: channelId)
  let filterBuilder = AmityChannelMembershipFilterBuilder()
  filterBuilder.add(filter: .member)

  let searchResults = membership.searchMembers(
      displayName: "alex",
      filterBuilder: filterBuilder,
      roles: ["moderator"],
      includeDeleted: false
  )

  token = searchResults.observe { collection, error in
      if let error {
          handleError(error)
          return
      }

      showSuccessMessage(collection.snapshots.count)
  }
  ```

  ```kotlin Android theme={null}
  import com.amity.socialcloud.sdk.api.chat.member.query.AmityChannelMembership

  val disposable = AmityChatClient.newChannelRepository()
      .membership(channelId = channelId)
      .searchMembers(keyword = "alex")
      .membershipFilter(channelMembership = listOf(AmityChannelMembership.MEMBER))
      .roles(roles = listOf("moderator"))
      .includeDeleted(includeDeleted = false)
      .build()
      .query()
      .subscribe(
          { members: PagingData<AmityChannelMember> -> showSuccessMessage(members) },
          { error -> handleGeneralError(error) },
      )
  ```

  ```dart Flutter theme={null}
  final members = await AmityChatClient.newChannelRepository()
      .membership(channelId)
      .searchMembers('alex')
      .membershipFilter([AmityChannelMembership.MEMBER])
      .roles(['moderator'])
      .includeDeleted(false)
      .sortBy(AmityMembershipSortOption.LAST_CREATED)
      .query(limit: 20);
  ```
</CodeGroup>

## Filter Notes

<CardGroup cols={2}>
  <Card title="Status Filters" icon="filter">
    TypeScript accepts `memberships: ['member' | 'banned' | 'muted']`. Android query uses `AmityChannelMembershipFilter.ALL`, `MEMBER`, or `BANNED`; Android search uses `AmityChannelMembership`. Flutter query uses `AmityChannelMembershipFilter.ALL`, `MUTED`, or `BANNED`; Flutter search uses `AmityChannelMembership`.
  </Card>

  <Card title="Deleted Users" icon="user-x">
    `includeDeleted: false` filters deleted users out of the result. iOS defaults this argument to `true`, so pass `false` when you want only active user records.
  </Card>

  <Card title="Roles" icon="shield">
    Role filters match channel roles assigned to members, such as `moderator` or custom roles configured for your app.
  </Card>

  <Card title="Paging" icon="list-end">
    TypeScript live collections expose `hasNextPage` and `onNextPage`; Android returns `PagingData`; Flutter uses `PagingController` or `getPagingData`.
  </Card>
</CardGroup>

## Related Topics

<CardGroup cols={2}>
  <Card title="Join and Leave Channels" href="./join-leave-channel" icon="door-open">
    Manage the current user's channel membership.
  </Card>

  <Card title="Preview Members" href="./preview-members" icon="user-round-search">
    Display a lightweight set of participant avatars.
  </Card>

  <Card title="Member Management" href="../channels/governance/member-management" icon="user-plus">
    Add or remove other users from a channel.
  </Card>

  <Card title="Ban Management" href="../channels/governance/ban-management" icon="user-slash">
    Moderate channel membership state.
  </Card>
</CardGroup>
