Bulk Reddit Search Scraper avatar

Bulk Reddit Search Scraper

Pricing

$30.00/month + usage

Go to Apify Store
Bulk Reddit Search Scraper

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

Yevhenii Molodtsov

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

24 days ago

Last modified

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

FeatureBenefit
Bulk Query ProcessingRun 100+ searches in one actor run instead of 100 separate runs
No Reddit API keyWorks without Reddit API credentials or OAuth setup
profileUrl MirroringYour 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 RecoveryEvery post saved the moment it's scraped; state checkpointed between queries
Query IsolationOne 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)

  1. Open the actor in Apify Console. Go to the Bulk Reddit Search Scraper page and click Try actor.
  2. 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.
  3. 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.
  4. 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

ParameterTypeDescription
queriesArrayList of {profileUrl, searchQuery} objects. Batch as many as you need.

Search Options

ParameterTypeDefaultDescription
searchTimeString"all"Time filter: hour, day, week, month, year, all
sortString"new"Sort: new, hot, relevance, top, comments
includeNSFWBooleantrueInclude 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.
searchModeString"raw"Query mode: raw, exact, and, or (see below)
searchTypeString"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

ModeInputTransformed QueryUse Case
rawEmily MillerEmily MillerReddit default (implicit AND)
exactEmily Miller"Emily Miller"Exact phrase, prevents typo fixes
andEmily MillerEmily AND MillerExplicit AND (same as raw)
orTaylor SwiftTaylor OR SwiftMatch 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

ParameterTypeDefaultDescription
maxItemsPerQueryNumber25Posts per query (1-500)
maxItemsNumberGlobal cap across all queries

Performance & Infrastructure

ParameterTypeDefaultDescription
fastModeBooleantrue~45% cheaper search-page extraction (see field availability table below)
maxConcurrencyNumber3Parallel queries (2 for 1GB RAM, 3 for 2GB)
proxyConfigurationObjectApify residentialResidential 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 numberOfreplies spelling (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

FieldStandard ModeFast Mode
body (post text)Full textAlways null
username, userId, flairReal valuesUsually "[deleted]" / null (not shown on the search page)
isVideo, videoUrlDetectedAlways false / null
upVotes, numberOfreplies, createdAtExactApproximate (parsed from the rendered page)
isNSFWReliable (Reddit's flag)Best-effort (detected from the search page)
title, url, communityName, thumbnailUrlAvailableAvailable

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):

ScenarioModeTimeCost
3 queries, 25 posts eachFast75s$0.0021
3 queries, 25 posts eachStandard137s$0.0038
10 queries, 50 posts eachFast~4 min~$0.035
50 queries, 25 posts eachFast~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 its profileUrl, searchQuery, final status (success, partial, failed, or skipped), postsFound, postsSaved, and the error / 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

WorkloadMemoryConcurrencyNotes
1-5 queries1024 MB2Minimum viable
5-15 queries2048 MB3Recommended
15-50 queries2048 MB2-3Lower concurrency for stability
50+ queries4096 MB3Large 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. maxItemsPerQuery accepts 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 dependencies
apify run # Run locally with Apify proxies
npm test # Run tests
npm run format # Format code

Changelog

  • v1.1 - includeNSFW: false now actually filters out NSFW posts; removed unused timeoutSecs input; 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.