Reddit Scraper - Posts, Comments, Subreddits & Users
Pricing
from $0.02 / 1,000 results
Reddit Scraper - Posts, Comments, Subreddits & Users
π₯ ~$0.02/1K results π₯ Scrape Reddit without an account. Search posts, pull a subreddit or user feed, fetch full comment trees by URL, or discover communities. Clean structured JSON, no browser, no proxy required.
Pricing
from $0.02 / 1,000 results
Rating
0.0
(0)
Developer
Kai
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
11
Monthly active users
3 days ago
Last modified
Categories
Share
Reddit Scraper
Collect Reddit posts, complete comment threads, and subreddit profiles as structured data. Search by keyword, read a subreddit or user feed, fetch known posts by URL, or discover communities. Each result is one item in the default dataset. No Reddit account or API key is needed.
Use cases
- Brand and product monitoring: find every post and comment that mentions a name, and track score and sentiment over time.
- Market and audience research: read what a community asks, recommends, and complains about.
- Trend and news tracking: pull the top posts of the day, week, or month from the subreddits that matter to you.
- Discussion datasets: build corpora of posts and threaded comments for NLP, classification, or model evaluation.
- Competitive analysis: follow a company's subreddit, its spokespeople, and the threads about its launches.
- Community discovery: find the subreddits for a topic, ranked by size and activity.
- Content research: collect image galleries, hosted video links, and the reactions to them.
Post, comment, and subreddit data
- Post identity, subreddit and subscriber count, author and flair, title, body in Markdown and optionally HTML, outbound link and domain.
- Post signals: score, upvote ratio, comment, crosspost, and award counts, posting and edit times, moderation state, and status flags such as locked, stickied, archived, spoiler, or over-18.
- Post media: thumbnail with size, preview images, full-size gallery images in order, and Reddit-hosted video with MP4, HLS, and DASH links, duration, dimensions, and an audio flag.
- Comments: author and flair, text in Markdown and optionally HTML, score, controversiality, awards, posting and edit times, depth, permalink, submitter and moderator marks, collapse state, and the post and parent ids that place each comment in its thread.
- Subreddits: names, title, public and full descriptions, subscriber and active user counts, type, submission rules, language, category, icons and banner, and creation time.
Choose how to collect
| What you have | Set mode to | Required input |
|---|---|---|
| A topic or keyword | search | keyword, plus subreddit to stay inside one community |
| A community name | subreddit | subreddit |
| A username | user | username, plus userContent for posts or comments |
| Post URLs or ids | post | postUrls |
| A theme to find communities for | community | keyword |
sort, time, maxItems, and includeNsfw shape the list modes. The
leading results follow your sort and time; later results can be in a
different order. Results do not repeat. The run stops when it reaches
maxItems or Reddit has nothing left. Post mode keeps the supplied order and
always includes the comment thread.
Add comment threads
| Add | Turn on | Control with |
|---|---|---|
| A post's comments | includeComments (always on in post mode) | maxCommentsPerPost and commentSort |
| The complete thread, down to the last reply | expandComments | maxCommentsPerPost: 0 for no cap |
Each comment is saved as its own item right after its post, with the post id,
the parent id, and the depth, so a thread of any size fits and keeps its shape.
Without expandComments, a post comes with the comments Reddit shows on first
load. With it, the whole thread is collected, at any nesting depth. A thread
with eighteen thousand comments takes about three minutes.
Choose the data depth
| Mode | Use it when | Added data |
|---|---|---|
basic (default) | You need the core fields and the smallest records. | Every field except the HTML bodies. Images and video are included. |
detailed | You need the rendered HTML as well. | Everything in basic, plus selftextHtml on posts and bodyHtml on comments. |
Collect posts
In Apify Console, select Input, paste an example, and select Run. Open the default Dataset when the run finishes.
Search Reddit for a topic:
{"mode": "search","keyword": "large language models","sort": "top","time": "week","maxItems": 100}
Search inside one subreddit:
{"mode": "search","keyword": "fine tuning","subreddit": "MachineLearning","sort": "relevance","maxItems": 50}
Read the top posts of a subreddit this month:
{"mode": "subreddit","subreddit": "MachineLearning","sort": "top","time": "month","maxItems": 200}
Monitor new posts with their comments:
{"mode": "subreddit","subreddit": "startups","sort": "new","maxItems": 50,"includeComments": true,"maxCommentsPerPost": 100}
Read a user's posts, or their comments:
{"mode": "user","username": "spez","userContent": "submitted","sort": "new","maxItems": 50}
{"mode": "user","username": "spez","userContent": "comments","maxItems": 100}
Fetch known posts with their complete threads:
{"mode": "post","postUrls": ["https://www.reddit.com/r/AskReddit/comments/1w4h5e6/doctors_of_reddit_whats_something_patients/","https://redd.it/1w415xd","t3_1w10tax","1vv2nkh"],"maxCommentsPerPost": 0,"commentSort": "top","expandComments": true}
Discover subreddits for a theme:
{"mode": "community","keyword": "machine learning","maxItems": 25}
Input
Pick one mode and fill its target field. keyword drives search and
community, subreddit drives subreddit and narrows search, username
drives user, and postUrls drives post. A missing target stops the run with
a clear message before anything is collected. Fields that do not apply to the
selected mode are ignored.
| Field | Type | Default | Behaviour |
|---|---|---|---|
mode | enum | search | search, subreddit, user, post, or community. |
keyword | string | empty | Search terms for search and community. Reddit search syntax such as quoted phrases works. |
subreddit | string | empty | Community name, with or without r/. The target of subreddit mode and an optional filter for search. |
username | string | empty | Reddit username, with or without u/. The target of user mode. |
postUrls | string[] | [] | Targets of post mode: full post URLs, redd.it short links, t3_ fullnames, or bare ids. A post listed more than once is saved once. Unparseable entries are skipped and counted in the log. |
sort | enum | hot | relevance, hot, top, new, rising, or comments. The leading results follow this sort; later results can be in a different order. A value the selected mode does not offer falls back to the nearest one: rising becomes hot in search, and relevance or comments become hot in a feed. |
time | enum | all | hour, day, week, month, year, or all. Applies to top and controversial feeds and to search. A window narrower than all is a filter: every result falls within it. In a subreddit or user feed, top for that window then leads in place of hot, new, or rising. |
maxItems | integer | 50 | Maximum posts, comments, or subreddits to save in the list modes. 0 means everything Reddit offers for the target. Results do not repeat. Not used in post mode, where the URL list sets the size. |
userContent | enum | submitted | submitted for a user's posts or comments for their comments. Used by user mode. |
includeNsfw | boolean | true | Keep posts and subreddits marked over-18. |
depth | enum | basic | basic or detailed. See the depth table above. |
includeComments | boolean | false | Save each post's comments as their own items, right after the post, in the list modes. Always on in post mode. |
maxCommentsPerPost | integer | 50 | Hard cap on comments per post, counting nested replies. 0 means no cap. |
commentSort | enum | confidence | confidence (Reddit's "best"), top, new, controversial, old, or qa. |
expandComments | boolean | false | Collect the complete thread, down to the last reply. |
proxyConfiguration | object | {"useApifyProxy":true} | Connection settings for the run. Apify proxy is on by default. Set useApifyProxy to false to run without one. |
Complete input examples
Output
The default dataset holds one object per collected item, and every item has a
type of post, comment, or subreddit. search, subreddit, user with
submitted, and post mode save posts. When comments are requested, each
comment follows its post as its own item, and its linkId, parentId, and
depth place it in the thread. user with comments saves comments.
community saves subreddits. Download the dataset as JSON, CSV, Excel, XML, or
HTML from the Apify Console or the API. The Console offers a Posts view and a
Comments view of the same dataset.
Output at a glance
| Group | Main post fields |
|---|---|
| Identity | type, id, fullName, permalink, url, domain, isSelf, postHint |
| Community | subreddit, subredditPrefixed, subredditId, subredditType, subredditSubscribers |
| Author | author, authorFullName, authorFlairText, authorFlairType, authorFlairCssClass, authorPremium |
| Content | title, selftext, selftextHtml |
| Signals | score, upvoteRatio, numComments, numCrossposts, viewCount, totalAwardsReceived |
| Time | createdUtc, created, editedUtc, edited, scrapedAt |
| Status | over18, spoiler, stickied, locked, archived, quarantine, contestMode, isOriginalContent, distinguished, removedByCategory |
| Flair | linkFlairText, linkFlairType, linkFlairCssClass, linkFlairBackgroundColor, linkFlairTextColor |
| Media | thumbnail, thumbnailWidth, thumbnailHeight, previewImages, galleryImages, video, isVideo |
| Crossposts | crosspostParentId |
Root field types
| JSON type | Post fields |
|---|---|
| string | type, id, fullName, subreddit, subredditPrefixed, title, permalink, scrapedAt |
string or null | subredditId, subredditType, author, authorFullName, authorFlairText, authorFlairType, authorFlairCssClass, url, domain, selftext, selftextHtml, created, distinguished, removedByCategory, linkFlairText, linkFlairType, linkFlairCssClass, linkFlairBackgroundColor, linkFlairTextColor, thumbnail, postHint, crosspostParentId |
number or null | subredditSubscribers, score, upvoteRatio, numComments, numCrossposts, viewCount, totalAwardsReceived, createdUtc, editedUtc, thumbnailWidth, thumbnailHeight |
| boolean | authorPremium, isSelf, edited, over18, spoiler, stickied, locked, isVideo, isOriginalContent, contestMode, archived, quarantine |
| object[] | previewImages, galleryImages |
object or null | video |
These unchanged fields are from a recorded r/MachineLearning search result. This selected example is not a saved dataset item:
{"type": "post","id": "1vv2nkh","fullName": "t3_1vv2nkh","subredditPrefixed": "r/MachineLearning","subredditSubscribers": 3069244,"title": "I developed my own quantized LLM from scratch, trained on 30B tokens, deploys in 60 MB [R]","author": "Final-Data-1410","isSelf": true,"score": 349,"upvoteRatio": 0.97,"numComments": 53,"numCrossposts": 1,"created": "2026-08-22T04:39:18.000Z","edited": true,"linkFlairText": "Research","scrapedAt": "2026-09-02T08:50:22.558Z"}
Selected post fields
selftextHtml is null at basic depth and holds the rendered HTML at
detailed depth. viewCount is null on almost every post, since Reddit
shows it only to the author. thumbnail is a URL for link and media posts and
a keyword such as self or default otherwise.
Media fields
Gallery posts list their images in gallery order in galleryImages. These
values are from a recorded r/pics gallery, shortened to two of its six images:
{"type": "post","id": "1w2q0yb","title": "Food served to US service men & women.","subredditPrefixed": "r/pics","url": "https://www.reddit.com/gallery/1w2q0yb","score": 37841,"numComments": 5038,"thumbnail": "https://preview.redd.it/4bg1ylvg7kmh1.jpg?width=140&height=78&auto=webp&s=cb10bf62e0355643df0e974b33d2c8c3003bbedf","thumbnailWidth": 140,"thumbnailHeight": 78,"previewImages": [],"galleryImages": [{"url": "https://preview.redd.it/4bg1ylvg7kmh1.jpg?width=858&format=pjpg&auto=webp&s=85579f28acaabf8f8e8694559f45e7cd336d7703","width": 858,"height": 483},{"url": "https://preview.redd.it/662iplvg7kmh1.jpg?width=638&format=pjpg&auto=webp&s=8a5c5cdb0eb9c903d868e771fb7ed8633be382fa","width": 638,"height": 841}],"video": null}
Reddit-hosted videos fill video. These values are from a recorded r/aww post:
{"type": "post","id": "1w4tl99","title": "Caught a baby groundhog eating wild berries.","subredditPrefixed": "r/aww","postHint": "hosted:video","isVideo": true,"url": "https://v.redd.it/f2terttiuzmh1","previewImages": [{"url": "https://external-preview.redd.it/dHpudDBnc2l1em1oMXXW2jQ0ep1LXLIwd3_hyHbgZT-OYNyI9K11VXITQ2JR.png?format=pjpg&auto=webp&s=4b86979347b53b93dcbc5988f63df18016fc8351","width": 405,"height": 720}],"video": {"url": "https://v.redd.it/f2terttiuzmh1/CMAF_1080.mp4?source=fallback","hlsUrl": "https://v.redd.it/f2terttiuzmh1/HLSPlaylist.m3u8?a=1790931095%2CM2MwM2MwZjZiZGRiZjk2ZTg1NjYwNjQwZDE3YzYzODg0Yzk4NTU0YmY4NGEyNWM2NGZmMGUzMTk0ZjFjYTA1Yg%3D%3D&v=1&f=sd","dashUrl": "https://v.redd.it/f2terttiuzmh1/DASHPlaylist.mpd?a=1790931095%2CZGZhOTFjZjkzZTY5MDBmZTkzYTkwYTA5ZjA0MTQwMzVjMmE1MjczMWY2ZGEzM2UyYWIzNDMyYTczMmE5MDBkZA%3D%3D&v=1&f=sd","durationSeconds": 26,"width": 1080,"height": 1920,"hasAudio": true,"isGif": false}}
The video.url is a direct MP4. HLS and DASH playlists carry a signed
a= parameter and expire after a while, so download or play them soon after
the run. Videos embedded from other sites, such as YouTube, are link posts:
isVideo is false and url points at that site.
Comment fields
Every comment is its own dataset item with the same shape: after its post when
comments are requested in a post mode, and as the results of user mode with
userContent: "comments".
| JSON type | Comment fields |
|---|---|
| string | type, id, fullName, parentId, linkId, subreddit, permalink |
string or null | subredditId, author, authorFullName, authorFlairText, body, bodyHtml, created, distinguished, collapsedReasonCode |
number or null | depth, score, controversiality, totalAwardsReceived, createdUtc, editedUtc |
| boolean | authorPremium, edited, isSubmitter, stickied, scoreHidden, collapsed |
linkId is the fullname (t3_) of the post the comment belongs to. parentId
is that post fullname for a top-level comment and the parent comment's fullname
(t1_) for a reply. depth is 0 at the top and one more at each level.
Comments are saved parent first, so the post and the parent of every comment
appear earlier in the dataset. In a user's comment feed no thread is saved and
Reddit reports no level, so depth is null there. distinguished marks moderator or admin
comments. scoreHidden is true while Reddit hides a fresh comment's score.
collapsed and collapsedReasonCode reflect Reddit's default folding, for
example LOW_SCORE. With expandComments, the comments past those Reddit shows
on first load come from a Reddit source without controversiality, premium
status or HTML, so on them controversiality and bodyHtml are null and
authorPremium is false.
These unchanged values are a recorded user mode item, one comment by the
account spez:
{"type": "comment","id": "p1wosm9","fullName": "t1_p1wosm9","parentId": "t1_p1wd2fi","linkId": "t3_1vgbkge","subreddit": "u_spez","subredditId": "t5_3k30p","author": "spez","authorFullName": "t2_1w72","authorFlairText": null,"authorPremium": true,"body": "That was the thinking. Otherwise it would be easier to just replicate the UI. ","bodyHtml": null,"score": 9,"controversiality": 0,"totalAwardsReceived": 0,"createdUtc": 1785954710,"created": "2026-08-05T18:31:50.000Z","editedUtc": null,"edited": false,"depth": 0,"permalink": "https://www.reddit.com/user/spez/comments/1vgbkge/modernizing_reddits_infrastructure_with_you/p1wosm9/","isSubmitter": true,"stickied": false,"distinguished": "admin","scoreHidden": false,"collapsed": false,"collapsedReasonCode": null}
A post with its thread
Subreddit fields
community mode saves one item per subreddit.
| JSON type | Subreddit fields |
|---|---|
| string | type, id, fullName, name, namePrefixed, url, scrapedAt |
string or null | title, publicDescription, description, subredditType, submissionType, lang, advertiserCategory, communityIcon, iconImg, bannerBackgroundImage, headerTitle, created |
number or null | subscribers, activeUserCount, createdUtc |
| boolean | over18, quarantine, wikiEnabled |
publicDescription is the short blurb shown in search results.
description is the full sidebar text in Markdown. submissionType is any,
link, or self. activeUserCount is null when Reddit does not report it.
These unchanged values are a recorded community result, with the sidebar text
shortened:
{"type": "subreddit","id": "2r3gv","fullName": "t5_2r3gv","name": "MachineLearning","namePrefixed": "r/MachineLearning","title": "Machine Learning","publicDescription": "Beginners -> /r/mlquestions or /r/learnmachinelearning , AGI -> /r/singularity, career advices -> /r/cscareerquestions, datasets -> r/datasets","description": "**[Rules For Posts](https://www.reddit.com/r/MachineLearning/about/rules/)** [...]","subscribers": 3069244,"activeUserCount": null,"over18": false,"quarantine": false,"subredditType": "public","submissionType": "any","wikiEnabled": true,"lang": "en","advertiserCategory": "Technology","communityIcon": "https://styles.redditmedia.com/t5_2r3gv/styles/communityIcon_kilpomt3l5c51.png?width=256&s=671205393c49c1a601b16e1ba19c2a25fb0f0d22","iconImg": null,"bannerBackgroundImage": null,"headerTitle": null,"createdUtc": 1248878084,"created": "2009-07-29T14:34:44.000Z","url": "https://www.reddit.com/r/MachineLearning/","scrapedAt": "2026-09-02T08:51:33.926Z"}
Nested field reference
Timestamps come in two forms: createdUtc and editedUtc are Unix seconds,
created is ISO 8601. scrapedAt on posts and subreddits is the collection
time in ISO 8601. Markdown bodies keep Reddit's raw characters; they are not
HTML-escaped.
Collection behaviour
Search and feed results
Each post appears once. The leading items follow your sort and time;
later items can be in a different order. Large maxItems values can return
about 5,000 unique posts from a big subreddit; on a small one the run can
return the whole subreddit. A time narrower than all keeps every item
within that window, so a top of the week stays within the week. Subreddit
discovery returns at most about 1,000 subreddits.
Search matching and order follow Reddit and can change between runs.
includeNsfw: false leaves out posts and subreddits marked over-18. They do
not count toward maxItems, so the run still fills the budget from the rest.
A valid search with no matches produces an empty dataset.
Comment threads
Each comment is its own dataset item, so a thread of any size is saved in
full: a post with twenty thousand comments yields one post item and about
twenty thousand comment items. maxCommentsPerPost is a hard cap that counts
nested replies. 0 removes it. The cap keeps whole branches, so a saved reply
always has its parent saved too. Without expandComments, a post comes with
what Reddit shows on first load, which is up to a few hundred comments on a
large thread. With expandComments, the Actor collects every branch to the
last reply, with no limit on depth.
A fully collected thread can hold slightly fewer comments than the post's
numComments. Reddit counts comments that were later deleted by their author,
removed by moderators, or filtered as spam, and no longer serves them. A
deleted or removed comment that still has replies is still saved so the
replies keep their parent: its author is [deleted], its authorFullName is
null, and its body is [deleted] or [removed].
Users, subreddits, and posts by id
Only public content is reachable. A run aimed at a private, quarantined, or
banned subreddit, or at a subreddit or user that does not exist, stops at once
with a status message that says so, before anything is collected. In post
mode an unreachable post is skipped with a log line that gives the reason, and
the run continues with the rest.
Speed and volume
Small runs finish in seconds. Very large runs take longer. The Apify proxy is
on by default. If you switch it off in proxyConfiguration, large runs can
take longer.
Content changes
Scores, comment counts, and flair change over time, and content can be edited
or removed after collection. scrapedAt records when each item was read.
Media URLs on preview.redd.it and v.redd.it can expire; store the files if
you need them later.