Reddit Scraper By Multiple Subreddits & Keyword Search avatar

Reddit Scraper By Multiple Subreddits & Keyword Search

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Reddit Scraper By Multiple Subreddits & Keyword Search

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

API Empire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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.

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 depth field
  • 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 TypeKey FieldsJSON Field Names
Poststitle, author, score, comment count, flair, creation datetitle, author, score, upvoteRatio, numComments, linkFlairText, createdAt, permalink
Commentsbody text, score, nesting depth, parent linkbody, score, depth, parentId, linkId, isSubmitter
Subredditssubscriber count, description, active users, typename, subscribers, activeUsers, description, subredditType, totalPosts
Userskarma totals, submitted-item countsusername, 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.

FeatureReddit Data APIReddit Scraper By Multiple Subreddits & Keyword Search
AuthenticationOAuth app + Reddit developer accountNone — no login, token, or Reddit account
Commercial accessSubject to Reddit's Data API Terms; paid tier for high-volume commercial use since 2023Pay-per-result via Apify, no separate Reddit agreement
Multi-subreddit keyword searchOne call per subreddit/listing; no built-in cross-subreddit fan-outOne job searches every keyword across every listed subreddit
Date-range searchGoverned by each endpoint's own listing/search behaviorReal dateFrom/dateTo range plus a relative time-window filter
Output formatRaw Reddit "Listing"/"Thing" JSON with data wrappers and t1_/t3_ prefixesFlat, normalized JSON with consistent field names across every mode
SetupRegister an app, obtain credentials, implement the OAuth flowFill 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)

  1. Open this Actor on its Apify Store listing and click Try for free (or Start, if you already have it saved).
  2. No field is strictly required — provide keywords and subreddits for a multi-subreddit keyword search, or startUrls (a post, subreddit, or user URL) to scrape a specific target directly. Both can run in the same job.
  3. Set the filters and per-mode toggles you need — dateFrom/dateTo, minScore, minComments, flairFilter for search; enableSubreddit/enablePost/enableUser/enableSubredditInfo to turn Start-URL modes on or off; and the limit fields to bound how much each mode fetches.
  4. Click Start and watch rows land in the Output tab as they're scraped.
  5. 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.

ParameterRequiredTypeConstraintsDescription
keywordsNoarraystringListOne 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.
subredditsNoarraystringListOne 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.
startUrlsNoarraystringList; minItems 0Reddit post, subreddit, or user URLs to scrape directly, alongside the keyword search.
excludeKeywordsNoarraystringList; default []Terms to exclude from search results; a matching post is dropped and does not count toward the item budget.
dateFromNostringdatepicker (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.
dateToNostringdatepicker (absolute or relative)Only include posts created on or before this date.
minScoreNointegermin 0; default 0Only include posts with at least this many upvotes.
minCommentsNointegermin 0; default 0Only include posts with at least this many comments.
flairFilterNostringtextfield; default ""Only include posts whose link flair text contains this substring (case-insensitive).
sortSearchNostringenum: relevance, new, hot, top, comments; default newOrder of search results. relevance/hot/top rank by score; new is newest first; comments is most comments first.
timeFilterNostringenum: hour, day, week, month, year, all; default allRestricts search results to a relative time window; combines with dateFrom (more restrictive lower bound wins).
enableSearchNobooleandefault trueRuns the keyword search when keywords are set and no Start URLs apply.
ignoreStartUrlsNobooleandefault falseWhen enabled, Start URLs are not scraped — only the keyword search runs.
searchForPostsNobooleandefault trueInclude posts in search results (the only search scope supported).
enableSubredditNobooleandefault trueScrapes any subreddit URLs in Start URLs for their post listing.
sortSubredditNostringenum: hot, new, top, rising, controversial; default newOrder 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.
enablePostNobooleandefault trueScrapes any post URLs in Start URLs for the post and its comment tree.
skipCommentsNobooleandefault falseIf enabled, comments are not fetched for post URLs.
enableUserNobooleandefault trueScrapes any user profile URLs in Start URLs.
skipUserPostsNobooleandefault falseIf enabled, user profile URLs in Start URLs are ignored entirely.
fetchUserProfileNobooleandefault trueFetches each user's profile/karma summary.
fetchUserSubmittedNobooleandefault trueFetches posts submitted by each user.
fetchUserCommentsNobooleandefault trueFetches comments made by each user.
enableSubredditInfoNobooleandefault trueFetches metadata for subreddits found in Start URLs, plus the optional top-subreddits ranking.
skipCommunityNobooleandefault falseIf enabled, subreddit/community metadata is not fetched.
fetchTopSubredditsNobooleandefault falseAdds a ranking of large subreddits by subscriber count as top_subreddit rows.
searchTermsNoarraystringListLegacy search-term field; used only when keywords is empty.
searchCommunityNostringtextfieldLegacy single-subreddit field; used only when subreddits is empty.
filterByDateNostringdatepickerLegacy date field; used only when dateFrom is empty.
maxItemsToSaveNointegermin 1; default 50Global maximum number of rows saved across the entire run, across every mode combined.
limitPostsPerPageNointegermin 1; default 10Target number of posts per keyword, per subreddit.
limitCommunityPagesNointegermin 1; default 2Max result pages to paginate through per keyword/subreddit combination or subreddit listing.
limitCommentsPerPageNointegermin 1; default 50Max comments to fetch for a single post.
maxCommentDepthNointegermin 1; max 20; default 5Max depth of nested comment replies parsed. Depth 1 = top-level only.
limitUserPagesNointegermin 1; default 2Max pages fetched per user for submitted posts and comments.
maxItemsPerUserNointegermin 1; default 20Max submitted posts and max comments fetched per user.
maxSubredditsInfoNointegermin 1; max 100; default 25Max subreddits returned when fetchTopSubreddits is enabled.
proxyConfigurationNoobjecteditor: proxyApify 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.

typeSourceisChild
searchKeyword × subreddit search match (searchQuery, sourceSubreddit)false
subreddit_postPost from a Start-URL subreddit listing (sourceSubreddit)false
postPost from a Start URLfalse
commentComment on a scraped post (postId, depth)true
user_profileA scraped user's karma/activity summaryfalse
user_postA post submitted by a scraped usertrue
user_commentA comment made by a scraped usertrue
subreddit_infoMetadata for a Start-URL subredditfalse
top_subredditA subreddit in the subscriber-count rankingfalse

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?

FeatureThis ActorGeneric single-purpose Reddit scraper
Output formatFlat, 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 filterdateFrom/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 requiredvaries 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.

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 ApifyClient
client = 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.

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.