Reddit Scraper - Posts, Comments, Users & Virality Insights avatar

Reddit Scraper - Posts, Comments, Users & Virality Insights

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Reddit Scraper - Posts, Comments, Users & Virality Insights

Reddit Scraper - Posts, Comments, Users & Virality Insights

Scrape Reddit posts, comments, user profiles & subreddits - no login or API key. Search any keyword or subreddit, pull full comment threads, and get a virality score, controversy score, engagement, sentiment & question signals on every post. Export JSON, CSV & Excel.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Kelopr_bk

Kelopr_bk

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

6

Monthly active users

19 days ago

Last modified

Features

Limited permissions

Share

👽 Reddit Scraper — Posts, Comments, Users, Communities & Virality Insights

Extract Reddit posts, comment threads, user profiles and subreddit (community) data at scale — no login, no API key, no browser. Point the Actor at a subreddit, a search keyword, or any Reddit URL (post, profile, or search page) and get clean, source‑linked records exported to JSON, CSV, Excel, or the API. 🚀

Every post is automatically scored with a 🔥 virality score and a ⚔️ controversy score, plus engagement velocity, sentiment and question signals — so you can sort straight to what matters instead of eyeballing a raw dump.

✅ Request‑only & reliable. Talks to Reddit's sanctioned OAuth surface (oauth.reddit.com) with an anonymous, read‑only app token — not the IP‑reputation‑gated www.reddit.com/*.json endpoints that block most scrapers. That means it runs on cheap datacenter proxies and keeps working where plain .json scrapers get 403'd.


📑 Table of contents


🎯 What you can do

  • Market & audience research — pull every post in a niche subreddit, sorted by virality, to see what resonates right now.
  • Brand & product monitoring — search Reddit for your brand, product or competitor and track mentions, sentiment and the hottest debates.
  • Lead & community discovery — collect subreddit profiles (size, rules, posting policy) to find where your audience actually hangs out.
  • Content & trend mining — grab top/hot/rising feeds with engagement velocity (scorePerHour) to catch breakouts early.
  • Discussion & UX analysis — pull full comment threads with depth, author participation and question detection.
  • Dataset building for ML / LLMs — export large, clean, deduplicated post + comment corpora with consistent schemas.
  • Creator & user intelligence — collect public profiles with karma breakdown, submitted posts and comment history.

🧭 Workflows (modes)

Pick a Workflow and the Actor knows what to collect. CUSTOM unlocks the individual switches so you can mix result types.

WorkflowCollectsTypical input
PostsSubreddit feeds & keyword search results (with every post scored)Subreddit, search keyword, or subreddit/search URL
CommentsComment threads of matching posts, or a user's comment historyPost permalink, search keyword, or user URL
UsersPublic profiles: karma, status, avatar, descriptionUser profile URL or username search
CommunitiesSubreddit profile: description, members, rules, posting policySubreddit name or URL
Discussion insightsPosts + their comments + a question/participation summaryPost permalink or subreddit
CustomAny combination — toggle posts / comments / users / communities individuallyAnything above

🔗 Inputs: three ways to point it at Reddit

You can mix all three in one run.

  1. Subreddits — Python, r/Python, or https://www.reddit.com/r/Python/. Multi‑subreddit (Python+django) is supported.
  2. Search keywords — one literal phrase per entry (mechanical keyboard). Optionally restrict to one subreddit.
  3. Reddit URLs (startUrls) — full permalinks and redd.it short links are accepted:
    • Post: https://www.reddit.com/r/Python/comments/abc123/title/
    • Profile: https://www.reddit.com/user/spez/
    • Subreddit: https://www.reddit.com/r/dataisbeautiful/
    • Search page: https://www.reddit.com/search/?q=python

Share links (/s/…) must be expanded to the full permalink first — the Actor will tell you if you paste one.


⚡ Quick‑start examples

Top posts from a subreddit this week, with sentiment:

{ "mode": "POSTS", "subreddits": ["Python"], "sort": "top", "time": "week", "maxItems": 50, "sentiment": true }

Search all of Reddit for a keyword and grab the discussion:

{ "mode": "DISCUSSION_INSIGHTS", "searches": ["mechanical keyboard"], "maxItems": 200, "maxCommentsPerPost": 50 }

Scrape a single thread's comments:

{ "mode": "COMMENTS", "startUrls": [{ "url": "https://www.reddit.com/r/AskReddit/comments/abc123/example/" }], "maxCommentsPerPost": 200, "commentSort": "top" }

A user's public profile + post history:

{ "mode": "POSTS", "startUrls": [{ "url": "https://www.reddit.com/user/spez/" }], "maxItems": 100 }

Community profiles with rules:

{ "mode": "COMMUNITIES", "subreddits": ["python", "dataisbeautiful", "MachineLearning"] }

Everything at once (custom):

{
"mode": "CUSTOM",
"subreddits": ["Python"],
"searches": ["fastapi"],
"searchCommunities": true,
"scrapeComments": true,
"maxCommentsPerPost": 20,
"maxItems": 300
}

🔥 The flagship signals, explained

Two numbers you won't find in a raw Reddit JSON dump. Both are 0–100, higher = stronger, computed on every post.

🔥 viralityScore — "is this blowing up?"

Blends four things, log‑scaled so a megathread doesn't break the scale:

ComponentWeightMeaning
Velocity45%Score gained per hour (scorePerHour) — recency‑aware
Volume35%Total reaction (score + comments)
Vote quality12%Upvote ratio — a clean 99% beats a contested 55%
Awards8%Reddit awards received

Sort descending to surface breakout posts the moment they pop.

⚔️ controversyScore — "is this a fight?"

Peaks when the vote is split (upvote ratio near 0.5) and the thread draws far more comments than upvotes. Returns nothing for tiny posts (needs score + comments ≥ 20). Sort descending to find the hottest debates.

Both scores are transparent, rule‑based math over observable counters — not an AI verdict. analysisMethod on each record says so. A post with score=14, a 55% upvote ratio and 60 comments will out‑rank a quiet 500‑upvote announcement on controversy — exactly as you'd expect.

Supporting engagement signals on every post/comment: scorePerHour, commentsPerHour, ageHours, engagementTotal, commentToScoreRatio, isHighEngagement.


📦 Example output

A single post record (trimmed to the headline fields — the full record carries ~70 fields plus native Reddit compatibility fields):

{
"dataType": "post",
"id": "t3_1x1t161",
"title": "Python 3.15 Released",
"url": "https://www.reddit.com/r/Python/comments/1x1t161/python_315_released/",
"subreddit": "Python",
"subredditSubscribers": 1517656,
"author": "treyhunner",
"flair": "News",
"postType": "text",
"score": 537,
"upvoteRatio": 0.99,
"numComments": 72,
"totalAwards": 0,
"createdAt": "2026-10-09T18:29:03+00:00",
"ageHours": 157.78,
"scorePerHour": 3.404,
"engagementTotal": 609,
"isHighEngagement": true,
"viralityScore": 39,
"controversyScore": 7,
"sentimentScore": 0.833,
"sentimentLabel": "positive",
"wordCount": 283,
"containsQuestion": false,
"hasMedia": false,
"bodyStatus": "present"
}

🧩 Drop‑in compatibility. Each post also ships Reddit's native field names (num_comments, upvote_ratio, created_utc, permalink, author_fullname, …) and common aliases (commentsCount, communityName, authorName, crawledAt). Pipelines built for other Reddit scrapers keep working without rewrites.


🗃️ Output fields

Missing values are omitted; 0 and false are kept as real values. Enable Include original source data (rawOutput) to also attach the full raw Reddit object under sourceData.

Post

GroupFields
Identity & textid, parsedId, title, body, bodyHtml, bodyStatus, bodyLength, wordCount, url, contentUrl, domain, outboundUrlHost, postType, flair, isSelf
Authorauthor, authorId, authorFlair, authorPremium
Communitysubreddit, communityName, subredditId, subredditSubscribers
Engagementscore, upVotes, upvoteRatio, numComments, numCrossposts, numDuplicates, totalAwards, gilded
⭐ SignalsviralityScore, controversyScore, scorePerHour, commentsPerHour, ageHours, engagementTotal, isHighEngagement, commentToScoreRatio, containsQuestion
Sentiment (optional)sentimentScore, sentimentLabel, sentimentMethod
MediahasMedia, postType, imageUrls, videoUrls, videoUrl, isGallery, galleryCount, galleryImages, previewImage, mediaAssets, thumbnail, video width/height/duration
Flags & moderationover18, spoiler, locked, archived, pinned, stickied, edited, editedAt, distinguished, isOriginalContent, removedByCategory, isRobotIndexable, content_flags
TimingcreatedAt, createTime, scrapedAt, searchTerm

Comment

id, parsedId, body, bodyHtml, bodyStatus, url, author, authorId, authorFlair, isSubmitter, subreddit, score, upVotes, controversiality, totalAwards, gilded, depth, isTopLevel, parentId, parentKind, postId, postTitle, postUrl, linkId, collapsed, scoreHidden, distinguished, stickied, edited, containsQuestion, wordCount, scorePerHour, ageHours, createdAt, createTime, scrapedAt, plus optional sentiment.

User

id, username, url, profileTitle, description, totalKarma, linkKarma, commentKarma, awardeeKarma, awarderKarma, isGold, isMod, isEmployee, verified, hasVerifiedEmail, acceptFollowers, isNsfw, followersCount, userIcon, snoovatarImg, bannerImg, createdAt, createTime. In USERS/CUSTOM you can also pull the profile's submitted posts and comment history.

Community (subreddit)

id, name, title, url, description, descriptionLong, descriptionHtml, submitText, membersCount, onlineUsersCount, subredditType, submissionType, lang, advertiserCategory, restrictPosting, restrictCommenting, wikiEnabled, suggestedCommentSort, quarantine, over18, content‑policy flags (allowImages, allowVideos, allowGalleries, allowPolls, spoilersEnabled, originalContentTagEnabled), rules (array), rulesCount, communityIcon, bannerImage, headerImage, createdAt, createTime.


🧠 Discussion insights

Choose Discussion insights (or use scrapeComments in Custom) to collect posts and their comment threads, with collapsed replies expanded. Alongside the records, a separate Discussion insights table summarizes each sampled thread:

  • sampleComments, questionComments, authorComments, authorSharePct
  • questionsWithoutSavedReplies — sampled questions that had no reply within the collected sample

A missing reply in the sample does not prove the question is unanswered on Reddit — it reflects only what was collected. These summaries are free; no separate analysis event is charged.


🗓️ Filters & sorting

ControlWhat it does
Sortrelevance, hot, top, new, rising, comments (mapped to what each endpoint supports)
Time rangeall, hour, day, week, month, year — for Top / search
Comment sorttop, new, controversial, old, qa, confidence (Best)
Posts after / beforeKeep posts in a date window — YYYY-MM-DD or full ISO‑8601
Comments after / beforeSame, for comments
Publication cutoff / Only newer thanExclusive cutoff as ISO date or Unix seconds/milliseconds
Only posts with flairKeep only flaired posts
Strict keyword matchKeep only results containing every keyword in title/body
Include NSFW (18+)Off by default
Remove duplicatesOn by default — each item saved once per run

Date cutoffs are exclusive and apply to posts/comments (not profile creation dates). Date‑only upper bounds include the whole UTC day. Invalid input returns a clear corrective message instead of silently scraping the wrong thing. Filtered and duplicate candidates are not billed and do not consume your result limit.


🖼️ Media downloads

  • Download post media — saves up to 3 public Reddit CDN assets per post to the run's key‑value store (8 MB/file, 16 MB/run cap).
  • Download user avatars — saves profile avatars within the same shared allowance.

Original media URLs are always included regardless. Oversized or failed downloads keep the source URL with an explanation. Downloads are restricted to Reddit's own CDNs and never send your API token.


📤 Results, tables & exports

Everything lands in the default dataset (Results), and is mirrored into focused, uncharged tables so you can export exactly what you need:

TabContents
ResultsEvery collected record
Posts / Comments / Users / CommunitiesOne type each, no unrelated rows
Discussion insightsPer‑thread question & participation summary
Source issuesUnavailable/failed sources with reasons
Run summary (OUTPUT)Status, counts by type, stop reason, per‑source diagnostics, applied filters, proxy usage

Export any tab to JSON, CSV, Excel, HTML or RSS, or pull it via the API.


🧮 Limits & how collection stops

  • Max results (maxItems) — total unique saved records across all sources/types. 0 = the 100,000 safety ceiling.
  • Max posts per source (maxPostsPerSource) — cap per subreddit/search/profile; thread comments use their own allowance.
  • Max comments per post (maxCommentsPerPost).

A run can also stop early on budget, time, or when a source is exhausted, rate‑limited or unavailable — the Run summary always states the exact stopReason. Reddit listings page up to ~1,000 items per feed and are not a guaranteed full historical archive; deleted/private/removed content cannot be recovered.


💵 Pricing

This Actor uses Pay‑per‑event. You are charged per successfully saved record in the default dataset (the Store panel shows the current rate), plus the standard Actor Start. The type‑specific tables (Posts/Comments/…) are free mirrors — they never double‑charge. Summaries and Source‑issues rows are not billed. Candidates removed by your filters or dedupe are not billed. Platform usage (compute/proxy) is billed separately per Apify's schedule.

Typical smoke‑test runs collect data in 3–20 seconds on datacenter proxies — this Actor is cheap to run.


🌐 Proxies & reliability

  • Default: Apify datacenter proxy — cheap and sufficient, because access is authorized by OAuth token, not IP.
  • Optional: set your own proxy group (e.g. Residential) in the Proxy field if you ever need it. There is no forced residential escalation that silently inflates cost.
  • Built‑in retries with backoff, token refresh on expiry, per‑source isolation (one bad source never kills the run), request budgets and a no‑progress watchdog.

🔌 Run it from the API

Send the same input JSON to the Actor's run endpoint:

curl -X POST "https://api.apify.com/v2/acts/trakk~reddit-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "mode": "POSTS", "subreddits": ["Python"], "maxItems": 50, "sort": "top" }'

Then read the run's default dataset for all records, or the named posts / comments / users / communities datasets for focused exports. Works with the Apify API, JS/Python clients, webhooks, schedules and integrations (Make, Zapier, n8n, …).


  • Collects public Reddit data only — no login, no private content, no messages.
  • Reddit scores are platform figures that can change; they are not a verified tally of individual votes.
  • Text is kept in its original language. Optional sentiment is an English word‑list heuristic, not AI; unsupported text is unclassified. Question signals use visible ?.
  • No bot/fake‑account/demographic conclusions are inferred.
  • Respect Reddit's terms, content licensing and applicable privacy law (e.g. GDPR/CCPA). You are responsible for how you use collected data.

❓ FAQ

A run succeeded but saved nothing — why? Open Run summary. A recent date cutoff, an unavailable/private source, or a strict filter can legitimately yield zero. The per‑source counters show exactly what was discovered, filtered or skipped.

Do I need a Reddit account, API key or password? No. The Actor authorizes with an anonymous, read‑only app token automatically.

Can I search comments across all of Reddit? Comment search inspects comment text inside threads of matching posts (up to 10 posts, 100 comments each) — it is not Reddit's global comment index. For exact threads, pass post permalinks directly.

Can I collect just a profile? Yes — choose Users and enter a profile URL. Custom has separate switches for submitted posts and comment history.

How do I get the hottest or most controversial content first? Export Results and sort by viralityScore or controversyScore descending.


Built for reliability: request‑only, OAuth‑authorized, no browser. Questions or a field you need added? Open an issue on the Actor page.