> ## Documentation Index
> Fetch the complete documentation index at: /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.

```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();
```

## 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

> [card] [Query Communities](/social-plus-sdk/social/communities-spaces/discovery/query-communities.md)
>
> Query and search communities by membership, category, tags, keyword, and sort order.

> [card] [Community Categories](/social-plus-sdk/social/communities-spaces/organization/community-categories.md)
>
> Retrieve categories used to organize community discovery.

> [card] [Search Overview](/social-plus-sdk/social/discovery-engagement/search/overview.md)
>
> Review SDK search surfaces for community and post discovery.


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