> ## Documentation Index
> Fetch the complete documentation index at: https://social-b97141fb-feat-user-history-moderation-detail.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Communities

> Search communities semantically with category, tag, membership, and discoverable private community filters.

Use community semantic search when a discovery experience should match a user's intent instead of only exact community names. The client SDK sends a query and optional filters, then observes or receives a paginated set of `AmityCommunity` results.

Flutter semantic community search requires `amity_sdk` 7.8.7 or later.

## Parameters

| Parameter | TypeScript | iOS | Android | Flutter |
| - | - | - | - | - |
| Query | `query` | `query` | `query` | `query` |
| Category IDs | `categoryIds` | `categoryIds` | `categoryIds` | `categoryIds` |
| Tags | `tags` | `tags` | `AmityTags` | `tags` |
| Membership status | `communityMembershipStatus` | `communityMembershipStatus` | `filter` | `filter` |
| Discoverable private communities | `includeDiscoverablePrivateCommunity` | `includeDiscoverablePrivateCommunity` | `includeDiscoverablePrivateCommunity` | `includeDiscoverablePrivateCommunity` |

## Search Communities

Search communities with a semantic query and optional category, tag, membership, or discoverable-private filters.

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

  let loadNextPage: (() => void) | undefined;
  let canLoadMore = false;

  const unsubscribe = CommunityRepository.semanticSearchCommunities(
    {
      query: 'trail running',
      categoryIds: ['category-id'],
      tags: ['outdoors'],
      includeDiscoverablePrivateCommunity: true,
      limit: 20,
    },
    ({ data: communities, onNextPage, hasNextPage, loading, error }) => {
      if (loading) return;
      if (error) {
        handleError(error);
        return;
      }

      renderResults(communities);
      loadNextPage = onNextPage;
      canLoadMore = hasNextPage;
    },
  );

  function loadMoreCommunities() {
    if (canLoadMore) {
      loadNextPage?.();
    }
  }

  unsubscribe();
  ```

  ```swift iOS theme={null}
  let options = AmityCommunitySemanticSearchOptions(
      query: "trail running",
      categoryIds: ["category-id"],
      tags: ["outdoors"],
      communityMembershipStatus: .all,
      includeDiscoverablePrivateCommunity: true
  )

  token = communityRepository
      .semanticSearchCommunities(options: options)
      .observe { collection, error in
          if let error {
              handleError(error)
              return
          }

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

  ```kotlin Android theme={null}
  import com.amity.socialcloud.sdk.model.social.community.AmityCommunityMembershipStatusFilter

  AmitySocialClient.newCommunityRepository()
      .semanticSearchCommunities(
          query = "trail running",
          filter = AmityCommunityMembershipStatusFilter.ALL,
          tags = AmityTags(listOf("outdoors")),
          categoryIds = listOf("category-id"),
          includeDiscoverablePrivateCommunity = true
      )
      .subscribe(
          { pagingData: PagingData<AmityCommunity> -> showSuccessMessage(pagingData) },
          { error -> handleGeneralError(error) }
      )
  ```

  ```dart Flutter theme={null}
  final liveCollection = AmitySocialClient.newCommunityRepository()
      .semanticSearchCommunities(
        query: 'trail running',
        filter: AmityCommunityFilter.ALL,
        tags: const ['outdoors'],
        categoryIds: const ['category-id'],
        includeDiscoverablePrivateCommunity: true,
      )
      .getLiveCollection(pageSize: 20);

  liveCollection.getStreamController().stream.listen((communities) {
    // Render communities in your UI.
  });

  await liveCollection.loadNext();
  ```
</CodeGroup>

## Membership Status

| Intent | iOS | Android | TypeScript | Flutter |
| - | - | - | - | - |
| Search all visible communities | `.all` | `AmityCommunityMembershipStatusFilter.ALL` | Omit `communityMembershipStatus` for the default all-status search | `AmityCommunityFilter.ALL` (default) |
| Search joined communities | `.member` | `AmityCommunityMembershipStatusFilter.MEMBER` | Use the SDK's typed membership-status value in app code | `AmityCommunityFilter.MEMBER` |
| Search communities the user has not joined | `.notMember` | `AmityCommunityMembershipStatusFilter.NOT_MEMBER` | Use the SDK's typed membership-status value in app code | `AmityCommunityFilter.NOT_MEMBER` |

## Notes

* Use category and tag filters when your discovery UI already knows the user's topic area.
* Use `includeDiscoverablePrivateCommunity` only when your product intentionally exposes discoverable private communities in search results.
* Flutter defaults `includeDiscoverablePrivateCommunity` to `false`; set it to `true` to include discoverable private communities.
* Search results are returned as live or paginated collections depending on platform, so keep pagination and disposal logic close to the screen that owns the search.
* On Flutter, `includeDiscoverablePrivateCommunity` is available on `semanticSearchCommunities()` only. `getCommunities()` does not expose it.

## Related Topics

<CardGroup cols={3}>
  <Card title="Query Communities" href="../../communities-spaces/discovery/query-communities" icon="magnifying-glass">
    Query and search communities by membership, category, tags, keyword, and sort order.
  </Card>

  <Card title="Community Categories" href="../../communities-spaces/organization/community-categories" icon="folder">
    Retrieve categories used to organize community discovery.
  </Card>

  <Card title="Search Overview" href="./overview" icon="sparkles">
    Review SDK search surfaces for community and post discovery.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.