# Brand Mention Monitor: News, Reddit, YouTube & Hacker News (`zaiq/brand-mention-monitor`) Actor

Find public brand mentions across news, Reddit search results, YouTube, Hacker News, blogs, forums and reviews. Get new-only monitoring, sentiment cues, relevance reasons, competitor share of voice and a client HTML report. Pay for delivered mentions.

- **URL**: https://apify.com/zaiq/brand-mention-monitor.md
- **Developed by:** [Zaiq](https://apify.com/zaiq) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 mentions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Brand Mention Monitor: new mentions, sentiment and a client report

See **who is talking about your brand** across news, Reddit search results, YouTube, Hacker News, blogs and forums. Each delivered mention starts with a short verdict, then the source link, visible text, sentiment cues and a reason it matched.

Prices are **$0.003 per Hacker News mention**, **$0.005 per YouTube mention**, and **$0.025 per mention from Google’s news or web index**, including indexed Reddit threads. Duplicates, excluded results and failed lookups have no mention charge.

For the quickest first run, use the prefilled generic topic **open source**, Hacker News and 10 mentions. Then replace the topic with your brand, select the sources you need, and add a monitoring store to receive only newly discovered mentions on later runs.

### What you get

| Field | What it holds |
|---|---|
| Verdict first | `verdict`: tone, source, a short excerpt and the date shown. |
| Brand and relevance | `brandMatched`, `brandsMatched`, `matchedTerms`, `relevanceScore` and `relevanceWhy`. Context words must all occur; excluded words must not. |
| Source evidence | `url`, `title`, `snippet` or `text`, `publisher`, `subreddit`, `channel`, `evidenceType` and `discoveredVia`. Google rows are indexed excerpts. |
| Dates | `publishedAt`, `publishedAtRaw`, `datePrecision`, `publishedAtIsEstimated` and `dateBasis`. Missing dates stay unknown. |
| Sentiment | `sentiment` (positive, neutral or negative), `sentimentScore` (-1 to 1), `sentimentCues`, `sentimentText` and `sentimentMethod`. English cue rules handle nearby negation. |
| Public counts | YouTube `views` and Hacker News `points` and `comments`. No audience estimate is invented. |
| Monitoring | `firstSeenAt`, `isNew`, stable IDs and optional suppression of previously delivered mentions. |
| Deduplication | One row for the same canonical URL. Matching long news headlines plus overlapping text identify likely syndicated copies; `alsoPublishedAt` preserves other links. |
| Client report | A standalone `REPORT.html`: new negative mentions first, mentions by source/day, sentiment split, sampled share of voice, top publishers/subreddits and the most-viewed videos. |
| Run summary | `SUMMARY`: source coverage, filtering counts, errors, route changes, spending-limit status and delivered charges. |

### What people use it for

- **Daily brand monitoring:** Find new public discussions and complaints before a weekly review.
- **Agency reporting:** Open or share the standalone report for one brand and its selected competitors.
- **Launch feedback:** Follow new videos, discussions and articles within a recent time window.
- **Competitor comparison:** Search each competitor under the same settings and compare its share of the retrieved sample.

### How to use it

1. Enter the primary brand under **Brand terms**. Add alternative spellings there; add distinct rivals under **Competitor brands**.
2. Choose **Sources**, a time window and a maximum number of delivered mentions. Add your own domains to keep your site out of the results.
3. For a common word used as a brand, add **Required context** or **Exclude words**. Matching uses visible text, not a brand name found only inside a URL.
4. Set **Monitoring store** to a stable project name for repeat runs. Keep **Only new mentions** on, and schedule one active run at a time for that project.
5. Start the Actor, open the mentions table and **Report (web page)**, and read coverage notes before treating the sample as complete.

### Input

| Field | Example | Notes |
|---|---|---|
| Brand terms | `["Example Brand", "ExampleBrand"]` | Up to five spellings of one primary brand. |
| Required context | `["workspace"]` | Every phrase must appear in visible title/text. Applied equally to competitors. |
| Exclude words | `["recipe"]` | Any matching whole word or phrase rejects the result. |
| Exclude own websites | `["example.com"]` | Excludes your website and subdomains. |
| Competitor brands | `["Example Rival"]` | Up to five separately searched brands. Their results count toward the same maximum. |
| Sources | `["news", "reddit", "web", "youtube", "hackernews"]` | The quick prefill uses Hacker News. Web includes indexed blogs and forums. |
| Time window | `week` | day, week, month or since-last-run. First since-last scan uses seven days; subsequent scans overlap one day, up to 30 days. |
| Country / language | `US` / `en` | Search context, not the writer’s location. English sentiment rules; stars or unclassified tone for other languages. |
| Maximum mentions | `50` | 1–500 delivered mentions in total. New negative mentions are delivered first. |
| Pages per source and brand | `2` | 1–10; stops earlier on exhaustion, repeated continuations or low new-result yield. |
| Include undated | on | An undated Google result is evidence of an indexed match, not proof of a recent publication. |
| Monitoring store | `example-brand-monitor` | Blank means an independent scan. Different matching/source settings create separate histories in the named store. |
| Only new mentions | on | Previously delivered identities are free skips when using the same monitoring scope. |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "verdict": "Negative · Public technology forum · Create a problem… · 2026-10-24T07:06:25Z",
  "brandMatched": "Example Brand",
  "source": "hackernews",
  "url": "https://forum.example.com/item?id=sample-001",
  "title": "Example Brand Security Research Device",
  "snippet": "Create a problem, and then heroically fight to make a solution.",
  "publisher": "Public technology forum",
  "publishedAt": "2026-10-24T07:06:25Z",
  "datePrecision": "second",
  "points": null,
  "comments": null,
  "sentiment": "negative",
  "sentimentScore": -0.333,
  "sentimentCues": [
    {
      "cue": "problem",
      "weight": -1,
      "negated": false,
      "position": 9
    }
  ],
  "relevanceScore": 90,
  "relevanceWhy": [
    "Brand in title",
    "Required context found: Example Phone",
    "No excluded words found"
  ],
  "competitorsMentioned": [],
  "firstSeenAt": "2026-10-26T08:19:58Z",
  "isNew": true
}
```

This example is from a real live run on 26 October 2026. The company, product and publisher names, site address and identifier have been replaced; the excerpt is shortened. Dates, sentiment, cue weights, relevance score and null public-count fields are retained. SUMMARY and REPORT.html are saved in the run’s key-value store. Note rows explain empty, blocked or incomplete searches and are not charged as mentions.

### Pricing

- **$0.003 per Hacker News mention.**
- **$0.005 per YouTube mention.**
- **$0.025 per indexed mention** from news, Reddit or the open web. A usable destination link must be available.
- A mention found through several sources is delivered and charged once. The event follows the retained row’s source.
- No mention charges for excluded words, failed context matches, duplicate URLs, collapsed copies, previously seen results in new-only mode, missing records or access failures.
- Sentiment, SUMMARY and REPORT.html are included. There is no model or separate analysis fee.
- Apify’s **$0.00005 start charge** counts toward the buyer’s **Maximum cost per run**.

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| 10 Hacker News mentions | $0.03005 including the start charge |
| 20 YouTube mentions | $0.10005 including the start charge |
| 25 indexed news/web/Reddit mentions | $0.62505 including the start charge |
| 10 Hacker News + 10 YouTube + 10 indexed mentions | $0.33005 including the start charge |

The same price on every Apify plan. Set Maximum cost per run. The Actor checks room before requesting paid source work and before delivery. If an expensive mention no longer fits, cheaper matching mentions can still be delivered. Free notes and the report remain available after the limit.

### Tips

- Start with one primary brand and one or two sources, then broaden the monitor after inspecting its matches.
- Use a product category as required context for a common word. Review rejected examples before making the context stricter.
- Keep your own domains out of web results.
- Use a short window and a stable monitoring store for frequent checks. Read free coverage notes even when some sources delivered rows.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/brand-mention-monitor").call(run_input={"brandTerms": ["Example Brand"], "sources": ["hackernews"], "maxMentions": 10})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

**JavaScript**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/brand-mention-monitor').call({"brandTerms": ["Example Brand"], "sources": ["hackernews"], "maxMentions": 10});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~brand-mention-monitor/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"brandTerms": ["Example Brand"], "sources": ["hackernews"], "maxMentions": 10}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "find new mentions of Example Brand across the selected public sources and summarize negative feedback". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- This is sampled public-web monitoring, not complete access to every mention. Search ranking, indexing lag, source limits, the requested row maximum and outages affect coverage.
- Reddit mentions come from Google’s index: thread link, title, snippet, subreddit and any displayed date. Reddit pages and comments are not fetched. There are no Reddit vote or comment-count estimates.
- Google date filters can reflect updates or indexing rather than initial publication. Date precision and missing-date notes are retained. Opaque result links must resolve before a mention is charged.
- YouTube uses signed-out search listings sorted by upload date. There are no video transcripts, comments, private videos or login-only data. Search views and dates may be rounded.
- English sentiment is deterministic. It can miss sarcasm, implied complaints, mixed views and which brand a sentence criticizes. Neutral can mean no known sentiment cues. For other languages, stars are used when present; otherwise tone is marked unclassified.
- Share of voice is the share of brand appearances in delivered rows, not a whole-web market share. A row naming two brands counts once for each; new-only mode and limits can skew comparisons.
- Use one active run at a time for a monitoring store and scope. Keep the previous run’s dataset until an interrupted run is recovered. A history holds up to 200,000 identities; choose a new store after exporting a full history.
- The Actor stops after two pages without new matches, at 3,000 matching candidates, or when additional Google searches have too little observed yield. Coverage notes explain these stops. Zero-match runs still have Apify’s start charge.
- The since-last-run watermark advances only after a complete, uncapped scan. Limited or interrupted runs keep the previous watermark so a later scan can recover missed results. The scan window is never more than 30 days.

### FAQ

**Do I need accounts or API keys for the monitored sites?**

No. The Actor reads public signed-out sources. It does not log in, solve checks or request a model key.

**Can I monitor an ambiguous name?**

Yes. Require words that identify its product or category, and exclude unwanted meanings. All required phrases must appear, so overly strict settings can remove valid mentions.

**Does the first monitoring run send everything?**

It delivers the matching baseline. Later runs with the same store and scope suppress identities already delivered. Set Only new mentions off to receive matches again with their original first-seen time.

**What is a new mention?**

A canonical URL not delivered before in this monitoring scope, or a copy not matched to a delivered article. An edit or a changed count on an existing URL is not a new mention. Newly indexed older pages may appear later.

**Does the Actor send alerts directly?**

It writes the new-only dataset and report. Connect the completed run to your chosen Apify integration or webhook to deliver notifications. The Actor itself does not send messages.

**Why can a source return no rows?**

There may be no matching public evidence, context may be too strict, or the site may refuse the available routes. SUMMARY and free note rows distinguish those situations.

**How are syndicated copies identified?**

Canonical URLs are always deduplicated. Separate news/web URLs collapse only when long titles closely agree and their snippets overlap. This is deliberately conservative; distinct reporting about the same event remains separate.

**What happens after a restart?**

The Actor loads its saved source-page plan and reconciles stable result IDs in the dataset before delivery. Rows already delivered are skipped without another mention charge.

**Can I share the report?**

Yes. REPORT.html is standalone HTML with no external scripts, fonts or tracking. It contains the delivered sample and coverage notes.

### Related Actors from Zaiq

- [ai-answer-tracker](https://apify.com/zaiq/ai-answer-tracker): brand visibility in AI answers
- [google-news-scraper](https://apify.com/zaiq/google-news-scraper): dedicated news discovery
- [youtube-scraper](https://apify.com/zaiq/youtube-scraper): video search and public metadata
- [trustpilot-reviews-scraper](https://apify.com/zaiq/trustpilot-reviews-scraper): dedicated review extraction

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: brand mention monitor, brand monitoring, social listening, brand sentiment, news monitoring, Reddit brand mentions, competitor share of voice, new mention alerts.

# Actor input Schema

## `brandTerms` (type: `array`):

Primary brand name and up to four alternative spellings. All terms belong to the same primary brand. Empty input uses the generic demonstration query open source.

## `contextWords` (type: `array`):

Every word or phrase must appear in the visible title or text. Use these to disambiguate common brand names. Applied equally to competitors and reviews.

## `negativeWords` (type: `array`):

Reject any mention containing one of these whole words or phrases. Case insensitive.

## `ownDomains` (type: `array`):

Website domains to exclude from results and search queries (your own sites).

## `competitorBrands` (type: `array`):

Up to five competing brands, each searched separately under the same source and context settings. Share of voice describes the retrieved sample.

## `sources` (type: `array`):

News, Reddit and web use Google’s index (web includes blogs and forums). YouTube and Hacker News are read directly. The default is the two direct sources, for a fast first run.

## `timeWindow` (type: `string`):

Publication window where a date is shown. Google’s date filter can reflect indexing dates. Since last run uses the last completed scan with a one-day overlap, limited to 30 days; the first scan uses seven days.

## `country` (type: `string`):

Two-letter country code for Google and YouTube search context. Does not establish where a writer or audience lives.

## `language` (type: `string`):

Search language code, for example en. English sentiment uses deterministic cue words; other languages use review stars or remain neutral and unclassified.

## `maxMentions` (type: `integer`):

Maximum unique mentions delivered across all tracked brands and sources. Competitor mentions count toward this limit.

## `maxPagesPerSource` (type: `integer`):

Maximum pages per source per searched brand group. Stops early when a source ends, repeats or two pages yield no new matches. Lower values bound sparse search costs.

## `includeUndated` (type: `boolean`):

Include undated search results with an explicit unknown-date note. Turn off for a strict published-date window.

## `monitorStoreName` (type: `string`):

Optional stable name for new-only tracking across scheduled runs. Use one active run per store and query scope. Changing matching inputs starts a separate history. Keep this blank for an independent scan.

## `newOnly` (type: `boolean`):

With a monitoring store, suppress mentions delivered by an earlier run. The first run establishes the baseline and delivers its matches. Without a store, all matches are new to this run.

## Actor input object example

```json
{
  "brandTerms": [
    "open source"
  ],
  "contextWords": [],
  "negativeWords": [],
  "ownDomains": [],
  "competitorBrands": [],
  "sources": [
    "hackernews",
    "youtube"
  ],
  "timeWindow": "week",
  "country": "US",
  "language": "en",
  "maxMentions": 10,
  "maxPagesPerSource": 2,
  "includeUndated": true,
  "monitorStoreName": "",
  "newOnly": true
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset: the results.

## `summary` (type: `string`):

What each input returned, and notes.

## `report` (type: `string`):

A one-page view of the results to open in a browser.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "brandTerms": [
        "open source"
    ],
    "sources": [
        "hackernews",
        "youtube"
    ],
    "maxMentions": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/brand-mention-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "brandTerms": ["open source"],
    "sources": [
        "hackernews",
        "youtube",
    ],
    "maxMentions": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/brand-mention-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "brandTerms": [
    "open source"
  ],
  "sources": [
    "hackernews",
    "youtube"
  ],
  "maxMentions": 10
}' |
apify call zaiq/brand-mention-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaiq/brand-mention-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cU8hvWusU2hfuzhy7/builds/3TbyTAdyvoIdfftt8/openapi.json
