Reddit Scraper: Posts, Comments, Search & AI Sentiment
Pricing
from $2.00 / 1,000 results
Reddit Scraper: Posts, Comments, Search & AI Sentiment
Scrape Reddit posts, comments and user profiles from any subreddit, search query or URL. Get score, upvote ratio, awards, media, flair, author karma and optional AI sentiment and summaries. Fast HTTP-only Reddit API. Export JSON, CSV or Excel.
Pricing
from $2.00 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
2
Monthly active users
21 hours ago
Last modified
Categories
Share
Reddit Posts & Comments Scraper
Here is one real result, with the optional AI and author-profile add-ons enabled, showing every field the actor returns:
{"recordType": "post","id": "1vwihzi","subreddit": "technology","subredditId": "t5_2qh16","subredditPrefixed": "r/technology","subredditType": "public","title": "Cheap 'Guardian' interceptors developed by Florida start-up could turn tables on Iranian drones","author": "Stukwan","authorId": "t2_4m79xcva","authorFlairText": null,"selftext": null,"body": null,"postType": "link","url": "https://www.jpost.com/defense-and-tech/article-906338","permalink": "https://www.reddit.com/r/technology/comments/1vwihzi/cheap_guardian_interceptors_developed_by_florida/","domain": "jpost.com","score": 64,"upvoteRatio": null,"numComments": 42,"numCrossposts": 0,"totalAwards": 0,"rank": 1,"isSelf": false,"isGallery": false,"isNsfw": false,"isSpoiler": false,"isPinned": false,"isLocked": false,"isArchived": false,"isEdited": false,"distinguished": null,"isOriginalContent": false,"promoted": false,"whitelistStatus": "all_ads","thumbnail": "https://external-preview.redd.it/lkz74R3cUYq-x8sAheK2a0cSGTKyn3wegD7eVFqm5RQ.jpeg?width=140&height=78","mediaUrl": "https://external-preview.redd.it/lkz74R3cUYq-x8sAheK2a0cSGTKyn3wegD7eVFqm5RQ.jpeg?width=140&height=78","mediaUrls": ["https://external-preview.redd.it/lkz74R3cUYq-x8sAheK2a0cSGTKyn3wegD7eVFqm5RQ.jpeg?width=140&height=78"],"createdAt": "2026-08-23T20:46:06.000Z","observedAt": "2026-08-26T05:43:25.974Z","authorKarma": 27297,"authorPostKarma": 25412,"authorCommentKarma": 1885,"authorCakeDay": "2019-09-18T19:49:49+00:00","aiSentiment": "positive","aiSentimentScore": 0.7,"aiSentimentRationale": "The post highlights affordable interceptors that could counter Iranian drones, suggesting a promising advancement in defense technology.","aiSummary": "A Florida start-up has developed affordable 'Guardian' interceptors that could counter Iranian drones, potentially changing drone warfare.","error": null}
The most complete Reddit scraper on Apify. It returns every field Reddit exposes for each post and comment (score, upvote ratio, award counts, crosspost count, media URLs, flair, NSFW, spoiler, lock, archive, edit, pinned and OC flags), and adds fields competitors do not: post-author karma and cake day, plus optional AI sentiment and AI summaries computed in the same run. Fifteen input filters (subreddit feeds, Reddit search, direct post and user URLs, five sort orders including controversial, time window, post type, minimum score, comment depth and sort, NSFW toggle and a date range) let you target exactly the posts and comments you need. This is an HTTP-only scraper, so runs are fast and do not spend a browser-tier compute charge on your account.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- How we compare
- Use cases
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
This is a Reddit scraper and Reddit data API: it pulls posts and comments from any subreddit feed, from a Reddit search query, or from direct post and user URLs, applies the filters you pass as input, and writes one normalized record per post to the run's dataset. When Include Comments is enabled it also fetches each post's full comment tree (with reply depth and parent id) and emits one record per comment. Timestamps are normalized to ISO 8601, missing source values are returned as null, and every post carries its full set of Reddit flags (self, link or media type, NSFW, spoiler, locked, archived, edited, pinned, original content) plus score, upvote ratio, comment count and crosspost count so you can sort and filter without extra parsing.
Record types written to the dataset: post records and, when a direct user URL is scraped, user records (both charged as the result event); comment records (charged as the details event). Use recordType to tell them apart. Optional paid add-ons enrich each post in place: scrapeUserProfiles adds the author's karma and cake day, analyzeSentiment adds an AI sentiment label and score, and summarizePost adds a one-line AI summary.
How we compare
Reddit scrapers on Apify differ mostly in how many fields they return and whether they run in a browser. Here is an honest comparison with the most-used alternatives.
| scrapers_lat/reddit-scraper (this actor) | trudax/reddit-scraper-lite | trudax/reddit-scraper | bovi/reddit-scraper | |
|---|---|---|---|---|
| Posts + full comment trees | Yes | Yes | Yes | Yes |
| Subreddit feed + search + direct URLs | Yes | Yes | Yes | Yes |
| Sort orders | hot, new, top, rising, controversial | hot, new, top, relevance, comments | hot, new, top, relevance, comments | hot, new, top |
| Upvote ratio, crosspost count, award count | Yes | Partial | Partial | Partial |
| Post-author karma + cake day (inline) | Yes (add-on) | No | No | Separate user records |
| AI sentiment + AI summary in the same run | Yes (add-on) | No | No | No |
| Comment depth + comment sort filters | Yes | Partial | Partial | Partial |
| Engine | HTTP-only (fast, no browser charge) | Headless browser | Headless browser | HTTP |
| Price per 1,000 posts | about $2.00 | $3.40 | $45/month rental + usage | $1.50 |
| Adoption | Newer, growing | Largest (about 39k users) | About 14k users | Smaller |
Where competitors win, honestly: trudax/reddit-scraper-lite has by far the largest user base and the longest track record, and bovi/reddit-scraper lists a lower per-result price and MCP support. Choose this actor when you want the richest per-post field set (upvote ratio, crosspost and award counts, author karma) and optional AI sentiment or summaries computed in the same run, without paying a browser-tier compute charge.
Use cases
- Market and sentiment research. Pull posts and comments for a product, ticker or topic across subreddits, then turn on
analyzeSentimentto score how the community feels without a separate NLP step. - Brand and reputation monitoring. Track mentions of your brand or competitors with search mode, filter by
minScoreto focus on posts gaining traction, and usecreatedAfterfor daily monitoring. - Trend and topic discovery. Read
top,risingandcontroversialfeeds with a time window to surface what is breaking out in a niche. - Lead generation and audience research. Capture the authors behind high-scoring posts and, with
scrapeUserProfiles, their karma and account age to qualify active, credible community members. - Content sourcing and curation. Collect the highest-scoring posts and their media URLs for newsletters, dashboards or content pipelines.
- AI training and RAG datasets. Export clean JSON, CSV or Excel of posts and threaded comments to build datasets for models and retrieval systems.
Quickstart
Open the actor, paste this into the input, and press Run. It returns the 10 hottest posts in r/technology plus their top comments.
{"maxPosts": 10,"includeComments": true,"mode": "subreddit","subreddits": ["technology"],"sort": "hot","time": "day","commentsLimit": 10,"commentSort": "top","postType": "any","excludeNsfw": false}
Set includeComments to false to collect posts only. Switch mode to search and set searchQuery to query across Reddit instead of reading a subreddit feed.
Input reference
Every field is optional. With an empty input the actor reads the default subreddit feed.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
maxPosts | integer | no | 10 | Maximum number of posts to collect across all sources. |
includeComments | boolean | no | true | When enabled, also fetch each post's comments and emit one record per comment. |
mode | enum | no | subreddit | Where to read posts from: subreddit (a community feed) or search (a query across Reddit). |
subreddits | string[] | no | ["technology"] | Subreddit names to scrape when mode is subreddit. Enter names without the r/ prefix, for example technology, worldnews. |
startUrls | string[] | no | (empty) | Direct Reddit URLs to scrape: post links (.../comments/...), subreddit links (reddit.com/r/name) or user profiles (reddit.com/user/name). Works alongside or instead of the mode inputs. |
searchQuery | string | no | (empty) | Search terms to query when mode is search, for example artificial intelligence. |
searchSubreddit | string | no | (empty) | When mode is search, restrict the search to this single subreddit (name without r/). Empty searches all of Reddit. |
sort | enum | no | hot | Sort order. Subreddit mode: hot, new, top, rising, controversial. Search mode: relevance, new, top, comments. |
time | enum | no | day | Time window for top sort and search: hour, day, week, month, year, all. Ignored for hot, new and rising. |
commentsLimit | integer | no | 50 | Maximum comments to collect per post when Include Comments is enabled. |
commentSort | enum | no | top | How comments are ordered on each post: best, top, new, controversial, old, qa. |
maxCommentDepth | integer | no | (all) | Only keep comments up to this reply nesting depth (0 = top-level only). Empty keeps all depths. |
minScore | integer | no | (none) | Skip posts whose net vote score is below this number. Empty keeps every post. |
postType | enum | no | any | Keep only one kind of post: text (self posts), link (external links) or media (image, gallery or video). any keeps all. |
excludeNsfw | boolean | no | false | When enabled, posts flagged NSFW (over 18) are skipped. |
createdAfter | string | no | (none) | Keep only posts created on or after this date, for example 2026-01-01 or a full ISO timestamp. |
createdBefore | string | no | (none) | Keep only posts created on or before this date, for example 2026-06-30 or a full ISO timestamp. |
scrapeUserProfiles | boolean | no | false | Paid add-on (paid Apify plans only). Add each post author's karma, cake day and verified/gold flags to the post record. Charged only when a profile is genuinely fetched. |
analyzeSentiment | boolean | no | false | Paid add-on. Add an AI sentiment label (positive / neutral / negative), score and rationale per post. Charged only on usable AI output. |
summarizePost | boolean | no | false | Paid add-on. Add a one to two sentence AI summary per post. Charged only on usable AI output. |
Output reference
One dataset item per post or per comment. Use recordType to distinguish them. Types: string, integer, number, boolean, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
recordType | string | post, comment or user. |
id | string | Reddit thing id of the post or comment. |
name | string | Username (user records from a direct user URL). |
title | string | Post title (post records). |
selftext | string | Body text of a self (text) post, or null. |
body | string | Comment text (comment records), or null. |
subreddit | string | Subreddit name without prefix. |
subredditId | string | Reddit subreddit id (t5_...). |
subredditPrefixed | string | Subreddit name with r/ prefix. |
subredditType | string | Subreddit type, for example public. |
author | string | Username of the post or comment author. |
authorId | string | Reddit author id (t2_...). |
authorFlairText | string | Author flair text, or null. |
postType | string | text, link or media (post records). |
url | string | Outbound or content URL of the post. |
permalink | string | Full reddit.com permalink of the post or comment. |
domain | string | Domain of the linked content. |
score | integer | Net vote score. |
upvoteRatio | number | Fraction of votes that are upvotes (post records). |
numComments | integer | Comment count on the post. |
numCrossposts | integer | Number of crossposts. |
totalAwards | integer | Total awards received. |
rank | integer | Position of the post within the collected feed. |
linkFlair | string | Raw link flair, or null. |
linkFlairText | string | Human-readable link flair text, or null. |
isSelf | boolean | true for text (self) posts. |
isGallery | boolean | true for gallery posts. |
isVideo | boolean | true for native video posts. |
isNsfw | boolean | true when the post is flagged NSFW. |
over18 | boolean | Reddit over_18 flag. |
isSpoiler | boolean | true when marked spoiler. |
spoiler | boolean | Raw spoiler flag. |
isPinned | boolean | true when pinned. |
isLocked | boolean | true when the post is locked. |
locked | boolean | Raw locked flag. |
isArchived | boolean | true when archived. |
archived | boolean | Raw archived flag. |
isEdited | boolean | true when the post or comment was edited. |
editedAt | string | ISO 8601 edit timestamp, or null. |
distinguished | string | Distinguished marker (moderator, admin), or null. |
isOriginalContent | boolean | true when marked OC. |
promoted | boolean | true when the post is a promoted/ad unit. |
whitelistStatus | string | Reddit ad-whitelist status, for example all_ads. |
thumbnail | string | Thumbnail image URL, or null. |
mediaUrl | string | Primary media URL, or null. |
mediaUrls | string[] | All media URLs on the post. |
numReplies | integer | Number of direct replies (comment records). |
postId | string | Parent post id (comment records). |
postTitle | string | Parent post title (comment records). |
parentId | string | Reddit id of the parent thing (comment records). |
depth | integer | Reply nesting depth (comment records; 0 = top-level). |
isSubmitter | boolean | true when the comment author is the post's OP. |
isStickied | boolean | true when the comment is stickied. |
createdAt | string | ISO 8601 creation timestamp. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
authorKarma | integer | Author total karma (post + comment). Populated only with the scrapeUserProfiles add-on, else null. |
authorPostKarma | integer | Author post (link) karma, with the scrapeUserProfiles add-on. |
authorCommentKarma | integer | Author comment karma, with the scrapeUserProfiles add-on. |
authorCakeDay | string | Author account creation date (ISO 8601), with the scrapeUserProfiles add-on. |
authorIsVerified | boolean | true when the author account is verified, else null. |
authorIsGold | boolean | true when the author has Reddit premium/gold, else null. |
aiSentiment | string | positive, neutral or negative. Populated only with the analyzeSentiment add-on, else null. |
aiSentimentScore | number | Sentiment score from -1 to 1, with the analyzeSentiment add-on. |
aiSentimentRationale | string | One-line explanation of the sentiment, with the analyzeSentiment add-on. |
aiSummary | string | One to two sentence AI summary of the post, with the summarizePost add-on. |
error | string | null on success. On a failed source, a single item with a populated error field is written instead. |
Example output record
Real comment record from the same run (input {"subreddits": ["technology"], "includeComments": true}):
{"recordType": "comment","id": "p2tcd3h","body": "Anyone remember all the \"dating coaches\" in the early 2000s? What's old is new again.","author": "RottenPingu1","authorId": "t2_vr2wdzpw","authorFlairText": null,"score": 503,"totalAwards": 0,"numReplies": 0,"postId": "1vkhkcw","postTitle": "The 'Manosphere' Isn't a Movement. It's a Multibillion-Dollar Grievance Industry | Many young men are driven to resentment and are financially exploited as influencers sell them classes, pills, and the illusion of clout, a new report reveals.","subreddit": "technology","subredditId": "t5_2qh16","subredditType": "public","parentId": "t3_1vkhkcw","depth": 0,"isSubmitter": false,"isStickied": false,"isEdited": false,"editedAt": null,"distinguished": null,"permalink": "https://www.reddit.com/r/technology/comments/1vkhkcw/the_manosphere_isnt_a_movement_its_a/p2tcd3h/","createdAt": "2026-08-10T11:20:25+00:00","observedAt": "2026-08-10T14:40:49.980Z","error": null}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~reddit-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"mode":"subreddit","subreddits":["technology"],"sort":"hot","maxPosts":25,"includeComments":false}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~reddit-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"mode":"search","searchQuery":"artificial intelligence","sort":"top","time":"week","maxPosts":100,"analyzeSentiment":true}'
Apify CLI:
apify call scrapers_lat/reddit-scraper \--input '{"subreddits":["worldnews"],"sort":"top","time":"day","includeComments":true,"commentsLimit":20}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. Post and user records are charged as the
resultevent; comment records are charged as thedetailsevent. See the pricing tab for the current per-record prices. - Optional add-on events.
scrapeUserProfilescharges auser_profileevent only when an author profile is genuinely fetched;analyzeSentimentandsummarizePostchargeai_sentimentandai_summaryevents only when the model returns usable output. All three are off by default. - No charge on failure. If a source errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. An add-on that returns nothing is never charged. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable records. - Free Apify plans are capped at 10 posts per run, and the paid add-ons are disabled for free accounts. Upgrade for higher
maxPostsand the enrichment add-ons. - Comments are optional. Set
includeCommentstofalseto collect and pay for posts only.
FAQ and troubleshooting
A run returned 0 records. Why?
The subreddit is empty or private, the search matched nothing, or your filters (for example minScore, postType, excludeNsfw or the date range) excluded everything. Loosen the filters or confirm the subreddit name. Zero-result runs are not charged.
How do I collect posts without comments?
Set includeComments to false. Only post records are written and only the result event is charged.
What is the difference between subreddit mode and search mode?
Subreddit mode reads a community feed (r/<name>) using hot, new, top, rising or controversial. Search mode queries across Reddit (or a single subreddit via searchSubreddit) using relevance, new, top or comments.
How do I limit comment depth?
Set maxCommentDepth. 0 keeps only top-level comments; a higher number keeps deeper replies. Leave it empty to keep the full tree up to commentsLimit.
Why is selftext null on some posts?
Only text (self) posts carry selftext. Link and media posts have their content in url, mediaUrl and mediaUrls instead.
How do I get sentiment or summaries?
Turn on analyzeSentiment and summarizePost (paid Apify plans). Each post then carries aiSentiment, aiSentimentScore, aiSentimentRationale and aiSummary. These run in the same pass, so you do not need a second tool or a separate NLP pipeline.
Can I scrape specific posts or a user by URL?
Yes. Put post links, subreddit links or user profile links in startUrls. Post links return the full post plus comments; user links return a user record with karma and cake day. For bulk user-history scraping, see the dedicated Reddit User Scraper.
Is it fast? Does it use a browser?
It is HTTP-only, so it does not launch a headless browser and does not add a browser-tier compute charge to your account. Reddit rate-limits automated traffic, so the actor routes through rotating residential IPs and retries when Reddit serves its interstitial. Occasionally a single source can still be rate-limited within a run; that source is written as an error item and is not charged, and re-running usually clears it.
Is this an official Reddit tool? No. This actor is independent and has no affiliation with Reddit. It reads only data that is publicly available on Reddit. Use it in accordance with Reddit's terms.
Related scrapers
- Reddit Search Scraper: Reddit search results across all of Reddit or one subreddit.
- Reddit Trending Scraper: trending and popular posts across Reddit.
- Reddit User Scraper: a user's posts, comments and profile.
- Hacker News Scraper: Hacker News stories, comments and points.
- Google News Scraper: news articles by keyword and topic.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Reddit. Accesses only publicly available Reddit data. Use in accordance with Reddit's terms.
