Reddit Scraper – Posts, Comments & User History avatar

Reddit Scraper – Posts, Comments & User History

Pricing

from $0.75 / 1,000 reddit results

Go to Apify Store
Reddit Scraper – Posts, Comments & User History

Reddit Scraper – Posts, Comments & User History

Export Reddit posts and comments by subreddit or user, with UTC date filters and CSV/JSON downloads. No Reddit API key, login, or proxy setup. Uses Arctic Shift archives; recent content may lag. $0.75 per 1,000 results, plus a small start charge.

Pricing

from $0.75 / 1,000 reddit results

Rating

0.0

(0)

Developer

Anas Nadeem

Anas Nadeem

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

2

Monthly active users

17 days ago

Last modified

Share

Export Reddit posts and comments from subreddits and public user histories into structured datasets for research, AI/RAG ingestion, and content analysis. Choose your targets, set a UTC date range, and download JSON, CSV, or Excel.

This Actor uses Arctic Shift archives. Recent content, available records, and engagement values can differ from live Reddit. Global keyword search, direct post-thread URLs, and live rankings are not supported.

$0.75 per 1,000 output rows, plus a small memory-based start charge. No Reddit API key, Reddit login, cookies, or proxy setup is required. An Apify account is required to run the Actor on Apify.

Moving from our old Reddit Scraper?

Our old Actor is obsolete. Use this Actor for supported subreddit and user post/comment exports. Input names, output fields, and data coverage have changed; changing only the Actor name in an existing integration is insufficient.

  1. Move supported subreddit or user-profile URLs into targets, or use r/name and u/name shorthand.
  2. Choose posts, comments, or both and provide a date range and a small result cap.
  3. Run the example below and inspect the output before reconnecting downstream steps.
  4. Create a new saved task or update your API calls to whoareyouanas/reddit-faster-actor. Reconfigure schedules, webhooks, and integrations for the new task and output fields.
  5. Disable obsolete schedules once your supported replacement workflow is ready.
Previous input or workflowUse here
Subreddit URL in startUrlsMove the URL to targets, or use targets: ["r/Python"]
User-profile URL in startUrlsMove the URL to targets, or use targets: ["u/username"]
skipComments: truedatasets: ["posts"]
Posts and commentsdatasets: ["posts", "comments"]
User commentsUser target with datasets: ["comments"]
postDateLimit, commentDateLimitShared startDate and endDate; use separate runs for different post/comment windows
time presetsExplicit UTC date bounds
maxItems, maxPostCount, maxCommentsSet maxItemsPerKind; it applies separately to every target and dataset
debugModeverboseLog
Proxy and browser timeout/scroll settingsRemove; this Actor requests the archive directly
skipCommunityNo direct equivalent; skipMetadata skips separate archive metadata requests
searches, search flags, direct post/comment URLsUnsupported
Live sort, NSFW filtering, community discovery, profile rowsNo direct equivalents

Comments are exported for the selected subreddit or author. They are not fetched as the comment trees of the selected post rows. This Actor does not output normalized community or user-profile rows.

Previous output fieldNew output field or action
dataTypekind (post or comment)
parsedIdredditId
usernameauthor
bodydescription (post selftext or comment text; can be null)
createdAt, title, urlSame names; review nullability and URL semantics below
upVotes, community name, parent identifiersInspect available source fields in rawData; normalized legacy names are not provided
scrapedAt, normalized profile/community rowsNo equivalent

Quick start: subreddit posts and comments

This bounded historical example requests up to 100 posts and 100 comments. It demonstrates an export, not current Reddit freshness.

{
"targets": ["r/Python"],
"datasets": ["posts", "comments"],
"startDate": "2024-01-01",
"endDate": "2024-01-07",
"maxItemsPerKind": 100,
"limit": "100",
"resumeFromState": false
}

For one target and two datasets, the maximum is 200 rows: $0.15 in result charges if both caps are reached, plus startup. Date ranges and archive availability can produce fewer rows.

startDate is the lower UTC bound. A date-only endDate includes that calendar day by setting the upper bound to the next UTC midnight. For example, "endDate": "2024-01-07" means before 2024-01-08T00:00:00Z. Use an ISO datetime for an exact upper boundary. "now" sets an upper time boundary; it does not guarantee the archive contains current content.

What can you use it for?

  • Subreddit research: export dated discussions from known communities for topic and audience analysis.
  • Reddit comments datasets: collect available comment text with source identifiers for downstream sentiment or language analysis.
  • Public user history: export an author's available posts and comments within a selected period.
  • AI/RAG ingestion: obtain text, timestamps, links, and original source fields for your own filtering and retrieval pipeline.
  • Content and SEO research: study questions, terminology, and post text from relevant communities.
  • Historical backfills: query explicit date windows instead of relying on Reddit's current feed listings. Coverage depends on the archive.

The Actor collects data; it does not generate sentiment scores, embeddings, leads, or summaries.

User history example

Replace the example username with your target:

{
"targets": ["u/spez"],
"datasets": ["posts", "comments"],
"startDate": "2024-01-01",
"endDate": "2024-01-31",
"maxItemsPerKind": 100,
"limit": "100",
"resumeFromState": false
}

Comments-only example

{
"targets": ["r/Python"],
"datasets": ["comments"],
"startDate": "2024-01-01",
"endDate": "2024-01-07",
"maxItemsPerKind": 100,
"limit": "100",
"resumeFromState": false
}

Output

Each dataset row is one post or one comment. The following is an illustrative schema example, not a measured run result:

{
"createdAt": "2024-01-03T12:00:00Z",
"author": "example_author",
"title": "Example discussion title",
"link_flair_text": "Discussion",
"description": "Example post text.",
"url": "https://www.reddit.com/r/Python/comments/example/example_discussion/",
"kind": "post",
"redditId": "example",
"rawData": {
"id": "example",
"author": "example_author",
"subreddit": "Python",
"created_utc": 1704283200,
"title": "Example discussion title",
"selftext": "Example post text.",
"link_flair_text": "Discussion",
"permalink": "/r/Python/comments/example/example_discussion/"
}
}
FieldMeaning
createdAtSource creation time formatted in UTC
authorSource author, potentially a deleted marker or null
titlePost title; for comments, source parent-title information when present
link_flair_textSource flair when present
descriptionPost selftext or comment body; link posts without selftext can be null
urlSource permalink expanded to a Reddit URL; a comment may fall back to its parent-post permalink; can be null
kindpost or comment
redditIdSource Reddit identifier
rawDataOriginal archive row, including additional fields when available

Text and metadata fields can be null. Scores, subreddit names, post/parent identifiers, and other fields may be available inside rawData; their presence is source-dependent. Use JSON export when you need the nested source payload. The default Output tab includes the record kind and Reddit ID alongside readable text, date, author, flair, and link fields.

The run's key-value store contains OUTPUT (summary), METADATA-r_Python or equivalent target metadata when enabled, and STATE-r_Python-posts / STATE-r_Python-comments or equivalent checkpoints.

Input reference

The default export selects posts from the past 30 days, capped at 100 rows per target, with endDate: "now" and API limit: "100". Archive freshness still applies. Use explicit dates and caps for repeatable research jobs. The Input tab describes advanced controls.

FieldTypePurpose
targetsstring array, requiredr/name, u/name, user/name, or exact Reddit subreddit/user-profile URLs; post, search, and nested listing paths are not accepted
datasetsstring arrayposts, comments, or both
startDatestringUTC lower bound; defaults to 30 days ago. Accepts N days ago, dates, ISO datetimes, epoch seconds/milliseconds, none, or all
endDatestringUTC upper bound; defaults to now; date-only includes that day
maxItemsPerKindpositive integerMaximum new rows per target per selected dataset; not a global cap
maxPagesPerKindpositive integerOptional cap on non-empty fetched pages per target/dataset
limitstringArchive API page-size parameter; separate from total result cap
windowDaysnumberMaximum request date-window span; 0 disables windowing
minWindowSecondspositive integerMinimum window after oversized-range responses
requestDelayMsintegerDelay between successful non-empty page requests
timeoutSecondsnumberTimeout for each HTTP request
retries, retrySleepSecondsinteger / numberTransient request retry controls
skipMetadatabooleanSkip archive metadata lookup; provide an explicit start date
dryRunbooleanPreview request URLs and summary without fetching dataset rows; startup can still be charged
resumeFromStatebooleanRead checkpoints in the current run's default key-value store when present
verboseLogbooleanMore detailed progress logs
baseUrlstringAdvanced archive endpoint override; leave the default for normal use

For two targets and both datasets, maxItemsPerKind: 100 permits up to 400 rows. Smaller page limits affect request size, not that overall maximum. Avoid broad unbounded ranges when testing.

Pricing

The configured result event is $0.00075 per row, or $0.75 per 1,000 posts or comments. One post and one comment are two rows. The same rate applies to both kinds.

Returned rowsResult charges, excluding startup
100$0.075
1,000$0.75
10,000$7.50
100,000$75.00

The configured apify-actor-start price is $0.00005 per startup event unit. Apify determines the number of units from allocated run memory, with a minimum of one unit. This is not a universal flat fee for every memory setting. Review the Pricing tab and your run's charge details for the exact total.

Failed requests, empty windows, metadata requests, and skipped duplicates do not create billable result rows. A run with no rows, including a dry run, can still incur startup charges. Already returned rows remain billable if a later request fails. No proxy is configured by default.

API and integrations

Use the replacement Actor identifier and the new input shape. An Apify API token is needed for authenticated API calls; a Reddit API key is not needed.

curl -X POST \
'https://api.apify.com/v2/acts/whoareyouanas~reddit-faster-actor/run-sync-get-dataset-items' \
-H 'Authorization: Bearer YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"targets": ["r/Python"],
"datasets": ["posts", "comments"],
"startDate": "2024-01-01",
"endDate": "2024-01-07",
"maxItemsPerKind": 100,
"limit": "100",
"resumeFromState": false
}'

For larger exports, use the asynchronous run endpoint or an Apify client, wait for completion, and retrieve the run's default dataset. Keep your token in a secret manager or environment variable in production. The Actor's API tab provides client examples.

In n8n, Make, or Zapier, select this Actor or a new saved task and map the new dataset fields. Inspect one successful dataset before enabling downstream automation.

Schedules and checkpoints

Use fixed dates for reproducible backfills and delayed resumption: relative dates such as 30 days ago are resolved when the run starts. Checkpoints are stored in the current run's default key-value store. A new scheduled run gets its own storage: resumeFromState: true does not automatically continue a previous scheduled run or provide deduplication across runs.

For recurring exports, explicitly advance your UTC date bounds in your workflow. Allow overlap when appropriate for archive ingestion delays, then deduplicate downstream using kind and redditId. Validate missing IDs before using them as keys. A capped export may not cover its whole date range; inspect the summary before advancing the next window. No fixed overlap duration guarantees all late-arriving archive content.

Coverage and troubleshooting

Why fewer rows than requested? A result cap is a maximum, not a promise. Check target spelling, date bounds, page caps, and the run summary. The archive may lack recent, deleted, removed, private, banned, or otherwise unavailable content. A zero-row result does not establish that Reddit has no matching content.

Why are current scores or posts different from Reddit? This Actor exports an archive snapshot. It does not refresh records or engagement values against live Reddit and has no guaranteed freshness interval.

Can I get a complete subreddit or comment thread? You can request available subreddit or user rows across date windows. Archive completeness is not guaranteed. Direct post-thread URLs, live comment expansion, and complete-thread guarantees are not supported.

Can I search Reddit by keyword? There is no global or scoped keyword-search input. Export a known subreddit/date range and filter returned text downstream if that meets your needs.

Why did a run fail? Check the log for invalid input, source errors, or exhausted retries. Correct input errors before rerunning. For source failures, try a smaller historical window and a bounded result cap. Inspect any partial dataset before retrying to avoid treating repeated rows as new data.

What does a saturated timestamp error mean? If the archive returns a full page at one timestamp and cannot advance safely, the run fails with partial results saved. This prevents silently skipping records. Try a larger supported page limit or a narrower target, and inspect the checkpoint and partial dataset before retrying.

Need migration help? Open an issue from this Actor's Issues tab with your use case, input without secrets, and a run link you are comfortable sharing. Mention whether you need subreddit posts, comments, user history, or an unsupported legacy mode.

This is an unofficial Actor, unaffiliated with Reddit. It exports data available through Arctic Shift; use the data consistently with applicable source terms and privacy requirements.