Reddit Scraper icon

Reddit Scraper

Scrape Reddit posts, comments and media from any subreddit or user profile. Search by keyword, sort by hot, new, top or rising, and optionally extract…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Reddit Scraper at a glance

Reddit Scraper is a ready-to-run Apify actor from abotapi for collecting social media data. Its documented output includes id, title, author, score and comments, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Social Media, Developer Tools
Pricing
$1.70 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
17 options

Scrape Reddit posts, comments and media from any subreddit or user profile. Search by keyword, sort by hot, new, top or rising, and optionally extract full comment threads and media URLs. Fast, resource-efficient and requires no login or API keys.

What Reddit Scraper can do

  • Two targets, one actor. Scrape any public subreddit's listing, or switch to username mode and pull one user's posted history instead.
  • Posts with context. Collect post text, author, timestamps, media links and post type together in each post record.
  • Comments on demand. Turn on comment scraping to read each post's public comment-thread feed. Reddit currently exposes few or no comment entries in those feeds, so comment output can be empty (disclosed up front, never silently billed).
  • Media without extra tooling. Image and video links come straight from the post data, and can optionally be downloaded to storage instead of just linked.
  • Reliable connection. Reddit refuses most ordinary datacenter connections, so the actor reads the feeds over Apify's result-unblocking connection, with your own selected connection tried first and a backup connection taking over automatically if it is refused.
  • Built for schedules. Resume continues one interrupted pull without re-collecting or re-charging posts it already has, and incremental mode returns only new and changed posts on recurring runs.

Choose what to collect

These inputs let you configure Reddit Scraper - Posts, Comments, Subreddits & Media. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
targetstring · requiredSubreddit name (for example, python or askreddit) or username (for example, spez). Enter the name only; turn on Is Username for user posts.
isUserbooleanSet to true if target is a Reddit username instead of subreddit
limitintegerMaximum posts to scan, up to 1000. Unchanged posts suppressed by incremental mode still count. Comments are additional result rows and are not included in this limit.
sortstringSubreddit post order: new, hot, top, or rising. User mode returns submitted posts in the source’s own order; this setting does not change that order.

Choices: new, hot, top, rising

timeframestringTime period for 'top' posts

Choices: hour, day, week, month, year, all

scrapeCommentsbooleanFetch the public comment-thread feed for each post. Each returned comment is a separate, billable result row. Reddit currently exposes few or no comment entries in these feeds, so posts-only monitoring is unaffected but comment output can be empty; adds requests and runtime.
commentsLimitintegerMaximum comments returned per post, up to 500. Reddit's public comment feeds currently expose few or no entries, so the returned count can be lower; this is not a hard output-row cap.
Show 10 more inputs
More input fields
InputWhat it controls
extractMediaUrlsbooleanExtract image, video, and gallery URLs from the post data already collected. Does not download the files.
downloadMediabooleanDownload available media files to the Key-Value Store. Requires Extract Media URLs. Adds transfer and storage work; leave off when URLs are enough.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large pull of posts without returning or charging for posts already collected there. Use this after an interrupted run, or when continuing a pull in another run. For recurring daily monitoring of the same subreddit/user, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring of the same subreddit/user. The first run returns all matching posts as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED posts. A post is UPDATED only when its title, text, URL, or type actually changes -- score, upvote ratio, comment count, and the other fields the public post feeds do not publish (see the README) are excluded from that comparison, so voting or commenting alone never marks a post UPDATED. Turn on "Emit unchanged" or "Emit expired" only when you also want those posts returned (and billed). State is kept separately for each subreddit/user, sort, timeframe, and media toggle combination; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the subreddit/user, sort, timeframe, and media toggles -- different setups then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return posts that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return posts that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the subreddit/user listing to its natural end -- not when Post Limit capped it, or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID (text)
titleTitle (text)
authorAuthor (text)
scoreScore (number)
num_commentsComments (number)
post_typeType (text)
permalinkPermalink (link)
created_utcCreated (text)
comment_idID (text)
bodyComment (text)
post_titlePost (text)
urlURL (link)
Show 1 more field
media_urlsMedia (json)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "type": "post",
  "id": "1hj2abc",
  "title": "What's your favorite Python library?",
  "author": "pythonista123",
  "subreddit": "python",
  "created_utc": "2024-12-20T15:30:00",
  "permalink": "https://reddit.com/r/python/comments/1hj2abc/",
  "url": "https://reddit.com/r/python/comments/1hj2abc/",
  "score": null,
  "upvote_ratio": null,
  "num_comments": null,
  "num_crossposts": null,
  "selftext": "I've been exploring different libraries and wanted to hear what everyone's using...",
  "post_type": "text",
  "is_nsfw": null,
  "is_spoiler": null,
  "flair": null,
  "total_awards": null,
  "has_media": false,
  "media_urls": {
    "images": [],
    "videos": [],
    "galleries": []
  }
}

Ways to use this data

  • Market research and brand monitoring: track product mentions and competitor discussion across chosen subreddits.
  • Sentiment and NLP research: build labeled text datasets from post titles, self text and comment threads.
  • Content curation: collect trending posts and their media for aggregation or a content pipeline.
  • Academic and social research: gather subreddit or user activity for longitudinal studies.
  • Lead generation: find users discussing a relevant topic or product across a community.
  • Recurring monitoring: schedule the actor with incremental mode to track a subreddit or user's new activity without re-collecting what you already have.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Reddit Scraper return?

The documented output for Reddit Scraper includes id, title, author, score, comments, type, permalink and created. Availability of each field depends on the source page and the selected mode.

How much does Reddit Scraper cost?

It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed posts on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Later runs then return only NEW and UPDATED posts by default, and unchanged posts are not returned or billed unless you turn on Emit unchanged. When Scrape Comments is enabled, comments can still be fetched and returned as separate billable rows for an unchanged post.

What's the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run from a pasted run or dataset ID, so a large one-off pull can finish without starting over. Incremental mode is for scheduling the actor repeatedly against the same subreddit or user, sort and timeframe, so each run returns only what's new or changed since the last one. They solve different problems and can be combined for a first bootstrap run.

Why did my run fail instead of returning an empty dataset?

This actor fails the run for a configuration problem (a missing target, a resumeFromRunId that doesn't resolve to a run or dataset you own, or turning on incremental mode with resumeFromRunId while that state key already has saved history) or an unexpected internal error. If Reddit itself refuses requests during the scrape, the run still finishes and simply returns fewer posts, or none, rather than failing; try again in a few minutes, and keep the default connection selection (see the Connection input), which reads the feeds over the connection Reddit serves.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Reddit Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.