Reddit Scraper
Pricing
from $1.70 / 1,000 posts
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
Maintained by CommunityActor 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
| Name | Type | Meaning |
|---|---|---|
id | string | Reddit fullname, such as t3_1wzo05i. |
parsedId | string | Post ID without the t3_ prefix. |
url | string | Canonical Reddit post URL. |
username | string or null | Post author. |
title | string or null | Post title. |
communityName | string | Community name with r/ prefix. |
parsedCommunityName | string | Community name without the prefix. |
body | string | Plain-text post body. |
html | string or null | Post body HTML when available. |
numberOfComments | number | Reddit's reported comment count. |
upVotes | number or null | Post score; null for posts requested by direct URL. |
isVideo | boolean | Whether the post is marked as video. |
isAd | boolean | Ad marker; returned posts have false. |
over18 | boolean | Whether Reddit marks the post NSFW. |
createdAt | string or null | Post creation time in ISO format. |
scrapedAt | string | Time this Actor parsed the post, in ISO format. |
dataType | string | Always post. |
postType | string or null | Reddit's post type, such as text or link. |
upvoteRatio | number or null | Reddit's upvote ratio when available. |
linkUrl | string or null | External link for link posts. |
domain | string or null | Post link domain when available. |
authorId | string or null | Reddit author fullname when available. |
communityId | string or null | Reddit community fullname when available. |
spoiler | boolean | Whether the post is marked spoiler. |
comments | array | Included 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.