Reddit Comments Scraper API | CSV, Excel & JSON ยท Apify
Reddit Comment Scraper | Replies & CSV Export avatar

Reddit Comment Scraper | Replies & CSV Export

Pricing

from $6.00 / 1,000 comments

Go to Apify Store
Reddit Comment Scraper | Replies & CSV Export

Reddit Comment Scraper | Replies & CSV Export

Export Reddit comments and nested replies from post URLs to CSV, Excel or JSON. Get text, authors, scores and timestamps for feedback research or AI workflows. Monitor only new comments across runs. No Reddit login or API key needed. Try 10 comments first.

Pricing

from $6.00 / 1,000 comments

Rating

0.0

(0)

Developer

Newbs

Newbs

Maintained by Community

Actor stats

2

Bookmarked

103

Total users

5

Monthly active users

a day ago

Last modified

Features

Limited permissions

Share

What does Reddit Comment Scraper do?

Reddit Comment Scraper exports comments and nested replies from public Reddit post URLs to CSV, Excel or JSON. Get comment text, authors, scores, timestamps and reply relationships for product feedback research, sentiment-analysis datasets and AI workflows. No Reddit login or Reddit API key is required.

Use it once to export a discussion, or monitor only new comments across repeated runs. You can run it without code in Apify, call the API, or connect it to n8n and Apify MCP.

Start with 10 comments: result charges are $0.06, plus the start event and Apify platform usage. Check the output before increasing your limit.

How to scrape Reddit comments

  1. Paste one public Reddit post URL, or keep the prefilled example for a first test.
  2. Keep Maximum comments per post at 10. Choose Top for popular feedback or New for monitoring; leave optional sections at their defaults.
  3. Set a maximum run cost in Run options, then click Start.
  4. Open Comments to read the results, then export CSV, Excel or JSON. Open Run summary if fewer comments were returned than expected.

Standard reddit.com, old.reddit.com and short redd.it post links are supported. This Actor extracts comments from supplied posts; it does not discover posts through subreddit or keyword searches.

What data can you export?

Each row is one comment or reply. The default table puts the comment text, author, score and timestamp first so you can check useful results immediately.

DataOutput fieldsUse it for
Comment textcommentTextFeedback research, topic classification and sentiment analysis
Author and original-poster flagcommentAuthor, isPostAuthorDistinguishing community feedback from the post author's replies
Score and creation timecommentScore, commentTimestampPrioritizing feedback and tracking discussion over time
Direct comment linkcommentPermalinkReturning to the source for context
Reply relationshipscommentId, parentCommentId, commentDepthReconstructing the available conversation
Post contextpostTitle, postUrl, subredditCombining results from several discussions

Unavailable fields can be null. Deleted or removed bodies are skipped. The Actor exports source text and metadata; it does not generate sentiment scores or AI summaries of the comments.

Choose a workflow

Your goalStart hereSuggested setup
Export a discussion for analysisSentiment-analysis dataset exampleTop comments, include replies, export CSV
Collect product feedbackProduct-feedback exampleAdd relevant post URLs, inspect scores and reply context
Monitor ongoing discussionsNew-comment monitoring exampleNew sort, only new comments, a stable monitoring key

Apify Schedules and webhooks can connect repeated runs to your workflow. The n8n instructions below cover exports, alerts and downstream AI processing.

Reddit comment scraping cost

The Actor uses pay-per-event pricing:

  • $0.006 per saved comment
  • $0.00005 per GB at startup, with a minimum of one start event
  • Apify platform usage can also apply as shown in the Console pricing estimate

Estimated result charges:

Saved commentsResult charge
10$0.06
100$0.60
500$3.00
1,000$6.00

You are charged only for rows successfully saved under the comment event. The Actor respects the maximum run cost configured by the user and stops gracefully when that limit is reached.

Reddit comment scraper input

Example input:

{
"postUrls": [
"https://www.reddit.com/r/AskReddit/comments/ovihp9/what_city_would_you_never_ever_ever_live_in/"
],
"maxComments": 10,
"includeReplies": true,
"maxCommentDepth": 20,
"sortBy": "top",
"maxConcurrency": 2
}
FieldDefaultDescription
postUrlsRequiredDirect public Reddit post URLs
maxComments10Maximum saved comments per post, including replies
sortBytoptop, best, new, controversial, old, or qa
includeRepliestrueInclude nested replies
onlyNewCommentsfalsePersist state and save only comments not seen by earlier runs
monitoringKeydefaultStable name that isolates one recurring monitor
sinceTimestampEmptySkip comments older than this ISO 8601 timestamp
monitoringScanLimit100Recent comments inspected per post when filtering or monitoring
maxCommentDepth20Deepest reply level to save; 0 means top-level only
maxConcurrency2Posts processed in parallel, from 1 to 4
proxyResidentialProxy used by both HTTP and browser collection
mcpOutputConnectorsEmptyOptional Apify MCP destinations for a run summary

maxComments applies to each post. For example, two URLs with maxComments: 10 can save up to 20 paid comment rows.

Monitor only new comments

Use this input in an Apify Schedule or automation:

{
"postUrls": [
"https://www.reddit.com/r/AskReddit/comments/ovihp9/what_city_would_you_never_ever_ever_live_in/"
],
"onlyNewComments": true,
"monitoringKey": "customer-feedback",
"monitoringScanLimit": 100,
"maxComments": 10,
"includeReplies": true,
"sortBy": "new"
}

The first run saves up to 10 unseen comments. Later runs with the same monitoringKey and post URL save comments whose IDs are not in the monitor's saved history. Unseen rows beyond the output or spending limit remain eligible for later runs. Already-seen rows are skipped before billing. Change the key to start a separate history.

Use sortBy: "new" to prioritize recent discussion and sinceTimestamp to exclude older history. Reddit's tree order does not guarantee a global timestamp order across nested replies. The Actor scans up to monitoringScanLimit comments and remembers the latest 20,000 saved IDs per post and key. Increase the scan limit for busy threads and avoid overlapping runs of the same monitor. Older IDs outside that history can be returned again.

Monitoring state is stored in newbs-reddit-comment-monitor-state in your Apify account. Use the same post URL across scheduled runs. A run with no unseen comments reports no-new-comments; it still incurs start and platform usage charges.

Reddit comment output example

Each dataset item is one comment or reply. The flat format works directly with spreadsheets, databases, BI tools, and AI workflows.

{
"postUrl": "https://www.reddit.com/r/example/comments/abc123/example_post/",
"postId": "t3_abc123",
"postTitle": "Example post",
"postAuthor": "original_poster",
"postScore": 123,
"postText": "Post body when available",
"postCreatedAt": "2026-07-20T08:00:00.000Z",
"subreddit": "example",
"commentId": "t1_def456",
"parentCommentId": "t3_abc123",
"commentAuthor": "commenter",
"commentText": "Example comment",
"commentScore": 42,
"commentPermalink": "https://www.reddit.com/r/example/comments/abc123/example_post/def456/",
"commentTimestamp": "2026-07-20T09:00:00.000Z",
"commentDepth": 0,
"commentPath": "0",
"parentPath": null,
"isTopLevel": true,
"isPostAuthor": false,
"replyCount": 3,
"scrapeSource": "reddit-json",
"scrapedAt": "2026-07-28T10:00:00.000Z"
}

Reddit does not expose every field on every page. Fields such as score, permalink, or post body can be null when they are unavailable.

The Actor also writes an OUTPUT run summary with per-post status, scanned/new/skipped counts, monitoring state, collection source, duration, and an explanation when a post returns no rows. A successful monitor with no updates reports no-new-comments instead of looking like a scraping failure.

Ready-to-run examples

Reddit comments API

JavaScript:

import { ApifyClient } from "apify-client";
const apifyClient = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await apifyClient.actor("newbs/reddit-comment-scraper").call({
postUrls: [
"https://www.reddit.com/r/AskReddit/comments/ovihp9/what_city_would_you_never_ever_ever_live_in/"
],
maxComments: 10,
includeReplies: true,
maxCommentDepth: 20,
sortBy: "top"
}, { maxTotalChargeUsd: 1 });
const { items } = await apifyClient.dataset(run.defaultDatasetId).listItems();

Synchronous HTTP API:

POST https://api.apify.com/v2/acts/newbs~reddit-comment-scraper/run-sync-get-dataset-items

Send the JSON input as the request body with Authorization: Bearer YOUR_APIFY_TOKEN. For larger runs, use the asynchronous run endpoint and retrieve the dataset after completion.

Python:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("newbs/reddit-comment-scraper").call(run_input={
"postUrls": ["https://www.reddit.com/r/AskReddit/comments/ovihp9/what_city_would_you_never_ever_ever_live_in/"],
"maxComments": 10,
"includeReplies": True,
})
for comment in client.dataset(run["defaultDatasetId"]).iterate_items():
print(comment["commentText"])

Automation and AI

Apify MCP

Select this Actor in Apify's hosted MCP server or use:

https://mcp.apify.com?tools=newbs/reddit-comment-scraper

The input, output, and dataset schemas let AI agents discover the tool and understand its result fields. Optional MCP output connectors can send a compact run summary and dataset link to an authenticated destination without exposing destination credentials to the Actor.

Use with n8n

Use the official Apify node and choose Run an Actor and Get Dataset:

  1. Set Actor ID to newbs/reddit-comment-scraper.
  2. Pass the same JSON input shown above.
  3. Send returned rows to Google Sheets, Slack, Notion, Airtable, a database, or an AI node.

Start from the monitoring example for recurring runs, or the sentiment analysis example for a one-time export. The same input fields work in the official Apify n8n node.

Download a starter workflow and import its JSON into n8n. Select your Apify credentials and replace the sample URL before running:

Reliability and limitations

  • Public Reddit posts only; private, quarantined, age-gated, or removed content may be unavailable.
  • Deleted and removed comment bodies are skipped. Accessible replies beneath those comments are retained; their parent ID may refer to a row absent from the export.
  • Collection tries JSON with bounded comment expansion, then static HTML. The browser fallback first reuses comments already rendered on the page, then tries JSON within that session and page expansion when more results are needed. Recovered comments are preserved if later expansion fails or times out. Reddit can still withhold comments; a result limit is a cap, not a guarantee of that many available rows.
  • maxCommentDepth and maxComments intentionally limit the saved result set.
  • Residential proxy traffic adds platform usage costs. Keep the tested default configuration for your first run. For large browser-based threads, compare 2 GB of memory with the 1 GB default; faster runtime does not automatically mean a lower total cost.

Frequently asked questions

Do I need a Reddit API key or login?

No Reddit credentials are required for public posts. Running in Apify Console needs no code. Calling the Apify API from your own code requires an Apify API token, as shown in the examples above.

Can I download Reddit comments as CSV or Excel?

Yes. Open the completed run's dataset, select Export, and choose CSV, Excel or JSON. One row represents one comment or reply; the parent ID and depth preserve available thread relationships.

Is there a free trial?

This is a paid Actor. Ten saved comments cost $0.06 in result charges, plus the start event and platform usage. Any Apify account credits are governed by your plan; this Actor does not include a separate free result allowance.

Can I export more than 500 comments?

Set maxComments up to 5,000 per post. The Actor follows available JSON continuation IDs in batches of up to 100 and uses browser expansion when needed. Actual coverage depends on what Reddit exposes, reply depth, runtime and your spending limit.

Why did I get fewer comments than requested?

Check the Run summary. Comments may be deleted, filtered by depth or time, already saved by your monitor, or inaccessible. A partial result preserves available comments when further collection fails. Run-level failure is reported when all requested posts fail.

Can I search Reddit or scrape an entire subreddit?

This Actor accepts direct post URLs. Use another discovery step to find posts, then send their URLs here for comment extraction.

How do I prevent duplicate charges?

Duplicate comment IDs and alternate URLs for the same post are removed within a run. For repeated runs, enable onlyNewComments, keep the same monitoringKey and post URL, and follow the monitoring history limits above.

Support

For a failed or empty source, first open the run's Run summary output. It identifies the affected URL and explains whether the post was empty, unavailable, blocked, or stopped by a spending limit.

If the problem persists, open an issue in the Issues tab and include the run ID and a public example URL. Do not include API tokens or proxy credentials.

Changelog

November 13, 2026

  • Simplify the first-run form, show comment text first in the results table, and clarify export, monitoring and pricing instructions.

  • Bound lightweight HTTP probes and stop repeating a path after it denies two distinct posts in the same run; browser fallback stays available.

  • Allow briefly for rendered comments to appear before another request, and read post metadata in one browser operation.

  • Reuse comments already rendered in the browser before trying additional JSON requests or expansion.

  • Preserve the best recovered snapshot when browser expansion times out, and report interrupted collection in the run summary.

  • Avoid repeated DOM extraction once the requested comment limit is reached.

  • Expand comment controls in small batches to avoid overloading the browser on large threads.

  • Count saved comment events separately from SDK synthetic events, keeping spending-limit summaries and monitoring checkpoints accurate.

  • Refresh runtime dependencies and the pinned Puppeteer browser version.

September 15, 2026

  • Added HTTP continuation requests, static HTML collection, and structured JSON collection within browser sessions.
  • Preserved accessible replies below deleted parents and recovered comments after failed expansion.
  • Applied reply-depth filtering before result limits and deduplicated alternate post URLs.
  • Batched dataset writes while retaining spending-limit checks and matching comment charges.
  • Fixed monitoring that could discard unseen comments after a timestamp cutoff.
  • Added clearer partial/failure reporting and runnable Python and JavaScript examples.
  • Added a verified Chrome installation to the container build and updated Browserslist to 4.28.9.

September 1, 2026

  • Added persistent onlyNewComments monitoring with per-thread deduplication.
  • Added sinceTimestamp, isolated monitoring keys, and a separate scan limit for busy threads.
  • Added no-new-comments run summaries with scanned, new, and skipped row counts.
  • Switched the fast collector to Reddit's working structured endpoint to avoid browser startup on common runs.
  • Upgraded the runtime to Node 22, Crawlee 3.18, and Puppeteer 25.
  • Reduced the first-run default from 25 to 10 comments for tighter cost control.
  • Added a ready-to-run Reddit comment monitoring task and updated the n8n Slack monitor workflow.

July 2026

  • Added HTTP-first collection that skips browser startup when possible.
  • Kept automatic browser fallback for blocked or incomplete JSON responses.
  • Added canonical support for reddit.com variants and redd.it links.
  • Added comment score, permalink, parent ID, original-poster flag, post text, and collection source.
  • Added maximum reply depth.
  • Added a visible per-post run summary for empty and failed sources.
  • Reduced the first-run default from 500 to 25 comments for clearer cost control.