Reddit Post Monitor Lite

Monitor new public Reddit posts by subreddit, keyword, or URL. Filter by date and engagement, deduplicate scheduled runs, and export post, media, and source-quality data.

Data fields

FieldTypeDescription
recordIdstringReddit fullname used for within-run and optional cross-run deduplication.
postIdstringReddit post ID without the t3_ prefix.
namestringReddit object name, normally t3_ followed by the post ID.
subredditstringSubreddit name without r/.
postTitlestringVisible Reddit post title.
authorstring | nullPublic Reddit username when available.
urlstringCanonical public Reddit post URL.
permalinkstringCanonical Reddit permalink for the post.

Input preview

subredditsSubreddits
searchQueriesReddit search queries
redditUrlsReddit URLs
maxPostsMaximum posts per run
maxPostsPerSourceMaximum posts per source
maxPagesPerSourceMaximum pages per source

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Monitor new public Reddit posts by subreddit, keyword, date, engagement, or URL, then export structured post and media data to JSON, CSV, Excel, API, automations, or AI agents.

The Actor is built for scheduled social listening. It can remember post IDs across runs, establish an initial baseline, and return only later matches. Each run also produces a diagnostic summary showing which sources worked, which fallback transport was used, why records were skipped, and whether any fields were unavailable.

What does this Actor collect?

  • Post identity, title, body, author, subreddit, flair, and timestamps
  • Score, upvote ratio, comment count, awards, and age-adjusted engagement rates
  • Post, outbound, thumbnail, image, gallery, GIF, and video URLs when Reddit provides them
  • NSFW, spoiler, stickied, locked, archived, crosspost, and removal flags
  • Input source, matched keywords, fetch transport, metadata completeness, and missing-field details
  • A RUN-SUMMARY JSON record with per-source outcomes, retries, filters, deduplication, and saved totals

Who is it for?

Audience Common workflow
Social listening and support teams Monitor brand mentions, complaints, questions, and incidents
Founders and growth teams Find recommendation requests, alternatives, pain points, and buying intent
Researchers and analysts Track subreddit discussions, trends, engagement, and public reactions
Automation builders Schedule new-post feeds for Slack, webhooks, databases, or dashboards
AI and agent developers Supply structured Reddit context through API or the official Apify MCP server

Input examples

Monitor new keyword matches across scheduled runs

{
  "subreddits": ["SaaS", "startups", "webscraping"],
  "includeKeywords": ["Apify", "scraping tool", "alternative"],
  "sort": "new",
  "maxAgeHours": 48,
  "maxPosts": 50,
  "deduplicateAcrossRuns": true,
  "onlyNew": true,
  "stateKey": "brand-monitor",
  "stateStoreName": "reddit-post-monitor-lite-state",
  "proxyConfiguration": { "useApifyProxy": true }
}

The first onlyNew run establishes a baseline without saving existing matches. Later runs using the same persistent stateStoreName and stateKey return only new matching posts.

Export recent high-engagement posts

{
  "subreddits": ["technology", "MachineLearning", "programming"],
  "sort": "top",
  "timeFilter": "week",
  "minScore": 100,
  "minComments": 20,
  "includeNsfw": false,
  "maxPosts": 100,
  "maxPostsPerSource": 100,
  "maxPagesPerSource": 5
}

Watch Reddit search results

{
  "searchQueries": ["best web scraping API", "Apify alternative"],
  "excludeKeywords": ["giveaway", "coupon"],
  "sort": "new",
  "dateFrom": "2026-07-01",
  "maxPosts": 50,
  "failOnNoResults": true
}

Output example

Each paid dataset item represents one saved Reddit post.

{
  "recordId": "t3_abc123",
  "postId": "abc123",
  "name": "t3_abc123",
  "subreddit": "apify",
  "postTitle": "Example Reddit post title",
  "author": "example_user",
  "url": "https://www.reddit.com/r/apify/comments/abc123/example/",
  "permalink": "https://www.reddit.com/r/apify/comments/abc123/example/",
  "createdAt": "2026-07-07T00:00:00.000Z",
  "score": 42,
  "upvoteRatio": 0.95,
  "numComments": 7,
  "over18": false,
  "isSelf": true,
  "selftext": "Post body text when available",
  "linkUrl": null,
  "flair": "Discussion",
  "postType": "text",
  "mediaUrls": [],
  "scorePerHour": 1.23,
  "commentsPerHour": 0.2,
  "engagementTotal": 49,
  "matchedKeywords": ["apify"],
  "isCrosspost": false,
  "numCrossposts": 0,
  "fetchTransport": "reddit-json",
  "metadataCompleteness": "full",
  "missingFields": [],
  "sourceType": "subreddit",
  "source": "apify",
  "fetchedAt": "2026-07-07T00:01:00.000Z"
}

When richer Reddit metadata is unavailable, a record may still contain its title, body, author, link, and date. These records use metadataCompleteness: "partial" and list unavailable values in missingFields. Do not treat a zero as a measured score when missingFields includes score.

Input settings

Provide at least one valid subreddits, searchQueries, or redditUrls value.

Setting JSON key Description
Subreddits subreddits Names without r/, such as apify or webscraping.
Reddit search queries searchQueries Phrases, products, brands, competitors, or questions to search across Reddit.
Reddit URLs redditUrls Public subreddit, listing, search, or individual post URLs.
Maximum posts per run maxPosts Hard cap on paid saved rows across all sources; allocated round-robin.
Maximum posts per source maxPostsPerSource Collection cap for each subreddit, query, or URL before filtering.
Maximum pages per source maxPagesPerSource Listing-page request cap for each source.
Sort order sort new, hot, top, rising, comments, or relevance; unsupported source/sort combinations use new.
Reddit time window timeFilter hour, day, week, month, year, or all for supported sorts.
Required keywords includeKeywords Keep posts containing at least one keyword in title or visible body.
Excluded keywords excludeKeywords Skip posts containing any excluded keyword.
Maximum age maxAgeHours Keep posts no older than this many hours.
Posted from dateFrom Inclusive minimum publication date or ISO date-time.
Posted to dateTo Inclusive maximum publication date or ISO date-time.
Minimum score minScore Minimum Reddit score; limited fallback rows without score are skipped.
Maximum score maxScore Maximum Reddit score; limited fallback rows without score are skipped.
Minimum comments minComments Minimum comment count; limited fallback rows without it are skipped.
Exact flair flairFilter Case-insensitive exact post-flair match.
Outbound domain domainFilter Keep link posts whose domain contains the supplied text.
Reddit author authorFilter Exact username; u/ is optional.
Include NSFW includeNsfw Keep posts Reddit identifies as NSFW. Default: false.
Include spoilers includeSpoilers Keep spoiler-marked posts. Default: true.
Include stickied includeStickied Keep moderator-pinned posts. Default: true.
Deduplicate across runs deduplicateAcrossRuns Skip matching IDs already stored under the same state key.
Establish baseline first onlyNew First run stores current matches without output; later runs return only new matches.
Monitoring state key stateKey Separates history for different schedules sharing a key-value store.
Persistent state store stateStoreName Named key-value store that preserves monitoring history across separate runs.
Fail on no results failOnNoResults Fail when no rows are saved, except during an initial onlyNew baseline.
Proxy configuration proxyConfiguration Standard Apify Proxy settings. Automatic Apify Proxy is the default.
Request retries maxRetries Retries after the first request for blocks, rate limits, server errors, or connection failures.
Legacy proxy switch useApifyProxy Backward-compatible setting used only when proxyConfiguration is absent.
Legacy proxy groups proxyGroups Backward-compatible group list used only when proxyConfiguration is absent.

Schedule a Reddit monitor

  1. Run the Actor once with a small input and inspect the dataset plus RUN-SUMMARY.
  2. Reuse the same task and default key-value store for every scheduled run.
  3. Enable deduplicateAcrossRuns. Add onlyNew if the first run should establish a silent baseline.
  4. Keep the same stateStoreName and stateKey on every scheduled run. Give unrelated monitors different stateKey values.
  5. Add an Apify schedule and connect the resulting dataset to a webhook, Slack, email, database, or another Actor.

Changing stateStoreName or stateKey starts a separate history. Disabling cross-run deduplication restores snapshot behavior for existing integrations.

API usage

cURL

curl "https://api.apify.com/v2/acts/fetch_cat/reddit-post-monitor-lite/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"subreddits":["apify"],"includeKeywords":["actor"],"maxPosts":25,"proxyConfiguration":{"useApifyProxy":true}}'

Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/reddit-post-monitor-lite').call({
  searchQueries: ['best web scraping API'],
  maxAgeHours: 72,
  maxPosts: 25,
  deduplicateAcrossRuns: true,
  stateKey: 'api-monitor',
  stateStoreName: 'reddit-post-monitor-lite-state'
});

console.log(run.defaultDatasetId, run.defaultKeyValueStoreId);

Python

from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/reddit-post-monitor-lite').call(run_input={
    'subreddits': ['apify', 'webscraping'],
    'sort': 'new',
    'maxPosts': 25,
    'deduplicateAcrossRuns': True,
    'stateKey': 'python-monitor',
    'stateStoreName': 'reddit-post-monitor-lite-state',
})

print(run['defaultDatasetId'], run['defaultKeyValueStoreId'])

Download the default dataset as JSON, CSV, Excel, XML, RSS, or through the Apify API after the run finishes.

MCP and AI agents

This Actor works through the official Apify MCP server. A focused endpoint exposes only this Actor:

https://mcp.apify.com?tools=fetch_cat/reddit-post-monitor-lite

Add it to Claude Code:

claude mcp add apify-reddit-post-monitor --transport http "https://mcp.apify.com?tools=fetch_cat/reddit-post-monitor-lite"

MCP JSON configuration:

{
  "mcpServers": {
    "apify-reddit-post-monitor": {
      "url": "https://mcp.apify.com?tools=fetch_cat/reddit-post-monitor-lite"
    }
  }
}

Example prompts:

  • "Monitor r/apify and r/webscraping for posts mentioning broken actors during the past 48 hours."
  • "Find new Reddit recommendation requests for web scraping tools and return the post URL, author, score, and matched keywords."
  • "Run my Reddit monitor, inspect RUN-SUMMARY, and tell me whether any source failed or returned partial metadata."

Reliability and practical limits

  • Reddit can block or rate-limit public data requests. The Actor retries temporary failures with fresh connections, tries a public RSS representation when available, and uses a compatibility Actor only as the final fallback.
  • Sources are isolated. One failed subreddit or query does not discard successful output from other sources. The run fails when every source fails.
  • RSS and compatibility records can omit score, comment count, ratio, flair, domain, media, or safety flags. Check metadataCompleteness and missingFields.
  • Filters that depend on unavailable score or comment metadata skip the affected fallback records instead of pretending a zero value satisfies the filter.
  • Reddit listing/search interfaces normally expose at most about 1,000 accessible records. This Lite Actor is intended for recent monitoring, not complete historical archives.
  • Overlapping sources are deduplicated within each run. Cross-run deduplication is opt-in to preserve existing snapshot integrations.
  • Private, quarantined, banned, deleted, login-gated, and inaccessible communities or posts may return no public data.
  • comments and relevance sorting apply to search sources; subreddit sources use new for those values. hot and rising search inputs also use new.

Support

If a run fails, returns no posts unexpectedly, or produces wrong output, open an issue from the Actor page. Include the Apify run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL such as a Reddit post or listing. RUN-SUMMARY is safe and useful diagnostic context, but do not post Apify tokens, cookies, proxy credentials, or private data.

Privacy and data handling

This Actor requests only public Reddit data needed for the input you provide. Inputs, monitoring state, run summaries, and output remain in your Apify storage. Requests may pass through Apify platform services and Apify Proxy during a run.

FetchCat does not send inputs or outputs to advertising networks, data brokers, or model-training services, and does not retain run data outside Apify storage unless you explicitly share run details for transient support debugging. You are responsible for using the Actor lawfully, respecting applicable terms and privacy rules, and reviewing public-content output before storing or sharing it.

Common questions

Questions and answers reused from the canonical actor README.

Can this replace the Reddit API for public post monitoring?

It provides an unauthenticated public-data workflow for supported subreddit listings, Reddit searches, and post URLs. It is not an official Reddit API and does not expose private or account-specific data.

Can I return only posts created since the previous run?

Yes. Enable deduplicateAcrossRuns. Use onlyNew when the first run should establish a baseline without output.

Why is score zero on a fallback record?

Some public RSS records do not include engagement metrics. If missingFields contains score, zero is a compatibility placeholder rather than a measured score.

Why did the run save no data?

Inspect RUN-SUMMARY. It distinguishes empty sources, failed sources, filtered records, duplicates, initial baselines, and unavailable metadata required by filters. Enable failOnNoResults when empty output should fail an automation.

Can I export Reddit posts to CSV or Excel?

Yes. Use the default dataset export controls or Apify dataset API to download JSON, CSV, Excel, XML, or RSS.