# Discourse Forum Monitor — New Topics & Replies (`dev_web_col/discourse-monitor`) Actor

Social listening on any Discourse forum: brand mentions, new topics, replies and trending threads. Community monitoring with only what changed.

- **URL**: https://apify.com/dev\_web\_col/discourse-monitor.md
- **Developed by:** [Diseño Web de Colombia](https://apify.com/dev_web_col) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 change detecteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Discourse Forum Monitor — New Topics & Replies

**Know the moment your product is mentioned in a community — without reading it all day.**

### What is the Discourse Forum Monitor?

This Actor monitors any Discourse community for new topics, new replies, brand mentions and threads that are picking up steam. It returns only what changed since your last run, so a daily or hourly schedule stays cheap.

Discourse powers thousands of technical and product communities — including the OpenAI, Docker and Rust forums — and all of them expose public JSON endpoints.

### Only the delta, with anti-noise thresholds

Dumping a forum every hour means paying for the same thousand topics repeatedly. This Actor keeps a snapshot in a named key-value store in **your own account** and reports the difference.

Trending detection uses **both a relative and an absolute threshold**, deliberately. Without an absolute floor, a topic going from 4 views to 5 shows up as "trending" — technically a 25% jump, practically noise.

The first run is a baseline: no per-result charge, small sample returned.

### What you can use it for

| What you want | How to ask for it |
|---|---|
| **Social listening** — mentions of your product | `keywords: ["yourbrand"]` |
| **Brand monitoring** across communities | Several `forumUrls` at once |
| **Support triage** — catch a bug report early | Alert on `new` topics matching your terms |
| **Developer relations** — questions as they are asked | Watch the forum of your own product |
| **Competitor community watch** | Their forum URL, look for churn language |
| **Product feedback mining** | Feature requests as they emerge |
| **Trending thread detection** | Read `trending` changes, tuned by `minViews` |
| **Content ideas** | What the community keeps asking about |

Typical jobs: **social listening**, **brand monitoring**, **community
monitoring**, and developer-relations triage.

### What data you get

For each change: the change type, topic title, URL, category, tags, author, post count, view count, the view delta where relevant, creation and last-activity timestamps, and the matched keyword when you are filtering for mentions.

### Input

Every field is optional unless marked required.

| Field | Type | Description |
|---|---|---|
| `oneShot` | boolean | Return the CURRENT topics instead of what changed. Use this for a single lookup or from an AI agent — the monitor needs two runs before it has anything to compare. It never touches your saved history. |
| `forumUrls` | array, **required** | Just the domain: community.openai.com, meta.discourse.org, forum.rclone.org. Almost every developer tool and SaaS community runs Discourse. This actor watches the forums you choose; it does not discover them. |
| `keywords` | array | Watch only topics mentioning these words — your product, a competitor, a feature. Leave empty to watch the forum's recent topics instead. |
| `monitorKey` | string | Keep this the same across runs — it is how the actor remembers what it already saw. Use a different name for an independent watchlist. |
| `trackSignals` | array | Leave empty to get everything. New topic and new replies are what you usually want for brand monitoring. |
| `maxPages` | integer | Only when not using keywords. Each page is 30 topics. Keep it stable across runs. |
| `minViews` | integer | Ignore topics below this view count. Views are only available when watching recent topics, not keyword search. |
| `categoryIds` | array | Only watch these forum categories. Find the ID in the category URL. Leave empty for all. |
| `tags` | array | Only watch topics carrying at least one of these tags. Leave empty for all. |
| `maxChanges` | integer | Safety cap. You are charged per change returned. |
| `resetBaseline` | boolean | Forget everything seen before and take a fresh baseline. The baseline run is never charged per result. |
| `proxyConfiguration` | object | Optional. Discourse forums are usually reachable without a proxy, but a busy schedule across many forums may need one. |

#### Input sample

```json
{
  "forumUrls": [
    "community.openai.com",
    "meta.discourse.org"
  ],
  "keywords": [
    "pricing"
  ]
}
```

### Output sample

One real row from an actual run:

```json
{
  "changeType": "baseline",
  "signals": [],
  "detectedAt": "2026-08-03T02:39:13.443Z",
  "newReplies": null,
  "previousPostsCount": null,
  "viewsGained": null,
  "previousViews": null,
  "id": "community.openai.com:998238",
  "forumDomain": "community.openai.com",
  "topicId": "998238",
  "title": "New Realtime API voices and cache pricing",
  "slug": "new-realtime-api-voices-and-cache-pricing",
  "url": "https://community.openai.com/t/new-realtime-api-voices-and-cache-pricing/998238",
  "excerpt": null,
  "categoryId": 6,
  "tags": [],
  "postsCount": 27,
  "replyCount": 18,
  "views": 0,
  "likeCount": 0,
  "hasAcceptedAnswer": false,
  "closed": false,
  "pinned": false,
  "lastPosterUsername": null,
  "imageUrl": null,
  "createdAt": "2024-10-30T17:09:19.831Z",
  "lastPostedAt": "2025-09-02T06:45:03.891Z",
  "matchedKeyword": "pricing"
}
```

### Who uses this

- **Developer relations** — catch questions about your product as they are asked
- **Support teams** — spot a bug report in a community before it reaches your inbox
- **Product managers** — feature requests and complaints, as they emerge
- **Competitive intelligence** — watch a rival's community for churn signals
- **Community managers** — a digest of what actually moved today

### Honest limits

These are real and none of them is fixable by any tool. They are here so you know what you are buying before you run it.

- **Discourse forums only.** Reddit, Slack, Discord and phpBB are different systems and are not covered.
- **The first run is a baseline** and returns a sample rather than the whole forum.
- **View counts are missing from search results.** Discourse's search endpoint does not return them, so keyword-filtered rows may show zero views while the latest-topics feed has them. Documented rather than papered over.
- **Private categories are invisible**, as they should be — only what a logged-out visitor can read is fetched.
- **A change between runs is invisible.** A topic created and deleted between two runs will not appear.

### FAQ

#### Which forums does this work on?

Any site running Discourse. If the forum has a URL like `/latest.json` that returns JSON in your browser, it works. That includes the OpenAI developer forum, meta.discourse.org and thousands of product communities.

#### Do I need an account on the forum?

No. Only publicly readable content is fetched, exactly what an anonymous visitor sees.

#### How do I track mentions of my brand?

Put your terms in `keywords`. The Actor searches for them and reports new matches, so you get an alert feed rather than a full dump.

#### Why do some rows show zero views?

Because Discourse's search endpoint does not return view counts, unlike its latest-topics endpoint. Rows that came from a keyword search will have zeros there. It is a limitation of the source, not a bug.

#### What counts as trending?

A topic whose views jumped by both a meaningful percentage and a meaningful absolute number. Both thresholds are configurable — the absolute one exists so that tiny topics do not flood your results.

#### Can I monitor several forums at once?

Yes, pass a list of forum URLs. Each keeps its own snapshot under your monitor key.

#### Do I need an account or an API key for the source?

No. This Actor only reads public pages and public endpoints, the same ones any
logged-out visitor sees. You never give it credentials, and nothing is done on
your behalf.

#### Is it legal to scrape this data?

Scraping publicly available information is broadly accepted as legal, and this
Actor only ever touches pages that require no login. That said, what you may do
with the data afterwards is a separate question — personal data in particular is
regulated by GDPR and CCPA. If you plan to process personal data, take advice
first. Apify has a good primer: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

#### How much will a run cost me?

You are charged per result, so the cost scales with what you actually get back.
The pricing is shown on this page above the input form. Start with a small run to
see real numbers before you scale up.

#### Can I export to Excel, CSV or Google Sheets?

Yes. Every run's dataset can be downloaded as CSV, Excel, JSON, XML or HTML from
the **Storage** tab, and Apify integrates directly with Google Sheets, Airtable,
Zapier, Make and Slack.

#### Can I run this on a schedule?

Yes. Open the **Schedules** tab and pick an interval — hourly, daily, weekly.
Each run only costs you what it returns.

#### Can I call it from my own code instead of the console?

Yes. Every Actor on Apify is also an API endpoint. There are official clients for
[Python](https://docs.apify.com/api/client/python/) and
[JavaScript](https://docs.apify.com/api/client/js/), plus a plain REST API. The
**API** tab on this page shows ready-made snippets with your input already filled in.

#### Something came back empty. Is it broken?

Usually not. An empty result normally means the filters were too narrow, or the
source genuinely has nothing to return for that query. This Actor is written to
finish successfully and tell you what happened rather than fail — check the run
log, it says which step returned nothing.

### Related Actors

- **Company Signals** — competitor changes across job board, store and status page
- **Google Trends Scraper** — search demand for the same topics

### Where the data comes from

The public JSON endpoints that every Discourse forum exposes. No login, no API key. Snapshots are kept in your own Apify account.

# Actor input Schema

## `oneShot` (type: `boolean`):

Return the CURRENT topics instead of what changed. Use this for a single lookup or from an AI agent — the monitor needs two runs before it has anything to compare. It never touches your saved history.

## `forumUrls` (type: `array`):

Just the domain: community.openai.com, meta.discourse.org, forum.rclone.org. Almost every developer tool and SaaS community runs Discourse. This actor watches the forums you choose; it does not discover them.

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

Watch only topics mentioning these words — your product, a competitor, a feature. Leave empty to watch the forum's recent topics instead.

## `monitorKey` (type: `string`):

Keep this the same across runs — it is how the actor remembers what it already saw. Use a different name for an independent watchlist.

## `trackSignals` (type: `array`):

Leave empty to get everything. New topic and new replies are what you usually want for brand monitoring.

## `maxPages` (type: `integer`):

Only when not using keywords. Each page is 30 topics. Keep it stable across runs.

## `minViews` (type: `integer`):

Ignore topics below this view count. Views are only available when watching recent topics, not keyword search.

## `categoryIds` (type: `array`):

Only watch these forum categories. Find the ID in the category URL. Leave empty for all.

## `tags` (type: `array`):

Only watch topics carrying at least one of these tags. Leave empty for all.

## `maxChanges` (type: `integer`):

Safety cap. You are charged per change returned.

## `resetBaseline` (type: `boolean`):

Forget everything seen before and take a fresh baseline. The baseline run is never charged per result.

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

Optional. Discourse forums are usually reachable without a proxy, but a busy schedule across many forums may need one.

## Actor input object example

```json
{
  "oneShot": false,
  "forumUrls": [
    "community.openai.com",
    "meta.discourse.org"
  ],
  "keywords": [
    "pricing"
  ],
  "monitorKey": "default",
  "trackSignals": [],
  "maxPages": 3,
  "categoryIds": [],
  "tags": [],
  "maxChanges": 5000,
  "resetBaseline": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `changes` (type: `string`):

One dataset item per topic that changed.

# 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 = {
    "forumUrls": [
        "community.openai.com",
        "meta.discourse.org"
    ],
    "keywords": [
        "pricing"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dev_web_col/discourse-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 = {
    "forumUrls": [
        "community.openai.com",
        "meta.discourse.org",
    ],
    "keywords": ["pricing"],
}

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

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

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

```

## CLI example

```bash
echo '{
  "forumUrls": [
    "community.openai.com",
    "meta.discourse.org"
  ],
  "keywords": [
    "pricing"
  ]
}' |
apify call dev_web_col/discourse-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dev_web_col/discourse-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KRl5CkxlmE4WcB3Ia/builds/Hw8jRn7HbwQbRV10y/openapi.json
