// Add an activity to 1 feed
let activity = try await feed.addActivity(
request: .init(
text: "hello world",
type: "post"
)
)
// Add an activity to multiple feeds
let multiFeedActivity = try await client.addActivity(
request: .init(
fids: ["user:1", "stock:apple"],
text: "apple stock will go up",
type: "post"
)
)
Activities
Creating Activities
The example below shows how to create an activity and add it to a feed.
// Add an activity to 1 feed
const response = await feed.addActivity({
type: "post",
text: "apple stock will go up",
});
console.log(response.activity);
//...or multiple feeds
const response = await client.addActivity({
fids: ["user:1", "stock:apple"],
type: "post",
text: "apple stock will go up",
});
// Add an activity to 1 feed or multiple feeds
const response = await client.feeds.addActivity({
fids: ["user:1", "stock:apple"],
type: "post",
text: "apple stock will go up",
// Provide user id, the owner of the activity
user_id: "<user id>",
});
console.log(response.activity);
The above example was quite simple. Here are a few more examples:
Image & Video
let imageActivity = try await feed.addActivity(
request: .init(
attachments: [
Attachment(
imageUrl: "https://example.com/image.jpg",
type: "image"
)
],
text: "look at NYC",
type: "post"
)
)
feed.addActivity({
type: "post",
text: "look at NYC",
attachments: [
{
type: "image",
image_url: "https://example.com/image.png",
custom: {},
},
],
});
client.feeds.addActivity({
fids: ["user:1"],
type: "post",
text: "look at NYC",
attachments: [
{
type: "image",
image_url: "https://example.com/image.png",
custom: {},
},
],
// Provide user id, the owner of the activity
user_id: "<user id>",
});
Stories
For a story you typically want multiple attachments and an expiration set:
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: Date())!
let storyActivity = try await feed.addActivity(
request: .init(
attachments: [
Attachment(imageUrl: "https://example.com/image1.jpg", type: "image"),
Attachment(assetUrl: "https://example.com/video1.mp4", type: "video")
],
expiresAt: ISO8601DateFormatter().string(from: tomorrow),
text: "My story",
type: "story"
)
)
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
feed.addActivity({
type: "story",
text: "My story",
expires_at: tomorrow.toISOString(),
attachments: [
{
type: "image",
image_url: "https://example.com/image.png",
custom: {},
},
{
type: "video",
image_url: "https://example.com/video.mp4",
custom: {},
},
],
});
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
client.feeds.addActivity({
fids: ["story:1"],
type: "story",
text: "My story",
expires_at: tomorrow.toISOString(),
attachments: [
{
type: "image",
image_url: "https://example.com/image.png",
custom: {},
},
{
type: "video",
image_url: "https://example.com/video.mp4",
custom: {},
},
],
user_id: "<user id>",
});
Restricted Visibility
let privateActivity = try await feed.addActivity(
request: .init(
text: "Premium content",
type: "post",
visibility: .tag,
visibilityTag: "premium"
)
)
// Only users with the permission to read premium activities can read this
feed.addActivity({
type: "post",
text: "Premium content",
visibility: "tag",
visibility_tag: "premium",
});
// Only users with the permission to read premium activities can read this
client.feeds.addActivity({
fids: ["user:1"],
type: "post",
text: "Premium content",
visibility: "tag",
visibility_tag: "premium",
user_id: "<user id>",
});
// Only users with the permission to read premium activities can read this
Overview of All Activity Fields
Here’s an overview of all the fields you can add when creating an activity:
Field | Description |
---|---|
id | Either set your own id, or let our server generate it. Setting your own ID can be convenient if your activity maps 1 to 1 to something in your database. |
type | The type of activity. Defaults to “post” if not provided. |
fids | The list of feed IDs to add this activity to |
text | The text for this activity |
attachments | A list of attachments. Video, images, location, etc. Also supports custom attachments |
custom | Any custom data you want to add |
visibility | Visibility levels for the activity |
location | Specify an activity location. This allows for feeds to show content close to you. Format: ActivityLocation(lat: 40.014984, lng: -105.270546) |
expiresAt | When the activity expires. After this timestamp it’s only visible to the person who created this activity (or server side API calls) |
mentionedUserIds | A list of users mentioned in this activity |
parentId | The parent activity. Used for replies/reshares etc |
searchData | Any extra data you want to search on for this activity |
filterTags | Array of strings that you can filter on when querying the feed |
interestTags | Either set the interest tags manually or enable an activity processor to have AI determine the topics for this activity. Used for “for you” style feeds |
Adding Many Activities
You can also batch add activities. Here’s an example:
let activities = [
ActivityRequest(
fids: ["user:123"],
id: "1",
text: "hi",
type: "post"
),
ActivityRequest(
fids: ["user:456"],
id: "2",
text: "hi",
type: "post"
)
]
let upsertedActivities = try await client.upsertActivities(activities)
client.upsertActivities({
activities: [
{
fids: ["user:123"],
id: "1",
type: "post",
text: "hi",
},
{
fids: ["user:456"],
id: "2",
type: "post",
text: "hi",
},
],
});
client.feeds.upsertActivities({
activities: [
{
fids: ["user:123"],
id: "1",
type: "post",
text: "hi",
user_id: "<user id>",
},
{
fids: ["user:456"],
id: "2",
type: "post",
text: "hi",
user_id: "<user id>",
},
],
});
Updating & Deleting Activities
This example shows how to update or delete an activity:
// Update an activity
let updatedActivity = try await feed.updateActivity(
id: "123",
request: .init(
custom: ["custom": "custom"],
text: "Updated text"
)
)
// Delete an activity
let hardDelete = false // Soft delete sets deleted at but retains the data, hard delete fully removes it
try await feed.deleteActivity(id: "123", hardDelete: hardDelete)
// Batch delete activities
try await client.removeActivities(
request: .init(
activityIds: ["123", "456"],
hardDelete: false
)
)
// Update an activity
client.updateActivity({
activity_id: "123",
text: "Updated text",
custom: {
color: "blue",
},
});
client.deleteActivity({
activity_id: "123",
hard_delete: false, // Soft delete sets deleted at but retains the data, hard delete fully removes it
});
// Batch delete activities
client.removeActivities({
activity_ids: ["123", "456"],
hard_delete: false,
});
// Update an activity
client.feeds.updateActivity({
activity_id: "123",
text: "Updated text",
custom: {
color: "blue",
},
user_id: "<user id>",
});
client.feeds.deleteActivity({
activity_id: "123",
hard_delete: false, // Soft delete sets deleted at but retains the data, hard delete fully removes it
user_id: "<user id>",
});
// Batch delete activities
client.feeds.removeActivities({
activity_ids: ["123", "456"],
user_id: "<user id>",
hard_delete: false,
});
Activity & Feed Visibility
Feed groups have a default visibility level. You can also set a custom visibility policy on the feed, or even on individual activities.
Feed Visibility Levels
Level | Description |
---|---|
visible | Viewing/following: anyone can see the content in this feed or follow it. Posting: only the owner or member/follower with the post permission can post |
public | Viewing/following: anyone can see the content in this feed. Posting: everyone can post |
followers | Viewing/following: you can only view this feed after you are approved as a follower. Posting: only the owner or member/follower with the post permission can post |
members | Viewing/following: the content is not visible unless you are a member. Posting: only the owner or member/follower with the post permission can post |
private | Only the owner has access |
By default the feed will use the feed group’s default visibility level.
Activity Visibility Levels
public
: marks the activity as publicprivate
: marks the activity as privatetag:mytag
: marks the activity as only visible to followers/members with the permission to see this tag
This visibility system is very flexible and allows you to build:
- Apps like Patreon where only certain levels of users can see your content
- Apps like Strava where it’s possible to share your activity with nobody, everyone or your followers