Bulk Reddit Search Scraper
Pricing
$30.00/month + usage
Bulk Reddit Search Scraper
Scrape Reddit posts by keyword — run 100+ searches in one job, no Reddit API key needed. Filter by time and sort, tag every post with your own routing ID, export JSON or CSV. Fast Mode cuts compute cost ~45%. Crash-safe with incremental saving. For brand monitoring, social listening, research.
Pricing
$30.00/month + usage
Rating
0.0
(0)
Developer
Yevhenii Molodtsov
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
1
Monthly active users
24 days ago
Last modified
Categories
Share
Batch-process hundreds of Reddit searches in a single run — no Reddit API key needed. Built for teams that need to monitor multiple topics, brands, or people across Reddit without running separate scrapers. Every post lands in an Apify Dataset you can export as JSON, CSV, or Excel, or pull through the Apify API.
Why This Scraper?
Most Reddit scrapers handle one search at a time. This one processes multiple queries in parallel and includes your routing identifier (profileUrl) in every result—so you can easily match posts back to the correct profile, topic, or campaign in your downstream systems.
Perfect for:
- Social listening platforms tracking multiple brands/celebrities
- Research teams monitoring various topics simultaneously
- Marketing agencies handling multiple client campaigns
- Anyone who needs to batch Reddit searches efficiently
Key Features
| Feature | Benefit |
|---|---|
| Bulk Query Processing | Run 100+ searches in one actor run instead of 100 separate runs |
| No Reddit API key | Works without Reddit API credentials or OAuth setup |
| profileUrl Mirroring | Your identifier echoed in every result for easy routing |
| Fast Mode (45% Cheaper) | Extracts posts from the search page — fewer fields, much lower cost (see table) |
| Crash Recovery | Every post saved the moment it's scraped; state checkpointed between queries |
| Query Isolation | One bad query never kills the run — failures are logged and the run continues |
How profileUrl Mirroring Works
When you search for "Kim Kardashian" with profileUrl: "https://myapp.com/profiles/kim", every returned post includes that URL:
{"profileUrl": "https://myapp.com/profiles/kim","title": "Kim Kardashian's new business venture...","url": "https://reddit.com/r/entertainment/...",...}
This eliminates the need for post-processing joins—your pipeline immediately knows which profile each post belongs to.
Quick Start
{"queries": [{ "profileUrl": "https://myapp.com/kim", "searchQuery": "Kim Kardashian" },{ "profileUrl": "https://myapp.com/taylor", "searchQuery": "Taylor Swift" }],"searchTime": "week","maxItemsPerQuery": 50,"fastMode": true}
How to Scrape Reddit Posts (Step by Step)
- Open the actor in Apify Console. Go to the Bulk Reddit Search Scraper page and click Try actor.
- Enter your queries. Paste one or more
{profileUrl, searchQuery}pairs into the Search Queries field, then pick a time filter (searchTime) and sort order. The defaults (residential proxy, Fast Mode) work out of the box. - Click Start. Posts stream into the run's Dataset in real time as each query completes — you don't have to wait for the whole run to finish.
- Export your data. Open the Storage → Dataset tab and download the results as JSON, CSV, or Excel, or fetch them programmatically via the Apify API (see Integrations & API).
Input Parameters
Required
| Parameter | Type | Description |
|---|---|---|
queries | Array | List of {profileUrl, searchQuery} objects. Batch as many as you need. |
Search Options
| Parameter | Type | Default | Description |
|---|---|---|---|
searchTime | String | "all" | Time filter: hour, day, week, month, year, all |
sort | String | "new" | Sort: new, hot, relevance, top, comments |
includeNSFW | Boolean | true | Include adult (NSFW) content. When disabled, posts flagged as adult are filtered out. In Fast Mode detection is best-effort (based on the search page), so occasional NSFW items may slip through. |
searchMode | String | "raw" | Query mode: raw, exact, and, or (see below) |
searchType | String | "posts" | posts (recommended) applies Reddit's posts-only search filter; all searches without it. Either way, the output contains posts only — comments are never scraped. |
Search Mode Explained
| Mode | Input | Transformed Query | Use Case |
|---|---|---|---|
raw | Emily Miller | Emily Miller | Reddit default (implicit AND) |
exact | Emily Miller | "Emily Miller" | Exact phrase, prevents typo fixes |
and | Emily Miller | Emily AND Miller | Explicit AND (same as raw) |
or | Taylor Swift | Taylor OR Swift | Match any word |
Recommendation: Use exact mode for person names and usernames. It prevents Reddit's spell correction (e.g., nitpicknate → "nitpicknate" instead of being auto-corrected to "nitpick rate") and enables "no results" detection.
Results Control
| Parameter | Type | Default | Description |
|---|---|---|---|
maxItemsPerQuery | Number | 25 | Posts per query (1-500) |
maxItems | Number | — | Global cap across all queries |
Performance & Infrastructure
| Parameter | Type | Default | Description |
|---|---|---|---|
fastMode | Boolean | true | ~45% cheaper search-page extraction (see field availability table below) |
maxConcurrency | Number | 3 | Parallel queries (2 for 1GB RAM, 3 for 2GB) |
proxyConfiguration | Object | Apify residential | Residential proxies are required — Reddit blocks datacenter IPs. Without residential proxies, queries fail with SEARCH_FAILED. The default uses Apify's residential proxy group. |
Output Format
Each post is pushed individually to the dataset. A Standard Mode record contains every field:
{"profileUrl": "https://myapp.com/kim","id": "t3_abc123","dataType": "post","title": "Kim Kardashian announces new skincare line","url": "https://www.reddit.com/r/entertainment/comments/abc123/...","createdAt": "2026-01-27T14:30:00.000Z","upVotes": 1542,"numberOfreplies": 234,"communityName": "r/entertainment","username": "redditor123","userId": "t2_9x8y7z","body": "Full post content here...","flair": "News","thumbnailUrl": "https://b.thumbs.redditmedia.com/abc123.jpg","imageUrls": ["https://preview.redd.it/abc123.jpg?width=640&format=pjpg"],"videoUrl": null,"isVideo": false,"isNSFW": false}
A Fast Mode record has the same shape, but fields that aren't visible on the search results page come back empty:
{"profileUrl": "https://myapp.com/kim","id": "t3_def456","dataType": "post","title": "Discussion about the new skincare line","url": "https://www.reddit.com/r/entertainment/comments/def456/...","createdAt": "2026-01-27T13:05:00.000Z","upVotes": 310,"numberOfreplies": 45,"communityName": "r/entertainment","username": "[deleted]","userId": null,"body": null,"flair": null,"thumbnailUrl": "https://b.thumbs.redditmedia.com/def456.jpg","imageUrls": ["https://b.thumbs.redditmedia.com/def456.jpg"],"videoUrl": null,"isVideo": false,"isNSFW": false}
Note: The
numberOfrepliesspelling (lowercase "r") is intentional and kept stable for backward compatibility with downstream consumers.
Fast Mode vs Standard Mode
Fast Mode extracts posts directly from the rendered search results page instead of fetching each post's .json endpoint. Measured runs show it cuts compute cost and run time by about 45% — but the search page simply doesn't show everything, so some fields are unavailable or approximate.
Field Availability by Mode
| Field | Standard Mode | Fast Mode |
|---|---|---|
body (post text) | Full text | Always null |
username, userId, flair | Real values | Usually "[deleted]" / null (not shown on the search page) |
isVideo, videoUrl | Detected | Always false / null |
upVotes, numberOfreplies, createdAt | Exact | Approximate (parsed from the rendered page) |
isNSFW | Reliable (Reddit's flag) | Best-effort (detected from the search page) |
title, url, communityName, thumbnailUrl | Available | Available |
Rule of thumb: Fast Mode is ideal for monitoring and alerting — you learn that a post exists, its title, link, community, and rough engagement, at ~45% lower cost. Use Standard Mode when you need post text, author identity, video links, or exact counts.
How Fast Mode Saves Money
Standard Mode: Browser scrolls search → Collects URLs → HTTP fetches each post individually → Full data extraction
Fast Mode: Browser scrolls search → Extracts data directly from DOM → Done
By skipping the per-post HTTP fetch phase, Fast Mode reduces compute time and network overhead by approximately 45%.
Real-World Cost Comparison
Based on actual test runs (January 2026):
| Scenario | Mode | Time | Cost |
|---|---|---|---|
| 3 queries, 25 posts each | Fast | 75s | $0.0021 |
| 3 queries, 25 posts each | Standard | 137s | $0.0038 |
| 10 queries, 50 posts each | Fast | ~4 min | ~$0.035 |
| 50 queries, 25 posts each | Fast | ~15 min | ~$0.11 |
Bottom line: if the Fast Mode field set covers your use case, you get the posts at roughly half the compute cost.
Built for Reliability
This scraper is designed so that a crash, a migration, or a broken query costs you as little data as possible:
- Per-post incremental saving. Every post is pushed to the dataset the moment it's extracted — not at the end of the query or run. If the actor crashes mid-run, everything scraped up to that second is already saved.
- Checkpoint & resume. After each query completes, progress is checkpointed. If the Apify platform migrates the actor to another server mid-run, it resumes from the last checkpoint instead of starting over — already-completed queries are skipped.
- One bad query never kills the run. Each query is isolated: if one fails (bad syntax, no results, temporary block), it's recorded with an error type and the run moves on to the next query. Only if more than 80% of queries have failed after at least 5 completed queries does the actor abort early to protect your budget — the remaining queries are marked
skipped, and the run still succeeds with all the data collected so far. - Rate limit handling. Automatic retries with session and proxy rotation when Reddit throttles or blocks a request.
Run Statistics & Per-Query Results
Besides the dataset, every run writes two records to its key-value store — great for debugging and pipeline monitoring:
STATISTICS— run-level summary: queries processed / succeeded / failed / partial / skipped, total posts saved, global limit, concurrency, mode, and whether the run aborted early.QUERY_RESULTS— one entry per query with itsprofileUrl,searchQuery, finalstatus(success,partial,failed, orskipped),postsFound,postsSaved, and theerror/errorType(e.g.SEARCH_FAILED,NO_RESULTS) if anything went wrong.
Check QUERY_RESULTS first when a query returns fewer posts than expected — it tells you exactly which query had a problem and why.
Memory Recommendations
| Workload | Memory | Concurrency | Notes |
|---|---|---|---|
| 1-5 queries | 1024 MB | 2 | Minimum viable |
| 5-15 queries | 2048 MB | 3 | Recommended |
| 15-50 queries | 2048 MB | 2-3 | Lower concurrency for stability |
| 50+ queries | 4096 MB | 3 | Large batch jobs |
Proxy Requirements
Residential proxies are required. Reddit aggressively blocks datacenter IPs — without residential proxies, queries fail with SEARCH_FAILED.
The default configuration uses Apify's residential proxy group, which works out of the box. If you use custom proxies, ensure they're residential.
Limitations
- ~250 results per query: Reddit's own search surfaces only about 250 results for any single query, regardless of the requested limit.
maxItemsPerQueryaccepts up to 500, but expect Reddit to stop delivering new posts around the 250 mark. To go deeper on a topic, split it into multiple narrower queries (e.g. by time window or subreddit keyword). - Posts only: The scraper returns posts — never comments or community/user profiles, even with
searchType: "all". - Fast Mode field gaps:
body, author fields, and video fields are unavailable in Fast Mode, and counts are approximate (see the field availability table above). - Rate limits: Reddit may throttle aggressive scraping. The scraper retries with session and proxy rotation automatically, but very large jobs may take longer.
Example Use Cases
Social Listening Platform
Monitor mentions of 50 celebrities across Reddit, routing each mention to the correct profile:
{"queries": [{ "profileUrl": "https://platform.com/celeb/1", "searchQuery": "Taylor Swift" },{ "profileUrl": "https://platform.com/celeb/2", "searchQuery": "Bad Bunny" }// ... 48 more],"searchTime": "day","maxItemsPerQuery": 25,"fastMode": true}
Brand Monitoring
Track your brand and competitors:
{"queries": [{ "profileUrl": "brand:ours", "searchQuery": "\"Acme Corp\" OR \"Acme Inc\"" },{ "profileUrl": "brand:competitor1", "searchQuery": "\"Big Corp\"" },{ "profileUrl": "brand:competitor2", "searchQuery": "\"Other Inc\"" }],"searchTime": "week","sort": "relevance","maxItemsPerQuery": 100}
Research Data Collection
Gather posts about specific topics for analysis (Standard Mode for full post text):
{"queries": [{ "profileUrl": "topic:ai", "searchQuery": "artificial intelligence" },{ "profileUrl": "topic:ml", "searchQuery": "machine learning" },{ "profileUrl": "topic:llm", "searchQuery": "large language models" }],"searchTime": "month","sort": "top","maxItemsPerQuery": 200,"fastMode": false}
Integrations & API
Run the scraper programmatically and pull results into your own pipeline. The actor handle is xmolodtsov/reddit-scraper.
Start a run with curl
curl -X POST "https://api.apify.com/v2/acts/xmolodtsov~reddit-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"queries": [{ "profileUrl": "https://myapp.com/kim", "searchQuery": "Kim Kardashian" }],"searchTime": "week","maxItemsPerQuery": 25}'
Node.js (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('xmolodtsov/reddit-scraper').call({queries: [{ profileUrl: 'https://myapp.com/kim', searchQuery: 'Kim Kardashian' }],searchTime: 'week',maxItemsPerQuery: 25,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Scraped ${items.length} posts`);
You can also wire runs into Zapier, Make, or webhooks via the standard Apify integrations, and export any dataset as JSON, CSV, or Excel from the Console or API.
FAQ
Is it legal to scrape Reddit? The scraper only collects publicly available posts — the same content anyone can see without logging in. That said, how you use scraped data is your responsibility: respect Reddit's terms, applicable privacy laws (GDPR/CCPA) when posts contain personal data, and consult a lawyer for your specific use case.
Do I need Reddit API credentials? No. This scraper works without a Reddit API key, OAuth app, or Reddit account — one less registration and no Reddit API pricing to worry about.
Why do I need residential proxies?
Reddit aggressively blocks datacenter IP ranges. With datacenter proxies (or no proxies), searches get blocked and queries fail with SEARCH_FAILED. The default input already uses Apify's residential proxy group, so it works out of the box.
How much does it cost to scrape 1,000 posts? Based on measured runs, compute cost in Fast Mode works out to roughly $0.03–$0.09 per 1,000 posts depending on batch shape (fewer, larger queries are cheaper per post), plus residential proxy bandwidth and the actor rental fee. Standard Mode costs roughly twice the compute. See the cost comparison table above for concrete measured runs.
A query returned 0 posts — is something broken?
Not necessarily: check the QUERY_RESULTS record in the run's key-value store. NO_RESULTS means Reddit genuinely found nothing (try searchMode: "raw" or a broader searchTime); SEARCH_FAILED usually points to a proxy/blocking issue.
Development
npm install # Install dependenciesapify run # Run locally with Apify proxiesnpm test # Run testsnpm run format # Format code
Changelog
- v1.1 -
includeNSFW: falsenow actually filters out NSFW posts; removed unusedtimeoutSecsinput; documentation honesty overhaul (Fast Mode field availability, real limits) - v1.0 - Initial release with Fast Mode, bulk queries, profileUrl mirroring, and migration persistence
License
MIT
Questions? Open an issue on the GitHub repository.
