Reddit Archive Scraper — Historical Posts and Comments by Date avatar

Reddit Archive Scraper — Historical Posts and Comments by Date

Pricing

from $2.40 / 1,000 results

Go to Apify Store
Reddit Archive Scraper — Historical Posts and Comments by Date

Reddit Archive Scraper — Historical Posts and Comments by Date

Pushshift alternative: historical Reddit posts and comments by subreddit, user or post ID and exact UTC date range from public archives. Sort by date or score. No login, no API key. Each run reports its newest item date.

Pricing

from $2.40 / 1,000 results

Rating

0.0

(0)

Developer

Ben

Ben

Maintained by Community

Actor stats

0

Bookmarked

114

Total users

11

Monthly active users

4 days ago

Last modified

Features

Limited permissions

Share

Reddit Archive Scraper is a Pushshift alternative that exports historical Reddit posts and comments by subreddit, keyword and UTC date range, as structured JSON or CSV. Earliest verified date: r/Python back to its first archived post on 2008-01-25 (cloud run of October 25, 2026, oldest-first, no start date). Choose a subreddit, explicit UTC date bounds, a post cap, and oldest-first or newest-first ordering. The linked n8n workflow converts these rows into Markdown and a Sheets export for reporting. Archive coverage and freshness vary; start with a small dated sample before a large backfill.

Need this as a managed weekly feed?

We keep your subreddits archived for you: new posts and comments every week, backfilled history on request, delivered as CSV or JSON (other formats on request) and ready for research or monitoring. You get a free sample before paying. Tell us what you need →

Try it: Archive historical Python posts · n8n: import reddit-archive → Sheets/Slack (reddit-archive-rag-sheets-slack.json)

Need live posts and full comment threads?

This Actor reads public archives by date. For what is on Reddit right now (new and top posts of a subreddit, a post's full comment thread, a user's history, search results, or an hourly watch for new posts), use the Reddit Scraper.

Actor fees include saved rows, non-empty comment threads and the start event; see the full pricing examples below. Use the Issues tab for questions and bug reports.

📚 What is the Reddit Archive Scraper?

It turns any subreddit or keyword into a structured historical dataset. Give it a list of subreddits (and optionally a keyword), an optional afterDate/beforeDate window and a maxPosts cap, and it pages through the archive in your chosen direction, returning available matching posts up to the cap — and, optionally, its archived comments. Each row carries a type field (post or comment) so you can split or join them effortlessly. Ideal for backfilling a database, running sentiment analysis, or studying how a topic was discussed over years.

How current is the data, and what can I scope by?

  • Scopes that work: one or more subreddits, one or more authors (their posts, and with authorHistory their comments), and exact post IDs. A keyword or commentQuery works inside those scopes.
  • Not offered: keyword search across all of Reddit without a subreddit, author or post ID. The public archives refuse it, so the Actor says so and charges nothing instead of returning partial results.
  • Freshness: the archive usually holds posts within minutes to a few days of Reddit, but it varies and has gaps. Every run saves a COVERAGE record in its key-value store (also linked in the run's Output tab) with newest_item_date, oldest_item_date, row counts and the scopes read, so you can see how current that run was.
  • Score ranking: the archive cannot sort by score. top reads the newest 5,000 matching items of your window per subreddit or author and ranks them; use afterDate/beforeDate to rank an older span. minScore, afterDate and beforeDate apply as before.

What data does it extract?

Posts (type: "post"):

  • id, title, selftext (body), author, subreddit
  • score, upvote_ratio, num_comments
  • created_utc (epoch) and created_iso (ISO timestamp)
  • permalink, url, domain, link_flair_text
  • Flags: is_self, is_video, over_18, locked, stickied, spoiler, total_awards_received

Comments (type: "comment", optional):

  • id, post_id, parent_id, link_id, body, author, subreddit
  • score, created_utc, created_iso, permalink
  • is_submitter, total_awards_received

Who it’s for

Researchers, analysts and data teams who need years of Reddit, not just the latest ~1,000 posts.

Verified output and limits

Selected fields from an actual r/Python post returned on September 5, 2026:

{
"type": "post",
"id": "18vkgtu",
"title": "Monday Daily Thread: Project ideas!",
"subreddit": "Python",
"score": 1,
"num_comments": 2,
"created_utc": 1704067208,
"created_iso": "2024-01-01T00:00:08+00:00",
"permalink": "https://www.reddit.com/r/Python/comments/18vkgtu/monday_daily_thread_project_ideas/"
}

Build 1.0.18 returned 250 unique posts oldest-first and 250 unique posts newest-first in separate cloud checks over January 2024. A comment check returned three posts and six comments, with nine result events and three comment-thread events. These checks establish correct output for the tested inputs, not complete archive coverage.

Pricing

On the Free tier, every saved post or comment costs $0.003. When includeComments is enabled and at least one eligible comment is returned for a post, its comment thread adds $0.005, once for that post. This fee is active; it is not a future change. Both the post and its comment rows also count as results.

At 512 MB, the start event is $0.00005. Larger memory settings charge one start event per GB, with a minimum of one. Apify plan discounts apply to all events. Examples before discounts:

OutputCost
250 posts, comments off$0.75005
3 posts + 6 comments across 3 non-empty threads$0.04205
20 posts + 200 comments across 20 non-empty threads$0.76005

The final example illustrates the formula, not a measured run. maxPosts caps posts rather than total dataset rows; comments increase both the row count and bill. Set Apify's maximum run charge as an additional budget limit. An empty result has no result or thread charge, but the start event applies.

⬇️ Input

Give it at least one subreddit (plus an optional keyword), then scope the window and size:

FieldDescription
subredditsOne or more subreddits (without r/). Optional when postIds or authors is set
postIdsOptional list of exact posts: ids (1b9u2yn), t3_ ids or reddit.com comment links, up to 5,000
authorsOptional list of usernames (with or without u/), up to 50. Returns their archived posts across all subreddits
commentQueryOptional keyword searched in archived comment bodies, inside the given subreddits or authors. Returns flat comment rows
authorHistoryAlso return all archived comments of the listed authors (not only their posts)
searchQueryOptional keyword, matched inside the given subreddits
sortOrdernewest (default), oldest, or top (highest score first; ranks the newest 5,000 matching items per subreddit or author in your window)
minScoreOptional minimum Reddit score for both posts and included comments
afterDateInclusive start, YYYY-MM-DD at 00:00 UTC, for posts
beforeDateExclusive end, YYYY-MM-DD at 00:00 UTC, for posts
maxPostsMax posts across all subreddits (1–500000)
includeCommentsAlso fetch archived comments per post (raises result count and cost)
maxCommentsPerPostCap comments fetched per post (only when comments are on)

Example input

{
"subreddits": ["FragranceClones"],
"searchQuery": "dupe",
"sortOrder": "newest",
"minScore": 5,
"afterDate": "2024-01-01",
"beforeDate": "2025-01-01",
"maxPosts": 5000,
"includeComments": true,
"maxCommentsPerPost": 50
}

Fetch known threads or one author's posts (same rows, same type field; afterDate, beforeDate, minScore and includeComments apply):

{
"postIds": ["1b9u2yn", "https://www.reddit.com/r/Python/comments/1b9u2yo/title/"],
"authors": ["spez"],
"maxPosts": 20,
"includeComments": true
}

⬆️ Output

Each post or comment is a separate dataset row. Use (type, id) as the unique key when merging exports. Posts keep selftext; comments keep body and link back through post_id, parent_id and link_id. Missing or deleted source text remains missing or marked as deleted.

Post date bounds do not constrain the dates of comments on those posts. Threads from includeComments carry a depth field (0 = reply to the post, 1 = reply to a reply). Dates accept ISO format, 2024-01-31 or 2024-01-31T12:00:00Z. Comment count is limited by maxCommentsPerPost, archive availability, and the optional score threshold. num_comments describes the archived post and can exceed the number of comment rows returned.

The Actor deduplicates within a run. It does not persist a cross-run cursor or deduplicate earlier exports. For recurring refreshes, store (type, id) in your destination and use overlapping bounded windows to accommodate late archive ingestion. Large exports should use the asynchronous run endpoint, wait for success, then page through the resulting dataset; do not assume a synchronous HTTP connection can stay open for the whole backfill.

An upstream outage, unrecognized response, or stalled pagination cursor fails the run. Inspect the run status before treating a partial dataset as complete. A successful empty run means the archive returned no eligible matches for that request; it does not prove that Reddit had no posts in that period.

📦 Bulk backfill: many subreddits, years of history

Most of this Actor's volume comes from large one-off pulls: a research dataset or a sentiment study. How to run one without surprises:

  1. Start with a dated sample. Run 100 posts of one month first and check the fields you need.
  2. Put up to 50 subreddits in one run. maxPosts (up to 500,000) counts posts across all of them, in the order you list them. For an even split, run one subreddit per run with its own maxPosts, side by side. Measured on October 28, 2026: 1,500 posts from r/Python and r/rust (one month, no comments) in 72 seconds.
  3. Cut years into windows. One run per year or quarter (afterDate / beforeDate) keeps each run inside its timeout and makes a failed window easy to repeat.
  4. Set a budget. Set the run's maximum charge; the run stops cleanly when it is used up and keeps what it saved.
  5. Raise the timeout for big windows. The default is one hour. The run stops about 90 seconds before its timeout and ends SUCCEEDED with the rows it saved; its status message says so. Continue with beforeDate (newest-first) or afterDate (oldest-first) set past the last saved post.
  6. Call it through the async API (POST /v2/acts/benthepythondev~reddit-archive-scraper/runs), wait for the run, then page through the dataset.

If Apify moves a running backfill to another server, the run continues where it was and does not save or charge a post twice.

Example input for one year of three subreddits, oldest first:

{
"subreddits": ["Python", "rust", "golang"],
"afterDate": "2024-01-01",
"beforeDate": "2025-01-01",
"sortOrder": "oldest",
"maxPosts": 50000
}

Cost of 50,000 posts without comments: $150 on the Free tier, $120 on Gold and $105 on Diamond ($0.003 down to $0.0021 a row). Need recurring dumps of the same subreddits, or more than a few hundred thousand rows? The managed weekly feed above delivers them for you.

🔌 Use from Claude, Cursor or any MCP client

You can connect an AI assistant to the Reddit Archive Scraper through Apify's MCP server. It uses your Apify account and this Actor's pricing.

{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=benthepythondev/reddit-archive-scraper",
"headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"}}}}

💡 Use cases

  • 🗃️ Historical backfill: seed a database with years of a subreddit's posts and comments in a single run.
  • 🗂️ Topic archives: build large, topic-specific historical collections for research and search.
  • 📈 Research & sentiment datasets: analyse how opinions and trends shifted across long time spans.
  • 🔎 Brand & product monitoring: study archived mentions of a brand, product or keyword over time.

💰 Cost tips

Pricing is pay-per-result, so you're charged per post or comment returned. Comments are usually the bulk of the count — leave includeComments off if you only need posts, or set maxCommentsPerPost to cap them. Use afterDate/beforeDate to scope exactly the window you need and avoid pulling more than you'll use.

❓ FAQ

Can Claude read whole Reddit threads? For past threads, yes: the hosted MCP server's get_reddit_archive tool returns posts with their archived comments for a UTC date window, up to 10 posts per call when comments are on. For a live thread in thread order with "load more" expanded, use the Reddit Scraper's MCP tool get_post_comments (up to 10 posts per call).

How do I scrape historical Reddit data? Enter one or more subreddits (and optionally a searchQuery), optionally set a date window, then Run. It follows the selected time order and returns structured posts (and comments if enabled).

Why not just use Reddit's official API? Reddit's API hard-caps any listing at ~1000 posts — a few weeks for a busy subreddit. The archive lets you reach months or years of history that the live API simply won't return.

Where does the data come from? The public PullPush and Arctic Shift archives. The Actor automatically selects a healthy backend; coverage and freshness depend on those third-party services.

Can I search all of Reddit by keyword? No. Since October 2026 the public archive refuses a keyword search without a subreddit, so name one or more subreddits (or authors) and add searchQuery to filter inside them. A keyword-only run ends at once with a status message and no result charges.

Can I fetch specific posts or one user's posts? Yes. postIds takes post ids, t3_ ids or comment links and returns those posts (plus comments with includeComments); authors returns a user's archived posts from every subreddit. Ids the archive does not hold are skipped without a charge. With postIds, searchQuery is matched locally against the title and text.

Can I get comments too? Yes — turn on includeComments. Each post's archived comments are returned as separate rows with type: "comment"; use maxCommentsPerPost to cap them. minScore applies to comments too, so low-signal replies do not enter the export.

How do I separate posts from comments? Every row has a type field set to post or comment, plus post_id/link_id on comments to join them back to their thread.

Do I need an API key or login? No. It reads the public archive — no Reddit account, app credentials or API key required.

How far back does it go? To the oldest post the archive holds for that subreddit or keyword. For r/Python that is 2008-01-25, the subreddit's first weeks (verified in a cloud run on October 25, 2026); smaller or newer subreddits start later. Use afterDate to set the earliest date you want. Set sortOrder to oldest when you want to begin at the start of that window.

Why did my run fail? On purpose, when the upstream archive is down, returns an answer the Actor does not recognise, or stops advancing its page cursor. The run then fails instead of succeeding with a silently partial dataset, so a SUCCEEDED run means the archive answered every page. Rows saved before the failure stay in the dataset; run the same input again a little later, or narrow the date window. This is why the success rate shown on the Store counts archive outages as failed runs.

Can I run it on a schedule or via API? Yes — schedule recurring runs in Apify, call it via the API/SDK, or connect it to Make, Zapier or n8n.

Is scraping Reddit data legal? It reads publicly archived data. Use it for lawful purposes and follow Reddit's and each archive provider's terms.

🔗 You might also like


Keywords: historical reddit dump, Pushshift alternative, PullPush, reddit historical posts, Reddit archive scraper, historical Reddit posts, Arctic Shift, Reddit posts scraper, Reddit comments scraper, subreddit scraper, Reddit API alternative, weekly Reddit refresh, Reddit data export, keyword search Reddit.

⌂ 换网址