Reddit Subreddit Posts Scraper
Pricing
from $1.00 / 1,000 results
Reddit Subreddit Posts Scraper
Get posts from any public subreddit by sort (hot/new/top/rising/controversial) and time filter. Bulk-paginated.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
12 days ago
Last modified
Categories
Share
Bulk-fetch posts from any public subreddit by sort order — hot, new, top, rising, or controversial — with optional time-window filtering and pagination.
Why use this actor
- No account / no login required — just give it a list of subreddit names.
- All five sort modes —
hot,new,top,rising,controversial, plus atop/controversialtime filter (hour,day,week,month,year,all). - Bulk input — scrape multiple subreddits in a single run; one clean dataset row per post.
- Anonymous-friendly — works out of the box without any token; pass an optional Reddit app token for higher rate limits on large jobs.
- Automatic retries and fallbacks — transient failures retry with backoff; private / banned subreddits surface as
_errorrows so you can triage failures. - Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries
_input,_source,_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of subreddit names (e.g.
python,r/MachineLearning) and pick a sort order. - The actor walks the subreddit's post listing, paginating until it reaches
maxPostsor the end of the feed. - Each post is normalized into a flat JSON record with title, author, score, comment count, permalink, URL, media, flair, and timestamps.
- Results stream into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.
Input
{"subreddits": ["python", "MachineLearning"],"sort": "hot","timeFilter": "all","maxPosts": 25,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
subreddits | array | Subreddit names to scrape. Accepts plain names (python), r/-prefixed (r/python), or full URLs. |
sort | string | One of hot, new, top, rising, controversial. Default hot. |
timeFilter | string | One of hour, day, week, month, year, all. Only applied when sort is top or controversial. Default all. |
maxPosts | integer | Maximum posts per subreddit. 0 = fetch all available (Reddit caps listings at roughly 1,000). Default 25. |
redditClientId | string | Optional Reddit app token for higher rate limits. Leave blank for anonymous access. |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxy works for most subreddits. |
Sort and time-filter reference
sort value | Meaning |
|---|---|
hot | Reddit's front-page algorithm — recent + high-engagement mix. |
new | Strictly chronological, newest first. |
top | Highest-scoring posts within the chosen timeFilter. |
rising | Posts gaining engagement velocity right now. |
controversial | Posts with high up/down split within the chosen timeFilter. |
timeFilter value | Window |
|---|---|
hour | Last 60 minutes |
day | Last 24 hours |
week | Last 7 days |
month | Last 30 days |
year | Last 365 days |
all | Since the subreddit was created (default) |
Output
Input: subreddits: ["AskReddit"], sort: "hot", maxPosts: 3
[{"_input": "AskReddit","_source": "S3-fallback","_scrapedAt": "2026-05-18T11:10:22.012033+00:00","id": "1tg56u8","name": "t3_1tg56u8","subreddit": "AskReddit","subreddit_name_prefixed": "r/AskReddit","subreddit_id": "t5_2qh1i","subreddit_subscribers": 58575107,"title": "Who destroyed their own career within seconds by being an idiot?","author": "goldbeau","author_fullname": "t2_2dwkdlsms4","ups": 7687,"score": 7687,"upvote_ratio": 0.95,"num_comments": 4941,"num_crossposts": 2,"permalink": "/r/AskReddit/comments/1tg56u8/who_destroyed_their_own_career_within_seconds_by/","url": "https://old.reddit.com/r/AskReddit/comments/1tg56u8/who_destroyed_their_own_career_within_seconds_by/","domain": "self.AskReddit","is_self": true,"is_video": false,"thumbnail": "","media": null,"link_flair_text": null,"over_18": false,"spoiler": false,"stickied": false,"locked": false,"archived": false,"created_utc": 1779060093.0},{"_input": "AskReddit","_source": "S3-fallback","_scrapedAt": "2026-05-18T11:10:22.012033+00:00","id": "1tg4gql","name": "t3_1tg4gql","subreddit": "AskReddit","title": "What are some lazy jobs that pay a ridiculous amount of money?","author": "Jordz0_0","ups": 2999,"score": 2999,"upvote_ratio": 0.88,"num_comments": 1463,"permalink": "/r/AskReddit/comments/1tg4gql/what_are_some_lazy_jobs_that_pay_a_ridiculous/","url": "https://old.reddit.com/r/AskReddit/comments/1tg4gql/what_are_some_lazy_jobs_that_pay_a_ridiculous/","domain": "self.AskReddit","is_self": true,"over_18": false,"created_utc": 1779058246.0}]
Output field reference
| Field | Type | Description |
|---|---|---|
_input | string | The subreddit name exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the record. S1-primary = fastest authenticated path (used when you supply redditClientId); S2-fallback / S3-fallback = anonymous public paths used when the primary is unavailable or you didn't pass a token. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
id | string | Post ID without prefix (e.g. 1tg56u8). |
name | string | Fully-qualified Reddit ID with t3_ prefix. |
subreddit | string | Subreddit name (without r/). |
subreddit_name_prefixed | string | Subreddit with r/ prefix. |
subreddit_id | string | Reddit's internal subreddit ID (t5_ prefix). |
subreddit_subscribers | integer | Subscriber count at scrape time. |
title | string | Post title. |
author | string | Author's Reddit username. |
author_fullname | string | Author's Reddit user ID (t2_ prefix). |
ups / score | integer | Net upvote count. |
upvote_ratio | number | Ratio of upvotes to total votes (0.0–1.0). |
num_comments | integer | Comment count. |
num_crossposts | integer | How many times the post has been crossposted. |
permalink | string | Relative URL to the post on reddit.com. |
url | string | Linked URL — for self-posts this is the Reddit thread; for link posts this is the external URL. |
domain | string | Domain of url (e.g. self.AskReddit, github.com). |
is_self | boolean | true if the post is a text post, false for link / image / video posts. |
is_video | boolean | true if the post is a Reddit-hosted video. |
thumbnail | string | Thumbnail image URL (empty string for self-posts). |
media | object | Embedded media metadata when present (video, gallery, etc.); null for text / link posts. |
link_flair_text | string | Post flair text, or null if no flair is set. |
over_18 | boolean | NSFW flag — posts marked NSFW are returned with over_18: true. |
spoiler | boolean | true if the post is marked as a spoiler. |
stickied | boolean | true if the post is pinned to the top of the subreddit. |
locked | boolean | true if comments are locked. |
archived | boolean | true if the post is older than 6 months and no longer editable. |
created_utc | number | Post creation time as a Unix timestamp (seconds). |
Error envelope
Subreddits that don't exist, are private, banned, or fail to fetch return a structured error instead of crashing the run:
{"_input": "this-subreddit-does-not-exist-xyz","_source": "S2-fallback","_scrapedAt": "2026-05-18T11:10:22.012033+00:00","_error": "fetch_failed","_errorDetail": "NotFound https://www.reddit.com/r/this-subreddit-does-not-exist-xyz/hot.json"}
Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $3.50 per 1,000 posts. Each successful post = 1 result. Error rows (private / banned / not-found subreddits) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Reddit User Profile Scraper | Karma, account age, trophies for any Reddit user | |
| Reddit Search Scraper | Keyword search globally or within a single subreddit | |
| Reddit Post Detail Scraper | Single post + full nested comments tree | |
| YouTube | YouTube Channel Scraper | Recent uploads, view counts, and channel metadata |
| Bluesky | Bluesky Search Scraper | Keyword search across the atproto network |
| Telegram | Telegram Channel Posts Scraper | Public Telegram channel post history |
| Mastodon | Mastodon Account Scraper | Profile + toot history for any Mastodon handle |
Browse the full catalog at apify.com/xtracto.
Notes
- Private, banned, or quarantined subreddits return
{"_error": "fetch_failed", ...}rather than partial data — filter on_errorto triage. - NSFW posts are returned with
over_18: trueset; filter them client-side if you need a SFW-only dataset. - For jobs larger than ~1,000 posts per subreddit, register a free Reddit app at reddit.com/prefs/apps and pass
redditClientId— anonymous access is rate-limited and large bulk runs will be noticeably slower without a token. - Reddit listings are capped at roughly 1,000 posts per sort regardless of
maxPosts; for deeper history use the companion Reddit Search Scraper with date filters. - Need a single post with its full comments tree? Use Reddit Post Detail Scraper. Need a user's submission history? Use Reddit User Profile Scraper.