---
title: "Mention events"
description: "What an instant rule sends for every matching mention."
canonical: https://docs.mentio.dev/webhooks/mention-events
markdown: https://docs.mentio.dev/webhooks/mention-events.mdx
---

# Mention events

What an instant rule sends for every matching mention.

An `instant` rule sends one request per mention that passes its filter, right after the classifier scored it. `data` is the mention exactly as `GET /v1/mentions/{id}` returns it, so everything in the [Mentions reference](/api/mentions/get-mention) applies to the payload.

```json
{
  "id": "dlv_9c1e...",
  "event": "mention.buy_intent",
  "createdAt": "2026-09-03T08:15:04.201Z",
  "alert": { "id": "feed_2b7d...", "name": "Buying signals" },
  "data": {
    "id": "mm_7f3a...",
    "status": "open",
    "relevant": true,
    "delivered": false,
    "priority": 74.2,
    "keyword": {
      "id": "kw_60d9...",
      "term": "your product name",
      "group": { "id": "grp_7f3a...", "name": "Default", "externalId": null, "isDefault": true },
      "matchedAs": "phrase",
      "matchedIn": "text"
    },
    "post": {
      "platform": "reddit",
      "kind": "post",
      "url": "https://www.reddit.com/r/devops/comments/...",
      "title": "Switching monitoring tools, worth it?",
      "text": "Switching monitoring tools, worth it?\n\nWe're evaluating your product name vs the incumbent for our team, anyone switched recently?",
      "imageUrl": null,
      "subreddit": "devops",
      "flair": "Discussion",
      "repository": null,
      "links": [],
      "engagement": { "likes": 42, "reposts": null, "replies": 17, "quotes": null, "views": null, "bookmarks": null },
      "publishedAt": "2026-09-03T08:12:44.000Z",
      "replyTo": null
    },
    "author": {
      "id": "aut_1c2d...",
      "name": "ops_lead",
      "handle": "u/ops_lead",
      "url": "https://www.reddit.com/user/ops_lead",
      "avatarUrl": null,
      "followers": 1240,
      "tags": ["prospect"]
    },
    "classification": {
      "relevance": 91,
      "sentiment": "neutral",
      "intents": ["buy_intent", "question"],
      "automated": false,
      "language": "en",
      "confidence": 0.82,
      "uncertain": false,
      "note": "Team lead comparing the product against an incumbent before switching.",
      "failed": false,
      "feedback": null
    },
    "review": null,
    "triage": { "assignee": null, "snoozedUntil": null, "note": null },
    "duplicateOf": null,
    "duplicates": [],
    "createdAt": "2026-09-03T08:15:02.113Z"
  }
}
```

## What to expect

* **Relevant mentions by default, every match on request.** A rule without `minRelevance` sends mentions scored 40 and up, so `data.relevant` is `true`. A rule with `minRelevance` under 40 (`0` for everything) also receives the matches the classifier scored as noise, with `data.relevant` `false` and the score in `data.classification.relevance`, which is how a reseller shows its customers every billed match. Email channels keep the 40 line whatever the rule says. `data.classification` is never `null` in a mention event.
* **`data.delivered` describes the moment the payload was built**, before this request was sent, so it is usually `false` in the payload itself.
* **`data.id` is the mention id** (`mm_...`). Use it to `PATCH /v1/mentions/{id}` from your own tooling: set `status` to `done` once handled, or `assigneeId` to route it.
* **One post, several keywords, several events.** A post matching two of your keywords arrives once per keyword, each with its own `data.id` and `data.keyword`.
* **A cross-post arrives once.** When the same author posts the same text again for the same keyword within three days, only the first sends an event; the copies are listed on it later as `duplicates` when you read the mention ([Cross-posts](/how-it-works#cross-posts)). In the event itself `duplicates` is empty: the copies have not been posted yet.
* **Comments and repositories are mentions too.** `data.post.kind` is `post`, `comment` (a reply or a comment naming your keyword) or `repository` (a [GitHub repository event](/platforms/github#repositories), with the facts in `data.post.repository`).

## Branching on the payload

Everything the rule filtered on is in the body, so one endpoint can serve every rule:

| Route on                  | Field                                                                                           |
| ------------------------- | ----------------------------------------------------------------------------------------------- |
| The rule                  | `event`, `alert.id`                                                                             |
| The keyword               | `data.keyword.term`, `data.keyword.id`                                                          |
| The platform              | `data.post.platform`                                                                            |
| Sentiment, intents, score | `data.classification.sentiment`, `data.classification.intents`, `data.classification.relevance` |
| Who wrote it              | `data.author.followers`, `data.author.tags`                                                     |
| Attention                 | `data.priority`, the same score that sorts the feed by priority                                 |

Retries and signature verification are covered in [Webhooks](/webhooks).
