Reddit Subreddit Scraper – Export Posts from Any Subreddit
Pricing
from $1.70 / 1,000 post returneds
Reddit Subreddit Scraper – Export Posts from Any Subreddit
Scrape the newest, hot, top or rising posts from any public subreddit. Export post title, body text, author, score, comment count, timestamp, permalink and URL to JSON, CSV or Excel. No login, no Reddit API key. Pay only per post returned.
Pricing
from $1.70 / 1,000 post returneds
Rating
0.0
(0)
Developer
EndSpec
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape posts from any public subreddit on Reddit — sorted by new, hot, top or rising — and export them to JSON, CSV or Excel. No login, no Reddit API key.
Simple Input-Output Example
Input (subreddit is required):
{"subreddit": "technology","sortType": "new","limit": 25}
Output (one dataset row per post):
{"id": "1kx9r2h","title": "EU regulators open formal probe into cloud storage pricing","text": "Filed this morning. The complaint focuses on egress fees and how they lock in customers...","author": "netpolicywatch","subreddit": "technology","score": 3184,"num_comments": 412,"created_utc": 1752710400,"url": "https://example-news-site.com/eu-cloud-probe","permalink": "https://reddit.com/r/technology/comments/1kx9r2h/eu_regulators_open_formal_probe/","_query": "{\"subreddit\":\"technology\",\"sortType\":\"new\"}"}
Important Notes:
- Results are returned instantly — no Reddit account, login or official API key needed
- Pay per post returned — $0.0020 / post; failed and empty runs cost you nothing
- Sort by new, hot, top or rising
- One subreddit per run, up to 100 posts — this Actor returns posts, not comments
- All data comes from public subreddits only
- Searching Reddit by keyword instead of browsing one subreddit? Use Reddit Keyword Search Scraper
- Contact: contact@endspec.net
Full Actor Documentation
Reddit Subreddit Scraper
Pull the post feed of any public subreddit in seconds. Give the Actor a subreddit name and a sort order, and get back structured posts — title, body text, author, score, comment count, timestamp, permalink and link URL — ready to export or pipe into your own tools.
Overview
The Reddit Subreddit Scraper is an Apify Actor that extracts the post feed of a single public subreddit from Reddit. It answers one question well: what is being posted in r/<subreddit> right now (or what is on top there)?
Point it at r/technology, r/gaming, r/personalfinance or any other public community, choose whether you want the newest, hot, top or rising posts, and the Actor writes each post as a row in an Apify dataset that you can download as JSON, CSV, Excel, HTML or XML — or read straight from the Apify API.
What this Actor does not do, so you can decide quickly:
- It does not search Reddit by keyword — for that, use the Reddit Keyword Search Scraper, a separate Actor that queries across all of Reddit (optionally narrowed to one subreddit) with time filters.
- It does not return comments — only the posts themselves, including each post's comment count.
- It does not access private, banned, or quarantined subreddits, or anything behind a login.
- It does not crawl multiple subreddits in one run, and it does not paginate through a subreddit's whole history — see Cost, Performance and Limits.
What You Can Do
- Browse Any Public Subreddit: Fetch the post feed of any public community by name — no
r/prefix, no account, no Reddit API credentials - Choose Your Sort Order: Get the feed as new (chronological), hot (currently active), top (highest scoring) or rising (gaining traction fast)
- Get Full Post Text: Self-posts come back with their body text, not just the headline
- Read Engagement Signals: Every post carries its score (net upvotes) and comment count at the moment of scraping
- Follow Links Out: Link posts include the external
urlthey point to, alongside the Redditpermalink - Monitor a Community on a Schedule: Run on an Apify Schedule with
sortType: "new"and deduplicate on postidto build a rolling feed archive - Export Anywhere: Download as JSON, CSV, Excel, HTML or XML, or pull the dataset via the Apify API into your database, spreadsheet or BI tool
Data Availability
All data returned by this Actor is publicly available information. It reads only posts that Reddit displays publicly in a subreddit's feed — the same content any logged-out visitor can see. It does not access private or restricted communities, deleted content, direct messages, or anything requiring authentication. This Actor simply makes public subreddit content easier to collect programmatically and in a structured shape.
Actor Input Parameters
The Actor accepts the following input parameters:
subreddit
• Type: string
• Required: Yes
• Default: none (the input form prefills technology)
• Description: The subreddit name without the r/ prefix
e.g., technology, askreddit, personalfinance
sortType
• Type: string (select)
• Required: Optional
• Default: new
• Allowed values: new, hot, top, rising
• Description: The order posts are returned in
e.g., top
limit
• Type: integer
• Required: Optional
• Default: 25
• Range: 1–100
• Description: Maximum number of posts to return. The Actor returns up to this many posts; it may return fewer
e.g., 50
Important Notes:
subredditis required — a run with no subreddit cannot return posts.- Do not include the
r/prefix — passtechnology, notr/technology. Ther/form is not a valid subreddit name and will not resolve. - The subreddit must be public — private, banned, quarantined and non-existent subreddits all return an error row rather than posts, and are not charged.
limitis a cap, not a target. The Actor fetches a single feed page and returns at mostlimitposts from it. Asking for100does not guarantee 100 posts — you may get fewer even from a very large subreddit. There is no pagination or backfill through a subreddit's history.tophas no time window. This Actor does not expose a time filter, sotopreturns the feed's top posts as Reddit ranks them by default. If you need "top of the past week", use the Reddit Keyword Search Scraper, which has atimeFilterparameter.- One subreddit per run. To cover several communities, start one run per subreddit.
- No Reddit API key is needed — and there is no field to put one in. Authentication is handled entirely by the Actor.
Input Examples
Example 1: Newest Posts from a Subreddit (Most Common)
{"subreddit": "technology","sortType": "new","limit": 25}
When to use: Day-to-day monitoring. new gives you the feed in chronological order, which is what you want when you re-run on a schedule and only care about what appeared since last time.
Example 2: Minimal Input — Defaults Applied
{"subreddit": "askreddit"}
Result: sortType defaults to new and limit defaults to 25. This is the smallest valid input.
Example 3: Top Posts for Research
{"subreddit": "personalfinance","sortType": "top","limit": 100}
When to use: One-off research where you want the highest-scoring, most-discussed threads rather than the latest ones. Remember limit: 100 is a ceiling — see Important Notes.
Example 4: r/ Prefix Included (Will Return an Error Row)
{"subreddit": "r/technology","sortType": "hot"}
Result: No posts. r/technology is not a subreddit name — the name is technology. The run finishes successfully but the dataset contains a single error row, and you are not charged. This is the single most common input mistake.
Output Structure
The Actor writes results to the Apify dataset, one row per post. Export the dataset as JSON, CSV, Excel, HTML or XML, or pull it via the Apify API.
There are exactly two row shapes: a post row and an error row.
Post Row Format
{"id": "string","title": "string","text": "string","author": "string","subreddit": "string","score": 0,"num_comments": 0,"created_utc": 0,"url": "string","permalink": "string","_query": "string"}
Field Descriptions:
id • Type: string • Description: Reddit's post ID, unique per post. Use this as your deduplication key across scheduled runs
title • Type: string • Description: The post's title as displayed on Reddit
text • Type: string • Description: The post's self-text body. Empty for link posts and image posts, which have no body — only self-posts carry text here
author
• Type: string
• Description: The posting account's username, without the u/ prefix. May read [deleted] for removed accounts, as Reddit itself reports it
subreddit
• Type: string
• Description: The subreddit the post belongs to, as reported by Reddit. Normally matches your subreddit input
score • Type: number • Description: The post's net score (upvotes minus downvotes) at the moment of scraping. Reddit fuzzes vote counts, so treat this as an indicator, not an exact ledger
num_comments • Type: number • Description: Number of comments on the post at the moment of scraping. The Actor returns this count only — it does not return the comments themselves
created_utc • Type: number • Description: Post creation time as a Unix epoch timestamp in seconds. Present only when Reddit supplies it — the field is omitted from the row when unavailable
url • Type: string • Description: The URL the post points to. For link posts this is the external destination; for self-posts it is typically the Reddit thread itself. Omitted from the row when unavailable
permalink
• Type: string
• Description: Full, clickable https://reddit.com/... link to the post's thread. Omitted from the row when unavailable
_query
• Type: string
• Description: A JSON string echoing back the query this Actor ran on your behalf — your subreddit and the effective sortType. Useful for tracing which run produced which rows when you merge datasets. Note that it does not include limit, which is applied after fetching
Error Row Format
When a run cannot return posts, the dataset contains a single error row instead:
{"status": "error","_query": "string","error": "string"}
status
• Type: string
• Description: Always the literal "error". This field appears on error rows only — successful post rows do not carry a status field, so testing for status === "error" is the reliable check
_query • Type: string • Description: The same echo of your query as on post rows
error • Type: string • Description: A plain-language explanation of what happened. Always one of the fixed messages listed under Output Examples below — see Example 3, 4 and 5
No posts, no charge. Error rows are never billed. See Cost, Performance and Limits.
Output Examples
Example 1: Link Post with Full Engagement Data
{"id": "1kx9r2h","title": "EU regulators open formal probe into cloud storage pricing","text": "","author": "netpolicywatch","subreddit": "technology","score": 3184,"num_comments": 412,"created_utc": 1752710400,"url": "https://example-news-site.com/eu-cloud-probe","permalink": "https://reddit.com/r/technology/comments/1kx9r2h/eu_regulators_open_formal_probe/","_query": "{\"subreddit\":\"technology\",\"sortType\":\"new\"}"}
Note the empty text: this is a link post, so the body is empty and url carries the external destination.
Example 2: Self-Post with Body Text
{"id": "1kxa8f3","title": "I paid off $42k of debt in 19 months — here is the exact spreadsheet","text": "Long-time lurker. In Nov 2024 I had $42,180 across three cards at 22-27% APR. I stopped the avalanche/snowball argument and just did the math...","author": "quietsaver_88","subreddit": "personalfinance","score": 8921,"num_comments": 1044,"created_utc": 1752624000,"url": "https://www.reddit.com/r/personalfinance/comments/1kxa8f3/i_paid_off_42k_of_debt_in_19_months/","permalink": "https://reddit.com/r/personalfinance/comments/1kxa8f3/i_paid_off_42k_of_debt_in_19_months/","_query": "{\"subreddit\":\"personalfinance\",\"sortType\":\"top\"}"}
Here text carries the post body, and url points back at the Reddit thread because there is no external link.
Example 3: No Posts Returned (Empty Result)
If the subreddit does not exist, is not public, or the feed comes back with nothing, the run still finishes successfully but the dataset holds one error row:
{"status": "error","_query": "{\"subreddit\":\"r/technology\",\"sortType\":\"hot\"}","error": "No results were found for this input. You were not charged."}
There is no "successful run with zero rows" for this Actor — an empty feed is reported as the error row above. You are not charged for it.
Example 4: Data Service Temporarily Unavailable
{"status": "error","_query": "{\"subreddit\":\"technology\",\"sortType\":\"new\"}","error": "The data service is temporarily unavailable — please retry shortly. You were not charged."}
The Actor already retries several times internally before emitting this. Seeing it means every attempt failed — retry the run in a few minutes.
Example 5: Service Busy (Rate Limited)
{"status": "error","_query": "{\"subreddit\":\"askreddit\",\"sortType\":\"hot\"}","error": "The service is busy right now — please retry in a moment. You were not charged."}
Emitted when the Actor is being rate limited. Wait a moment and re-run; if you are firing many runs in parallel, stagger them.
The Complete List of Error Messages
The error field is always exactly one of these four strings — nothing else is ever emitted:
error value | What it means |
|---|---|
No results were found for this input. You were not charged. | The feed came back empty — usually a misspelled, private, banned or non-existent subreddit, or an r/ prefix left in the name |
The data service is temporarily unavailable — please retry shortly. You were not charged. | Every retry attempt failed to return a usable feed. Transient; retry shortly |
The service is busy right now — please retry in a moment. You were not charged. | Rate limited. Wait and retry |
The request could not be completed right now. Please retry shortly. You were not charged. | A fallback for any other unexpected condition |
You can match on these strings safely, but checking for the presence of status === "error" is more robust.
Use Cases
For Community and Brand Managers
Community Monitoring: Watch the subreddits where your product, industry or competitors get discussed. Running with sortType: "new" on a schedule gives you a rolling feed of everything posted, so nothing gets missed between check-ins.
Example Workflow:
- List the subreddits relevant to your product (e.g.
technology, plus your niche communities) - Create one Apify Schedule per subreddit, running the Actor hourly with
sortType: "new"andlimit: 25 - Deduplicate incoming rows on
idagainst what you already stored - Alert your team on new rows whose
titleortextmatches your brand keywords - Use
permalinkto jump straight into the thread and respond
For Product and UX Researchers
Voice-of-Customer Mining: Subreddits are where users complain in their own words. Pull the top feed of a community to find the pain points that resonated the most, and read text for the full account rather than a headline.
Example Workflow:
- Run with
sortType: "top"andlimit: 100on the subreddit your users live in - Export the dataset to CSV and sort by
scoreandnum_comments - Read the
textof the highest-engagement threads for recurring complaints - Cluster them into themes and size each theme by total score
- Re-run monthly to see which themes are growing
For Content and Marketing Teams
Content Ideation: hot and rising show you what a community is engaging with right now. rising in particular surfaces posts gaining traction before they peak — useful for topic selection while the interest curve is still going up.
Example Workflow:
- Run with
sortType: "rising"on 3–5 subreddits in your topic area - Review titles with a high
scorerelative to how recentcreated_utcis - Turn recurring questions into blog posts, videos or docs
- Track whether the same themes keep rising week over week
For Analysts, Researchers and Data Teams
Dataset Building: Structured post feeds with score and comment counts make a clean base for trend, sentiment or topic-modelling work — no HTML parsing, no Reddit API quota to manage.
Example Workflow:
- Schedule regular
newruns across your target subreddits - Pull each dataset via the Apify API into your warehouse, keyed on
id - Use
created_utcto bucket posts into time series - Run sentiment or topic models over
title+text - Correlate
scoreandnum_commentsagainst your own events
For Developers
Integration: Wrap the Actor behind your own service to give an app, bot or internal dashboard a subreddit feed, without registering a Reddit app or handling OAuth token refresh.
Example Workflow:
- Call the Actor via the Apify API with the subreddit as a parameter
- Check each row: if
status === "error", surface a retry rather than an empty state - Map post rows onto your own model, tolerating absent
created_utc,urlandpermalink - Cache on
idand refresh on an interval that suits the community's pace
Best Practices
Choosing Your Input
- Drop the
r/—subreddittakes the bare name.r/technologywill not resolve;technologywill - Subreddit names are what Reddit uses in the URL — if the community lives at
reddit.com/r/personalfinance, the value ispersonalfinance - Pick the sort order that matches the job —
newfor monitoring,topfor research,hotfor current activity,risingfor early trend detection - Start with a small
limit— run withlimit: 5first to confirm the subreddit resolves and the shape is what you expect, then scale up
Handling Results
- Test
status, not row count — a run that returns nothing gives you one row withstatus: "error", not zero rows. Branch onstatus === "error"before you touch the data - Deduplicate on
id— schedulednewruns overlap by design;idis stable and unique - Expect empty
text— link and image posts have no body. This is normal, not a failure - Expect missing fields —
created_utc,urlandpermalinkare omitted entirely from a row when unavailable. Code defensively rather than assuming they exist - Treat
scoreandnum_commentsas snapshots — they are true for the moment of scraping and will drift as the thread ages. Re-scrape if you need current values
Scaling and Scheduling
- One subreddit per run — for several communities, start several runs; they are independent and can run in parallel
- Stagger parallel runs — firing many at once can trip the rate-limit path and cost you a wasted round trip (though never a charge)
- Match the schedule to the community — a fast-moving subreddit may warrant hourly
newruns; a quiet one is fine daily - Retry the transient errors — the "temporarily unavailable" and "busy" messages both mean try again, and neither costs you anything
Cost, Performance and Limits
Billing
This Actor uses pay per result. You are charged $0.0020 per post returned — one charge per post row written to the dataset, under the post-returned event.
- Empty runs cost nothing. If no posts come back, the Actor emits an error row and charges nothing
- Failed runs cost nothing. Rate limits, unavailable-service errors and unresolvable subreddits are never billed
- You pay only for posts you actually receive. A run with
limit: 100that returns 43 posts bills 43 posts - No monthly subscription, no minimums, no Reddit API costs
Performance
The Actor is optimized for fast, single-subreddit lookups. A run makes one feed request, so results typically arrive within seconds. If the first attempt does not return a usable feed, the Actor retries up to four times with a short backoff before giving up and emitting an error row — a run that ends in an error may therefore take a few seconds longer than a successful one.
Limits
Know these before you build on the Actor:
- One subreddit per run — there is no multi-subreddit input
- Maximum 100 posts per run (
limitceiling), with a default of 25 - A single feed page is fetched — there is no pagination.
limitcaps how many posts are returned from that page; it does not make the Actor fetch more. You may receive fewer posts than yourlimiteven on a huge subreddit, and you cannot page back through a subreddit's history - Posts only, no comments — you get
num_commentsas a number, not the comment bodies - No time window filter —
topreturns the feed's default top ranking; there is no "past week"/"past month" control on this Actor - Public subreddits only — private, banned and quarantined communities return an error row
- Point-in-time data —
scoreandnum_commentsreflect the moment of scraping
Data Sources and Legality
All data returned by this Actor is publicly available information published openly by Reddit users in public subreddits — the same posts any logged-out visitor can read. The Actor does not access private communities, non-public content, or anything behind authentication, and it does not attempt to circumvent access controls.
Your responsibilities:
- You are responsible for complying with applicable laws and regulations, including data-protection law such as GDPR, in your jurisdiction
- You are responsible for complying with Reddit's terms of service and content policy
- Usernames are personal data in many jurisdictions — have a lawful basis before storing or processing
authorvalues, and honor deletion requests - Post content is authored by Reddit users and may be subject to their rights — respect them when republishing
- Use the data for legitimate purposes; do not use it to harass, profile or spam individuals
This documentation is not legal advice. If your use case is sensitive or large-scale, take your own legal advice.
Not affiliated with, endorsed by, or sponsored by Reddit.
Frequently Asked Questions
Q: Do I need a Reddit account or an official Reddit API key? A: No. There is no credential field in the input and nothing to register. Provide a subreddit name and run the Actor.
Q: What is the difference between this Actor and the Reddit Keyword Search Scraper? A: This Actor browses one subreddit's feed — "show me what's in r/technology, sorted by new". The Reddit Keyword Search Scraper searches by keyword across Reddit — "find posts mentioning electric vehicles" — optionally narrowed to one subreddit, with time-window filters. Use this one to follow a community; use that one to hunt a topic.
Q: Why did I get fewer posts than my limit?
A: limit is a ceiling, not a target. The Actor fetches a single feed page and returns at most limit posts from it, so you can receive fewer even from a very active subreddit. There is no pagination to fetch more.
Q: Can I get more than 100 posts, or scrape a subreddit's full history?
A: No. 100 is the limit maximum, and the Actor fetches one page with no backfill. For an ongoing archive, schedule repeated new runs and deduplicate on id.
Q: Will empty or failed runs cost me anything? A: No. You are charged only per post actually returned. Error rows — including the "no results" case — are never billed.
Q: I got "No results were found for this input" but the subreddit definitely exists. Why?
A: The most common cause is the r/ prefix — pass technology, not r/technology. Otherwise check spelling, and confirm the community is public rather than private, banned or quarantined.
Q: Can I scrape multiple subreddits in one run? A: Not in one run — the input takes a single subreddit. Start one run per subreddit; runs are independent and can go in parallel.
Q: Can I get the comments on these posts?
A: No. This Actor returns posts and their comment count (num_comments), not the comment bodies.
Q: Why is text empty on some posts?
A: Link posts and image posts have no self-text body — only self-posts do. For those, check url for the destination the post points to.
Q: Can I get the top posts of the past week or month?
A: Not with this Actor — it has no time filter, so top returns the feed's default top ranking. The Reddit Keyword Search Scraper exposes a timeFilter parameter if you need a specific window.
Q: What is the _query field in each row?
A: It is an echo of the query the Actor ran for you — your subreddit and the effective sort order, as a JSON string. It is handy for tracing rows back to their run when you merge datasets, and you can ignore or drop it otherwise.
Q: Are score and num_comments exact?
A: They are accurate as of the moment of scraping and will change as the thread ages. Reddit also fuzzes vote counts, so treat score as a strong indicator rather than an exact tally.
Q: Can I use this Actor commercially? A: Yes. The data is publicly available. You remain responsible for complying with applicable law and Reddit's terms — see Data Sources and Legality above.
Q: How do I export the results? A: From the Apify dataset, download as JSON, CSV, Excel, HTML or XML, or fetch it programmatically via the Apify API.
Contact & Support
Questions? Need help? We're here for you.
For any questions, technical support, feature requests, or general inquiries about the Reddit Subreddit Scraper, please reach out:
Email: contact@endspec.net
Response Time: We respond within 24 hours during business days.
What to Include in Your Inquiry:
- Your question or a description of the issue
- The Apify run ID (if applicable)
- The input you used
- The
errormessage or row you received, if any - What you expected to happen instead
You can also report problems directly through the Issues tab on this Actor's Apify page. We're committed to helping you get the most out of the Actor — whether you're integrating it into a workflow, troubleshooting, or exploring a new use case.
Related Actors
- Reddit Keyword Search Scraper – Search all of Reddit by keyword, optionally restricted to one subreddit, with time-window and sort filters.
- Instagram Instant Media Scraper – Extract public posts and media data from Instagram profiles.
- LinkedIn Instant Profile Search – Find LinkedIn profiles by name, job title or company.
- YouTube Instant Email Scraper – Find publicly listed contact emails for YouTube channels.
Last Updated: July 2026