Reddit Scraper avatar

Reddit Scraper

Pricing

from $1.70 / 1,000 posts

Go to Apify Store
Reddit Scraper

Reddit Scraper

Scrape posts and nested comments from subreddit feeds and Reddit post URLs. $2 per 1,000 posts, $3 per 1,000 comments, no per-run minimum.

Pricing

from $1.70 / 1,000 posts

Rating

5.0

(1)

Developer

Daniel G

Daniel G

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

Categories

Share

This Actor scrapes public subreddit feeds ordered by new, hot, top, or rising, individual Reddit posts, and nested comment threads. Results are post records, optionally with comments attached, or a {post, comments} record for a post URL; a run report records what happened for each input URL. Pricing is $2 per 1,000 posts and $3 per 1,000 comments, with no per-run minimum.

What it returns

Each dataset item is one post row. comments is present when comments are requested for that post.

Post fields

NameTypeMeaning
idstringReddit fullname, such as t3_1wzo05i.
parsedIdstringPost ID without the t3_ prefix.
urlstringCanonical Reddit post URL.
usernamestring or nullPost author.
titlestring or nullPost title.
communityNamestringCommunity name with r/ prefix.
parsedCommunityNamestringCommunity name without the prefix.
bodystringPlain-text post body.
htmlstring or nullPost body HTML when available.
numberOfCommentsnumberReddit's reported comment count.
upVotesnumber or nullPost score; null for posts requested by direct URL.
isVideobooleanWhether the post is marked as video.
isAdbooleanAd marker; returned posts have false.
over18booleanWhether Reddit marks the post NSFW.
createdAtstring or nullPost creation time in ISO format.
scrapedAtstringTime this Actor parsed the post, in ISO format.
dataTypestringAlways post.
postTypestring or nullReddit's post type, such as text or link.
upvoteRationumber or nullReddit's upvote ratio when available.
linkUrlstring or nullExternal link for link posts.
domainstring or nullPost link domain when available.
authorIdstring or nullReddit author fullname when available.
communityIdstring or nullReddit community fullname when available.
spoilerbooleanWhether the post is marked spoiler.
commentsarrayIncluded comments, when requested.

Each comment object contains id (string), parsedId (string), url (string), parentId (string), username (string or null), category (string), communityName (string), body (string), html (string or null), createdAt (string or null), scrapedAt (string), upVotes (number or null), numberOfreplies (number), depth (number), dataType (string, always comment), and replies (array of nested comment objects). Replies retain their parent and thread order.

Input

startUrls is required and accepts subreddit or post URLs. Defaults: sort: "new", time: "all", maxItems: 25, skipComments: false, fetchPostComments: false, maxCommentsPerPost: 25, includeNSFW: false, and maxConcurrency: 10. URL sort and time override input fields. time applies to top and accepts hour, day, week, month, year, or all. Set skipComments to return only the post for a post URL.

Newest 50 posts from a subreddit:

{"startUrls":[{"url":"https://www.reddit.com/r/python/new/"}],"maxItems":50}

One post with up to 100 comments:

{"startUrls":[{"url":"https://www.reddit.com/r/python/comments/abc123/example_post/"}],"maxItems":100}

Several subreddits with comments attached to each feed post:

{"startUrls":[{"url":"https://www.reddit.com/r/python/"},{"url":"https://www.reddit.com/r/programming/"}],"fetchPostComments":true,"maxItems":10,"maxCommentsPerPost":5}

maxItems applies per start URL: it caps posts for a subreddit and total comments, including replies, for a post URL. With fetchPostComments, maxCommentsPerPost caps comments on each feed post. Comments are sampled top-level first, then replies, and retain their nested structure.

Output examples

Feed post row (text shortened):

{"id":"t3_1wzo05i","parsedId":"1wzo05i","url":"https://www.reddit.com/r/lithuania/comments/1wzo05i/…/","username":"gommy4","title":"JUDU yra tragiskas appsas…","communityName":"r/lithuania","parsedCommunityName":"lithuania","body":"informacija neteisinga…","html":"<p>informacija neteisinga…</p>","numberOfComments":0,"upVotes":1,"isVideo":false,"isAd":false,"over18":false,"createdAt":"2026-10-07T05:05:01.300Z","scrapedAt":"2026-10-07T05:06:08.816Z","dataType":"post","postType":"text","upvoteRatio":1,"linkUrl":null,"domain":"self.lithuania","authorId":"t2_hmgc1","communityId":"t5_2qj20","spoiler":false}

Feed post with comments: same post fields plus a comments array; each entry has the comment fields above. For example: {"id":"t3_1wu01wd","dataType":"post","comments":[{"id":"t1_pd018hb","parentId":"t3_1wu01wd","body":"Flight-tracking data…","upVotes":1970,"numberOfreplies":0,"depth":0,"dataType":"comment","replies":[]}]}.

Post URL row has a wrapper with a post object and comments array. A direct-URL post's score is null:

{"post":{"id":"t3_1ww4kzt","parsedId":"1ww4kzt","url":"https://www.reddit.com/r/europe/comments/1ww4kzt/…/","username":"StraightSky7809","title":"If Britain decides to rejoin the EU…","communityName":"r/europe","parsedCommunityName":"europe","body":"","html":null,"numberOfComments":1489,"upVotes":null,"isVideo":false,"isAd":false,"over18":false,"createdAt":"2026-10-02T20:39:35.000Z","scrapedAt":"2026-10-07T05:06:14.884Z","dataType":"post","postType":null,"upvoteRatio":null,"linkUrl":"https://www.independent.co.uk/news/uk/politics/uk-rejoin-eu-germany-brexit-b3060288.html","domain":null,"authorId":null,"communityId":null,"spoiler":false},"comments":[{"id":"t1_pdhj5gm","parsedId":"pdhj5gm","url":"https://www.reddit.com/r/europe/comments/1ww4kzt/comment/pdhj5gm/","parentId":"t3_1ww4kzt","username":"paneuropeanism_","category":"europe","communityName":"r/europe","body":"Only the US and China benefitted from Brexit…","html":"<div>…</div>","createdAt":"2026-10-02T20:42:21.813Z","scrapedAt":"2026-10-07T05:06:14.885Z","upVotes":2092,"numberOfreplies":0,"depth":0,"dataType":"comment","replies":[]}]}

Run report

The key-value store record TARGETS contains one report for each supplied URL: url and type (subreddit or post), status, items (posts emitted), comments (comments emitted), pages, and message. complete means the requested item cap was reached or the post request completed; exhausted means the feed ended before its cap; empty-or-unavailable means no posts were found (the subreddit may be missing, banned, or private); failed means requests failed after retries; skipped means the URL was unsupported. This record distinguishes an empty feed from a failed request.

Pricing

Each run is charged per event: post at $0.002 and comment at $0.003 (replies count as comments). Apify platform usage is included, and there is no minimum per run. For example, 50 posts cost $0.10; one post with 10 comments costs $0.032.

Limits

Runs by users on Apify's free plan are limited to 3 URLs and 20 results per run.

The Actor reads public Reddit content. It does not support keyword search or user profiles. NSFW posts are excluded unless includeNSFW is enabled. Very deep reply chains exposed through Reddit's “continue this thread” links are not followed.

Use via API

Send a JSON input body to the synchronous dataset-items endpoint:

curl -X POST 'https://api.apify.com/v2/acts/LordFloofington~reddit-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"startUrls":[{"url":"https://www.reddit.com/r/python/new/"}],"maxItems":50}'

Users are responsible for complying with Reddit's terms and applicable law when using this Actor.