---
title: Feeds
slug: cms-12/api/activity-streams-feeds
docTags: 
createdAt: 2026-08-07T16:45:43.000Z
---

A feed represents a record of the activities occurring within the application. As an activity is added to the system, the platform generates feed items for users subscribed to the entity upon which the activity occurred.

In the Optimizely Community API, feed items can be managed through a service implementing the interface `IFeedService`. This service provides the ability to retrieve feed items generated by the Activity Streams system.

## Manage feeds

In the Optimizely Community API, feed items are retrieved through a service implementing the interface `IFeedService`.

### Access an IFeedService

When the Activity Streams feature is installed on an Optimizely Content Management System (CMS) site, with the feature's site integration package, you can get an instance of the Feed service from the inversion of control (IoC) container.

Example:

```csharp
var feedService = ServiceLocator.Current.GetInstance<IFeedService>();
```

When the feature is installed on a non-Optimizely CMS site, you can get an instance of a service from the default factory class provided within the package.

Example:

```csharp
var factory = new EPiServer.Social.ActivityStreams.DefaultActivityStreamsFactory();
var feedService = factory.CreateFeedService();
```

## Retrieve feed items

To retrieve a collection of feed items, regardless of the type of payload extending the activity, use the `Get(Criteria<FeedItemFilter>)` method. This method accepts an instance of `Criteria<FeedItemFilter>`, which contains the specifications necessary to retrieve the desired feed items.

The Filter property of the `Criteria<FeedItemFilter>` class accepts an instance of the `FeedItemFilter` class. This class contains the specifications that let you refine the result set of `FeedItems` that you want to retrieve.

- `Actor` – Assigning a value (`Reference`) to this property refines the result set to FeedItems representing activities initiated by the identified user.
- `Subscriber`– Assigning a value (`Reference`) to this property refines the result set to FeedItems representing activities on targets to which the identified user is subscribed.
- `Target`– Assigning a value (`Reference`) to this property refines the result set to `FeedItems` representing activities targeting the identified entity.

You can apply the specifications of the `FeedItemFilter` in conjunction with one another. Each specification, assigned a value in the filter, further refines the result set (a logical AND). In the following example, a page of `FeedItems` is retrieved for a particular subscriber.

```csharp
IFeedService feedService;
// ...

var subscriber = Reference.Create("user://identifier/for/a/user");
var criteria = new Criteria<FeedItemFilter> {
  Filter = new FeedItemFilter() {
    Subscriber = subscriber
  }
};
var pageOfFeedItems = feedService.Get(criteria);
```

The previous example invokes the request to retrieve feed items synchronously. An example of retrieving feed items asynchronously using the asynchronous overload with C#'s async and await keywords is described below.

```csharp
private async Task<ResultPage<FeedItem>> GetFeedItemsAsync(IFeedService feedService) {
  // ...

  var subscriber = Reference.Create("user://identifier/for/a/user");
  var criteria = new Criteria<FeedItemFilter> {
    Filter = new FeedItemFilter() {
      Subscriber = subscriber
    }
  };
  var getFeedItemsTask = feedService.GetAsync(criteria);

  //Do other application specific work in parallel while the task executes.
  //....

  //Wait until the task runs to completion.
  var pageOfFeedItems = await getFeedItemsTask;
  return pageOfFeedItems;
}
```

The `FeedItemSortFields` class exposes a set of fields upon which a result set of feed items may be ordered. These fields may be applied when constructing sorting rules you associate with your criteria. These fields include

- `FeedItemSortFields.ActivityId`
- `FeedItemSortFields.ActivityDate`
- `FeedItemSortFields.Actor`
- `FeedItemSortFields.Target`

The following example demonstrates how to apply sorting rules to order your result set by `Target` reference, alphabetically in ascending order. A fallback rule, subsequently ordering results with the same Target reference according to when the activity occurred from newest to oldest, is also added.

```csharp
var criteria = new Criteria<FeedItemFilter> {
  // ...

  OrderBy = new List<SortInfo> {
    new SortInfo(FeedItemSortFields.Target, true),
    new SortInfo(FeedItemSortFields.ActivityDate, false),
  }
};
```

For details regarding criteria use, including information on paging and sorting, see *Criteria* in [Discover the platform](docId\:NKmGS-fLtRQIYLEWZfb69).

### Retrieve composite feed items

To retrieve a collection of FeedItems with their accompanying extension data, use the `Get<TExtension>(CompositeCriteria\<FeedItemFilter,TExtension>)` method. This method accepts an instance of `CompositeCriteria\<FeedItemFilter,TExtension>`, which contains the specifications necessary to retrieve the desired`FeedItems`.

The Filter property of the `CompositeCriteria\<FeedItemFilter,TExtension>` class accepts an instance of the `FeedItemFilter` class. This class contains the specifications that let you refine the result set of `FeedItems` that you want to retrieve.

The `ExtensionFilter` property of the `CompositeCriteria\<FeedItemFilter,TExtension>` class accepts a `FilterExpression`, which lets you specify a Boolean expression to refine the result set further by values represented within your extension data. For information on this type of filter, see *Composite Criteria* and *Filtering Composistes* in [Discover the platform](docId\:NKmGS-fLtRQIYLEWZfb69).

In the following example, a page of `FeedItems` composed with the `PageRated` (a sample class used in earlier examples) is retrieved. The criteria combine a filter native to the`IFeedService` with a custom one targeting a field the `PageRated` extension data.

More specifically, this sample demonstrates the retrieval of feed items targeting a specific resource (a page, product, and so on), upon which a `PageRated` activity has occurred where a rating of 5 was assigned.

```csharp
IFeedService feedService;
// ...

var criteria = new CompositeCriteria<FeedItemFilter, PageRated> {
    Filter = new FeedItemFilter {
      Target = Reference.Create("resource://identifier/for/a/resource")
    },
    ExtensionFilter = FilterExpressionBuilder<PageRated> .Field(pr => pr.Rating).EqualTo(5)
  };
var feedPage = feedService.Get<PageRated>(criteria);
```

The previous example invokes the request to retrieve feed items synchronously. An example of retrieving feed items asynchronously using the asynchronous overload with C#'s async and await keywords is described below.

```csharp
private async Task<ResultPage<Composite<FeedItem, PageRated>>> GetFeedItemsAsync(IFeedService feedService) {
  // ...

  var criteria = new CompositeCriteria<FeedItemFilter, PageRated> {
      Filter = new FeedItemFilter {
        Target = Reference.Create("resource://identifier/for/a/resource")
      },
      ExtensionFilter = FilterExpressionBuilder<PageRated> .Field(pr => pr.Rating).EqualTo(5)
    };
  var feedItemsTask = feedService.GetAsync(criteria);

  //Do other application specific work in parallel while the task executes.
  //....

  //Wait until the task runs to completion.
  var feedItemsPage = await feedItemsTask;
  return feedItemsPage;
}
```

The fields of your activity's extension data may also be applied to sort your result set. The example below demonstrates the use of an extension data field in defining a sorting rule.

```csharp
var criteria = new CompositeCriteria<FeedItemFilter,
  PageRated> {
    // ...

    OrderBy = new List<SortInfo> {
      new SortInfo(new SortField(FilterExpressionBuilder<PageRated> .Field(payload => payload.Rating)), true),
      new SortInfo(FeedItemSortFields.ActivityDate, false),
    }
  };
```

For details regarding criteria use, including information on paging and sorting, see *Criteria* in [Discover the platform](docId\:NKmGS-fLtRQIYLEWZfb69).
