let query = FeedsQuery(
filter: .equal(.createdById, "john"),
sort: [Sort(field: .createdAt, direction: .reverse)],
limit: 10,
watch: true
)
let feedList = client.feedList(for: query)
// Page 1
let page1 = try await feedList.get()
// Page 2
let page2 = try await feedList.queryMoreFeeds(limit: 10)
let page1And2 = feedList.state.feedsActivity Feeds v3 is in beta — try it out!
Search for Feeds
The query feeds endpoint lets you search for feeds.
Examples
Querying My Feeds
val query = FeedsQuery(
filter = FeedsFilterField.createdById.equal("john"),
sort = listOf(FeedsSort(FeedsSortField.CreatedAt, SortDirection.REVERSE)),
limit = 10,
watch = true
)
val feedList = client.feedList(query = query)
// Page 1
val page1: Result<List<FeedData>> = feedList.get()
// Page 2
val page2: Result<List<FeedData>> = feedList.queryMoreFeeds(limit = 10)
val page1And2 = feedList.state.feedsconst firstPage = await client.queryFeeds({
filter: {
created_by_id: "john",
},
limit: 10,
sort: [{ field: "created_at", direction: -1 }],
});
const secondPage = await client.queryFeeds({
filter: {
created_by_id: "john",
},
limit: 10,
sort: [{ field: "created_at", direction: -1 }],
next: firstPage.next,
});final query = FeedsQuery(
filter: const Filter.equal(FeedsFilterField.createdById, 'john'),
sort: [FeedsSort.desc(FeedsSortField.createdAt)],
limit: 10,
watch: true,
);
final feedList = client.feedList(query);
// Page 1
final page1 = await feedList.get();
// Page 2
final page2 = await feedList.queryMoreFeeds(limit: 10);
final page1And2 = feedList.state.feeds;const firstPage = await client.feeds.queryFeeds({
filter: {
created_by_id: "john",
},
limit: 10,
sort: [{ field: "created_at", direction: -1 }],
});
const secondPage = await client.feeds.queryFeeds({
filter: {
created_by_id: "john",
},
limit: 10,
sort: [{ field: "created_at", direction: -1 }],
next: firstPage.next,
});ctx := context.Background()
// First page query
firstPage, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: map[string]any{
"created_by_id": "john",
},
Limit: getstream.PtrTo(10),
Sort: []getstream.SortParamRequest{
{
Field: getstream.PtrTo("created_at"),
Direction: getstream.PtrTo(-1),
},
},
})
if err != nil {
log.Fatal("Error querying first page:", err)
}
// Second page query using next cursor from first page
secondPage, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: map[string]any{
"created_by_id": "john",
},
Limit: getstream.PtrTo(10),
Sort: []getstream.SortParamRequest{
{
Field: getstream.PtrTo("created_at"),
Direction: getstream.PtrTo(-1),
},
},
Next: firstPage.Data.Next,
})
if err != nil {
log.Fatal("Error querying second page:", err)
}
log.Printf("First page: %d feeds, next: %v", len(firstPage.Data.Feeds), firstPage.Data.Next)
log.Printf("Second page: %d feeds, next: %v", len(secondPage.Data.Feeds), secondPage.Data.Next)// First page query
Map<String, Object> filter = new HashMap<>();
filter.put("created_by_id", "john");
QueryFeedsRequest firstPageRequest = QueryFeedsRequest.builder()
.filter(filter)
.limit(10)
.sort(List.of(
SortParamRequest.builder()
.field("created_at")
.direction(-1)
.build()
))
.build();
QueryFeedsResponse firstPage = feeds.queryFeeds(firstPageRequest).execute().getData();
// Second page using next cursor from first page
QueryFeedsRequest secondPageRequest = QueryFeedsRequest.builder()
.filter(filter)
.limit(10)
.sort(List.of(
SortParamRequest.builder()
.field("created_at")
.direction(-1)
.build()
))
.next(firstPage.getNext())
.build();
QueryFeedsResponse secondPage = feeds.queryFeeds(secondPageRequest).execute().getData();// First page query
$firstPage = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)['created_by_id' => 'john'],
limit: 10,
sort: [
['field' => 'created_at', 'direction' => -1]
]
)
);
// Second page using next cursor from first page
$secondPage = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)['created_by_id' => 'john'],
limit: 10,
sort: [
['field' => 'created_at', 'direction' => -1]
],
next: $firstPage->getData()->next
)
);// First page query
var firstPage = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new { created_by_id = "john" },
Limit = 10,
Sort = new List<SortParamRequest>
{
new SortParamRequest
{
Field = "created_at",
Direction = -1
}
}
}
);
// Second page using next cursor from first page
var secondPage = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new { created_by_id = "john" },
Limit = 10,
Sort = new List<SortParamRequest>
{
new SortParamRequest
{
Field = "created_at",
Direction = -1
}
},
Next = firstPage.Next
}
);# First page query
first_page = feeds.query_feeds(
filter={"created_by_id": "john"},
limit=10,
sort=[{"field": "created_at", "direction": -1}]
)
# Second page using next cursor from first page
second_page = feeds.query_feeds(
filter={"created_by_id": "john"},
limit=10,
sort=[{"field": "created_at", "direction": -1}],
next=first_page["next"]
)# First page query
first_page = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: { "created_by_id" => "john" },
limit: 10,
sort: [{ "field" => "created_at", "direction" => -1 }]
)
)
# Second page using next cursor from first page
second_page = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: { "created_by_id" => "john" },
limit: 10,
sort: [{ "field" => "created_at", "direction" => -1 }],
_next: first_page.data._next
)
)Querying Feeds Where I Am a Member
let query = FeedsQuery(
filter: .contains(.members, "john")
)
let feedList = client.feedList(for: query)
let feeds = try await feedList.get()val query = FeedsQuery(
filter = FeedsFilterField.members.contains("john")
)
val feedList = client.feedList(query = query)
val feeds: Result<List<FeedData>> = feedList.get()await client.queryFeeds({
filter: {
members: { $in: ["john"] },
},
});const query = FeedsQuery(
filter: Filter.contains(FeedsFilterField.members, 'john'),
);
final feedList = client.feedList(query);
final feeds = await feedList.get();await client.feeds.queryFeeds({
filter: {
members: { $in: ["john"] },
},
});ctx := context.Background()
filter := map[string]any{
"members": map[string]any{
"$in": []string{"john"},
},
}
response, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: filter,
})
if err != nil {
log.Fatal("Error querying feeds:", err)
}
log.Printf("Query feeds response: %+v", response)Map<String, Object> filter = new HashMap<>();
Map<String, Object> membersFilter = new HashMap<>();
membersFilter.put("$in", List.of("john"));
filter.put("members", membersFilter);
QueryFeedsRequest request = QueryFeedsRequest.builder()
.filter(filter)
.build();
QueryFeedsResponse response = feeds.queryFeeds(request).execute().getData();$response = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)[
'members' => (object)['$in' => ['john']]
]
)
);var response = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new
{
members = new { __in = new[] { "john" } }
}
}
);response = feeds.query_feeds(
filter={
"members": {"$in": ["john"]}
}
)response = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: {
"members" => { "$in" => ["john"] }
}
)
)Querying feeds by name or description
let sportsQuery = FeedsQuery(
filter: .and([
.equal(.visibility, "public"),
.query(.name, "Sports")
])
)
let sportsFeedList = client.feedList(for: sportsQuery)
let sportsFeeds = try await sportsFeedList.get()
let techQuery = FeedsQuery(
filter: .and([
.equal(.visibility, "public"),
.query(.description, "tech")
])
)
let techFeedList = client.feedList(for: techQuery)
let techFeeds = try await techFeedList.get()val sportsQuery = FeedsQuery(
filter = Filters.and(
FeedsFilterField.visibility.equal("public"),
FeedsFilterField.name.query("Sports")
)
)
val sportsFeedList = client.feedList(query = sportsQuery)
val sportsFeeds: Result<List<FeedData>> = sportsFeedList.get()
val techQuery = FeedsQuery(
filter = Filters.and(
FeedsFilterField.visibility.equal("public"),
FeedsFilterField.description.query("tech")
)
)
val techFeedList = client.feedList(query = techQuery)
val techFeeds: Result<List<FeedData>> = techFeedList.get()await client.queryFeeds({
filter: {
visibility: { $eq: "public" },
name: { $q: "Sports" },
},
});
// search public feeds by description
await client.queryFeeds({
filter: {
visibility: "public",
description: { $q: "tech" },
},
});const sportsQuery = FeedsQuery(
filter: Filter.and([
Filter.equal(FeedsFilterField.visibility, 'public'),
Filter.query(FeedsFilterField.name, 'Sports'),
]),
);
final sportsFeedList = client.feedList(sportsQuery);
final sportsFeeds = await sportsFeedList.get();
const techQuery = FeedsQuery(
filter: Filter.and([
Filter.equal(FeedsFilterField.visibility, 'public'),
Filter.query(FeedsFilterField.description, 'tech'),
]),
);
final techFeedList = client.feedList(techQuery);
final techFeeds = await techFeedList.get();await client.feeds.queryFeeds({
filter: {
visibility: { $eq: "public" },
name: { $q: "Sports" },
},
});
// search public feeds by description
await client.feeds.queryFeeds({
filter: {
visibility: "public",
description: { $q: "tech" },
},
});// Create context
ctx := context.Background()
response1, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: map[string]any{
"visibility": map[string]any{
"$eq": "public",
},
"name": map[string]any{
"$q": "Sports",
},
},
})
if err != nil {
log.Fatal("Error querying feeds:", err)
}
log.Printf("Query feeds response 1: %+v", response1)
response2, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: map[string]any{
"visibility": getstream.PtrTo("public"),
"description": map[string]any{
"$q": "tech",
},
},
})// Search public feeds by name
Map<String, Object> filter1 = new HashMap<>();
filter1.put("visibility", Map.of("$eq", "public"));
filter1.put("name", Map.of("$q", "Sports"));
QueryFeedsRequest request1 = QueryFeedsRequest.builder()
.filter(filter1)
.build();
QueryFeedsResponse response1 = feeds.queryFeeds(request1).execute().getData();
// Search public feeds by description
Map<String, Object> filter2 = new HashMap<>();
filter2.put("visibility", "public");
filter2.put("description", Map.of("$q", "tech"));
QueryFeedsRequest request2 = QueryFeedsRequest.builder()
.filter(filter2)
.build();
QueryFeedsResponse response2 = feeds.queryFeeds(request2).execute().getData();// Search public feeds by name
$response = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)[
'visibility' => (object)['$eq' => 'public'],
'name' => (object)['$q' => 'Sports']
]
)
);
// Search public feeds by description
$response2 = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)[
'visibility' => 'public',
'description' => (object)['$q' => 'tech']
]
)
);// Search public feeds by name
var response1 = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new
{
visibility = new { __eq = "public" },
name = new { __q = "Sports" }
}
}
);
// Search public feeds by description
var response2 = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new
{
visibility = "public",
description = new { __q = "tech" }
}
}
);# Search public feeds by name
response1 = feeds.query_feeds(
filter={
"visibility": {"$eq": "public"},
"name": {"$q": "Sports"}
}
)
# Search public feeds by description
response2 = feeds.query_feeds(
filter={
"visibility": "public",
"description": {"$q": "tech"}
}
)# Search public feeds by name
response1 = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: {
"visibility" => { "$eq" => "public" },
"name" => { "$q" => "Sports" }
}
)
)
# Search public feeds by description
response2 = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: {
"visibility" => "public",
"description" => { "$q" => "tech" }
}
)
)Querying feeds by creator name
let query = FeedsQuery(
filter: .and([
.equal(.visibility, "public"),
.query(.createdByName, "Thompson")
])
)
let feedList = client.feedList(for: query)
let feeds = try await feedList.get()val query = FeedsQuery(
filter = Filters.and(
FeedsFilterField.visibility.equal("public"),
FeedsFilterField.createdByName.query("Thompson"),
)
)
val feedList = client.feedList(query = query)
val feeds: Result<List<FeedData>> = feedList.get()// search public feeds created by users with 'Thompson' in their name
await client.queryFeeds({
filter: {
visibility: "public",
"created_by.name": { $q: "Thompson" },
},
});const query = FeedsQuery(
filter: Filter.and([
Filter.equal(FeedsFilterField.visibility, 'public'),
Filter.query(FeedsFilterField.createdByName, 'Thompson'),
]),
);
final feedList = client.feedList(query);
final feeds = await feedList.get();// search public feeds created by users with 'Thompson' in their name
await client.feeds.queryFeeds({
filter: {
visibility: "public",
"created_by.name": { $q: "Thompson" },
},
});// Create context
ctx := context.Background()
// Search public feeds created by users with 'Thompson' in their name
if response, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: map[string]any{
"visibility": "public",
"created_by.name": map[string]any{
"$q": "Thompson",
},
},
});
err != nil {
log.Fatal("Error querying feeds:", err)
} else {
log.Printf("Found %d feeds", len(response.Data.Feeds))
}// Search public feeds created by users with 'Thompson' in their name
Map<String, Object> filter = new HashMap<>();
filter.put("visibility", "public");
filter.put("created_by.name", Map.of("$q", "Thompson"));
QueryFeedsRequest request = QueryFeedsRequest.builder()
.filter(filter)
.build();
QueryFeedsResponse response = feeds.queryFeeds(request).execute().getData();$response = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)[
'visibility' => 'public',
'created_by.name' => (object)['$q' => 'Thompson']
]
)
);var response = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new
{
visibility = "public",
created_by = new { name = new { __q = "Thompson" } }
}
}
);response = feeds.query_feeds(
filter={
"visibility": "public",
"created_by.name": {"$q": "Thompson"}
}
)response = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: {
"visibility" => "public",
"created_by.name" => { "$q" => "Thompson" }
}
)
)A complex example
Search for user feeds where text matches the feed’s name, description or creator’s name:
let query = FeedsQuery(
filter: .and([
.equal(.groupId, "user"),
.or([
.query(.name, searchQuery),
.query(.description, searchQuery),
.query(.createdByName, searchQuery)
])
])
)
let feedList = client.feedList(for: query)
let feeds = try await feedList.get()val query = FeedsQuery(
filter = Filters.and(
FeedsFilterField.groupId.equal("user"),
Filters.or(
FeedsFilterField.name.query(searchQuery),
FeedsFilterField.description.query(searchQuery),
FeedsFilterField.createdByName.query(searchQuery)
)
)
)
val feedList = client.feedList(query = query)
val feeds: Result<List<FeedData>> = feedList.get()await client.queryFeeds({
filter: {
group_id: "user",
$or: [
{ name: { $q: searchQuery } },
{ description: { $q: searchQuery } },
{ "created_by.name": { $q: searchQuery } },
],
},
});const query = FeedsQuery(
filter: Filter.and([
Filter.equal(FeedsFilterField.groupId, 'user'),
Filter.or([
Filter.query(FeedsFilterField.name, searchQuery),
Filter.query(FeedsFilterField.description, searchQuery),
Filter.query(FeedsFilterField.createdByName, searchQuery),
]),
]),
);
final feedList = client.feedList(query);
final feeds = await feedList.get();await client.queryFeeds({
filter: {
group_id: "user",
$or: [
{ name: { $q: searchQuery } },
{ description: { $q: searchQuery } },
{ "created_by.name": { $q: searchQuery } },
],
},
});// Create context
ctx := context.Background()
response, err := client.Feeds().QueryFeeds(ctx, &getstream.QueryFeedsRequest{
Filter: map[string]any{
"group_id": "user",
"$or": []map[string]any{
{"name": map[string]any{"$q": searchQuery}},
{"description": map[string]any{"$q": searchQuery}},
{"created_by.name": map[string]any{"$q": searchQuery}},
},
},
})
if err != nil {
log.Fatal("Error querying feeds:", err)
}
log.Printf("Query feeds response: %+v", response)Map<String, Object> filter = new HashMap<>();
filter.put("group_id", "user");
filter.put("$or", List.of(
Map.of("name", Map.of("$q", searchQuery)),
Map.of("description", Map.of("$q", searchQuery)),
Map.of("created_by.name", Map.of("$q", searchQuery))
));
QueryFeedsRequest request = QueryFeedsRequest.builder()
.filter(filter)
.build();
QueryFeedsResponse response = feeds.queryFeeds(request).execute().getData();$response = $feedsClient->queryFeeds(
new GeneratedModels\QueryFeedsRequest(
filter: (object)[
'group_id' => 'user',
'$or' => [
(object)['name' => (object)['$q' => $searchQuery]],
(object)['description' => (object)['$q' => $searchQuery]],
(object)['created_by.name' => (object)['$q' => $searchQuery]]
]
]
)
);var response = await _feedsV3Client.QueryFeedsAsync(
request: new QueryFeedsRequest
{
Filter = new
{
group_id = "user",
__or = new[]
{
new { name = new { __q = searchQuery } },
new { description = new { __q = searchQuery } },
new { created_by = new { email = new { __q = searchQuery } } }
}
}
}
);response = feeds.query_feeds(
filter={
"group_id": "user",
"$or": [
{"name": {"$q": search_query}},
{"description": {"$q": search_query}},
{"created_by.name": {"$q": search_query}}
]
}
)response = client.feeds.query_feeds(
GetStream::Generated::Models::QueryFeedsRequest.new(
filter: {
"group_id" => "user",
"$or" => [
{ "name" => { "$q" => search_query } },
{ "description" => { "$q" => search_query } },
{ "created_by.name" => { "$q" => search_query } }
]
}
)
)Feeds Queryable Built-in Fields
| name | type | description | supported operations | example |
|---|---|---|---|---|
id | string or list of strings | The ID of the feed | $in, $eq | { id: { $in: [ 'abc', 'xyz' ] } } |
group_id | string or list of strings | The ID of the group this feed belongs to | $in, $eq | { group_id: { $in: [ 'abc', 'xyz' ] } } |
feed | string or list of strings | The fully qualified feed ID (group_id:id) | $in, $eq | { fid: { $in: [ 'abc', 'xyz' ] } } |
visibility | string or list of strings | The visibility setting of the feed | $in, $eq | { visibility: { $eq: 'public' } } |
created_by_id | string or list of strings | The ID of the user who created the feed | $in, $eq | { created_by_id: { $in: [ 'abc', 'xyz' ] } } |
created_by.name | string | The name of the user who created the feed | $eq, $q, $autocomplete | { 'created_by.name': { $autocomplete: 'Frank' } } |
name | string | The name of the feed | $eq, $q, $autocomplete | { name: { $q: 'Sports' } } |
description | string | The description of the feed | $eq, $q, $autocomplete | { description: { $autocomplete: 'tech' } } |
member_count | number | The number of members in this feed | $eq, $ne, $gt, $lt, $gte, $lte | { member_count: { $gt: 100 } } |
members | list of strings | The list of members in this feed | $in | { members: { $in: [ 'bob', 'alice' ] } } |
following_count | number | The number of feeds this feed follows | $eq, $ne, $gt, $lt, $gte, $lte | { following_count: { $gt: 100 } } |
following_feeds | list of strings | The list of feeds this feed follows | $in | { following_feeds: { $in: [ 'feed1', 'feed2' ] } } |
follower_count | number | The number of followers of this feed | $eq, $ne, $gt, $lt, $gte, $lte | { follower_count: { $gt: 100 } } |
created_at | string, RFC3339 timestamp | The time the feed was created | $eq, $gt, $lt, $gte, $lte | { created_at: { $gte: '2023-12-04T09:30:20.45Z' } } |
updated_at | string, RFC3339 timestamp | The time the feed was updated | $eq, $gt, $lt, $gte, $lte | { updated_at: { $gte: '2023-12-04T09:30:20.45Z' } } |
filter_tags | list of strings | Tags for filtering the feed | $eq, $contains, $in | { filter_tags: { $in: [ 'sports', 'news' ] } } |
Filter expressions can be combined using $or and $and operators as well.
Feeds can be sorted by created_at, updated_at, member_count, follower_count, and following_count.
Be sure to reach out to support if you need additional query feed capabilities.