Reddit Scraper - Posts, Feeds, Comments, Subreddits & Raw JSON avatar

Reddit Scraper - Posts, Feeds, Comments, Subreddits & Raw JSON

Pricing

from $1.20 / 1,000 results

Go to Apify Store
Reddit Scraper - Posts, Feeds, Comments, Subreddits & Raw JSON

Reddit Scraper - Posts, Feeds, Comments, Subreddits & Raw JSON

Scrape Reddit subreddit, user and domain feeds without a Reddit account or API key. Get posts with comments (comments per post, reply depth) or comments only. Include raw JSON (every Reddit field). Filter by score, upvote ratio and comments.

Pricing

from $1.20 / 1,000 results

Rating

0.0

(0)

Developer

Watcharin Kan

Watcharin Kan

Maintained by Community

Actor stats

4

Bookmarked

8

Total users

2

Monthly active users

3 days ago

Last modified

Categories

Features

Limited permissions

Share

Reddit Scraper extracts posts and comments from Reddit without a Reddit account, cookies or API key. Read the feeds of subreddits, users and domains (or any Reddit page URL) and get clean, ready-to-use rows. Export them as JSON, CSV, Excel or HTML, or call the Actor from your own code through the Apify API.

It does four things well:

  • Posts from feeds. Subreddit, user and domain feeds in hot, new, top, rising or controversial order.
  • Posts with their comments. Every post row is followed by its comment rows. You choose how many comments to read per post and how many reply levels deep.
  • Comments only. The newest comments written in one or more subreddits, or every comment a user wrote, one row per comment. You do not have to find and open posts first.
  • Every Reddit field. Turn on Include raw JSON and each post and comment carries the complete original Reddit data in a raw field.

Why use Reddit Scraper?

  • Hear what people say, not only what they post. Comments hold the opinions, questions, complaints and recommendations. Comments only gives them to you directly, filtered by words, score and date.
  • No missing fields. The clean columns cover the common needs; raw gives you everything else Reddit sends (awards, media, gallery data, edit and removal info and more).
  • Pay for what you need. Filters are applied before rows are saved, and limits per subreddit, user and domain, per post and for the whole run stop the run as soon as you have enough.
  • No setup. No Reddit login, API key or proxy to configure.

What can Reddit Scraper do?

  • Read Reddit feeds. The posts of subreddits, users and domains, or any subreddit, user, domain or post page by URL.
  • Add the comments of each post. Turn on Include comments of each post and set Max comments per post (up to 500) and Max reply depth (1-10).
  • Get only comments. Each subreddit and each user is its own feed, newest first, with its own limit (Max comments per subreddit / user). Filter by words, score, date and NSFW.
  • Keep every Reddit field. Include raw JSON works for posts, post comments and comments-only rows (a comment without its replies, which are rows of their own).
  • Filter before you save. Words the item must contain, minimum and maximum score, minimum upvote ratio, minimum and maximum comments, a date range (posted after / before, absolute or relative such as 7 days), authors, title contains, post text contains, flairs, linked domains, linked URL contains, text-only posts and NSFW on/off, plus the same as exclusions (authors, title, post text, flairs, domains, URL, text posts, NSFW).
  • No duplicates. The same post or comment from several sources is returned once.
  • Control cost and size. Max posts per subreddit, user and domain, max comments per subreddit and user (Comments only), max comments per post, max results and max pages. A run stops as soon as a limit is reached.
  • Apify platform features. Schedule runs, call the API, send results to webhooks and integrations, and monitor runs in the Console.

Who is it for?

  • Market and product research: what people ask for and complain about in a niche.
  • Brand and keyword monitoring: mentions of a brand, product or topic, in posts and in comments, on a schedule.
  • Customer support and community research: questions and answers as they appear in a subreddit.
  • Datasets for analysis and AI: posts with their comment threads, or plain comment corpora, with the raw data attached.

What data can you extract from Reddit?

Row typeMain fields
Post (type: "post")keyword, postId, subreddit, sort, time range, score, upvote ratio, comment count, author, title, selftext, flair, domain, url (the link in the post), NSFW flag, date, permalink
Comment (type: "comment")keyword, postId, postTitle, postPermalink, commentId, parentId, depth, author, body, score, isSubmitter, date, permalink

A comment row points back to its post with postId (a post row has its own id in the same column), postTitle and postPermalink. parentId is the post (t3_...) for a top-level comment, or the comment it replies to (t1_...).

How to scrape Reddit

  1. Open the Actor and fill in Subreddit feeds, User feeds, Domain feeds or Reddit page URLs (or the section Comments only).
  2. Optionally turn on Include comments of each post and set the limits in the sections Post limits and Limits (total).
  3. Optionally add filters (minimum score, flair, author, words...).
  4. Click Start, then open the Output tab or download the dataset as JSON, CSV, Excel or HTML.

Comments only and raw JSON

  • Comments only (section Comments only: Subreddits (comments) and Users (comments)). One row per comment, with postId, postTitle and postPermalink of the post it belongs to. Typical uses: what people say about a product or brand in a subreddit, everything a user has written, support questions and complaints as they appear. Reddit limits how far back these comment feeds go.
  • Include raw JSON. Adds a raw field to every row: the original Reddit object of that post or comment. Use it when a field you need (awards, media, gallery data, edit and removal info and so on) is not in the default columns. It makes the output much larger.

Keep only items containing

Keep only items containing (filterKeywords): the Actor itself checks the title and post text of every post it has read (the text of the comment, or the post title, in the section Comments only) and drops the ones without these words. Several words in one item must all appear, an exact phrase goes in double quotes, capital letters do not matter and a word also matches inside a longer word (camp matches camping). It is not applied to a single post URL you give explicitly. When it is used, each row gets a keyword column with the item(s) of the list that the row matched; a comment under a post carries the keyword of its post. Without this filter there is no keyword column.

Input examples

Read the top posts of subreddits

{
"listingSubreddits": ["camping", "overlanding"],
"listingSort": "top",
"timeRange": "week",
"minScore": 10,
"maxPostsPerSubreddit": 50
}

Each subreddit is read as its own feed in the order of Feed sort (Time range is used for top and controversial) and has its own limit Max posts per subreddit. all and popular work too. A name that does not exist is skipped with a warning.

Read feeds by name

{
"listingSubreddits": ["camping"],
"listingUsers": ["spez"],
"listingDomains": ["youtube.com"],
"listingSort": "new",
"maxPostsPerSubreddit": 100,
"maxPostsPerUser": 20,
"maxPostsPerDomain": 50
}

Names are easier to type than URLs. A user feed gives the posts of that user, a domain feed the posts anywhere on Reddit that link to the domain (sub-domains such as m.youtube.com are included). rising exists only for subreddits; user and domain feeds use new instead.

Posts with their comments

{
"listingSubreddits": ["camping"],
"listingSort": "top",
"timeRange": "week",
"minComments": 5,
"includeComments": true,
"maxPostsPerSubreddit": 10,
"maxCommentsPerPost": 10,
"maxCommentDepth": 3
}

The posts are filtered first; for every post that passes, its comments are read (one extra request per post), up to Max comments per post and Max reply depth (1 = only the top-level comments, up to 10). The dataset holds the post row followed by its comment rows; a post without comments gives only its post row. Comments are read in the order Reddit suggests for the post (suggested_sort: confidence, top, new, controversial, old or qa); a post without a suggestion uses Reddit's default order. Every comment row counts as one result in Max results (total). With Include raw JSON, a comment row gets the comment's own JSON (without its replies, which are rows of their own).

Only comments: subreddits and users

{
"subreddits": ["camping", "overlanding"],
"users": ["spez"],
"filterKeywords": ["tent"],
"minScore": 2
}

The section Comments only gives the comments themselves instead of posts, one row each: the newest comments written in each subreddit and the comments each user wrote. Every subreddit and every user is its own feed, newest first, with its own count (Max comments per subreddit, Max comments per user, empty = no limit); a name that does not exist is skipped with a warning. Only Keep only items containing (comment text or post title), Authors and Exclude authors (the author of the comment), Title contains and Exclude title contains (the title of the post), Post text contains and Exclude post text contains (the text of the comment), Minimum / Maximum score (the score of the comment), Posted after / before (the date of the comment) and Adult (NSFW) content apply; the post filters, Max posts per ... and the comment settings of posts (Max comments per post, Max reply depth) do not. The flair, domain, URL and text post filters do not apply (a comment has no such data). A comment row has the post's id, title and link, not the full post.

Read pages from URLs

{
"startUrls": [
"https://www.reddit.com/r/camping/controversial/?t=month",
"https://www.reddit.com/r/overlanding/rising/",
"https://www.reddit.com/user/spez/",
"https://www.reddit.com/domain/youtube.com/new/"
],
"filterKeywords": ["stove"]
}

startUrls is a JSON list: write each URL as a string, as above, or as an object with a url field ({ "url": "https://www.reddit.com/r/camping/" }); both forms can be mixed. A sort or time written in a URL (for example /top/?t=week) wins over Feed sort and Time range. old.reddit.com and r/all also work. The limit of a URL follows its kind: a subreddit URL uses Max posts per subreddit, a user URL Max posts per user, a domain URL Max posts per domain. A comments page (https://www.reddit.com/user/<name>/comments/ or https://www.reddit.com/r/<name>/comments/) is read like the section Comments only. Search, wiki and multireddit pages are not supported and are skipped with a warning, and short redd.it links are skipped too.

Get the comments of one post

{
"startUrls": [
{ "url": "https://www.reddit.com/r/camping/comments/1xakl25/" }
],
"includeComments": true,
"maxCommentsPerPost": 50,
"maxCommentDepth": 5
}

Replace the URL with a real post. Without Include comments of each post only the post row is returned.

More ready-to-use inputs are in the examples folder of the Actor.

Keep posts from a date range

{
"listingSubreddits": ["camping"],
"postedAfter": "2026-10-01",
"postedBefore": "2026-10-15",
"maxScore": 5
}

postedAfter and postedBefore take a date (YYYY-MM-DD, UTC; the whole day counts) or a relative value such as 7 days, 2 weeks, 1 month or 1 year counted back from the start of the run (for example "postedAfter": "7 days" on a weekly schedule). They apply to the date of the post (in the section Comments only, the date of the comment).

Input fields

FieldWhat it does
Keep only items containingKeep only the posts (or comments) whose text contains these words; checked by the Actor after reading.
Subreddit feeds / User feeds / Domain feeds / Feed sortRead the posts of subreddits, users and domains by name. Rising exists only for subreddits (user and domain feeds read new instead); Feed sort does not apply to Comments only, which is always newest first.
Reddit page URLsA single post, or a subreddit, user, domain or comments page that needs its own sort or time.
Include comments of each postRead the comments under every post that passes the filters.
Comments only: Subreddits (comments), Users (comments)The newest comments of subreddits, and the comments users wrote, instead of posts.
Include filters: Authors, Title contains, Post text contains, Post flairs, Linked domains, Linked URL containsKeep only the posts that match (applied after the posts are read). The comments read under posts (Include comments of each post) are not filtered. In Comments only, Authors, Title contains (the title of the post) and Post text contains (the text of the comment) keep only the matching comments.
Include filters: Text (self) posts only, Adult (NSFW) content onlySwitch on to keep only text posts, or only NSFW content.
Exclude filters: Exclude authors, Exclude title contains, Exclude post text contains, Exclude post flairs, Exclude linked domains, Exclude linked URL containsThe same fields as the Include filters, used the other way round: remove the posts that match, for example the bot AutoModerator. Exclude wins over the include filters. Like the Include filters they work on the posts only (not on the comments read under posts); in Comments only, Exclude authors, Exclude title contains and Exclude post text contains remove the matching comments, and flairs, domains and URLs do not apply.
Exclude filters: Exclude text (self) posts, Exclude adult (NSFW) contentSwitch on to remove text posts, or NSFW content. Cannot be on together with the matching include switch (the run then ends with a message).
Time rangeTime range of top / controversial feeds.
Posted after, Posted beforeKeep only posts created inside a date range: a date picked in the form (YYYY-MM-DD, UTC) or a relative value such as 7 days.
Minimum / Maximum comments, Minimum / Maximum score, Minimum upvote ratioPopularity filters: keep only posts inside these limits (empty = no limit). Applied after the posts are read.
Post limits: Max posts per subreddit / user / domainThe most posts read from each subreddit, user or domain (empty = no limit).
Post limits: Max comments per post, Max reply depthHow many comments (default 10, up to 500) and reply levels (default 3, up to 10) are read under each post.
Comments only limits: Max comments per subreddit, Max comments per userThe most comments read from each subreddit and each user of the section Comments only (empty = no limit).
Limits (total): Max results, Max pagesThe most results (dataset rows, counted after the filters, comments included) and the most pages to read in total, over all sources. The run stops at whichever is reached first.
Include raw JSON (every Reddit field)Add the complete original Reddit data of each post and comment as a raw field.

Max posts / comments per source and Max pages

Max posts per subreddit / user / domain (and, in Comments only, Max comments per subreddit / user) counts items kept, per source: each subreddit, user and domain has its own count, and the source stops being read once its count is reached. Max pages is one limit for the whole run: the number of pages (up to 100 posts each) read over all sources together, and the sources that come after the limit is used up are skipped. Use the first to get an equal share from every source and the second to cap the total number of requests. Max results (total) counts the rows of the dataset (posts and comments). The run stops at whichever limit is reached first.

Output example

Each result is one row in the dataset. A post row followed by one of its comment rows:

{
"type": "post",
"scrapedAt": "2026-10-16T08:21:44.000Z",
"postId": "abc123",
"subreddit": "camping",
"sort": "top",
"timeRange": "week",
"score": 128,
"upvoteRatio": 0.93,
"totalVote": 140,
"comments": 42,
"author": "example_user",
"title": "Best portable grill for car camping?",
"selftext": "I am looking for a small grill that fits in a trunk.",
"flair": "Gear",
"domain": "self.camping",
"url": "https://www.reddit.com/r/camping/comments/abc123/best_portable_grill/",
"nsfw": false,
"posted": "2026-10-10T14:03:11.000Z",
"permalink": "https://www.reddit.com/r/camping/comments/abc123/best_portable_grill/"
}
{
"type": "comment",
"scrapedAt": "2026-10-16T08:21:45.000Z",
"subreddit": "camping",
"postId": "abc123",
"postTitle": "Best portable grill for car camping?",
"postPermalink": "https://www.reddit.com/r/camping/comments/abc123/best_portable_grill/",
"commentId": "k1x2y3z",
"parentId": "t3_abc123",
"depth": 0,
"author": "another_user",
"body": "A small charcoal grill fits well.",
"score": 12,
"isSubmitter": false,
"posted": "2026-10-10T15:20:00.000Z",
"permalink": "https://www.reddit.com/r/camping/comments/abc123/best_portable_grill/k1x2y3z/"
}

When Keep only items containing is used, both rows also have a keyword column. All dates are in UTC (ISO 8601). In the Output tab, the Posts and Comments views show the columns of each row type.

Good to know

  • How much you can get is limited by Reddit, not by the Actor. Feeds go about this deep (tested):
    • Subreddit feeds: the depth differs by sort; rising gives only a few posts.
    • Domain feeds: less deep than subreddit feeds.
    • User feeds: only what the user's public page shows, which can be just a few posts.
    • Comments only: Reddit limits how far back the newest comments of a subreddit or the comments of a user go.
  • There is no search. The Actor reads feeds and pages; it does not use Reddit's search. To look for a topic, read the feeds of the subreddits where it is discussed and use Keep only items containing.
  • Comments use more requests. With Include comments of each post, every post that passes the filters needs one extra request, so set Max posts per ..., Max pages or Max results (total) to keep runs short.
  • Large comment threads. Very large threads are not returned completely in one request. Some replies that Reddit hides behind "load more" are not included.
  • No duplicates. When you give several sources (for example the same subreddit as new and as hot, or a user's posts and a subreddit they post in), a post or comment that several of them return appears once, from the first source that gives it. Duplicates are not counted in Max posts per ... or Max results (total), and the comments of a duplicate post are not read again.
  • Where filters are applied. All filters are applied after the posts are read, so they do not reduce the number of pages read (use the limits for that). When a source is read newest first (a feed sorted by new, or comments only), the Actor stops paging as soon as it reaches posts older than Posted after; Posted before cannot skip pages.
  • Rising exists only for subreddits (user and domain feeds use new).

FAQ

Do I need a Reddit account or API key? No.

Can I search Reddit by keyword? No. Read the feeds of the relevant subreddits and use Keep only items containing to keep the posts with your words.

Why did I get fewer results than I expected? Reddit limits how deep a feed can go (see Good to know), and your filters remove posts after they are read.

How do I know which post a comment belongs to? Every comment row has postId, postTitle and postPermalink; the post row has the same postId.

Can I schedule it or call it from my own code? Yes. Like any Apify Actor it can be scheduled, called through the API, and connected to integrations such as webhooks.

Something does not work or you need a feature. Open an issue on the Actor page and describe your input and the run link.

Responsible use

The Actor reads publicly visible Reddit pages. Make sure your use of the data follows Reddit's terms and the laws that apply to you, especially when you collect information about people.