Reddit Scraper - Posts, Comments, Subreddits & Users avatar

Reddit Scraper - Posts, Comments, Subreddits & Users

Pricing

from $0.04 / 1,000 results

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

Reddit Scraper - Posts, Comments, Subreddits & Users

πŸ”₯ ~$0.05/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.04 / 1,000 results

Rating

0.0

(0)

Developer

Kai

Kai

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

10 hours 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 haveSet mode toRequired input
A topic or keywordsearchkeyword, plus subreddit to stay inside one community
A community namesubredditsubreddit
A usernameuserusername, plus userContent for posts or comments
Post URLs or idspostpostUrls
A theme to find communities forcommunitykeyword

sort, time, maxItems, and includeNsfw shape the list modes. When the listing you chose runs out before maxItems, the Actor continues through the target's other sorts and time windows, without duplicates, until the budget is met or Reddit has nothing left. Post mode keeps the supplied order and always includes the comment thread.

Add comment threads

AddTurn onControl with
A post's commentsincludeComments (always on in post mode)maxCommentsPerPost and commentSort
The complete thread, down to the last replyexpandCommentsmaxCommentsPerPost: 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, every "load more comments" batch and every "continue this thread" branch is collected, at any nesting depth. A thread with several thousand comments takes seconds.

Choose the data depth

ModeUse it whenAdded data
basic (default)You need the core fields and the smallest records.Every field except the HTML bodies. Images and video are included.
detailedYou 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.

FieldTypeDefaultBehaviour
modeenumsearchsearch, subreddit, user, post, or community.
keywordstringemptySearch terms for search and community. Reddit search syntax such as quoted phrases works.
subredditstringemptyCommunity name, with or without r/. The target of subreddit mode and an optional filter for search.
usernamestringemptyReddit username, with or without u/. The target of user mode.
postUrlsstring[][]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.
sortenumhotrelevance, hot, top, new, rising, or comments. The leading results follow this sort; once its listing is exhausted, the other sorts and windows follow. 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.
timeenumallhour, day, week, month, year, or all. Applies to top and controversial feeds and to search. A window narrower than all is a filter: the run walks only listings that can honour it, so in a feed hot, new, and rising are skipped and the windowed top leads instead.
maxItemsinteger50Maximum posts, comments, or subreddits to save in the list modes. 0 means everything Reddit offers for the target. Past one listing's size, the Actor continues through the target's other sorts and time windows, without duplicates. Not used in post mode, where the URL list sets the size.
userContentenumsubmittedsubmitted for a user's posts or comments for their comments. Used by user mode.
includeNsfwbooleantrueKeep posts and subreddits marked over-18.
depthenumbasicbasic or detailed. See the depth table above.
includeCommentsbooleanfalseSave each post's comments as their own items, right after the post, in the list modes. Always on in post mode.
maxCommentsPerPostinteger50Hard cap on comments per post, counting nested replies. 0 means no cap.
commentSortenumconfidenceconfidence (Reddit's "best"), top, new, controversial, old, or qa.
expandCommentsbooleanfalseCollect the complete thread, including every "load more comments" branch.
proxyConfigurationobject{"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

GroupMain post fields
Identitytype, id, fullName, permalink, url, domain, isSelf, postHint
Communitysubreddit, subredditPrefixed, subredditId, subredditType, subredditSubscribers
Authorauthor, authorFullName, authorFlairText, authorFlairType, authorFlairCssClass, authorPremium
Contenttitle, selftext, selftextHtml
Signalsscore, upvoteRatio, numComments, numCrossposts, viewCount, totalAwardsReceived
TimecreatedUtc, created, editedUtc, edited, scrapedAt
Statusover18, spoiler, stickied, locked, archived, quarantine, contestMode, isOriginalContent, distinguished, removedByCategory
FlairlinkFlairText, linkFlairType, linkFlairCssClass, linkFlairBackgroundColor, linkFlairTextColor
Mediathumbnail, thumbnailWidth, thumbnailHeight, previewImages, galleryImages, video, isVideo
CrosspostscrosspostParentId

Root field types

JSON typePost fields
stringtype, id, fullName, subreddit, subredditPrefixed, title, permalink, scrapedAt
string or nullsubredditId, subredditType, author, authorFullName, authorFlairText, authorFlairType, authorFlairCssClass, url, domain, selftext, selftextHtml, created, distinguished, removedByCategory, linkFlairText, linkFlairType, linkFlairCssClass, linkFlairBackgroundColor, linkFlairTextColor, thumbnail, postHint, crosspostParentId
number or nullsubredditSubscribers, score, upvoteRatio, numComments, numCrossposts, viewCount, totalAwardsReceived, createdUtc, editedUtc, thumbnailWidth, thumbnailHeight
booleanauthorPremium, isSelf, edited, over18, spoiler, stickied, locked, isVideo, isOriginalContent, contestMode, archived, quarantine
object[]previewImages, galleryImages
object or nullvideo

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 the source.

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 typeComment fields
stringtype, id, fullName, parentId, linkId, subreddit, permalink
string or nullsubredditId, author, authorFullName, authorFlairText, body, bodyHtml, created, distinguished, collapsedReasonCode
number or nulldepth, score, controversiality, totalAwardsReceived, createdUtc, editedUtc
booleanauthorPremium, 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.

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 typeSubreddit fields
stringtype, id, fullName, name, namePrefixed, url, scrapedAt
string or nulltitle, publicDescription, description, subredditType, submissionType, lang, advertiserCategory, communityIcon, iconImg, bannerBackgroundImage, headerTitle, created
number or nullsubscribers, activeUserCount, createdUtc
booleanover18, 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 for that listing.

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

Reddit serves at most about 1,000 items per listing, and about 500 for a top or controversial window. To reach a larger maxItems, the Actor walks the target's other listings in turn: for a subreddit or user, new, hot, and every top and controversial window; for a search, new and every window of relevance, top, comments, and hot. Items already saved are skipped, so each post appears once. The listing you chose with sort and time always goes first, so the leading items follow your choice.

On a large subreddit this reaches about 5,000 unique posts; on a small one it is the whole subreddit. A time narrower than all is kept as a filter on every listing walked, so a top of the week stays within the week, and feeds that cannot be filtered by time are left out. Subreddit discovery has a single listing.

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, including branches Reddit only shows behind "continue this thread", 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. Reddit limits how fast content can be read, so very large runs slow down rather than fail; the Actor manages this by itself. The Apify proxy is on by default and helps large runs finish sooner. It can be switched off in proxyConfiguration.

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.