Reddit Scraper By Multiple Subreddits & Keyword Search
Pricing
from $4.99 / 1,000 results
Reddit Scraper By Multiple Subreddits & Keyword Search
Reddit Scraper by Multiple Subreddits & Keyword Search extracts posts, comments, authors, scores, timestamps, and engagement data across multiple subreddits and keywords. Ideal for market research, sentiment analysis, trend discovery, and competitor research.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Reddit Scraper — Extract Posts, Comments and Subreddit Data as JSON
Reddit Scraper By Multiple Subreddits & Keyword Search pulls posts, comments, subreddit metadata and user profiles from Reddit without a Reddit account, login, or API key. One run searches every keyword against every subreddit in your list, tags each match with its real source subreddit, and applies a genuine date-range, exclude-keyword, minimum-score and flair filter — not cosmetic options. Every result is typed, normalized JSON, ready for an LLM context window, a vector store, or a CSV export, with no HTML to parse. After reading this, you'll know exactly which input drives each mode and what every output row contains.
What is Reddit Scraper By Multiple Subreddits & Keyword Search?
This is an Apify Actor that searches Reddit by keyword across multiple subreddits in a single job, and also scrapes individual posts (with their full comment tree), subreddit listings, user profiles, and subreddit metadata from direct URLs. No Reddit account, OAuth app, or login is required — the actor connects to public, credential-free data sources rather than the logged-in reddit.com site. It is a superset of API-Empire's base Reddit Scraper: every base input still works, plus a real multi-subreddit fan-out and a working date-range filter.
- Scrape posts by keyword search (fanned out across every subreddit you list), by subreddit listing, or by direct post URL
- Scrape comments as a full nested reply tree, flattened with a
depthfield - Scrape subreddit metadata (subscribers, description, active users) plus an optional ranking of large subreddits by subscriber count
- Scrape user profiles, submitted posts, and comments from a profile URL
- Export as JSON, CSV, or Excel, or pull rows through the Apify API
What data does Reddit Scraper By Multiple Subreddits & Keyword Search collect?
The actor returns four structurally distinct entity types in the same dataset, each identified by its type field.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Posts | title, author, score, comment count, flair, creation date | title, author, score, upvoteRatio, numComments, linkFlairText, createdAt, permalink |
| Comments | body text, score, nesting depth, parent link | body, score, depth, parentId, linkId, isSubmitter |
| Subreddits | subscriber count, description, active users, type | name, subscribers, activeUsers, description, subredditType, totalPosts |
| Users | karma totals, submitted-item counts | username, postKarma, commentKarma, totalKarma, numPosts, numComments |
Need more Reddit data?
If you need Reddit's ad library instead of organic content, API-Empire also publishes a Reddit Ads Scraper. And if you only ever need a single subreddit or a single search term rather than the multi-subreddit fan-out this variant adds, the base Reddit Scraper in the same family covers that narrower case with the same output shape.
How does Reddit Scraper By Multiple Subreddits & Keyword Search differ from the official Reddit API?
Reddit's official Data API requires a registered developer app, an OAuth client ID/secret, and a Reddit account tied to that app — this Actor requires none of that. Reddit also introduced paid pricing for commercial-scale API access in 2023, governed by its Data API Terms and Developer Terms; this Actor is billed per Apify's pay-per-event pricing instead, with no separate agreement with Reddit.
| Feature | Reddit Data API | Reddit Scraper By Multiple Subreddits & Keyword Search |
|---|---|---|
| Authentication | OAuth app + Reddit developer account | None — no login, token, or Reddit account |
| Commercial access | Subject to Reddit's Data API Terms; paid tier for high-volume commercial use since 2023 | Pay-per-result via Apify, no separate Reddit agreement |
| Multi-subreddit keyword search | One call per subreddit/listing; no built-in cross-subreddit fan-out | One job searches every keyword across every listed subreddit |
| Date-range search | Governed by each endpoint's own listing/search behavior | Real dateFrom/dateTo range plus a relative time-window filter |
| Output format | Raw Reddit "Listing"/"Thing" JSON with data wrappers and t1_/t3_ prefixes | Flat, normalized JSON with consistent field names across every mode |
| Setup | Register an app, obtain credentials, implement the OAuth flow | Fill in the input form and start the run |
Use the official API when you need a logged-in-session-only feature (posting, voting, private subreddits you moderate) or you already have OAuth infrastructure. Use this Actor when you want structured multi-subreddit search results without building or maintaining that integration yourself.
Why do developers and teams scrape Reddit?
For AI engineers and agent builders
Reddit threads are a common source of unstructured, opinionated text for RAG indexing and agent tool use — a support agent can call this Actor with a product name in keywords and a list of relevant subreddits, get back typed JSON with title, selftext, and body fields already separated from post metadata, and index it directly without an HTML-parsing step in the pipeline.
For marketers and brand teams
Cross-community brand or product monitoring means checking many subreddits for the same term at once. Setting keywords to a brand name and subreddits to every community where your audience overlaps returns every mention in one run, each tagged with sourceSubreddit so you can see which communities are actually talking about you.
For researchers and analysts
Academic and market research on Reddit usually needs a bounded time window and only public data. The dateFrom/dateTo range filter, combined with minScore and minComments thresholds, lets you pull a reproducible slice of posts from a specific launch week or news cycle for later coding and analysis, without private or login-gated content.
For developers building data products
Scheduled Apify runs (daily or weekly) turn this Actor into a monitoring pipeline: a fixed subreddits list and rotating keywords feed a dataset that downstream code or a dashboard reads via the Apify API, with a stable output schema across runs so the consuming code doesn't need to change when Reddit's own front end does.
How to scrape Reddit (step by step)
- Open this Actor on its Apify Store listing and click Try for free (or Start, if you already have it saved).
- No field is strictly required — provide
keywordsandsubredditsfor a multi-subreddit keyword search, orstartUrls(a post, subreddit, or user URL) to scrape a specific target directly. Both can run in the same job. - Set the filters and per-mode toggles you need —
dateFrom/dateTo,minScore,minComments,flairFilterfor search;enableSubreddit/enablePost/enableUser/enableSubredditInfoto turn Start-URL modes on or off; and the limit fields to bound how much each mode fetches. - Click Start and watch rows land in the Output tab as they're scraped.
- Download results as JSON, CSV, or Excel from the Output tab, or pull them programmatically via the Apify API or
apify_client.
What to do when Reddit changes its structure
This Actor is maintained, and its output schema is kept stable across updates — field names and types on the dataset don't change when Reddit changes its own site. No specific turnaround time is promised for any given fix.
What changed in Reddit scraping recently?
Reddit's access model changed sharply starting in 2023. In April 2023, Reddit announced it would begin charging for API access at commercial volume, a shift that made what had been effectively free access metered. Weeks later, in May 2023, Reddit cut off Pushshift's public data feed — the free, Reddit-wide archive that many research and scraping tools had relied on for years — restricting it to verified moderator use. Several long-running third-party Reddit apps shut down in the following months, unable to absorb the new API costs.
For DIY scrapers, this meant rebuilding on community-run replacement archives (such as the Arctic Shift and PullPush projects that emerged after the Pushshift cutoff) or paying for official API access. This Actor already runs on that replacement-archive model, so users don't feel the breakage directly — public post, comment, subreddit, and user data remains reachable through it; only Reddit's original free-tier, unlimited API access and Pushshift's own free feed are gone. Ongoing maintenance tracks these backends as they evolve.
⬇️ Input
All fields are optional; provide either a keyword/subreddit combination, Start URLs, or both.
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
keywords | No | array | stringList | One or more search phrases, run across every subreddit in ONE job. A multi-word phrase matches posts containing ALL of its words (any order). Falls back to legacy searchTerms when empty. |
subreddits | No | array | stringList | One or more subreddit names, without r/. Every keyword is searched against every subreddit in this list. Leave empty to search unscoped across all of Reddit (fallback archive only). Falls back to legacy searchCommunity when empty. |
startUrls | No | array | stringList; minItems 0 | Reddit post, subreddit, or user URLs to scrape directly, alongside the keyword search. |
excludeKeywords | No | array | stringList; default [] | Terms to exclude from search results; a matching post is dropped and does not count toward the item budget. |
dateFrom | No | string | datepicker (absolute YYYY-MM-DD or relative, e.g. "7 days") | Only include posts created on or after this date. Falls back to legacy filterByDate when empty. |
dateTo | No | string | datepicker (absolute or relative) | Only include posts created on or before this date. |
minScore | No | integer | min 0; default 0 | Only include posts with at least this many upvotes. |
minComments | No | integer | min 0; default 0 | Only include posts with at least this many comments. |
flairFilter | No | string | textfield; default "" | Only include posts whose link flair text contains this substring (case-insensitive). |
sortSearch | No | string | enum: relevance, new, hot, top, comments; default new | Order of search results. relevance/hot/top rank by score; new is newest first; comments is most comments first. |
timeFilter | No | string | enum: hour, day, week, month, year, all; default all | Restricts search results to a relative time window; combines with dateFrom (more restrictive lower bound wins). |
enableSearch | No | boolean | default true | Runs the keyword search when keywords are set and no Start URLs apply. |
ignoreStartUrls | No | boolean | default false | When enabled, Start URLs are not scraped — only the keyword search runs. |
searchForPosts | No | boolean | default true | Include posts in search results (the only search scope supported). |
enableSubreddit | No | boolean | default true | Scrapes any subreddit URLs in Start URLs for their post listing. |
sortSubreddit | No | string | enum: hot, new, top, rising, controversial; default new | Order for Start-URL subreddit listings. new/top are real orderings; hot/rising are a disclosed approximation; controversial ranks by upvote ratio closest to 50/50. |
enablePost | No | boolean | default true | Scrapes any post URLs in Start URLs for the post and its comment tree. |
skipComments | No | boolean | default false | If enabled, comments are not fetched for post URLs. |
enableUser | No | boolean | default true | Scrapes any user profile URLs in Start URLs. |
skipUserPosts | No | boolean | default false | If enabled, user profile URLs in Start URLs are ignored entirely. |
fetchUserProfile | No | boolean | default true | Fetches each user's profile/karma summary. |
fetchUserSubmitted | No | boolean | default true | Fetches posts submitted by each user. |
fetchUserComments | No | boolean | default true | Fetches comments made by each user. |
enableSubredditInfo | No | boolean | default true | Fetches metadata for subreddits found in Start URLs, plus the optional top-subreddits ranking. |
skipCommunity | No | boolean | default false | If enabled, subreddit/community metadata is not fetched. |
fetchTopSubreddits | No | boolean | default false | Adds a ranking of large subreddits by subscriber count as top_subreddit rows. |
searchTerms | No | array | stringList | Legacy search-term field; used only when keywords is empty. |
searchCommunity | No | string | textfield | Legacy single-subreddit field; used only when subreddits is empty. |
filterByDate | No | string | datepicker | Legacy date field; used only when dateFrom is empty. |
maxItemsToSave | No | integer | min 1; default 50 | Global maximum number of rows saved across the entire run, across every mode combined. |
limitPostsPerPage | No | integer | min 1; default 10 | Target number of posts per keyword, per subreddit. |
limitCommunityPages | No | integer | min 1; default 2 | Max result pages to paginate through per keyword/subreddit combination or subreddit listing. |
limitCommentsPerPage | No | integer | min 1; default 50 | Max comments to fetch for a single post. |
maxCommentDepth | No | integer | min 1; max 20; default 5 | Max depth of nested comment replies parsed. Depth 1 = top-level only. |
limitUserPages | No | integer | min 1; default 2 | Max pages fetched per user for submitted posts and comments. |
maxItemsPerUser | No | integer | min 1; default 20 | Max submitted posts and max comments fetched per user. |
maxSubredditsInfo | No | integer | min 1; max 100; default 25 | Max subreddits returned when fetchTopSubreddits is enabled. |
proxyConfiguration | No | object | editor: proxy | Apify Proxy configuration. By default the actor connects directly and auto-escalates through a datacenter, then residential, proxy tier if a request is blocked. |
Example input:
{"keywords": ["AI chip"],"subreddits": ["technology", "artificial"],"startUrls": [],"excludeKeywords": ["crypto"],"dateFrom": "2026-06-01","dateTo": "2026-07-01","minScore": 10,"minComments": 5,"flairFilter": "Discussion","sortSearch": "new","timeFilter": "all","enableSearch": true,"ignoreStartUrls": false,"searchForPosts": true,"enableSubreddit": true,"sortSubreddit": "new","enablePost": true,"skipComments": false,"enableUser": true,"skipUserPosts": false,"fetchUserProfile": true,"fetchUserSubmitted": true,"fetchUserComments": true,"enableSubredditInfo": true,"skipCommunity": false,"fetchTopSubreddits": false,"maxItemsToSave": 50,"limitPostsPerPage": 10,"limitCommunityPages": 2,"limitCommentsPerPage": 50,"maxCommentDepth": 5,"limitUserPages": 2,"maxItemsPerUser": 20,"maxSubredditsInfo": 25,"proxyConfiguration": { "useApifyProxy": false }}
The most common input mistake is leaving subreddits empty while expecting scoped results: with no subreddit given, the keyword search runs unscoped across all of Reddit through the fallback archive only, which can lag behind the very latest posts.
⬆️ Output
Every row is typed, normalized JSON with a consistent field set per type. Download as JSON, CSV, or Excel from the Output tab, or pull the dataset through the Apify API. Every row also carries type, isChild, and scrapedAt; the table below lists all nine type values the actor writes.
type | Source | isChild |
|---|---|---|
search | Keyword × subreddit search match (searchQuery, sourceSubreddit) | false |
subreddit_post | Post from a Start-URL subreddit listing (sourceSubreddit) | false |
post | Post from a Start URL | false |
comment | Comment on a scraped post (postId, depth) | true |
user_profile | A scraped user's karma/activity summary | false |
user_post | A post submitted by a scraped user | true |
user_comment | A comment made by a scraped user | true |
subreddit_info | Metadata for a Start-URL subreddit | false |
top_subreddit | A subreddit in the subscriber-count ranking | false |
Scraped post
search, subreddit_post, post, and user_post rows share this shape (a search row additionally carries searchQuery and sourceSubreddit):
{"type": "search","isChild": false,"searchQuery": "AI chip","sourceSubreddit": "artificial","id": "1abcde","title": "New AI chip announced by startup","author": "example_user","subreddit": "artificial","score": 452,"upvoteRatio": 0.94,"numComments": 87,"createdUtc": 1783670400,"createdAt": "2026-08-05T12:03:00.000Z","url": "https://www.reddit.com/r/artificial/comments/1abcde/new_ai_chip/","permalink": "https://www.reddit.com/r/artificial/comments/1abcde/new_ai_chip/","isSelf": true,"selftext": "Full post body text here...","linkFlairText": "Discussion","over18": false,"spoiler": false,"stickied": false,"postHint": "","thumbnail": "","domain": "self.artificial","edited": false,"numCrossposts": 2,"gilded": 0,"isVideo": false,"isOriginalContent": false,"subredditSubscribers": 987654,"scrapedAt": "2026-08-15T09:15:00.000Z"}
Scraped comment
comment and user_comment rows share this shape (a comment row additionally carries postId):
{"type": "comment","isChild": true,"postId": "1abcde","id": "kzab12c","parentId": "t3_1abcde","linkId": "t3_1abcde","author": "another_user","subreddit": "artificial","body": "Interesting — how does this compare to existing chips?","score": 12,"createdUtc": 1783672000,"createdAt": "2026-08-05T12:26:40.000Z","permalink": "https://www.reddit.com/r/artificial/comments/1abcde/new_ai_chip/kzab12c/","distinguished": "","isSubmitter": false,"depth": 0,"scrapedAt": "2026-08-15T09:15:01.000Z"}
Scraped subreddit
subreddit_info and top_subreddit rows share this shape:
{"type": "subreddit_info","isChild": false,"name": "artificial","title": "Artificial Intelligence","description": "Reddit's home for artificial intelligence news and discussion.","subscribers": 987654,"activeUsers": 1240,"createdUtc": 1234567890,"createdAt": "2009-02-13T23:31:30.000Z","over18": false,"subredditType": "public","url": "https://www.reddit.com/r/artificial/","totalPosts": null,"totalComments": null,"scrapedAt": "2026-08-15T09:15:02.000Z"}
Scraped user
{"type": "user_profile","isChild": false,"username": "example_user","userSubmittedCount": 12,"userCommentsCount": 20,"postKarma": 4521,"commentKarma": 18320,"totalKarma": 22841,"numPosts": 340,"numComments": 2110,"earliestPostAt": "2016-03-02T08:11:00.000Z","lastPostAt": "2026-08-10T17:42:00.000Z","scrapedAt": "2026-08-15T09:15:03.000Z"}
Every run pushes one dataset row per event, charged as row_result. There is no separate uncharged error or accounting row — every row written to the dataset is a row_result charge, so Actor.log warnings for a failed target (a post that couldn't be found, a data source unavailable after retries) do not add a dataset row and are not charged.
How does Reddit Scraper By Multiple Subreddits & Keyword Search compare to other Reddit scrapers?
| Feature | This Actor | Generic single-purpose Reddit scraper |
|---|---|---|
| Output format | Flat, typed JSON per entity type | ✅/❌ varies; many require post-processing of nested Reddit "Listing" JSON |
| Multi-subreddit search in one run | ✅ every keyword × every subreddit in one job | ❌ typically one subreddit per run |
| Real date-range filter | ✅ dateFrom/dateTo genuinely bounds the query | ❌ often a cosmetic or absent filter |
| Entity coverage | ✅ posts, comments, subreddits, and users in one actor | ❌ most cover a single entity type |
| Login/API key required | ✅ none required | varies by tool |
If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML or raw Reddit "Listing" JSON inside an agent loop is a reliability failure mode, not a feature.
How many results can you scrape with Reddit Scraper By Multiple Subreddits & Keyword Search?
There is no hard cap in the Actor itself beyond what you set: maxItemsToSave (default 50) is the global ceiling on rows saved across the entire run, across every mode combined, and the run stops collecting once it's reached. Within that budget, limitPostsPerPage × limitCommunityPages bounds how many posts are targeted per keyword/subreddit combination, and limitUserPages bounds pagination per user. Each page request from the underlying archive backend is itself capped at 100 items per page — a real technical constraint from the data source, not a configurable input. Set maxItemsToSave as high as you need; the actor keeps paginating within your other limit fields until either that cap or the source data is exhausted.
Integrate Reddit Scraper By Multiple Subreddits & Keyword Search and automate your workflow
Reddit Scraper By Multiple Subreddits & Keyword Search works with any language or tool that can send an HTTP request.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"keywords": ["AI chip"],"subreddits": ["technology", "artificial"],"maxItemsToSave": 50,}# Actor ID is shown on this Actor's "API" tab in Apify Console.run = client.actor("reddit-scraper-by-multiple-subreddits-and-keyword-search").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["type"], item.get("title") or item.get("username"))
Works in Python, Node.js, Go, Ruby, cURL.
Automation platforms (n8n, Make)
Apify publishes an official Apify node for n8n and an official Apify app for Make, both of which can run any Actor by its ID, including this one — set the Actor ID above as the node/module's target and pass the same input fields shown in this README. Trigger a run on a schedule, then feed the resulting dataset into your existing workflow.
Is it legal to scrape Reddit?
Yes — this Actor only collects publicly accessible Reddit content: posts, comments, subreddit listings, and user profiles that don't require a login to view. Because the output includes personal data (usernames, comment authorship, karma totals tied to an identifiable Reddit account), GDPR and CCPA considerations apply to how you store and use it, not just how you collect it — you need a lawful basis for processing that data, particularly for EU or California data subjects. Scraping is generally permitted for public web data, but any commercial use involving bulk personal data should be reviewed against your own jurisdiction's requirements. Consult legal counsel for commercial use cases involving bulk personal data.
Frequently asked questions
Does Reddit Scraper By Multiple Subreddits & Keyword Search work without a Reddit account?
Yes. No Reddit account, OAuth app, or login is required for any mode — the actor connects to public, credential-free data sources rather than the logged-in reddit.com site.
How often is the scraped data updated?
Subreddit-scoped searches and Start-URL modes fetch data live on each run. Unscoped whole-of-Reddit search (no subreddits given) falls back to a broader archive that can lag behind the very latest posts, which is disclosed rather than presented as live. A user's karma/activity totals are a periodically-updated aggregate rather than a live-second snapshot; submitted posts and comments are still fetched live per run.
What happens if a post is deleted or a subreddit is private?
A deleted or removed author or body is normalized to an empty string rather than left as the literal "[deleted]"/"[removed]" text. If a post ID in startUrls can't be found, no row is pushed for it and a warning is logged. A private, banned, or nonexistent subreddit simply returns no results for that target rather than erroring out the whole run.
Can I scrape private or restricted Reddit content?
No. Only publicly accessible posts, comments, subreddits, and profiles are returned — private subreddits, suspended or shadowbanned accounts, and any content that requires a logged-in session are out of scope.
Do I need to pay Reddit separately to use this Actor?
No. This Actor runs on Apify's pay-per-event pricing (charged per row_result), independent of Reddit's own API billing — you don't need a Reddit developer account or OAuth credentials at all.
Does Reddit Scraper By Multiple Subreddits & Keyword Search work for AI agent workflows and LLM pipelines?
Yes. It's callable as an HTTP endpoint through apify_client (or any HTTP client) from any agent framework. Every response is typed JSON — no HTML and no selectors — so it can go straight into an LLM context window or a vector store without a parsing step.
How does it handle Reddit's anti-bot defenses?
Every request goes through a resilience ladder that starts with a direct connection and automatically escalates to an Apify datacenter proxy, then a residential proxy, whenever a response looks blocked (HTTP 401/403/429/5xx, or response text containing "unusual traffic," "captcha," or a rate-limit message). Failed requests are retried with a short backoff before escalating, and the User-Agent string rotates between requests.
How does this variant compare to the base Reddit Scraper?
This Actor is a strict superset of API-Empire's base Reddit Scraper: every base input still works unmodified (the legacy searchTerms, searchCommunity, and filterByDate fields are used automatically as a fallback), and it adds multi-subreddit fan-out plus a real dateFrom/dateTo range, keyword-exclude, minimum-score, minimum-comment, and flair filters that are genuinely applied against each record, not decorative.
Does it return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names across every mode. Pass it directly into an LLM's context window, index it into a vector store, or route it through an agent tool call.
Can I use it without managing proxies?
Yes. By default the actor connects directly and only escalates through Apify's proxy tiers automatically when a request is blocked or rate-limited. You can also configure Apify Proxy explicitly via the proxyConfiguration input if you want it engaged from the start.
What happens when Reddit changes its structure or blocks the scraper?
The actor is maintained and its output schema stays stable — field names and types on your end don't change when Reddit changes its own site or backend. No specific turnaround time is promised for any given fix.
Your feedback
Found a bug or missing a field? We want to know. Open an issue on this Actor's Issues tab in Apify Console with your run ID and input — that's the fastest way to get a fix scheduled and signals this Actor is actively maintained.