Reddit Scraper - Posts, Comments, Subreddits, Users & Search avatar

Reddit Scraper - Posts, Comments, Subreddits, Users & Search

Pricing

from $0.40 / 1,000 posts

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

Reddit Scraper - Posts, Comments, Subreddits, Users & Search

Reddit scraper for subreddit posts, comments, user profiles and keyword search: full post text, every comment and reply, votes, authors, dates and media. Export JSON, CSV or Excel, or use the API. No login, no API key. $0.50 per 1,000 posts, $0.25 per 1,000 comments.

Pricing

from $0.40 / 1,000 posts

Rating

0.0

(0)

Developer

Social Scrapers

Social Scrapers

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

12 hours ago

Last modified

Features

Limited permissions

Share

Reddit Scraper collects public Reddit posts and comments from subreddits, user profiles, post threads and keyword search, without a Reddit account or API key. Every post and every comment becomes one clean dataset item that you can export as JSON, CSV or Excel, or pull through the Apify API. It costs $0.50 per 1,000 posts and $0.25 per 1,000 comments, and you pay only for results you get.

What does Reddit Scraper do?

  • 📰 Subreddit scraper: the Hot, New, Top (of the day, week, month, year or all time) or Rising posts of any public subreddit. Need more than one listing holds? Set a high limit (or 0 for no limit) and the scraper also reads the subreddit's other listings, each post once.
  • 💬 Reddit comment scraper: every comment of a post, including the replies Reddit folds behind "more replies", sorted Best, Top, New, Controversial, Old or Q&A. Each comment comes with its depth and the comment it replies to, so you can rebuild the whole thread.
  • 🔎 Reddit search scraper: Reddit's post search for any number of keywords, by relevance, new, top or most comments, over any time range. Each result comes with its title, votes, comment count, author, subreddit and date; turn on Full post text for search results to also get the post's full text, link, flair, upvote ratio and media. One search on Reddit ends near 250 posts; ask for more and the scraper reads the same keyword in other orders and narrower time ranges, inside your time range, without duplicates.
  • 👤 Reddit user scraper: a user's posts and comments, newest first, or only their posts, or only their comments.
  • 🔗 Any mix in one run: paste subreddit, profile, post and search URLs side by side, add keywords, and get one dataset back. An item found by two inputs is stored, and charged, once.
  • 🧾 Stable output: every item has the same fields, with ISO dates, full links, media links, and null where a value does not apply.

What data can you extract from Reddit?

One dataset item per post or comment. dataType tells them apart. A field that does not apply to an item's type is null (a title on a comment, a depth on a post), and imageUrls is then an empty list.

FieldTypeDescription
dataTypestring"post" or "comment".
idstringReddit's full ID of the item: t3_… for a post, t1_… for a comment.
urlstringLink to the post or comment.
postIdstringFull ID (t3_…) of the post the item belongs to. For a post, the same as id.
parentIdstring or nullComments: what the comment replies to, t3_… for the post itself or t1_… for another comment.
titlestring or nullPosts: the title.
bodystring or nullPost text or comment text. Empty for link posts. null for a search result unless "Full post text for search results" is on.
bodyHtmlstring or nullThe same text as Reddit renders it, in HTML.
authorstringUsername without u/; "[deleted]" when the account was deleted.
authorIdstring or nullThe author's account ID (t2_…).
authorFlairstring or nullThe author's flair text in the subreddit, when Reddit shows it.
subredditstringSubreddit name without r/. Posts on a user's profile show u_<username>.
subredditIdstring or nullThe subreddit's ID (t5_…).
createdAtstring or nullWhen it was posted, ISO 8601 (UTC).
editedAtstring or nullWhen it was last edited, ISO 8601 (UTC), when Reddit shows it.
scorenumber or nullNet votes as Reddit shows them; null when Reddit hides the score.
upvoteRationumber or nullPosts: share of votes that are upvotes, from 0 to 1.
numCommentsnumber or nullPosts: number of comments Reddit reports (it counts removed ones too).
flairstring or nullPosts: the post flair text.
isOver18boolean or nullPosts: true when marked NSFW (18+).
linkUrlstring or nullPosts: where a link post points; null for text posts.
domainstring or nullPosts: the domain of linkUrl, for example i.redd.it or youtube.com.
thumbnailUrlstring or nullPosts: the thumbnail image.
imageUrlslist of stringsPosts: full-size images of an image or gallery post, in gallery order. Empty otherwise.
videoUrlstring or nullPosts: playable link to a video hosted on Reddit.
removedByCategorystring or nullPosts: why the post was removed, for example "moderator" or "deleted".
postTitlestring or nullComments: title of the post the comment is on, when known.
postUrlstring or nullComments: link to the post the comment is on, when known.
depthnumber or nullComments collected from a post: how deeply the comment is nested (0 = a direct reply to the post).
isSubmitterboolean or nullComments: true when the commenter is the post's author.
sourceTypestringThe kind of input that found the item: "subreddit", "user", "post" or "search".
sourceInputstringThe start URL or search keyword that found the item.
scrapedAtstringWhen the item was collected, ISO 8601 (UTC).

How to scrape Reddit

  1. Open Reddit Scraper on Apify and click Try for free.
  2. Add what to scrape. Start URLs take any mix of:
    • subreddits: https://www.reddit.com/r/AskReddit/ or r/AskReddit, or a URL with a sort such as https://www.reddit.com/r/AskReddit/top/?t=week;
    • user profiles: https://www.reddit.com/user/<username>/ or u/<username> (end in /submitted/ for posts only, /comments/ for comments only);
    • posts: a post's link, a redd.it short link, a gallery link, or a link to one of its comments;
    • share links from the Reddit app (https://www.reddit.com/r/<subreddit>/s/<id>, /u/<username>/s/<id>) and v.redd.it video links, also on old., np., m. and i.reddit.com;
    • search pages: https://www.reddit.com/search/?q=coffee&sort=new, or a search inside one subreddit: https://www.reddit.com/r/Coffee/search/?q=grinder. Search keywords each run their own search.
  3. Set Max items per source (posts per subreddit or keyword; 0 = no limit).
  4. To get comments, turn on Include comments and set Max comments per post (0 = every comment) and Sort comments by.
  5. Click Start. Results appear in the Output tab as they are scraped. Download them as JSON, CSV, Excel, XML or HTML, or read them through the API.

Share links from the Reddit app (/s/…) work as they are: the scraper follows each one to the post, comment, subreddit or profile it opens, without logging in and without charging for it. A share link Reddit no longer knows (it then opens the subreddit's front page instead) is reported as expired, not scraped as that subreddit.

How much does it cost to scrape Reddit?

ResultPrice per 1,000Silver plan (−10%)Gold plan (−20%)
Post$0.50$0.45$0.40
Comment$0.25$0.225$0.20
Search result with full text (option on)$1.45$1.305$1.16

Platform usage and proxies are included. You pay only for results that are stored: a post found by two of your inputs is stored, and charged, once, and a search result left out by the keyword filter costs nothing. A search result is a post ($0.50 per 1,000) unless Full post text for search results is on: then each result whose post page is read for its full text is a "Search result with full text" instead.

  • 10,000 posts from a list of subreddits: $5.00.
  • 2,000 search results with 20 comments each (2,000 posts + 40,000 comments): $1.00 + $10.00 = $11.00.
  • 1,000 search results with full text: $1.45.

Apify's free plan includes $5 of platform credit every month, enough for about 10,000 posts. To cap a run, set a maximum total charge in the run options: the scraper stops cleanly when it is reached and never stores a result your limit cannot pay for. Max items in total caps a run by result count the same way.

Input example

The week's top 500 posts of two subreddits, each with its 100 best comments:

{
"startUrls": ["https://www.reddit.com/r/Coffee/", "r/espresso"],
"subredditSort": "top",
"subredditTime": "week",
"maxItemsPerSource": 500,
"includeComments": true,
"maxCommentsPerPost": 100,
"commentSort": "best"
}

Every comment of one post, newest first:

{
"startUrls": ["https://www.reddit.com/r/StandingDesks/comments/1q9v2ks/best_standing_desks_in_2026_so_far/"],
"includeComments": true,
"maxCommentsPerPost": 0,
"commentSort": "new"
}

Keyword search: this month's posts for two keywords, 1,000 each, with full text:

{
"searches": ["standing desk", "ergonomic chair"],
"searchSort": "relevance",
"searchTime": "month",
"maxItemsPerSource": 1000,
"searchIncludePostDetails": true
}

A user's latest 300 posts and comments:

{
"startUrls": ["u/<username>"],
"maxItemsPerSource": 300
}

Output example

A search result with its full text, then one of its comments (trimmed):

[
{
"dataType": "post",
"id": "t3_1q9v2ks",
"url": "https://www.reddit.com/r/StandingDesks/comments/1q9v2ks/best_standing_desks_in_2026_so_far/",
"postId": "t3_1q9v2ks",
"parentId": null,
"title": "Best standing desks in 2026 so far?",
"body": "Hey guys, my friend asked me for standing desk recommendations and I realized I probably know way too much about them lol. ...",
"author": "<username>",
"authorId": "t2_<user-id>",
"subreddit": "StandingDesks",
"subredditId": "t5_2tf0s",
"createdAt": "2026-01-11T09:24:51.000Z",
"score": 10,
"upvoteRatio": 0.86,
"numComments": 45,
"flair": null,
"isOver18": false,
"linkUrl": null,
"imageUrls": [],
"depth": null,
"sourceType": "search",
"sourceInput": "standing desk",
"scrapedAt": "2026-11-08T11:17:22.418Z"
},
{
"dataType": "comment",
"id": "t1_nz4075k",
"url": "https://www.reddit.com/r/StandingDesks/comments/1q9v2ks/comment/nz4075k/",
"postId": "t3_1q9v2ks",
"parentId": "t1_nz2ggbi",
"title": null,
"body": "Good to hear another vote for the Uplift v3. How’s the stability at full standing height with dual monitors?",
"author": "<username>",
"authorId": "t2_<user-id>",
"subreddit": "StandingDesks",
"createdAt": "2026-01-12T04:59:23.000Z",
"score": 1,
"postTitle": "Best standing desks in 2026 so far?",
"postUrl": "https://www.reddit.com/r/StandingDesks/comments/1q9v2ks/best_standing_desks_in_2026_so_far/",
"depth": 1,
"isSubmitter": true,
"sourceType": "search",
"sourceInput": "standing desk",
"scrapedAt": "2026-11-08T11:17:22.418Z"
}
]

The Output tab shows three table views: Overview, Posts overview and Comments overview.

Use cases

  • Brand and product monitoring: follow what people say about a product, a competitor or a topic, every day on a schedule.
  • Market and product research: collect questions, complaints, feature requests and recommendations in a niche.
  • Trend tracking: watch new posts in the communities you care about.
  • Text and sentiment analysis: build datasets of real conversations, with whole comment threads, for NLP, classification or LLM work.
  • Community research: see what a subreddit discusses, which posts take off and how threads unfold.
  • Lead and audience research: find the people who ask for the problem you solve, and the subreddits where they gather.
  • Academic research: gather public discussion data on a topic over a time range.

Use Reddit Scraper via API, Python, JavaScript and integrations

Run it from your own code with the Apify API clients.

JavaScript / Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('socialscrapers/reddit-scraper').call({
searches: ['standing desk'],
maxItemsPerSource: 500,
includeComments: true,
maxCommentsPerPost: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length);

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("socialscrapers/reddit-scraper").call(
run_input={"startUrls": ["https://www.reddit.com/r/Coffee/"], "maxItemsPerSource": 1000}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["dataType"], item["title"] or item["body"][:80])

You can also:

  • Schedule runs (every hour, every day) to collect new posts and comments on a topic.
  • Send results to Google Sheets, Slack, Airtable and other apps through Make, Zapier or n8n, or call a webhook when a run finishes.
  • Let an AI agent run it through the Apify MCP server.
  • Read results as JSON, CSV, Excel, XML, HTML or RSS from the dataset API.

Reddit API vs this scraper

Official Reddit APIReddit Scraper
Account and appReddit account, registered app and OAuth credentialsNone
Rate limit100 requests per minute on the free tierHandled for you
CommentsYou page through "load more" yourselfEvery comment, already flattened in reading order
Search depthAbout 250 results per queryThousands per keyword (other orders and time ranges)
OutputRaw JSONClean items, CSV, Excel, JSON, API
Commercial useNeeds Reddit's approvalYou pay per result

Limits

  • Public content only, no login. Private, quarantined and banned subreddits, and anything that needs a Reddit account, are out of reach; the run log names each one.
  • Hidden profiles. Reddit lets users hide their posts and comments from their profile; such a profile shows nothing to logged-out visitors, and the run log says so.
  • Removed and deleted comments are not listed. Reddit's comment count includes them, so a post may report a few more comments than you get.
  • Listings end near 1,000 posts each. Reddit stops every subreddit listing and profile listing around 1,000 entries; with a higher limit the scraper reads the other listings to reach more.
  • Some fields depend on where an item comes from. editedAt and authorFlair are filled when Reddit serves them (Hot listings and profiles), and null otherwise. Missing values are always null, never guessed.
  • Residential proxy. Reddit refuses most datacenter IPs, so keep the default residential proxy. If you pick Apify Proxy without the RESIDENTIAL group, the first session Reddit refuses moves the run to RESIDENTIAL, in the same country; custom proxy URLs are used exactly as given.
  • A run with 0 results still succeeds when your input was fine. When a subreddit, profile, post or share link has nothing public (it does not exist, is private, banned, hidden or deleted, or a search matches nothing), the run ends as Succeeded with a status message naming each input and why, and nothing is charged. A run fails only when no start URL can be used at all, or when Reddit refuses every one of 3 or more inputs (the scraper is then blocked, and worth retrying later).

FAQ

Is it legal to scrape Reddit? Reddit Scraper collects only public data that anyone can see without logging in. Scraping public data is lawful in many countries, but Reddit's terms of service and data-protection laws such as the GDPR may apply to how you collect and use it, especially personal data. You are responsible for your use; ask a lawyer if unsure.

Do I need a Reddit account or API key? No. The scraper reads only what Reddit shows to logged-out visitors.

How many results can I get? As many as Reddit has. Set Max items per source to 0 for no limit, or Max comments per post to 0 for every comment of a post. One search on Reddit ends near 250 posts, so for more the scraper reads the keyword in other orders and narrower time ranges; one listing ends near 1,000 posts, so for more it reads the subreddit's other listings.

Why did I get fewer results than I asked for? The subreddit, profile or keyword has fewer posts, the profile's owner hides their activity, the keyword filter left out results that do not mention every word (turn off Only posts that mention every keyword word to keep them all), or the run reached its maximum charge. The run log says which, for each input.

Can I paste share links from the Reddit app? Yes. Links like https://www.reddit.com/r/AskReddit/s/AbCdEf1234 are followed to the post, comment, subreddit or profile they open, then scraped like the full URL. Resolving a link is never charged.

My run finished with 0 results. What happened? Your input was valid but had nothing public to collect: the status message and the run log name each input and the reason (not found, private, hidden profile, expired share link, no matching posts). Nothing was charged.

How do I collect only new posts? Use the New sort on a subreddit or search, and Search time range such as the past 24 hours, on a schedule.

How do I get the comments of search results or subreddit posts? Turn on Include comments. Each post is followed by its comments, up to Max comments per post.

Why do my search results have no text? Reddit's search results show only a post's title, votes, comment count, author, subreddit and date. Turn on Full post text for search results and the scraper reads each result's post page for its full text, link, flair, upvote ratio and media ($1.45 per 1,000 such results). It is off by default because those runs are slower.

How do I tell which input found an item? sourceType and sourceInput on every item name the start URL or keyword that found it.

Other scrapers by Social Scrapers

ScraperWhat it collects
Facebook Groups ScraperPosts from public Facebook groups
Facebook Profile ScraperPublic details of Facebook profiles and Pages
Facebook Profile Posts ScraperRecent posts of Facebook profiles and Pages
Facebook Ads Library ScraperAds from Meta's public Ad Library
X (Twitter) Profile ScraperPublic X profiles: followers, bio, counts
Quora ScraperQuora questions, answers and profiles
Instagram Profile ScraperInstagram profiles with their latest posts
Instagram Post ScraperInstagram posts and reels with comments
YouTube ScraperYouTube videos, channels, search and comments
YouTube Transcript ScraperTranscripts and captions of YouTube videos
LinkedIn Jobs ScraperPublic LinkedIn job postings
Threads ScraperThreads profiles, posts, replies and search