---
title: "How it works"
description: "How Rumoro collects posts, how often it checks each platform, which rules filter them, and what happens to a mention."
canonical: https://docs.rumoro.dev/how-it-works
markdown: https://docs.rumoro.dev/how-it-works.mdx
---

# How it works

How Rumoro collects posts, how often it checks each platform, which rules filter them, and what happens to a mention.

## From post to mention

Rumoro checks each platform on its own schedule. Every post is brought into one common shape, compared with the keywords of every workspace, scored by a language model, and sent on by your alert rules.

Workspaces share the collection. If two workspaces track the same term, Rumoro asks the platform once and stores the post once, then matches it for both. Hacker News is the exception, because it is searched for each keyword every 5 minutes. Your feed shows the part of this collection that matches your keywords.

## How often platforms are checked

Some platforms are read live (Bluesky), others once a day (reviews). The [Platforms](/platforms) tab lists each one.

On X, LinkedIn, Reddit, TikTok, Instagram and GitHub, a keyword that keeps finding nothing is checked less often. Its next match brings it back to the normal schedule. `polling` on a keyword shows when each platform was last checked and how many checks in a row found nothing.

A new keyword starts with the 10 newest matching posts from the last 30 days on each platform that supports it (10 days on Instagram). After that it only gets new posts. If you add a platform to an existing keyword, that platform starts from that moment, without a look-back. Look-back mentions are billed. They appear in the feed and in digests, but not in instant alerts.

## Matching rules

A term matches as a phrase, ignoring case. Two sets of rules remove posts before they are stored. A post they remove is never scored or billed, which is what makes them different from an alert's filter.

| Level | Where | Rules |
| --- | --- | --- |
| Keyword | `matching` on [`POST`](/api/keywords/create-keyword) and [`PATCH /v1/keywords/{id}`](/api/keywords/update-keyword) | `requiredTerms`, with `requiredMode` set to `any` or `all`. `excludedTerms`, where `*` at the start or end is a wildcard (`promo*`). `excludedAuthors`, written like an alert's mute list. `caseSensitive`, for acronyms such as `RAG` that shouldn't match `rag`. |
| Workspace | [`GET`](/api/filters/get-filters) and [`PATCH /v1/filters`](/api/filters/update-filters) | `excludedTerms` and `excludedAuthors` for all keywords, `excludedRepos` for GitHub repositories (`owner/name`), and `subreddits.only` or `subreddits.excluded`. |

A keyword can also have a `context` sentence that helps the classifier with that term, for example "Mercury is our banking app, not the planet or the metal." It changes the score, not what is stored. Changed rules apply from the next check. Mentions you already have stay.

## Mention status

A mention's state is in four fields.

| Field | Values | Meaning |
| --- | --- | --- |
| `status` | `open`, `ignored`, `done` | Your triage, set with [`PATCH /v1/mentions/{id}`](/api/mentions/update-mention). New mentions are `open`. |
| `relevant` | `true`, `false` | Relevance is 40 or higher. Stays `false` until the mention is scored. |
| `delivered` | `true`, `false` | At least one alert channel received it. |
| `classification` | object or `null` | `null` until scored. `failed: true` when scoring failed. |

All matches stay searchable. Noise (`relevant: false`) is only sent when a rule's `minRelevance` is below 40, and `GET /v1/mentions?relevant=false` lists it. Mentions marked ignored or done are not sent in new alerts.

## Scores

The classifier reads your [company profile](/api/company/get-company), or the description of the keyword's [group](/guides/groups) if it has one, and fills in `classification`.

| Field | Values |
| --- | --- |
| `relevance` | 0 to 100 |
| `sentiment` | `positive`, `neutral`, `negative` |
| `intents` | `buy_intent`, `question`, `complaint`, `praise`, `comparison`, `churn_intent`, `bug_report`, `pricing`, `hiring`, `event`, `promotional`, `testimonial` (someone recommends it from experience), `industry_insight` (facts or trends about the market), `launch` (something new is announced), `feedback` (an idea or a request) |
| `automated` | `true` for bots, templates and generated digests |
| `language` | An ISO 639-1 code such as `en` or `es`, or `null` |
| `confidence` | How sure the relevance score is, from 0 to 1, or `null` |
| `uncertain` | `true` when confidence is below 0.4 or the model that wrote the note disagreed with the score. It marks the mention but filters nothing. |
| `note` | Why the mention matters, in up to 200 characters |
| `failed` | `true` when scoring failed. Failed mentions are never billed. |
| `feedback` | Your verdict, if you gave one, and the values it replaced |

### Your verdict

Correct a score with [`PATCH /v1/mentions/{id}`](/api/mentions/update-mention).

- `relevant: false` marks a mention as noise. Its relevance becomes 0, and it drops out of the relevant feed, digests, counts and analytics.
- `relevant: true` rescues a mention the classifier missed and sets its relevance to 100.
- `sentiment` fixes the sentiment label.
- `null` undoes your verdict and restores the classifier's values from `classification.feedback`.

Verdicts don't change what you pay. Each keyword counts them in `stats.feedback`. A mention that isn't scored yet returns `409 classification_pending`.

<Callout title="Your company profile matters most">
  Good scores need good context. Use `PATCH /v1/company` to describe your company, its use cases, its competitors and what counts as relevant to you. A keyword's `context` adds detail for one term.
</Callout>

## Author data

Each mention keeps the public post and its author's public name, handle, picture and follower count. On some platforms Rumoro also reads public profile details such as bio, company, location, website and linked accounts. It keeps an email only when the person published one there. Every workspace that matched the person shares these details.

Rumoro relies on legitimate interests (GDPR Art. 6(1)(f)) to process this data. Your workspace's notes, tags and outreach about a person belong to you, and you are their controller. The [MCP tools](/mcp) never return an email address, so `profile.email` is always `null` there. The REST API and the dashboard show it where the person published it.

Anyone can ask to have their accounts removed at [rumoro.dev/privacy/remove](https://rumoro.dev/privacy/remove). We finish each request within 30 days. Their mentions then leave every workspace, with the notes, tags and outreach attached to them, and Rumoro stops storing their new posts. Charges for those mentions stay in your usage and ledger.
