How to Scrape Reddit Posts and Comments on Apify
Reddit Scraper Lite pulls posts, comments, communities and user profiles from public Reddit pages without you needing Reddit API credentials or managing Reddit's official API quotas. It bills per result stored, and the real number is $4.00/1,000 results subject to change · verified 2026-09-09 on the free plan. The Store page advertises $3.40, but that is the Business-plan discount price. Two things will surprise you on the first run: three separate limits default to 10, and upvote counts are switched off.
Open Reddit Scraper Lite in the Apify Store, paste a subreddit URL, raise maxItems, maxPostCount and maxComments from their default of 10, switch on includeMediaLinks, and run. Export the dataset as CSV, Excel or JSON. Cost is $4.00 per 1,000 results stored on the free plan.
What does it actually cost to scrape 1,000 Reddit results?
The Actor charges a result stored event for every row that lands in your dataset, and that price is tiered by your Apify subscription. The Store listing shows only the cheapest tier, so the headline you see is not the price most readers will pay.
| Apify plan | Store discount tier | Per result | Per 1,000 results |
|---|---|---|---|
| Free ($0/mo) | none | $0.0040 | $4.00 |
| Starter ($19/mo, $17 annual) | Bronze | $0.0038 | $3.80 |
| Scale ($199/mo) | Silver | $0.0036 | $3.60 |
| Business ($999/mo) | Gold | $0.0034 | $3.40 |
Prices read from the Actor's pricing record via api.apify.com/v2/acts/trudax~reddit-scraper-lite on 2026-09-09; the plan-to-tier mapping is from apify.com/pricing, fetched the same day. The Actor's pricing object also lists Platinum and Diamond tiers, both at $0.0034, which the public pricing page does not name.
Two smaller charges sit on top. Each run pays $0.02 per gigabyte of memory allocated at start, once, and every run has a $0.04 floor. So a 4 GB run that returns 500 posts on the free plan costs about $2.08, not $2.00.
The free plan's $5 monthly credit therefore buys roughly 1,200 Reddit results before you pay anything. That is enough to validate your input configuration and your field mapping, and not enough for a real dataset. Read the Apify free plan breakdown if you want the full credit arithmetic, or how pay-per-event billing works for the model itself.
Which Reddit Actor should you run?
This page uses Reddit Scraper Lite because it is the maintained one. Its sibling matters for a reason that is easy to miss:
trudax/reddit-scraperis marked deprecated in Apify's API, still shows a $45/month flat price today, and switches to pay-per-event on 2026-09-21. Do not budget against its current monthly figure.apify/reddit-scraperno longer resolves as an Actor. Apify redirects it to Reddit Scraper Lite, which is Apify itself naming the successor.
If you have not settled on an Actor yet, the Reddit scraper comparison runs several of them against the same subreddit and puts cost per 1,000 results next to what each one actually returns. Come back here once you have picked one; the configuration below applies to Reddit Scraper Lite specifically.
When the official Reddit Data API is the better choice
Be honest about this before you spend anything. Reddit's own Data API is the right tool when you need a first-party integration your legal review can point at, when you need write access or authenticated user context, or when you are building a product feature rather than a dataset. An Actor gives you neither an OAuth identity nor a contractual relationship with Reddit.
Scraping wins on bulk export, on setup time, and on not having to run credential rotation. It does not win on compliance posture. Pick accordingly, and see is Apify legal for how we think about the boundary.
Why does your first run only return 10 rows?
Because three separate caps all ship at 10, and they compound. This is the single most common reason a Reddit run looks broken when it is working exactly as configured.
Read from the Actor's input schema (build 5.7.9) via Apify's API on 2026-09-09:
| Input | Ships as | What it limits |
|---|---|---|
maxItems | 10 | Total rows saved to the dataset for the whole run |
maxPostCount | 10 | Posts pulled per subreddit, search or user page |
maxComments | 10 | Comments pulled per post; set to 0 to skip comments |
maxCommunitiesCount | 2 | Community pages visited |
maxUserCount | 2 | User pages visited |
includeMediaLinks | false | Upvotes, upvote ratio, comment count, image and video URLs |
includeNSFW | true | NSFW results are included unless you turn this off |
sort | new | Also accepts Relevance, Hot, Top and Comments |
proxy | Apify Proxy, RESIDENTIAL group | The residential group is the shipped default |
maxItems is the one that bites. Raising maxPostCount to 500 while leaving maxItems at 10 still gives you 10 rows.
Why is upVotes empty in your output?
Because includeMediaLinks is off by default, and it gates more than its name suggests. Its own schema description says it controls upVotes, upVoteRatio, imageUrls, videoUrls and numberOfComments. Leave it off and every engagement signal in your dataset is null, which quietly ruins any ranking, sentiment-weighting or "top threads" analysis you were planning.
The trade-off is real: the schema warns that enabling it "will use a more detailed extraction method, which may affect performance." Slower runs, but usable data. Turn it on.
Step-by-step: a Reddit run that returns what you asked for
- Open the Actor. Go to Reddit Scraper Lite and click Try for free to land in the run console.
- Set your input. Paste a subreddit into
startUrls, for examplehttps://www.reddit.com/r/webdev, or usesearcheswith an optionalsearchCommunityNameto scope a query to one subreddit. Search can target posts, comments, communities, users or media through thesearchPosts/searchComments/searchCommunities/searchUsers/searchMediaswitches. - Raise the three tens. Set
maxItemsto your real target, thenmaxPostCountandmaxCommentsto match. If you only want post metadata, setmaxCommentsto0and save yourself the rows. - Enable
includeMediaLinks. See the section above. - Narrow by date if you can.
postDateLimitandcommentDateLimitcut old content before it is stored, which is the cheapest optimisation available: you are billed per row saved, so filtering server-side is money not spent. - Run a 50-row test first. Check the field mapping against your target schema, confirm the cost in the run's billing panel, then scale.
- Export. Open Storage → Dataset, preview, then download CSV, Excel or JSON. For anything recurring, drive it from the Apify API instead of clicking.
What breaks, and what it looks like
Reddit's 1,000-item ceiling. The Actor's own documentation states that Reddit's 1,000-item limit applies to lists — a subreddit's post listing, a search result page — but not to the comments inside an individual post. You cannot pull the 5,000th-newest post in a subreddit in one pass. Work around it by splitting the job: multiple runs scoped by sort and time window, or by search term, rather than one run with a large maxPostCount.
Residential proxies are the default for a reason. The Actor ships with apifyProxyGroups: ["RESIDENTIAL"] and its Store page says plainly that "while some results can be obtained with datacenter proxies, residential proxies are preferred for Reddit scraping." Under pay-per-event you are not billed for that proxy traffic — the price you pay is per result stored — but switching to datacenter proxies to feel clever will cost you success rate. If you are seeing empty runs, see why scrapers get blocked.
Concurrency, where Apify contradicts itself. If you split a large job across parallel runs, note that Apify's two tier-1 pages disagree on the free plan's limit: apify.com/pricing lists 5 maximum concurrent runs, while docs.apify.com/platform/limits lists 25. Both fetched 2026-09-09. Plan for 5 and you will never hit the wall.
What you get back
The dataset schema returns one flat object per item, with a dataType field marking it as post, comment, community or user. Field names below are from the Actor's published dataset schema, fetched 2026-09-09.
| Field | Description | Example |
|---|---|---|
| dataType | post, comment, community or user | post |
| id | Unique identifier of the item | t3_1b8k2mx |
| url | Direct URL to the item | https://www.reddit.com/r/webdev/comments/1b8k2mx/... |
| username | Reddit username of the author | dev_sarah_codes |
| authorFlair | User flair in that subreddit | full-stack |
| title | Title of the post | Migrating a monolith to microservices |
| communityName | Subreddit name prefixed with r/ | r/webdev |
| body | Text content | After 8 months of planning... |
| upVotes | Upvotes. Null unless includeMediaLinks is on | 2847 |
| upVoteRatio | Upvotes over total votes. Same switch | 0.94 |
| numberOfComments | Comment count. Same switch | 312 |
| parentId | Parent post or comment, on comment rows | t3_1b8k2mx |
| createdAt | ISO timestamp of creation | 2026-03-15T14:32:08.000Z |
| scrapedAt | ISO timestamp of the scrape | 2026-03-15T14:35:12.409Z |
Field names are from the Actor's dataset schema; the values are illustrative.
{
"dataType": "post",
"id": "t3_1b8k2mx",
"parsedId": "1b8k2mx",
"url": "https://www.reddit.com/r/webdev/comments/1b8k2mx/migrating_a_monolith/",
"username": "dev_sarah_codes",
"userId": "t2_9x1qk",
"authorFlair": "full-stack",
"title": "Migrating a monolith to microservices",
"communityName": "r/webdev",
"parsedCommunityName": "webdev",
"body": "After 8 months of planning and execution, we finally completed the migration...",
"numberOfComments": 312,
"upVotes": 2847,
"upVoteRatio": 0.94,
"isVideo": false,
"isAd": false,
"over18": false,
"imageUrls": [],
"createdAt": "2026-03-15T14:32:08.000Z",
"scrapedAt": "2026-03-15T14:35:12.409Z"
}
Comment rows carry parentId, postId and numberOfReplies instead of title and numberOfComments. Community rows carry numberOfMembers. User rows carry postKarma and commentKarma.
What changed recently
- 2026-06-30 — the current pay-per-event pricing record took effect, adding the Store discount tiers that make the Free-plan price ($0.0040) different from the advertised one ($0.0034).
- 2026-07-31 — build 5.7.9, the version whose input schema is documented above.
- 2026-09-21 — the deprecated
trudax/reddit-scrapermoves off its $45/month flat price to pay-per-event. If you are running that Actor, your billing changes on that date.
Reddit Scraper Lite is free to try, and a 50-row test costs well under a cent of your free credit.
Open Reddit Scraper Lite on Apify →
Still comparing? The Reddit Actor comparison has the cheaper alternatives and what you give up to get them.
No. The Actor works from public Reddit pages, so you do not supply Reddit API credentials and you are not subject to Reddit's official API quotas. That is not the same as being unlimited: Reddit can still throttle or block scraping traffic, which is why the Actor defaults to residential proxies. You remain responsible for complying with applicable law and Reddit's terms.
Because maxItems defaults to 10 and caps the whole run. maxPostCount and maxComments also default to 10, per page. Raise all three. If you only want posts, set maxComments to 0 so comment rows do not eat your maxItems budget — you are billed per row stored.
On the free plan, 10,000 results stored is $40.00 at $0.0040 per result, plus $0.02 per GB of run memory and a $0.04 per-run floor. On Business (Gold tier) the same job is $34.00. Verified against Apify's API on 2026-09-09.
Not in a single listing pass. The Actor's documentation notes Reddit's 1,000-item limit on lists such as subreddit listings and search results, though it does not apply to comments within a single post. Split the work across runs using different sort orders, time windows or search terms.
It depends on jurisdiction, how you access the data, Reddit's terms, and whether you process personal data. This is not legal advice. See our web scraping legal guide and Is Apify legal?, and take counsel for regulated use.
Yes. Save the configured run as a task and attach a schedule, or trigger it from the Apify API or n8n, Make and Zapier. See Apify tasks and schedules for the setup.