# 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`)

<Admonition type="info">

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 `queryActivities` automatically 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](https://getstream.io/activity-feeds/docs/javascript/activity-selectors/) for more information.

</Admonition>

## Scope

### When called from client-side

`queryActivities` endpoint searches for activities in `public` and `visible` feeds. It also respects activity visibility:

- `private` activities are only returned for the activity author
- if an activity has `tag` visibilty, 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:

- `private` activities are not returned, unless `include_private_activities` is set to `true` [see example below](#querying-private-activities))
- activities with `tag` visibility are returned with full content, not just a preview
- `user_id` can be passed to turn a server-side request into a client-side request [see example below](#user_id-for-server-side-requests)

## Examples

You can query & search activities. Here's an example of how to query activities:

```js label="JavaScript"
client.queryActivities({
  filter: {
    activity_type: "post",
  },
  sort: [{ field: "created_at", direction: -1 }],
  limit: 10,
});
```

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](https://getstream.io/docs/platform/query-syntax-operators/). (It emulates it, we don't use MongoDB, but the query syntax is nice here).

### Querying activities by text

```js label="JavaScript"
client.queryActivities({
  filter: {
    text: {
      $q: "popularity",
    },
  },
});
```

### Querying activities by search data

Consider this example activity:

```json
{
  "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:

```js label="JavaScript"
client.queryActivities({
  filter: {
    search_data: { $contains: { campaign: { id: "spring-sale-2025" } } },
  },
});

client.queryActivities({
  filter: {
    search_data: { $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`).

```js label="Node.js"
const response = await client.feeds.queryActivities({
  include_private_activities: true,
  filter: {
    // 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.

```js label="Node.js"
const response = await client.feeds.queryActivities({
  user_id: "john",
  filter: {
    // 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`:

```js label="JavaScript"
// Get all the activities where filter tags contain both "green" and "orange"
const filter = {
  $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_at`
- `popularity`

Direction: `1` or `-1`


---

This page was last updated at 2026-08-11T08:51:11.111Z.

For the most recent version of this documentation, visit [https://getstream.io/activity-feeds/docs/javascript/query-activities/](https://getstream.io/activity-feeds/docs/javascript/query-activities/).