Collections

Overview

Collections provide a way to attach data to activities that is shared between these activities and can be updated in a single place. A typical use case is to track the status of an activity such as started, completed, or failed. Instead of having to update multiple activities when the status changes you can create a collection and add it to the activities that needs this data. When the status changes you only need to update the collection.

A collection consists of a name, an id and some data. You can think of the name as a namespace for the collection. A collection reference is a string that looks like <name>:<id> and is the unique identifier for the collection.

Data stored in collections can not be used in custom ranking or aggregation.

The batch endpoints supports up to 100 collections in a single request. Automatic deduplication will be applied, keeping the last occurrence only.

Creating Collections

The example below shows how to create a collection.

var collection = new CollectionRequest
{
    Name = "movies",
    ID = "lord_of_the_rings",
    Custom = new Dictionary<string, object>
    {
        { "title", "Lord of the Rings" },
        { "genre", "fantasy" },
        { "rating", 9 }
    }
};

var response = await _feedsV3Client.CreateCollectionsAsync(
    new CreateCollectionsRequest { Collections = new List<CollectionRequest> { collection } }
);

Overview of the collection model

CollectionResponse

NameTypeDescriptionConstraints
created_atnumberWhen the collection was created-
customobjectCustom data for the collection-
idstringUnique identifier for the collection within its nameRequired
namestringName/type of the collectionRequired
updated_atnumberWhen the collection was last updated-
user_idstringID of the user who owns this collection-

Updating Collections

The example below shows how to update a collection.

var collection = new CollectionRequest
{
    Name = "movies",
    ID = "lord_of_the_rings",
    Custom = new Dictionary<string, object>
    {
        { "title", "Lord of the Rings" },
        { "genre", "fantasy" },
        { "rating", 9.5 }
    }
};

var response = await _feedsV3Client.UpdateCollectionsAsync(
    new UpdateCollectionsRequest { Collections = new List<CollectionRequest> { collection } }
);

Deleting Collections

The example below shows how to delete a collection.

var response = await _feedsV3Client.DeleteCollectionsAsync(
    new DeleteCollectionsRequest { CollectionRefs = new List<string> { "movies:lord_of_the_rings" } }
);

Reading Collections

The example below shows how to read a collection.

var response = await _feedsV3Client.ReadCollectionsAsync(
    new ReadCollectionsRequest { CollectionRefs = new List<string> { "movies:lord_of_the_rings" } }
);

Activities and Enrichment

Collections are added to activities in the form of collection references. An activity can reference up to 10 collections.

Support for adding collections directly when creating activities is coming soon.

Adding Collections to an Activity

var activity = new AddActivityRequest
{
    Type = "post",
    Text = "I love this movie!",
    UserID = "jack",
    Feeds = new List<string> { "user:jack" },
    CollectionRefs = new List<string> { "movies:lord_of_the_rings" }
};
var response = await _feedsV3Client.AddActivityAsync(activity);

Enrichment

When you have added collection references to your activities these will automatically be enriched with the collection data when reading feeds.

// Create a collection
var collection = new CollectionRequest
{
    Name = "movies",
    ID = "lord_of_the_rings",
    Custom = new Dictionary<string, object>
    {
        { "title", "Lord of the Rings" },
        { "genre", "fantasy" },
        { "rating", 9 }
    }
};

await _feedsV3Client.CreateCollectionsAsync(
    new CreateCollectionsRequest { Collections = new List<CollectionRequest> { collection } }
);

// Add the reference to an activity
var activity = new AddActivityRequest
{
    Type = "post",
    Text = "I love this movie!",
    UserID = "jack",
    Feeds = new List<string> { "user:jack" },
    CollectionRefs = new List<string> { "movies:lord_of_the_rings" }
};
await _feedsV3Client.AddActivityAsync(activity);

// Read the feed and see the enriched collection data
var feedResponse = await _feedsV3Client.GetOrCreateFeedAsync(
    FeedGroupID: "user",
    FeedID: "jack",
    request: new GetOrCreateFeedRequest { UserID = "jack" }
);
var activities = feedResponse.Activities;
// The activities will contain enriched collection data in the collections field
// Example response structure:
// {
//     "activities": [
//         {
//             "type": "post",
//             "text": "I love this movie!",
//             "collections": {
//                 "movies:lord_of_the_rings": {
//                     "name": "movies",
//                     "id": "lord_of_the_rings",
//                     "custom": {
//                         "title": "Lord of the Rings",
//                         "genre": "fantasy",
//                         "rating": 9
//                     },
//                     "user_id": "jack",
//                     "created_at": "2025-01-01T00:00:00.000Z",
//                     "updated_at": "2025-01-01T00:00:00.000Z",
//                     "status": "ok"
//                 }
//             }
//         }
//     ],
//     ...
// }

The enrichment is a best effort process. Missing or deleted collections will not be enriched but will be retured with a status of notfound