// timeline:timeline_feed_1 follows user:user_42
var timelineFeed1 = client.Feed("timeline", "timeline_feed_1");
await timelineFeed1.FollowFeedAsync("user", "user_42");
// follow feed without copying the activities:
await timelineFeed1.FollowFeedAsync("user", "user_42", 0);Following Feeds
Following relationships are a fundamental part of social networks and many other apps that feature feeds. They link one Feed to another and cause Activities added to a feed to appear in any other feeds that follow it.
When an Activity is added to a feed, it is automatically added to any other feeds that follow the feed. This does not propagate further through the graph of following relationships. If your app requires that the Activity be added to other feeds, "to" field targeting or a batch activity add may be suitable.
The code example below shows you how to follow a feed:
// timeline:timeline_feed_1 follows user:user_42
userFeed, err := client.FlatFeed("user", "user_42")
if err != nil {
panic(err)
}
timeline, err := client.FlatFeed("timeline", "timeline_feed_1")
if err != nil {
panic(err)
}
_, err = timeline.Follow(context.TODO(), userFeed)
if err != nil {
panic(err)
}
// follow feed without copying all the activities:
_, err = timeline.Follow(context.TODO(), userFeed, stream.WithFollowFeedActivityCopyLimit(20))
if err != nil {
panic(err)
}Also take note that:
Only Flat Feeds may be followed
A Feed cannot follow itself
By default, the most recent 100 existing activities in the target feed will be added to the follower feed, but this can be changed via the activity_copy_limit parameter.
Parameters
| name | type | description | default | optional |
|---|---|---|---|---|
| feed | string | The feed id | - | |
| target | string | The feed id of the target feed | - | |
| activity_copy_limit | int | How many activities should be copied from the target feed. max 1000 | - | ✓ |
If you need to follow many feeds at once have a look at how to batch follow later in this document. If you need to run large imports, use our JSON import format.
Unfollowing Feeds
Unfollowing a feed removes the following relationship with the feed specified in the target parameter. See the following examples:
// Stop following feed user:user_42
_, err = timeline.Unfollow(context.TODO(), userFeed)
if err != nil {
panic(err)
}
// Stop following feed user:42 but keep history of activities
_, err = timeline.Unfollow(context.TODO(), userFeed, stream.WithUnfollowKeepHistory(true))
if err != nil {
panic(err)
}Existing Activities in the feed that originated in a no longer followed target feed will be purged unless the keep_history parameter is provided.
Parameters
| name | type | description | default | optional |
|---|---|---|---|---|
| feed | string | The feed id | - | |
| target | string | The feed id of the target feed | - | |
| keep_history | boolean | Whether the activities from the unfollowed feeds should be removed | false | ✓ |
Re-following a feed that is already followed has no effect. However, unfollowing and re-following a feed will result in feed updates as Activities are purged and re-added to the feed.
Reading Feed Followers
Returns a paginated list of the given feed's followers. See the following example:
resp, err := userFeed.GetFollowers(
context.TODO(),
stream.WithFollowersOffset(0),
stream.WithFollowersLimit(10),
)
for _, follower := range resp.Results {
fmt.Println(follower.FeedID, "-->", follower.TargetID)
// ...
}The followers returned by the API are sorted reverse chronologically, according to the time the follow relationship was created.
The number of followers that can be retrieved is limited to 1,000.
Parameters
| name | type | description | default | optional |
|---|---|---|---|---|
| limit | integer | Amount of results per request, max 100 | 25 | ✓ |
| offset | integer | Number of rows to skip before returning results, max 999 | 0 | ✓ |
Response Data
{
"results": [
{
"feed_id": "conversation2:test",
"target_id": "conversation2:user_2",
"created_at": "2018-01-19T09:35:17.817332Z"
}
],
"duration": "1.92ms"
}Reading Followed Feeds
Returns a paginated list of the feeds which are followed by the feed. See the following example:
// Retrieve last 10 feeds followed by user_42
resp, err := userFeed.GetFollowing(
context.TODO(),
stream.WithFollowingOffset(0),
stream.WithFollowingLimit(10),
)
if err != nil {
panic(err)
}
for _, r := range resp.Results {
fmt.Println(r)
//...
}
// Retrieve 10 feeds followed by user_42 starting from the 11th
resp, err = userFeed.GetFollowing(
context.TODO(),
stream.WithFollowingOffset(10),
stream.WithFollowingLimit(10),
)
if err != nil {
panic(err)
}
// Check if user_42 follows specific feeds
resp, err = userFeed.GetFollowing(
context.TODO(),
stream.WithFollowingOffset(0),
stream.WithFollowingLimit(2),
stream.WithFollowingFilter("user:user_43", "user:user_44"),
)
if err != nil {
panic(err)
}The followed feeds returned by the API are sorted reverse chronologically, according to the time the follow relationship was created.
The number of followed feeds that can be retrieved is limited to 1,000.
Parameters
| name | type | description | default | optional |
|---|---|---|---|---|
| limit | integer | Amount of results per request, max 100 | 25 | ✓ |
| offset | integer | Number of rows to skip before returning results, max 999 | 0 | ✓ |
| filter | string | The comma-separated list of feeds to filter results on | - | ✓ |
Response Data
{
"results": [
{
"feed_id": "conversation2:test",
"target_id": "conversation2:user_2",
"created_at": "2018-01-19T09:35:17.817332Z",
"updated_at": null
}
],
"duration": "1.92ms"
}Reading follow stats
Paginating followers and/or followings is sometimes not the answer and only counts are needed. In this case, stats can be retrieved directly too. With default permissions, it works automatically for server side auth. For client-side auth, please contact support to add it to your required feed groups.
Counts are up to 10K. If a feed has more followers or followings than this number, please contact support to increase limits.
// get follower and following stats of the feed
client.feed("user", "me").followStats();
// get follower and following stats of the feed but also filter with given slugs
// count by how many timelines follow me
// count by how many markets are followed
client.feed.followStats({
followerSlugs: ["timeline"],
followingSlugs: ["market"],
});Response Data
{
"results": {
"followers": { "count": 1529, "feed": "user:me" },
"following": { "count": 81, "feed": "user:me" }
},
"duration": "1.92ms"
}