---
title: "Views"
description: "Save a mention filter under a name. Switch to it in the dashboard, read it with viewId, or export it as CSV or JSON."
canonical: https://docs.rumoro.dev/guides/views
markdown: https://docs.rumoro.dev/guides/views.mdx
---

# Views

Save a mention filter under a name. Switch to it in the dashboard, read it with viewId, or export it as CSV or JSON.

A view is a saved filter for your mentions with a name, such as "Negative about us" or "Questions from big accounts". Switch between views on the Mentions page, or send a view's id as `viewId` to the API. Views don't store mentions. A view shows whatever matches its filter at the moment you open it.

## The filter

A view's `filter` takes the same fields as `GET /v1/mentions`.

- `keywordIds`, `keywordKinds` (`brand`, `competitor`, `topic`) and `groupIds` ([groups](/guides/groups))
- `platforms`, `languages`, `linkHosts`, `ratings` and `isReply`
- `relevant`, `minRelevance`, `minConfidence`, `sentiments`, `intents` and `automated`
- `minFollowers`, `maxFollowers`, `tags` and `excludeAuthors`
- `minLikes`, `minReposts`, `minReplies`, `minQuotes`, `minViews` and `minBookmarks`
- `status`, and `q`, which searches the post text, title, matched term and author handle

A list matches any of its values. The `not` lists, such as `notPlatforms`, `notGroupIds`, `notIntents` or `notTags`, exclude all of theirs. All conditions must hold, and an empty filter matches every mention. To combine conditions with OR, use `anyOf` with 1 to 10 groups ([Conventions](/conventions#or-across-groups-anyof)). A view has no time window, and no person, assignee or snooze setting.

`name` is 1 to 80 characters and unique, ignoring case (`409 duplicate_view`). `description` can be up to 500 characters.

```ts tab="TypeScript"
const { data: view } = await rumoro.createView({
  body: {
    name: 'Questions from big accounts',
    description: 'Reply within the hour.',
    filter: { intents: ['question'], minFollowers: 1000, status: 'open' },
  },
});
```

```python tab="Python"
view = rumoro.views.create(
    name="Questions from big accounts",
    description="Reply within the hour.",
    filter={"intents": ["question"], "minFollowers": 1000, "status": "open"},
)
```

```bash tab="curl"
curl -X POST https://api.rumoro.dev/v1/views \
  -H "Authorization: Bearer $RUMORO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Questions from big accounts",
    "description": "Reply within the hour.",
    "filter": { "intents": ["question"], "minFollowers": 1000, "status": "open" }
  }'
```

## Reading a view

`viewId` works together with all other parameters, so adding `since` gives you one period. It also works on `export.csv` and `export.json`. An unknown id returns 404.

```ts tab="TypeScript"
const { data: page } = await rumoro.searchMentions({ query: { viewId: 'vw_...', since: '2026-10-01T00:00:00Z' } });
```

```python tab="Python"
page = rumoro.mentions.search(view_id="vw_...", since="2026-10-01T00:00:00Z")
```

```bash tab="curl"
curl "https://api.rumoro.dev/v1/mentions?viewId=vw_...&since=2026-10-01T00:00:00Z" \
  -H "Authorization: Bearer $RUMORO_API_KEY"
```

## On the Mentions page

The view switcher is the first control in the toolbar, and filter chips narrow the view you're on. **Create view** appears once you've set a filter or search. **Edit** opens a view with its own filter chips, and **Manage views** lets you edit or delete any view. `anyOf` groups set through the API stay when you edit in the dashboard.

## Views and alerts

A view is for reading, an alert is for being notified. You can read an alert rule's filter the same way with `alertId`. To turn a view into an alert, send its filter to `POST /v1/alerts`. A field that alerts don't support returns 400.
