// Feed with no extra fields, of feed group "user"
let feed = client.feed(group: "user", id: "john")
try await feed.getOrCreate()
// More options
let query = FeedQuery(
group: "user",
id: "jack",
data: .init(
description: "My personal feed",
name: "jack",
visibility: "public"
)
)
let feed2 = client.feed(for: query)
try await feed.getOrCreate()
Feeds
Creating a Feed
// Feed with no extra fields, of feed group "user"
val feed = client.feed(group = "user", id = "john")
feed.getOrCreate()
// More options
val query = FeedQuery(
group = "user",
id = "jack",
data = FeedInputData(
description = "My personal feed",
name = "jack",
visibility = FeedVisibility.Public
)
)
val feed2 = client.feed(query = query)
feed2.getOrCreate()
// Feed with no extra fields, of feed group "user"
const feed = client.feed("user", "jack");
await feed.getOrCreate();
// Subscribe to WebSocket events for state updates
await feed.getOrCreate({ watch: true });
// More options
const feed = client.feed("user", "jack");
await feed.getOrCreate({
data: {
description: "My personal feed",
name: "jack",
visibility: "public",
},
});
// Feed with no extra fields, of feed group "user"
final feed = client.feed(group: 'user', id: 'john');
await feed.getOrCreate();
// More options
const query = FeedQuery(
fid: FeedId(group: 'user', id: 'jack'),
data: FeedInputData(
description: 'My personal feed',
name: 'jack',
visibility: FeedVisibility.public,
),
);
final feed2 = client.feedFromQuery(query);
await feed2.getOrCreate();
// Feed with no extra fields, of feed group "user"
const feed = client.feeds.feed("user", "jack");
await feed.getOrCreate({
// The owner of the feed
user_id: "<user id>",
});
// More options
const feed = client.feeds.feed("user", "jack");
await feed.getOrCreate({
data: {
description: "My personal feed",
name: "jack",
visibility: "public",
},
// The owner of the feed
user_id: "<user id>",
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Reading a Feed
Here is a basic example of how to read a feed:
let feed = client.feed(group: "user", id: "john")
try await feed.getOrCreate()
let feedData = feed.state.feed
let activities = feed.state.activities
let members = feed.state.members
val feed = client.feed(group = "user", id = "john")
feed.getOrCreate()
val feedData = feed.state.feed
val activities = feed.state.activities
val members = feed.state.members
const feed = client.feed("user", "john");
await feed.getOrCreate({ watch: true });
const currentState = feed.state.getLatestValue();
const visivility = currentState.visibility;
const name = currentState.name;
const description = currentState.description;
const activities = currentState.activities;
const members = currentState.members;
// Or subscribe to state changes
const unsubscribe = feed.state.subscribe((state) => {
// Called everytime the state changes
console.log(state);
});
// or if you care only part of the state
const unsubscribe2 = feed.state.subscribeWithSelector(
(state) => ({
activities: state.activities,
}),
(state, prevState) => {
console.log(state.activities, prevState?.activities);
},
);
// Unsubscribe when you no longer want to recieve updates
unsubscribe();
unsubscribe2();
final feed = client.feed(group: 'user', id: 'john');
await feed.getOrCreate();
final feedData = feed.state.feed;
final activities = feed.state.activities;
final members = feed.state.members;
// Note: Always dispose the feed when you are done with it
feed.dispose();
const feed = client.feed(group: "user", id: "john")
const response = await feed.getOrCreate({
user_id: '<user id>'
})
const feedData = response.feed;
const activities = response.activities;
const members = response.members;
firstPageResponse, err := feedsClient.QueryActivities(ctx, &getstream.QueryActivitiesRequest{
Limit: getstream.PtrTo(3),
Filter: map[string]interface{}{
"user_id": testUserID,
},
})
Map<String, Object> filter = new HashMap<>();
filter.put("user_id", testUserId);
QueryActivitiesRequest firstPageRequest =
QueryActivitiesRequest.builder().limit(3).filter(filter).build();
QueryActivitiesResponse firstPageResponse =
feeds.queryActivities(firstPageRequest).execute().getData();
$firstPageResponse = $this->feedsV3Client->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
limit: 3,
filter: (object)['user_id' => $this->testUserId]
)
);
// Get first page
var firstPageResponse = await _feedsV3Client.QueryActivitiesAsync(
new QueryActivitiesRequest
{
Filter = new Dictionary<string, object> { ["user_id"] = _testUserId },
Limit = 3
}
);
Assert.That(firstPageResponse, Is.Not.Null);
// Get second page if there's a next token
// snippet-start: GetFeedActivitiesSecondPage
if (firstPageResponse.Data?.Next != null)
{
var secondPageResponse = await _feedsV3Client.QueryActivitiesAsync(
new QueryActivitiesRequest
{
Filter = new Dictionary<string, object> { ["user_id"] = _testUserId },
Limit = 3,
Next = firstPageResponse.Data.Next
}
);
Assert.That(secondPageResponse, Is.Not.Null);
Console.WriteLine("✅ Retrieved second page of activities");
}
else
{
Console.WriteLine("⚠️ No next page available");
}
// snippet-end: GetFeedActivitiesSecondPage
first_page_response = self.client.feeds.query_activities(
limit=3, filter={"user_id": self.test_user_id}
)
The response will contain the following data.
You have more options when reading a feed, let’s go over a few:
let query = FeedQuery(
group: "user",
id: "john",
activityFilter: .in(.filterTags, ["green"]), // filter activities with filter tag green
activityLimit: 10,
externalRanking: ["user_score": 0.8], // additional data used for ranking
followerLimit: 10,
followingLimit: 10,
memberLimit: 10,
view: "myview", // overwrite the default ranking or aggregation logic for this feed. good for split testing
watch: true // receive web-socket events with real-time updates
)
let feed = client.feed(for: query)
try await feed.getOrCreate()
let activities = feed.state.activities
let feedData = feed.state.feed
val query = FeedQuery(
group = "user",
id = "john",
activityFilter = Filters.`in`("filter_tags", listOf("green")), // filter activities with filter tag green
activityLimit = 10,
externalRanking = mapOf("user_score" to 0.8), // additional data used for ranking
followerLimit = 10,
followingLimit = 10,
memberLimit = 10,
view = "myview", // overwrite the default ranking or aggregation logic for this feed. good for split testing
watch = true // receive web-socket events with real-time updates
)
val feed = client.feed(query = query)
feed.getOrCreate()
val activities = feed.state.activities
val feedData = feed.state.feed
const feed = client.feed("user", "jack");
const response = await feed.getOrCreate({
limit: 10,
filter: {
filter_tags: ["green"], // filter activities with filter tag green
},
external_ranking: {
user_score: 0.8, // additional data used for ranking
},
followers_pagination: {
limit: 10,
},
following_pagination: {
limit: 10,
},
member_pagination: {
limit: 10,
},
view: "myview", // overwrite the default ranking or aggregation logic for this feed. good for split testing
});
const query = FeedQuery(
fid: FeedId(group: 'user', id: 'john'),
// filter activities with filter tag green
activityFilter: Filter.in_(
ActivitiesFilterField.filterTags,
['green'],
),
activityLimit: 10,
// additional data used for ranking
externalRanking: {'user_score': 0.8},
followerLimit: 10,
followingLimit: 10,
memberLimit: 10,
// overwrite the default ranking or aggregation logic for this feed. good for split testing
view: 'myview',
// receive web-socket events with real-time updates
watch: true,
);
final feed = client.feedFromQuery(query);
await feed.getOrCreate();
final activities = feed.state.activities;
final feedData = feed.state.feed;
// Note: Always dispose the feed when you are done with it
feed.dispose();
const feed = client.feeds.feed("user", "jack");
const response = await feed.getOrCreate({
limit: 10,
filter: {
filter_tags: ["green"], // filter activities with filter tag green
},
external_ranking: {
user_score: 0.8, // additional data used for ranking
},
followers_pagination: {
limit: 10,
},
following_pagination: {
limit: 10,
},
member_pagination: {
limit: 10,
},
view: "myview", // overwrite the default ranking or aggregation logic for this feed. good for split testing
user_id: "<user id>",
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Feed Pagination
Here is how you can read the next page on the feed:
let feed = client.feed(
for: .init(
group: "user",
id: "john",
activityLimit: 10
)
)
// Page 1
try await feed.getOrCreate()
let activities = feed.state.activities // First 10 activities
// Page 2
let page2Activities = try await feed.queryMoreActivities(limit: 10)
let page1And2Activities = feed.state.activities
val feed = client.feed(
query = FeedQuery(
group = "user",
id = "john",
activityLimit = 10
)
)
// Page 1
feed.getOrCreate()
val activities = feed.state.activities // First 10 activities
// Page 2
val page2Activities: Result<List<ActivityData>> = feed.queryMoreActivities(limit = 10)
val page1And2Activities = feed.state.activities
const feed = client.feed("user", "jack");
// First page
await feed.getOrCreate({
limit: 10,
});
// Second page
await feed.getNextPage();
console.log(feed.state.getLatestValue().activities);
final feed = client.feedFromQuery(
const FeedQuery(
fid: FeedId(group: 'user', id: 'john'),
activityLimit: 10,
),
);
// Page 1
await feed.getOrCreate();
final activities = feed.state.activities; // First 10 activities
// Page 2
final page2Activities = await feed.queryMoreActivities(limit: 10);
final page1And2Activities = feed.state.activities;
const feed = client.feeds.feed("user", "jack");
const firstPage = await feed.getOrCreate({
limit: 10,
user_id: "user_id",
});
const nextPage = await feed.getOrCreate({
next: firstPage.next,
limit: 10,
user_id: "user_id",
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Filtering Examples
Another common use case is filtering a feed. This is trickier than it seems. Keep in mind that for performance reasons feeds often have to be computed on write time. To allow for filtering we expose the following API.
// Add a few activities
let feedId = FeedId(group: "user", id: "john")
try await client.upsertActivities([
ActivityRequest(feeds: [feedId.rawValue], filterTags: ["green", "blue"], text: "first", type: "post"),
ActivityRequest(feeds: [feedId.rawValue], filterTags: ["yellow", "blue"], text: "second", type: "post"),
ActivityRequest(feeds: [feedId.rawValue], filterTags: ["orange"], text: "third", type: "post")
])
// Now read the feed, this will fetch activity 1 and 2
let query = FeedQuery(feed: feedId, activityFilter: .in(.filterTags, ["blue"]))
let feed = client.feed(for: query)
try await feed.getOrCreate()
let activities = feed.state.activities // contains first and second
// Add a few activities
val fid = FeedId(group = "user", id = "john")
client.upsertActivities(
listOf(
ActivityRequest(feeds = listOf(fid.rawValue), filterTags = listOf("green", "blue"), text = "first", type = "post"),
ActivityRequest(feeds = listOf(fid.rawValue), filterTags = listOf("yellow", "blue"), text = "second", type = "post"),
ActivityRequest(feeds = listOf(fid.rawValue), filterTags = listOf("orange"), text = "third", type = "post")
)
)
// Now read the feed, this will fetch activity 1 and 2
val query = FeedQuery(fid = fid, activityFilter = Filters.`in`("filter_tags", listOf("blue")))
val feed = client.feed(query = query)
feed.getOrCreate()
val activities = feed.state.activities // contains first and second
const feed = client.feed("user", "123");
// Add a few activities
client.upsertActivities({
activities: [
{
feeds: [feed.feed],
type: "post",
text: "first",
filter_tags: ["green", "blue"],
},
{
feeds: [feed.feed],
type: "post",
text: "second",
filter_tags: ["yellow", "blue"],
},
{
feeds: [feed.feed],
type: "post",
text: "third",
filter_tags: ["orange"],
},
],
});
const response = await feed.getOrCreate({
filter: {
filter_tags: ["blue"],
},
});
// Add a few activities
const feedId = FeedId(group: 'user', id: 'john');
await client.upsertActivities(
activities: [
ActivityRequest(
feeds: [feedId.rawValue],
filterTags: const ['green', 'blue'],
text: 'first',
type: 'post',
),
ActivityRequest(
feeds: [feedId.rawValue],
filterTags: const ['yellow', 'blue'],
text: 'second',
type: 'post',
),
ActivityRequest(
feeds: [feedId.rawValue],
filterTags: const ['orange'],
text: 'third',
type: 'post',
),
],
);
// Now read the feed, this will fetch activity 1 and 2
const query = FeedQuery(
fid: feedId,
activityFilter: Filter.in_(ActivitiesFilterField.filterTags, ['blue']),
);
final feed = client.feedFromQuery(query);
await feed.getOrCreate();
// contains first and second
final activities = feed.state.activities;
const feed = client.feeds.feed("user", "123");
// Add a few activities
client.feeds.upsertActivities({
activities: [
{
feeds: [feed.feed],
type: "post",
text: "first",
filter_tags: ["green", "blue"],
user_id: "<user id>",
},
{
feeds: [feed.feed],
type: "post",
text: "second",
filter_tags: ["yellow", "blue"],
user_id: "<user id>",
},
{
feeds: [feed.feed],
type: "post",
text: "third",
filter_tags: ["orange"],
user_id: "<user id>",
},
],
});
const response = await feed.getOrCreate({
filter: {
filter_tags: ["blue"],
},
user_id: "<user id>",
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
The filter syntax also supports $or
and $and
, so here’s an example that’s a little more complicated:
// Get all the activities where filter tags contain both "green" and "orange"
let query = FeedQuery(
group: "user",
id: "john",
activityFilter: .and([
.in(.filterTags, ["green"]),
.in(.filterTags, ["orange"])
])
)
try await feed.getOrCreate()
let activities = feed.state.activities
// Get all the activities where filter tags contain both "green" and "orange"
val query = FeedQuery(
group = "user",
id = "john",
activityFilter = Filters.and(
Filters.`in`("filter_tags", listOf("green")),
Filters.`in`("filter_tags", listOf("orange"))
)
)
feed.getOrCreate()
val activities = feed.state.activities
// Get all the activities where filter tags contain both "green" and "orange"
const response = await feed.getOrCreate({
filter: {
$and: [{ filter_tags: ["green"] }, { filter_tags: ["orange"] }],
},
});
// Get all the activities where filter tags contain both "green" and "orange"
const query = FeedQuery(
fid: FeedId(group: 'user', id: 'john'),
activityFilter: Filter.and([
Filter.in_(ActivitiesFilterField.filterTags, ['green']),
Filter.in_(ActivitiesFilterField.filterTags, ['orange']),
]),
);
final feed = client.feedFromQuery(query);
await feed.getOrCreate();
final activities = feed.state.activities;
// Get all the activities where filter tags contain both "green" and "orange"
const response = await feed.getOrCreate({
filter: {
$and: [
{ filter_tags: ["green"] }
{ filter_tags: ["orange"] }
],
},
user_id: "<user id>",
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Feed Members
You can add and remove members to a feed. This is useful for building communities where a set of users can add content to the feed.
It’s not possible to set/update member role on client-side. Use server-side SDKs for this. When adding members client-side all new members will have feed_member
role:
// The following methods are available to edit the members of a feed
try await feed.updateFeedMembers(
request: .init(
members: [.init(
custom: ["joined": "2024-01-01"],
role: "moderator",
userId: "john"
)],
operation: .upsert
)
)
// Remove members
try await feed.updateFeedMembers(
request: .init(
members: [.init(userId: "john"), .init(userId: "jane")],
operation: .remove
)
)
// Set members (overwrites the list)
try await feed.updateFeedMembers(
request: .init(
members: [.init(role: "moderator", userId: "john")],
operation: .set
)
)
// The following methods are available to edit the members of a feed
feed.updateFeedMembers(
request = UpdateFeedMembersRequest(
members = listOf(
FeedMemberRequest(
custom = mapOf("joined" to "2024-01-01"),
role = "moderator",
userId = "john"
)
),
operation = UpdateFeedMembersRequest.Operation.Upsert
)
)
// Remove members
feed.updateFeedMembers(
request = UpdateFeedMembersRequest(
members = listOf(
FeedMemberRequest(userId = "john"),
FeedMemberRequest(userId = "jane")
),
operation = UpdateFeedMembersRequest.Operation.Remove
)
)
// Set members (overwrites the list)
feed.updateFeedMembers(
request = UpdateFeedMembersRequest(
members = listOf(
FeedMemberRequest(role = "moderator", userId = "john")
),
operation = UpdateFeedMembersRequest.Operation.Set
)
)
// The following methods are available to add or edit the members of a feed
await feed.updateFeedMembers({
operation: "upsert",
members: [
{
user_id: "john",
custom: {
joined: "2024-01-01",
},
},
],
});
// Remove members
await feed.updateFeedMembers({
operation: "remove",
members: [
{
user_id: "john",
},
{
user_id: "jane",
},
],
});
// Set members (overwrites the list)
await feed.updateFeedMembers({
operation: "set",
members: [
{
user_id: "john",
},
],
});
// The following methods are available to edit the members of a feed
final result = await feed.updateFeedMembers(
request: const UpdateFeedMembersRequest(
members: [
FeedMemberRequest(
custom: {'joined': '2024-01-01'},
role: 'moderator',
userId: 'john',
),
],
operation: UpdateFeedMembersRequestOperation.upsert,
),
);
// Remove members
await feed.updateFeedMembers(
request: const UpdateFeedMembersRequest(
members: [
FeedMemberRequest(userId: 'john'),
FeedMemberRequest(userId: 'jane'),
],
operation: UpdateFeedMembersRequestOperation.remove,
),
);
// Set members (overwrites the list)
await feed.updateFeedMembers(
request: const UpdateFeedMembersRequest(
members: [FeedMemberRequest(role: 'moderator', userId: 'john')],
operation: UpdateFeedMembersRequestOperation.set,
),
);
// The following methods are available to add or edit the members of a feed
await feed.updateFeedMembers({
operation: "upsert",
members: [
{
user_id: "john",
role: "moderator",
custom: {
joined: "2024-01-01",
},
},
],
});
// Remove members
await feed.updateFeedMembers({
operation: "remove",
members: [
{
user_id: "john",
},
{
user_id: "jane",
},
],
});
// Set members (overwrites the list)
await feed.updateFeedMembers({
operation: "set",
members: [
{
user_id: "john",
role: "moderator",
},
],
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Feed members vs followers
Followers and members might seem like similar concepts, but they serve two different purposes with some key differences.
Followers can only be feeds (for example the timeline
feed of Alice follows the user
feed of Bob). Followers’ aim is to access the content of a feed they’re interested in and interact with it.
Members can only be users (for example Alice adds Bob as a member to her feed about “Travel Hacks”). The aim of feed members is usually to help out with admin tasks (helpful if you want to build apps similar to Facebook pages) or to decide what activities a user has access to using membership levels (for example Bob becomes a premium member in Alice’s community).
Member invites
You can invite members with the invite
flag, where invited users can accept or reject the membership.
// Request to become a member
try await feed.updateFeedMembers(
request: .init(
members: [.init(
custom: ["reason": "community builder"],
invite: true,
role: "moderator",
userId: "john"
)],
operation: .upsert
)
)
// Accept and reject member requests
_ = try await feed.acceptFeedMember()
_ = try await feed.rejectFeedMember()
// Request to become a member
feed.updateFeedMembers(
request = UpdateFeedMembersRequest(
members = listOf(
FeedMemberRequest(
custom = mapOf("reason" to "community builder"),
invite = true,
role = "moderator",
userId = "john"
)
),
operation = UpdateFeedMembersRequest.Operation.Upsert
)
)
// Accept and reject member requests
feed.acceptFeedMember()
feed.rejectFeedMember()
await invitingFeed.updateFeedMembers({
operation: "upsert",
members: [
{
user_id: "john",
invite: true,
custom: {
reason: "community builder",
},
},
],
});
const feed = johnClient.feed(invitingFeed.group, invitingFeed.id);
// Then John can accept or reject
await feed.acceptFeedMemberInvite();
await feed.rejectFeedMemberInvite();
// Request to become a member
await feed.updateFeedMembers(
request: const UpdateFeedMembersRequest(
members: [
FeedMemberRequest(
custom: {'reason': 'community builder'},
invite: true,
role: 'moderator',
userId: 'john',
),
],
operation: UpdateFeedMembersRequestOperation.upsert,
),
);
// Accept and reject member requests
await feed.acceptFeedMember();
await feed.rejectFeedMember();
await feed.updateFeedMembers({
operation: "upsert",
members: [
{
user_id: "john",
role: "moderator",
invite: true,
custom: {
reason: "community builder",
},
},
],
});
await feed.acceptFeedMemberInvite({
user_id: "john",
});
await feed.rejectFeedMemberInvite({
user_id: "john",
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Query Feeds
Querying feeds allows you to do things like showing the list of communities you’ve joined.
Here’s an example of how to query feeds:
Querying My Feeds
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.feeds
val query = FeedsQuery(
filter = Filters.equal("created_by_id", "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.feeds
const 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.feedsQueryFeeds({
filter: {
created_by_id: "john",
},
limit: 10,
sort: [{ field: "created_at", direction: -1 }],
});
const secondPage = await client.feeds.feedsQueryFeeds({
filter: {
created_by_id: "john",
},
limit: 10,
sort: [{ field: "created_at", direction: -1 }],
next: firstPage.next,
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
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 = Filters.contains("members", "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.feedsQueryFeeds({
filter: {
members: { $in: ["john"] },
},
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
Querying feeds by name or visibility
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"),
.autocomplete(.description, "tech")
])
)
let techFeedList = client.feedList(for: techQuery)
let techFeeds = try await techFeedList.get()
val sportsQuery = FeedsQuery(
filter = Filters.and(
Filters.equal("visibility", "public"),
Filters.query("name", "Sports")
)
)
val sportsFeedList = client.feedList(query = sportsQuery)
val sportsFeeds: Result<List<FeedData>> = sportsFeedList.get()
val techQuery = FeedsQuery(
filter = Filters.and(
Filters.equal("visibility", "public"),
Filters.autocomplete("description", "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: {
// Shorthand for the $eq operator
visibility: "public",
description: { $autocomplete: "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.autoComplete(FeedsFilterField.description, 'tech'),
]),
);
final techFeedList = client.feedList(techQuery);
final techFeeds = await techFeedList.get();
await client.feeds.feedsQueryFeeds({
filter: {
visibility: { $eq: "public" },
name: { $q: "Sports" },
},
});
// search public feeds by description
await client.feeds.feedsQueryFeeds({
filter: {
// Shorthand for the $eq operator
visibility: "public",
description: { $autocomplete: "tech" },
},
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
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(
Filters.equal("visibility", "public"),
Filters.query("created_by.name", "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.feedsQueryFeeds({
filter: {
visibility: "public",
"created_by.name": { $q: "Thompson" },
},
});
feedsClient := client.Feeds()
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID,
})
if err != nil {
t.Logf("Failed to create feed 1: %v", err)
}
_, err = feedsClient.GetOrCreateFeed(ctx, userFeedType, testUserID2, &getstream.GetOrCreateFeedRequest{
UserID: &testUserID2,
})
testFeed = new Feed("user", testUserId, feeds);
testFeed2 = new Feed("user", testUserId2, feeds);
GetOrCreateFeedRequest feedRequest1 =
GetOrCreateFeedRequest.builder().userID(testUserId).build();
GetOrCreateFeedRequest feedRequest2 =
GetOrCreateFeedRequest.builder().userID(testUserId2).build();
GetOrCreateFeedResponse feedResponse1 = testFeed.getOrCreate(feedRequest1).getData();
GetOrCreateFeedResponse feedResponse2 = testFeed2.getOrCreate(feedRequest2).getData();
testFeedId = feedResponse1.getFeed().getFeed();
testFeedId2 = feedResponse2.getFeed().getFeed();
$feedResponse1 = $this->testFeed->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId)
);
$feedResponse2 = $this->testFeed2->getOrCreateFeed(
new GeneratedModels\GetOrCreateFeedRequest(userID: $this->testUserId2)
);
var feedResponse1 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId,
request: new GetOrCreateFeedRequest { UserID = _testUserId }
);
var feedResponse2 = await _feedsV3Client.GetOrCreateFeedAsync(
FeedGroupID: "user",
FeedID: _testFeedId2,
request: new GetOrCreateFeedRequest { UserID = _testUserId2 }
);
feed_response_1 = self.test_feed.get_or_create(user_id=self.test_user_id)
feed_response_2 = self.test_feed_2.get_or_create(
user_id=self.test_user_id_2
)
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' } } |
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.