# Discourse Community Topic Monitor

Track recent public Discourse topics by community and keyword. Compare topic activity and saved changes with source links. Bounded latest-topic coverage; no private forums.

Canonical product page: https://mayd-it.com/data-tools/actors/discourse-community-topic-monitor/

## Example input

```json
{
  "communityUrls": [
    "https://discuss.python.org"
  ],
  "maxResults": 3
}
```

## Full guide

# Discourse Community Topic Monitor

Paste a public Discourse community URL and collect a small review queue of topic observations. Track titles, tags, source dates and counts; optionally match literal keywords and compare with previously saved observations.

The default returns up to **three topics from Python Discussions**. No API key, login, proxy, browser or outside service is required for the tested public communities. Access remains subject to each forum’s settings and limits.

## Start with one community

```json
{"communityUrls":["https://discuss.python.org"],"maxResults":3}
```

1. Paste the forum’s HTTPS base URL into **Community URLs**.
2. Run, then open the dataset and saved **RUN_REPORT**.
3. Check **SOURCE_COVERAGE** before treating the result as a complete check of your selected window.

An omitted input or empty community list uses the Python example. It reads exactly one `/latest.json` response. The first source window is not a full archive, whole-forum search or chronological list of newly created topics. Pinned discussions and older active topics can appear; source order and `pinned` are retained.

## What each row contains

- Forum URL, stable forum/topic identity, title and direct topic link.
- Tags and numeric category ID when supplied. Category names are not fetched.
- Source creation and last-post dates; observation time is separate.
- Post count, views and likes when present; missing optional values stay null.
- Pinned, closed and archived states when supplied.
- Literal keyword evidence from the title or tag text, if filtering is enabled.
- Comparison status, changed fields, prior saved observation and numeric deltas when comparison is enabled.

`sourceReplyCount` preserves the API’s `reply_count` field. **It does not establish that a topic is unanswered.** Real source topics can have several posts and a zero `reply_count`. There is no inferred answer quality, sentiment, purchase intent or resolution state. The Actor does not request post bodies, profile pages, private content, thread details or accepted answers. User records embedded in the public topic-list response are ignored and are not included in dataset rows.

The dataset contains real topic observations only. Invalid source responses and access failures appear in the summary and coverage, never as paid diagnostic rows. `RUN_REPORT` presents saved topics and source coverage without adding dataset items.

## Keyword matching

Add optional keywords or phrases in **Advanced options**. Matching ignores case and uses literal text, not an AI classification. Whole-word matching uses Unicode letter/number boundaries; disable it for deliberate substring matching.

Keywords match the title and individual tags. They do not search post text or fetch additional pages. A zero-match result means no match within the selected source window, not no matching discussion anywhere on the forum. Evidence includes the term, matched field and a bounded excerpt. Each keyword has at most one title excerpt and one tag excerpt, capped at 40 evidence entries per row.

## Saved comparisons

Enable `comparePrevious` to establish a baseline. Later runs compare topic identity within the same forum. `onlyChanges` also enables comparison and saves only new or changed observations; an unchanged run can save zero rows successfully.

History scope includes the forum list, keywords, whole-word setting, inspected window size and comparison name. Use one sequential writer per scope. Only **confirmed saved rows** advance history. A topic excluded by an earlier result cap can be “new” on a later run because it was never saved before.

`metricDeltas` subtract the previous saved count from the current count only when both are numeric. Negative differences are retained and listed in `countersDecreased`; they are not deletion evidence. No rates, reach estimates or inferred activity are calculated. Missing topics, smaller response windows, failures and partial runs never establish removal.

## Three ready-to-run examples

### Python Discussions

```json
{"communityUrls":["https://discuss.python.org"],"maxResults":3}
```

### Hugging Face community

```json
{"communityUrls":["https://discuss.huggingface.co"],"maxResults":3}
```

### Rust users forum

```json
{"communityUrls":["https://users.rust-lang.org"],"maxResults":3}
```

## Coverage, limits and cost

- One fixed `/latest.json` GET per community; no pagination, topic-detail calls or cross-host redirects.
- Up to 10 community URLs and 100 inspected topics per community, limited to what that one response contains. The default inspects at most 30 topics and saves at most three globally.
- A fulfilled result cap is a successful bounded selection with `selectionTruncated: true`. Unreached later communities, processing failures, time limits or spending stops remain explicit and can make the run partial.
- Each source response is limited to 2 MiB and each request to 15 seconds within the remaining run deadline. Total source response bodies are limited to 8 MiB; the last received chunk can cross the bound before closing. Five seconds of the run budget are reserved for output. Cloud SDK storage calls and shutdown have five-second bounds; storage retries are disabled.
- Only public HTTPS base URLs are accepted. Credentials, private/reserved DNS addresses, local hosts, custom ports, queries, fragments and subpath installations are unsupported. DNS results are validated and pinned for the connection. TLS verification stays enabled.
- Redirects and source retries are disabled. Login-only, restricted, error-shaped or incompatible forum responses fail honestly. The Actor does not automatically change connections or attempt an access workaround.

Base pricing is **$0.001 per saved topic observation** plus **$0.00005 per run start**. The Store pricing panel and your run charge limit govern actual charges. This package adds no paid source provider or subscription. Source-byte and row caps are not an infrastructure billing ceiling. A successful small sample is not an uptime guarantee.

## Source contract

The [official Discourse API client](https://github.com/discourse/discourse_api/blob/main/lib/discourse_api/api/topics.rb) uses `/latest.json` for current topic lists. Its [maintainer changelog](https://github.com/discourse/discourse_api/blob/main/CHANGELOG.md) includes support for unauthenticated public requests. Each community controls its own permissions and public surface; the [official API documentation](https://docs.discourse.org/) also covers authenticated operations that this Actor does not use.

The examples were checked with small direct public probes and selected Apify runs. On 18 October 2026 UTC, bounded cloud samples returned usable topic metadata from Python Discussions, the Hugging Face community and the Rust users forum. Discourse Meta returned HTTP 429 on its first cloud request; that failed observation was retained, with no retry or access workaround.

These observations cover the selected communities and run windows. They do not establish access to every Discourse installation or continuing availability. Each run reports its actual source outcome. Forum content rights and terms still apply; output keeps attribution links and does not redistribute full threads.
