Reddit Scraper API - Posts, Comments & Monitoring avatar

Reddit Scraper API - Posts, Comments & Monitoring

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Reddit Scraper API - Posts, Comments & Monitoring

Reddit Scraper API - Posts, Comments & Monitoring

Scrape public Reddit posts, search, subreddits, media, and nested comments or monitor only newly observed posts. Anonymous read-only OAuth; no browser, proxy, login, cookies, or API key.

Pricing

from $1.00 / 1,000 results

Rating

5.0

(1)

Developer

Thirdwatch

Thirdwatch

Maintained by Community

Actor stats

5

Bookmarked

356

Total users

56

Monthly active users

9 minutes ago

Last modified

Share

Reddit Scraper API - Posts, Comments, Search & Monitoring

Thirdwatch portfolio: 8,800+ users across 140+ public Actors, 2M+ records delivered, >95% run success. Explore all Thirdwatch Actors.

What you get

Extract public Reddit posts, subreddit listings, global search results, self-post text, engagement, media, and nested comments through Reddit's anonymous read-only OAuth API. No browser, Reddit login, cookies, user-supplied API key, or proxy.

Why this Actor

  • Low-cost anonymous OAuth — structured JSON at 256 MB, with no stealth-browser startup fee or residential transfer.
  • 100 posts per page — paginate automatically to 1,000 posts per query.
  • Three query modes in one field — global search, subreddit listings, and search within a subreddit.
  • Full public post bodies — self-post text, media, flair, awards, crossposts, and moderation flags arrive in the structured response.
  • Comments included in the post price — embed up to 100 top or nested comments without paying per comment row.
  • Persistent new-post monitoring — the first run creates a baseline; later complete runs return only unseen post IDs.
  • Zero unchanged result charges — a scheduled monitor with no new posts writes no dataset rows.
  • No duplicate billing — overlapping queries, URLs, and subreddit pages are deduplicated by Reddit post ID across the run.

Query patterns

InputBehavior
AI agentsSearch all public Reddit posts
r/programmingBrowse a public subreddit using the selected sort
r/programming: Python 3.14Search within one subreddit
startUrlsPaginate an existing Reddit listing/search page or fetch a post URL
postUrlsFetch exact public posts and optionally their comments

Basic subreddit run

{
"queries": ["r/programming", "r/python"],
"sort": "new",
"maxResults": 100
}

Global and subreddit-specific research

{
"queries": [
"AI coding agents",
"r/SaaS: customer support automation"
],
"sort": "relevance",
"timeFilter": "month",
"maxResults": 250,
"minScore": 5
}

Scheduled new-post monitoring

{
"queries": ["r/devops: alternative to", "r/sysadmin: recommend"],
"sort": "new",
"skipPinnedPosts": true,
"maxResults": 50,
"includeComments": true,
"maxCommentsPerPost": 20,
"monitorMode": "new-posts",
"monitorStoreName": "infrastructure-buyer-signals"
}

Save that input as an Apify Task and attach a Schedule. The first successful run emits the current baseline with changeType: "baseline". Later successful runs using the same monitor name emit only unseen IDs with changeType: "new_post". The Actor commits state after publishing rows, providing at-least-once delivery. It refuses to advance state if any configured target is incomplete.

Use one monitorStoreName per independent watch and do not overlap runs that share it. Changing a query, sort, filter, or result depth changes the cohort; use a new monitor name. newerThan remains available for one-off timestamp-filtered exports but is not needed for persistent monitoring.

Post and comment extraction

{
"postUrls": [
"https://www.reddit.com/r/programming/comments/POST_ID/example/"
],
"includeComments": true,
"maxCommentsPerPost": 50,
"maxCommentDepth": 3
}

Output fields

Every post row includes:

  • identity: id, title, url, permalink, sourceQuery
  • author/community: author, subreddit, flair
  • content: selftext, post_hint, domain, mediaUrl, thumbnail, gallery_images
  • engagement: score, upvoteRatio, numComments, gildingCount
  • flags: isNSFW, is_spoiler, is_stickied, is_self, is_video, is_crosspost, is_locked, is_archived
  • timestamps: created, scrapedAt
  • monitoring: changeType, firstSeenAt when monitorMode is new-posts
  • optional comments: topComments[] with id, parentId, author, body, score, depth, created, and permalink

Example result

{
"id": "1uxtv30",
"title": "New Python type checker",
"author": "TheSeriousTrader",
"subreddit": "Python",
"url": "https://www.reddit.com/r/Python/comments/1uxtv30/new_python_type_checker/",
"permalink": "https://www.reddit.com/r/Python/comments/1uxtv30/new_python_type_checker/",
"selftext": "Was checking out some Python type checkers...",
"score": 42,
"upvoteRatio": 0.88,
"numComments": 16,
"created": "2026-07-16T05:39:00+00:00",
"flair": "Discussion",
"is_self": true,
"topComments": []
}

Live pricing

You pay only for unique post rows written to the dataset. Empty searches, duplicates, failed requests, and comments embedded inside a post row do not create additional result charges.

Apify tierPrice per 1,000 posts
FREE$1.00
BRONZE$0.80
SILVER$0.60
GOLD$0.40

There is no browser-start or proxy fee. The Pricing tab is the authoritative live price.

Reliability and responsible use

  • The Actor collects public Reddit content only. Private, banned, quarantined, removed, or login-only content is unavailable.
  • Requests are globally rate-limited with bounded retries for 429, authorization refreshes, timeouts, and transient network failures.
  • Persistent monitors keep at most 50,000 post identities. The oldest identities can eventually age out of extremely high-volume watches.
  • Monitoring visits every configured target but buffers at most 2,000 current post observations before diffing. With large watchlists, the Actor lowers maxResults evenly per listing; split broader cohorts into separate Tasks.
  • Monitoring state updates only after every configured target completes. A failed page or deadline guard fails closed instead of corrupting the baseline.
  • Reddit scores and comment counts can change between requests and may be hidden for very new posts.
  • Comment-enabled listing runs are capped at 100 posts total across all queries; exact postUrls reuse their detail response and remain separate.
  • Comments come from Reddit's initial public comment tree; hidden “load more comments” branches are not expanded.
  • Search relevance and geographic availability are controlled by Reddit.

Workflows and guides

Pairs well with Twitter/X Scraper, Google News Scraper, and YouTube Scraper for cross-channel listening.

Input parameters

ParameterRequiredDescription
queriesNoPlain text searches all Reddit. Use r/python for a subreddit listing or r/python: asyncio for search within one subreddit.
startUrlsNoExisting public Reddit URLs. Subreddit/search pages are paginated; post URLs are extracted directly.
postUrlsNoFetch exact public Reddit posts and, optionally, their comment threads.
sortNoHow subreddit and search results are ordered.
timeFilterNoTime range for top and relevance searches.
maxResultsNoMaximum unique posts returned for each query or listing URL. Pagination is automatic in batches of up to 100. Persistent monitors distribute a 2,000-observation safety budget across listing targets.
includeCommentsNoEmbed public top and nested comments in each post row. Comment-enabled listing runs are capped at 100 posts total across all queries to respect Reddit and the run timeout.
maxCommentsPerPostNoMaximum public comments embedded in each post row when comments are enabled.
maxCommentDepthNoZero keeps top-level comments only; higher values include nested replies up to that depth.
minScoreNoOnly write posts at or above this visible Reddit score.
skipPinnedPostsNoExclude moderator-pinned or stickied posts from results.
newerThanNoISO 8601 timestamp or date for one-off incremental exports, for example 2026-07-01 or 2026-07-01T00:00:00Z. Persistent monitors usually leave this empty.
monitorModeNoReturn every current post, or persist a baseline and return only posts not seen by this watch. An unchanged new-posts run writes no billable result rows.
monitorStoreNameNoStable identity for one scheduled watch. Reuse the same name and input on every run; use a different name for each independent monitor.
maxConcurrencyNoParallel parsing tasks for bodies/comments. Actual Reddit requests remain globally rate-limited.
requestDelaySecsNoMinimum delay between anonymous Reddit API requests. Keep at 0.65 seconds unless you need a gentler crawl.

Use cases

  • Marketers monitoring social presence and engagement
  • Researchers building social-media datasets
  • Teams tracking public figures and trends

Limitations

  • Comment-enabled listing runs are capped at 100 posts total across all queries, to respect Reddit and the run timeout; disable includeComments for larger post-only pulls.
  • Persistent monitors distribute a 2,000-observation safety budget across listing targets, so very broad watch configurations can be throttled before every target is checked.
  • Deleted, removed, or private-subreddit content disappears from results between runs, since the Actor reflects whatever Reddit currently serves publicly.
  • Nested comment depth and per-post comment counts are bounded by maxCommentDepth and maxCommentsPerPost — raise them for deeper threads at the cost of a longer run.

Last verified: 2026-07