$response = $feedsClient->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
limit: 10,
filter: (object)['activity_type' => 'post'],
sort: [['field' => 'created_at', 'direction' => -1]]
)
);Search for Activities
The queryActivities endpoint is designed for exploratory search and filtering across all activities. Example use-cases:
- A search bar where users can search by text
- A "My posts" page that shows a user their own posts across all feeds (useful for applications like Reddit, where users post across different communities instead of posting to a single feed like
user:alice)
This endpoint is not a replacement for getOrCreateFeed - signs that you're using queryActivities instead of getOrCreateFeed:
- You're using complicated filter expressions to tailor the search to the specific user
- You're calling
queryActivitiesautomatically any time users open your application
getOrCreateFeed has all the performance optimizations and rate limit settings to support those patterns; it also supports activity filters. Check out the activity selectors guide for more information.
Scope
When called from client-side
queryActivities endpoint searches for activities in public and visible feeds. It also respects activity visibility:
privateactivities are only returned for the activity author- if an activity has
tagvisibilty, and user doesn't have access to the full activity, only a preview is returned (for text based searches the search is performed across the whole activity text, not just the preview)
When called from server-side
queryActivities endpoint searches for activities in all feeds, regardless of visibility. It also respects activity visibility:
privateactivities are not returned, unlessinclude_private_activitiesis set totruesee example below)- activities with
tagvisibility are returned with full content, not just a preview user_idcan be passed to turn a server-side request into a client-side request see example below
Examples
You can query & search activities. Here's an example of how to query activities:
When searching activities, the activity.current_feed field contains information about the feed the activity belongs to. However, if an activity is posted to multiple feeds, this field will be empty. In this case, you can use the activity.feeds array to read all feed IDs the activity was posted to and fetch feeds separately if needed.
Search filter syntax emulates a MongoDB style query syntax. (It emulates it, we don't use MongoDB, but the query syntax is nice here).
Querying activities by text
// search for activities where the text includes the word 'popularity'.
$response = $feedsClient->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
filter: (object)[
'text' => (object)[
'$q' => 'popularity'
]
]
)
);Querying activities by search data
Consider this example activity:
{
"id": "activity-123",
"type": "post",
"text": "Check out our spring sale!",
"search_data": {
"campaign": {
"id": "spring-sale-2025",
"location": {
"mall": "yorkdale",
"city": "toronto",
"country": "canada"
}
}
}
// ... other activity fields
}You can search this activity using the search_data field in several ways:
// search for activities associated with the campaign ID 'spring-sale-2025'
$response = $feedsClient->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
filter: (object)[
'search_data' => (object)[
'$contains' => (object)[
'campaign' => (object)[
'id' => 'spring-sale-2025'
]
]
]
]
)
);
// search for activities where the campaign took place in a mall
$response2 = $feedsClient->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
filter: (object)[
'search_data' => (object)[
'$path_exists' => 'campaign.location.mall'
]
]
)
);Querying private activities
For server-side requests, you can set include_private_activities to true to include private activities in the results (the default is false).
$response = $feedsClient->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
include_private_activities: true,
filter: (object)[
// your filter here
]
)
);user_id for server-side requests
For server-side requests, you can provide a user_id to perform the search as if it were made by that specific user. It turns the server-side request into a client-side request.
$response = $feedsClient->queryActivities(
new GeneratedModels\QueryActivitiesRequest(
user_id: 'john',
filter: (object)[
// your filter here
]
)
);Activities Queryable Built-In Fields
| name | type | description | supported operations | example |
|---|---|---|---|---|
id | string or list of strings | The ID of the activity | $in, $eq | { id: { $in: [ 'abc', 'xyz' ] } } |
activity_type | string or list of strings | The type of the activity | $in, $eq | { activity_type: { $in: [ 'abc', 'xyz' ] } } |
user_id | string or list of strings | The ID of the user who created the activity | $in, $eq | { user_id: { $in: [ 'abc', 'xyz' ] } } |
text | string | The text content of the activity | $eq, $q, $autocomplete | { text: { $q: 'popularity' } } |
search_data | object | The extra metadata for search indexing | $contains, $path_exists | { search_data: { $contains: { 'category': 'sports', 'status': 'active' } } } |
interest_tags | list of strings | Tags for user interests | $eq, $contains | { interest_tags: { $in: [ 'sports', 'music' ] } } |
filter_tags | list of strings | Tags for filtering | $eq, $contains, $in | { filter_tags: { $in: [ 'categoryA', 'categoryB' ] } } |
created_at | string, must be formatted as an RFC3339 timestamp | The time the activity was created | $eq, $gt, $lt, $gte, $lte | { created_at: { $gte: '2023-12-04T09:30:20.45Z' } } |
popularity | number | The popularity score of the activity | $eq, $ne, $gt, $lt, $gte, $lte | { popularity: { $gte: 70 } } |
near | object | GEO point and a distance (in km) to search for activities within | $eq | { near: { $eq: { lat: 40.0, lng: -74.0, distance: 200 } } } |
within_bounds | object | GEO bounds to search for activities within | $eq | { within_bounds: { $eq: { ne_lat: 40.0, ne_lng: -115.0, sw_lat: 32.0, sw_lng: -125.0 } } } |
hidden | bool | true if an activity was hidden by the user. Hidden activities are excluded unless specified with filter | $eq | { hidden: { $eq: true } |
custom.<key> | string, number, boolean, or JSON (as stored) | Values from the activity custom object. Enterprise only. | $eq, $gt, $gte, $lt, $lte, $in, $exists, $contains | { 'custom.score': { $gte: 8 } } |
The filter syntax also supports $or and $and:
$filter = (object)['and' => [
'filter_tags' => ['green'],
'filter_tags' => ['orange'],
]]Be sure to reach out to support if you need additional query activity capabilities.
Activities sort options
Fields:
created_atpopularity
Direction: 1 or -1