# Mention Monitor: Hacker News, Mastodon, Bluesky, YouTube (`upward_enterprises/public-mention-monitor`) Actor

Watch keywords on Hacker News, hashtags and accounts on Mastodon, accounts on Bluesky, and YouTube channels; get only the new public posts since your last run as normalized rows with author, text, link, time, and engagement. Official public APIs and feeds, no keys. From $1.20 per 1,000.

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

## Pricing

from $0.60 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Mention Monitor: Hacker News, Mastodon, Bluesky, YouTube

**$2 per 1,000 mentions ($1.20 on the Gold tier), no start fee, no API key, no login. Every post is delivered once.**

Give it what to watch and run it on a schedule: keywords on Hacker News, hashtags or accounts on any Mastodon instance, accounts on Bluesky, and YouTube channels or playlists. Each run delivers only the public posts that appeared since the previous check, as one normalized row per post with author, text, link, time and engagement, so a brand, a product, a competitor or a topic can be followed across the open web from one dataset, into Slack, a sheet, or an agent.

All four sources are read through their official public interfaces: the Hacker News search API, the Mastodon public API of each instance, Bluesky's public AppView, and YouTube's channel feeds. No scraping of HTML, no accounts, no keys.

### What you get

**Mention rows** (`kind: "mention"`), newest first within each watch:

```json
{
  "kind": "mention",
  "source": "hackernews",
  "watch": "hackernews:apify",
  "id": "hackernews:49640012",
  "url": "https://news.ycombinator.com/item?id=49640012",
  "authorHandle": "pixel_popping",
  "authorName": null,
  "authorUrl": "https://news.ycombinator.com/user?id=pixel_popping",
  "type": "comment",
  "title": null,
  "text": "Just out of curiosity, may I know why you pay API price at work versus using dozens of subscriptions that you Apify?",
  "language": null,
  "postedAt": "2026-09-10T13:09:14.000Z",
  "likes": 3,
  "reposts": null,
  "replies": null,
  "comments": null,
  "views": null,
  "parentTitle": "DeepSeek v4.1 Flash",
  "parentUrl": "https://news.ycombinator.com/item?id=49639090",
  "instance": null,
  "observedAt": "2026-09-10T14:00:00.000Z"
}
```

`type` is `story` or `comment` on Hacker News, `post`, `reply` or `boost` on Mastodon, `post`, `reply` or `repost` on Bluesky, and `video` on YouTube. `likes` carries points on Hacker News, favourites on Mastodon, likes on Bluesky and the star-rating count on YouTube; `views` is filled for YouTube. HTML is stripped from text and long text is cut at 2,000 characters.

**Watch rows** (`kind: "watch"`, free), one per watch per run, with `status` (`ok`, `baseline` on the first check, `error`, or `invalid`), how many new posts were found, filtered, delivered, and held for the next run. **One summary row** (`kind: "summary"`, free) totals everything.

### Input

| Field | What it does |
|---|---|
| What to watch | One per line. `hn:apify` (Hacker News stories and comments containing the phrase). `mastodon:#opensource` or `mastodon:#opensource@fosstodon.org` (hashtag on an instance; default mastodon.social). `mastodon:@thunderbird@mastodon.online` (account). `bluesky:@bsky.app` (account). `youtube:UC...` or a channel URL, or `youtube:playlist:PL...`. |
| Keywords | Optional filter for hashtag, account and channel watches: deliver only posts whose text or title contains any of the words. Hacker News watches carry their own keyword. |
| Include replies and boosts | Off by default. |
| First-run look-back (hours) | Default 24. Later runs deliver everything since the previous check. |
| Snapshot name | Which memory to use; a key-value store named `public-mention-monitor-<name>`, one record per watch. |
| Max mentions per run | Default 1,000. Watches whose posts did not fit are re-checked from the same point next run, so nothing is skipped. |

Examples:

```json
{ "watches": ["hn:apify", "hn:\"web scraping\"", "mastodon:#webscraping", "bluesky:@apify.com"] }
```

Everything said about a company and its topic on the open social web, hourly or daily.

```json
{ "watches": ["mastodon:@eff@mastodon.social", "youtube:UC_x5XG1OV2P6uZZ5FSM9Ttw", "bluesky:@nytimes.com"], "keywords": ["privacy", "encryption"] }
```

Three accounts, only the posts and videos about two topics.

### Pricing

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Mention | $0.002 | $0.0018 | $0.0015 | $0.0012 |

A brand keyword on Hacker News produces a few posts a day; a busy Mastodon hashtag a few hundred; an active account a handful. Ten watches typically deliver 50 to 300 mentions a day, $0.10 to $0.60. Watch rows, the summary row, and runs with nothing new are free. Set a maximum total charge on the run to cap spend; the Actor stops cleanly when it is reached, never delivers rows it could not bill, and does not advance a watch until its posts have been delivered.

### Use cases

- **Brand and product monitoring**: mentions of your name, your competitors, or your category as they appear, without a $79-a-month listening tool.
- **Developer relations**: every Hacker News thread that mentions your tool, with the comment text, ready for a reply.
- **Journalists and analysts**: follow accounts and hashtags across instances without logging in anywhere.
- **Creators**: new videos from the channels you track, with view counts, into a sheet.
- **AI agents**: ask "what was said about X on Hacker News today" through the Apify MCP server and get the rows.

### Data source and limits

- Hacker News: the public Algolia search API (stories and comments by date, phrase match confirmed in the text). Mastodon: each instance's public API (hashtag timelines and public account statuses; the Actor stays under the instances' default limit of 300 requests per five minutes). Bluesky: the public AppView (account feeds; Bluesky's post search is not open to unauthenticated clients, so keyword search is not offered there). YouTube: the channel and playlist feeds YouTube publishes (the 15 most recent videos).
- Reddit, X, LinkedIn, Instagram, TikTok, Threads and Facebook are not included: their terms or access controls do not allow this kind of automated reading without an account.
- Only public posts are read. Rows carry the author's public handle and display name as the platform shows them; no profile data, follower lists or private content is collected, and nothing is combined across sources.
- The cadence you schedule is the resolution you get; hourly is common for keywords, daily for accounts.
- At the end of each run the Actor reports run counts (rows delivered, events charged, duration, status) to its maintainer's dashboard. It never sends your input, your results, or anything about your account.

### About

Built and maintained by **Upward Enterprises · AI & API Services** (Iowa, USA). Public-data tools for people and AI agents, with pay-per-record pricing and no keys to manage.

### Changelog

- **0.1** (2026-09-10): first release.

# Actor input Schema

## `watches` (type: `array`):

One watch per line. Hacker News keyword: hn:apify (stories and comments containing the word or phrase). Mastodon hashtag: mastodon:#opensource or mastodon:#opensource@fosstodon.org (default instance mastodon.social). Mastodon account: mastodon:@thunderbird@mastodon.online. Bluesky account: bluesky:@bsky.app. YouTube channel: youtube:UC_x5XG1OV2P6uZZ5FSM9Ttw or the channel URL.

## `keywords` (type: `array`):

Optional. For hashtag, account and channel watches, deliver only posts whose text or title contains any of these words or phrases, case-insensitive. Hacker News watches already carry their own keyword. Empty means every new post.

## `includeReplies` (type: `boolean`):

Off (default): original posts only for account watches (Hacker News comments always count as mentions). On: also replies and reposts/boosts.

## `lookbackHours` (type: `integer`):

On the first check of a watch, how far back to deliver. Later checks deliver everything since the previous check. Default 24.

## `snapshotName` (type: `string`):

Which memory this monitor uses. Kept on your account as a key-value store named public-mention-monitor-<name>. Give each schedule its own name.

## `maxItems` (type: `integer`):

Upper limit on delivered mention rows. Watches whose posts did not fit are re-checked from the same point next run.

## `proxyConfiguration` (type: `object`):

Normally not needed: these are official public APIs and feeds. Turn a proxy on only if the summary row reports rate limiting.

## Actor input object example

```json
{
  "watches": [
    "hn:apify",
    "mastodon:#opensource",
    "bluesky:@bsky.app",
    "youtube:UC_x5XG1OV2P6uZZ5FSM9Ttw"
  ],
  "keywords": [],
  "includeReplies": false,
  "lookbackHours": 24,
  "snapshotName": "default",
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `all` (type: `string`):

No description

## `mentionColumns` (type: `string`):

No description

## `watchColumns` (type: `string`):

No description

## `csv` (type: `string`):

No description

# 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 = {
    "watches": [
        "hn:apify",
        "mastodon:#opensource",
        "bluesky:@bsky.app",
        "youtube:UC_x5XG1OV2P6uZZ5FSM9Ttw"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("upward_enterprises/public-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 = { "watches": [
        "hn:apify",
        "mastodon:#opensource",
        "bluesky:@bsky.app",
        "youtube:UC_x5XG1OV2P6uZZ5FSM9Ttw",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("upward_enterprises/public-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 '{
  "watches": [
    "hn:apify",
    "mastodon:#opensource",
    "bluesky:@bsky.app",
    "youtube:UC_x5XG1OV2P6uZZ5FSM9Ttw"
  ]
}' |
apify call upward_enterprises/public-mention-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,upward_enterprises/public-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/D9drAUgm1dTVh7zhi/builds/SaGtJhOdRvgnfvcFV/openapi.json
