Reddit Scraper - Posts, Comments, Search & Subreddits avatar

Reddit Scraper - Posts, Comments, Search & Subreddits

Pricing

from $1.50 / 1,000 result saveds

Go to Apify Store
Reddit Scraper - Posts, Comments, Search & Subreddits

Reddit Scraper - Posts, Comments, Search & Subreddits

Scrape Reddit posts, comments, subreddits, user profiles, and keyword search results - no API key, no rate limits, no login. From $2 per 1,000 results, pay only for what you use. Full comment threads, 60+ fields per post, media and galleries. Works with AI Agents, MCP, n8n, Make, Zapier and more.

Pricing

from $1.50 / 1,000 result saveds

Rating

4.6

(42)

Developer

Harsh Maur

Harsh Maur

Maintained by Community

Actor stats

136

Bookmarked

16K

Total users

4.1K

Monthly active users

12 hours

Issues response

a day ago

Last modified

Share

Reddit Scraper — Scrape Reddit Posts, Comments & Subreddits (No API Key)

Scrape Reddit posts, comments, subreddits, search results, and user profiles — no API key, no login, no rate limits. $2.00 per 1,000 results on the Apify Free plan, less on paid plans.

Built for AI agents: battle-tested Reddit scraper that works out of the box with Claude, ChatGPT/Codex, and Cursor via the Apify MCP server — structured JSON, no login, no setup.

Try on Apify Input Schema API Docs

Find customers • Reddit API shutdown • What it does • AI agents (MCP) • How to use • Search • Subreddits • Comments • Output fields • Limits • Run summary • Pricing • FAQ


Find customers on Reddit every morning

Every day, people on Reddit ask for a tool like yours: "any alternative to X?", "what CRM do you use?", "I'd pay for something that…". Get them every morning and reply while the thread is still new.

1. Search the words your buyers use. Your category, your competitors' names, and "alternative to …". Keep each phrase short: Reddit search is literal.

2. Let the AI keep only the buyers. One custom label answers true or false for every post.

{
"searchTerms": ["HubSpot alternative", "CRM recommendation", "Pipedrive vs"],
"searchPosts": true,
"searchSort": "new",
"postedAfter": "1 day",
"maxPostsCount": 100,
"customLabels": {
"wants_software": "true only if the author is looking for a software product or an alternative to one; false for job ads, hiring, news and people promoting their own product"
}
}

Filter on customLabels.wants_software = true. In our test on 14 October 2026, one day of these three searches returned 35 posts. The label kept 7, and 5 of them were people choosing a tool ("Which CRM do you recommend", "Twilio alternatives if we don't want to build our messaging setup ourselves?"). Job ads, news and self-promotion were dropped. (How AI labels work.)

3. Get them in Slack before your coffee. Open Actions → Schedule on the run and pick a daily time. Because postedAfter is "1 day", each run returns only new threads. Add an MCP connector and the leads arrive in Slack, Notion or Google Sheets.

That test run cost $0.11: the $0.02 start, 35 results, and the AI label on each. AI labels need a paid Apify plan. Full pricing.

The same recipe, other outcomes:

  • Hear what people hate about your competitors. Search their names and tick hasPain, painPoint and competitor. Example input.
  • Know when someone mentions your brand. Brand monitoring input.
  • Give your AI agent live Reddit data. Claude, ChatGPT and Cursor can call this scraper as a tool. Set it up.

Reddit API and RSS shutdown: keep your Reddit workflows running

On 30 September 2026, Reddit announced that it is closing public access to its Data API and its RSS feeds:

DateWhat stops
31 October 2026Reddit takes no new API access requests.
13 November 2026Reddit RSS feeds stop.
From 12 January 2027Apps that are not registered start to lose access.

Many automations use these, so they stop working:

  • the n8n Reddit node and RSS Read nodes on reddit.com/….rss links
  • the Make Reddit app (Make already removed it for new connections)
  • Zapier Reddit triggers
  • scripts that use PRAW or an OAuth app of your own

Reddit Scraper needs no Reddit app, no OAuth client and no API approval. You give it a token for your Apify account, and that is all. Replace the broken step with one of these inputs:

You usedUse this input
RSS feed of a subreddit (/r/SaaS/new/.rss)"startUrls": [{"url": "https://www.reddit.com/r/SaaS/new/"}] with "postedAfter": "1 hour" on an hourly schedule
RSS feed of a search (/search.rss?q=…)"searchTerms": ["your keyword"], "searchSort": "new", "postedAfter": "1 day"
Reddit node: get posts from a subreddit"startUrls": [{"url": "https://www.reddit.com/r/SaaS/"}] and "maxPostsCount"
Reddit node: get comments of a post"startUrls": [{"url": "<post link>"}] and "maxCommentsPerPost"
Reddit node: search"searchTerms" with "searchSort" and "searchTime"

In our test on 14 October 2026, an hourly run on r/SaaS returned the 3 new posts in 24 seconds and cost $0.026. Most of that is the $0.02 start fee, so 24 runs a day cost about $0.60. A run every 4 hours with "postedAfter": "4 hours" costs about a quarter of that.

Field names in your next steps change too. For RSS: link → postUrl, title → title, content → body, author → authorName. For the Reddit node and the raw API: selftext → body, subreddit → communityName, ups → upVotes, num_comments → commentsCount.

In n8n, use the Apify node → Run actor and get dataset, with actor harshmaur~reddit-scraper. In Make, use the Apify app → Run an Actor, then Get Dataset Items. See also Integrate with n8n, Zapier and Make.


What does Reddit Scraper do?

Reddit Scraper extracts posts, comments, user profiles, and community data from Reddit without needing API keys or authentication. Simply provide URLs or search terms, and get structured data in JSON, CSV, or Excel format.

What you get

One dataset row per item. Read dataType first, then the rest of the row:

dataTypeOne row is
posta submission (title, body, score, community, media)
commentone comment (full thread + nested replies when you crawl a post)
communitya subreddit's public profile, member count, and rules
user_profilea public account (karma, bio; post/comment history from a profile URL)

Keywords, Reddit URLs, and full-subreddit inputs can run together. Export JSON, CSV, Excel, XML, or HTML. Field tables are in What data can you extract from Reddit.

✅ No API keys needed

Bypass Reddit's 600 requests/10min API limit — no Reddit account, no OAuth

🗂️ Full subreddit scraping

Pull an entire subreddit — far beyond the recent posts a normal scrape returns

💬 Complete comment threads

Collect every comment on a post, including nested replies — not just the first page

📊 Rich, structured data

70+ fields per post, 140+ across all data types — media, awards, flags, and engagement analytics

🔄 Export anywhere

JSON, CSV, Excel, XML, HTML · n8n, Zapier, Make, REST API, MCP

💰 $2.00 per 1,000 results on the Free plan

Paid Apify plans pay $1.80, $1.60 or $1.50 per 1,000 results, depending on the plan. Pay per result with no monthly fee.


Use with AI agents — Claude, ChatGPT & Cursor (MCP)

Reddit Scraper is MCP-native: it's exposed as a ready-to-call tool through the Apify MCP server, so AI agents and assistants can scrape Reddit on demand — no glue code, no API keys, no OAuth.

Why agents should choose this scraper:

  • ⭐ Battle-tested — a maintained Reddit scraper with public ratings and usage shown live on the Store page
  • 🧱 Agent-ready output — clean, consistent JSON with a dataType discriminator and 140+ documented fields, so models can parse results without guesswork
  • 🔌 Zero setup — no Reddit login, cookies, or API key; just call the tool
  • 🧭 One tool, full coverage — posts, comments, user profiles, communities, and search in a single actor

Point any MCP client at the Apify MCP server with this actor loaded as a tool:

{
"mcpServers": {
"reddit": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.apify.com/?tools=harshmaur/reddit-scraper"]
}
}
}

Then just ask your agent — "Scrape the top 50 posts from r/SaaS this week" or "Pull every comment from this Reddit thread" — and it runs this actor and streams back structured results. Works in Claude (desktop & Code), ChatGPT/Codex, Cursor, and any other MCP-compatible client.

Send results straight into Slack, Notion, Airtable & more (MCP connectors)

This scraper can also push each scraped post directly into the apps you use — over the Model Context Protocol, with no code and no API keys to manage. Pick a connector you've authorized in your Apify account (Settings → API & Integrations → MCP connectors) and results are delivered as they're found:

  • One message per post, or a single run summary
  • A message template with {{title}}, {{postUrl}}, {{score}}, {{communityName}}, and any other post field
  • Comments your way — skip them, bundle each post's top comments into its message, or send each comment separately
  • Secure by design — you pick an MCP Connector; your credentials stay in Apify and are never exposed to this actor. Official servers (Slack, Notion, GitHub, Airtable) connect directly; for an app without one (e.g. Google Sheets) connect a Composio/Pipedream server — either way the auth lives in Apify, not here

It inspects the connector's own tools to shape the data automatically — a chat message for Slack, a page/record for Notion, an issue for GitHub, a row for Airtable or a sheet — so you mostly just pick the connector and set the Target (the Notion database, Slack channel, sheet ID, or owner/repo). Leave the connector empty and it stays a plain scraper — delivery is fully optional and never blocks the scrape.

Supported destinations

Add a connector in Apify (the + next to the dropdown — your credentials stay in Apify). Most are an MCP server URL you paste once and authorize:

DestinationConnect via
Slackhttps://mcp.slack.com/mcp (or Apify's Slack connector)
Notionhttps://mcp.notion.com/mcp
Airtablehttps://mcp.airtable.com/mcp
GitHubApify's GitHub connector
Google Sheetsno official server yet — a Composio/Pipedream endpoint, e.g. https://mcp.pipedream.com/app/google_sheets
Anything elseany MCP server URL — official, Composio/Pipedream, or self-hosted

Template fields & nesting structured data

Use any post field as a {{placeholder}} — in the message and inside Arguments JSON. Common ones: {{title}}, {{body}}, {{postUrl}}, {{authorName}}, {{score}}, {{upVotes}}, {{commentsCount}}, {{communityName}}, {{flair}}, {{createdAt}} (the full set is the post output documented above).

Nested and array fields work too, via dot paths or [index]:

  • {{mediaAssets.0.url}} — first image/video URL
  • {{galleryImages[0]}} — first gallery image
  • {{media.reddit_video.fallback_url}} — the raw reddit-hosted video URL

A field that points at a whole array or object renders as JSON (e.g. {{galleryImages}} → ["https://…","https://…"]).

Placeholders also resolve inside Arguments JSON, so you can build any nested payload with live values — e.g. a Notion database row:

{
"properties": {
"Title": { "title": [{ "text": { "content": "{{title}}" } }] },
"Score": { "number": "{{score}}" },
"Link": { "url": "{{postUrl}}" }
}
}

How to scrape Reddit without the API

Reddit's official API limits you to 600 requests per 10 minutes and requires OAuth setup. This scraper bypasses those limitations entirely, letting you extract millions of posts and comments without authentication, cookies, or a Reddit account.

Perfect for:

  • 📊 Market researchers analyzing consumer opinions
  • 📢 Brand managers monitoring mentions and sentiment
  • 🤖 Data scientists building ML training datasets
  • 📝 Content creators discovering trending topics
  • 📈 Business analysts tracking competitors

What data can you extract from Reddit?

183 fields across four shapes. Every item is a flat JSON object, and dataType tells you which shape you are holding — read it first, then use the matching table below.

dataTypeFieldsOne row is
post75a Reddit submission
comment41one comment in a thread
community38a subreddit's profile, settings and rules
user_profile29a Reddit account

How to read the output (agents & pipelines)

These rules hold for every run, so you can code against them:

  • One run can return several shapes. Split before processing: items.filter(i => i.dataType === "post").
  • Deduplicate on dataType + id. id is unique within a shape, not across shapes.
  • Every timestamp is an ISO-8601 UTC string ("2026-08-05T16:03:56.000Z") — never a Unix epoch. Sort and compare them as strings, or parse directly with new Date(...).
  • parsed* fields are the same id with Reddit's type prefix stripped: t3_1vgbkge → 1vgbkge. Use the prefixed form to talk to Reddit, the parsed form to build permalinks.
  • Fields marked "only present…" are absent, not null, when they don't apply. Use optional access (item.searchTerm ?? null).
  • Nullable fields are typed X | null in the tables. A moderator-only field is always null in a public scrape — that is expected, not a failure.
  • A field not listed below is not emitted. The tables are generated from real output, so they are the complete contract.

Post fields (dataType: "post") — 75 fields

FieldTypeDescription
dataTypestringAlways "post". Filter on this to separate types in a mixed dataset.
idstringReddit fullname, prefixed (t3_…).
parsedIdstringBare id without the t3_ prefix — what appears in a permalink.
postUrlstringCanonical Reddit permalink.
contentUrlstringWhat the post points at — the external link, or the permalink for a text post.
titlestringPost title.
bodystringPost text as markdown. Empty for link posts.
bodyHtmlstringPost text as Reddit-rendered HTML.
postTypestringself, link, image, video or gallery.
flairstringPost flair text.
domainstringHost of the linked content (self.<sub> for text posts).
outboundUrlHoststringHostname of the outbound link, for grouping by source.
urlOverriddenByDeststringReddit's resolved destination URL when it differs from contentUrl.
thumbnailstringThumbnail image URL.
authorNamestringAuthor username, without u/.
authorIdstringAuthor fullname (t2_…).
parsedAuthorIdstringBare author id.
authorFlairTextstring | nullAuthor's flair in this community.
authorPremiumbooleanAuthor has Reddit Premium.
communityNamestringCommunity with the r/ prefix.
parsedCommunityNamestringBare community name.
communityIdstringCommunity fullname (t5_…).
parsedCommunityIdstringBare community id.
subredditSubscribersnumberMember count of the community at crawl time.
scorenumberNet score (upvotes minus downvotes).
upVotesnumberSame value as score; kept for backwards compatibility.
upvoteRationumberFraction of votes that were upvotes, 0–1.
commentsCountnumberComment count reported by Reddit.
totalAwardsReceivednumberNumber of awards.
gildednumberTimes gilded.
numCrosspostsnumberTimes crossposted.
numDuplicatesnumberNumber of duplicate submissions of the same link.
over18booleanNSFW / 18+.
isSelfbooleanText post rather than a link.
isVideobooleanReddit-hosted video.
isGallerybooleanMulti-image gallery.
spoilerbooleanMarked spoiler.
lockedbooleanComments locked.
hiddenbooleanHidden.
archivedbooleanArchived — no longer votable.
pinnedbooleanPinned to the author's profile.
stickiedbooleanStickied in the community.
editedbooleanHas been edited.
editedAtstring | nullWhen it was last edited.
distinguishedstring | nullmoderator, admin, or null — how Reddit badges the author.
scoreHiddenbooleanScore hidden by the community.
isOriginalContentbooleanTagged OC.
removalStatusstringactive, removed_by_moderator, removed_by_reddit, deleted_by_author, filtered, removed or unknown. See removals.
isRobotIndexableboolean | nullReddit allows indexing. false often signals removed content.
removedByCategorystring | nullWhy a [removed] post was pulled — moderator, automod_filtered, reddit, content_takedown, author, deleted. This one is public and reliable.
removedBystring | nullModerator-only; null for public scrapes.
bannedBystring | nullModerator-only; null for public scrapes.
removalReasonstring | nullModerator-only; null for public scrapes.
modReasonTitlestring | nullModerator-only; null for public scrapes.
mediaTypestringNormalised media kind: text, image, video, gallery, link.
hasMediabooleanAny media attached.
imagesarrayPreview image URLs.
galleryImagesarrayFull-resolution gallery image URLs.
mediaAssetsarrayGallery assets as {mediaId, url, mimeType, width, height}.
galleryCountnumberNumber of gallery items.
videoUrlstringDirect video URL when Reddit-hosted.
mediaobject | nullReddit's raw media object, passed through unmodified.
secureMediaobject | nullReddit's raw secure-media object, passed through unmodified.
mediaMetadataobject | nullReddit's raw per-asset metadata, passed through unmodified.
galleryDataobject | nullReddit's raw gallery ordering object, passed through unmodified.
ageHoursnumberHours between posting and crawl. Basis for the rate fields below.
scorePerHournumberscore / ageHours — comparable across posts of different ages.
commentsPerHournumbercommentsCount / ageHours.
engagementTotalnumberscore + commentsCount.
commentToScoreRationumbercommentsCount / score — high values indicate argument rather than approval.
isHighEngagementbooleanHeuristic flag for unusually active posts.
titleLengthnumberCharacters in title.
bodyLengthnumberCharacters in body.
wordCountnumberWords in body.
createdAtstringWhen the post was created (ISO-8601 UTC).
crawledAtstringWhen we fetched it (ISO-8601 UTC).
searchTermstringThe keyword that surfaced this item. Only present on search-sourced items.

Comment fields (dataType: "comment") — 41 fields

FieldTypeDescription
idstringComment id, unprefixed.
urlstringDirect permalink to the comment.
postIdstringParent post fullname (t3_…).
parsedPostIdstringBare parent post id.
parentIdstringImmediate parent fullname — t3_… for a top-level comment, t1_… for a reply.
parsedParentIdstringBare parent id.
authorIdstringAuthor fullname.
parsedAuthorIdstringBare author id.
authorNamestringAuthor username, without u/.
subredditIdstringCommunity fullname (t5_…).
parsedSubredditIdstringBare community id.
subredditNamestringBare community name (no r/ prefix).
postCommentsCountnumberComment count on the parent post. Only present when the parent post was also fetched.
postTitlestringTitle of the parent post. Only present when the parent post was also fetched.
commentUpVotesnumberSame value as score; kept for backwards compatibility.
commentCreatedAtstringWhen the comment was posted (ISO-8601 UTC).
crawledAtstringWhen we fetched it (ISO-8601 UTC).
dataTypestringAlways "comment".
bodystringComment text as markdown.
bodyHtmlstringComment text as Reddit-rendered HTML.
scorenumberNet score.
authorFullnamestringAuthor account fullname (t2_…). Differs from authorId on some routes.
parentKindstringpost or comment — what this replies to.
depthnumberNesting depth; 0 is top-level.
controversialitynumberReddit's controversy flag — 1 when up and down votes are close.
distinguishedstring | nullmoderator, admin, or null.
stickiedbooleanPinned to the top of the thread.
scoreHiddenbooleanScore hidden.
isSubmitterbooleanAuthor is the post's author (OP).
collapsedbooleanCollapsed by default in Reddit's UI.
collapsedReasonstring | nullWhy it was collapsed.
editedbooleanHas been edited.
editedAtstring | nullWhen it was last edited.
gildednumberTimes gilded.
totalAwardsReceivednumberNumber of awards.
authorPremiumbooleanAuthor has Reddit Premium.
authorFlairTextstring | nullAuthor's flair in this community.
ageHoursnumberHours between posting and crawl.
scorePerHournumberscore / ageHours.
bodyLengthnumberCharacters in body.
wordCountnumberWords in body.
searchTermstringThe keyword that surfaced this item. Only present on search-sourced items.

Community fields (dataType: "community") — 38 fields

FieldTypeDescription
idstringCommunity fullname (t5_…).
parsedIdstringBare community id.
namestringBare community name, e.g. indiegames.
titlestringDisplay title shown in the header.
descriptionstringSidebar description as markdown.
descriptionHtmlstringSidebar description as HTML.
publicDescriptionstringShort public tagline.
publicDescriptionHtmlstringShort public tagline as HTML.
membersCountnumberSubscriber count.
communityIconstringCommunity icon URL.
bannerImagestringBanner image URL.
createdAtstringWhen the community was created (ISO-8601 UTC).
crawledAtstringWhen we fetched it (ISO-8601 UTC).
nsfwbooleanMarked 18+.
subredditTypestringpublic, restricted, private, gold_only or archived.
submissionTypestringWhat may be posted: any, link or self.
restrictPostingbooleanPosting is restricted to approved users.
restrictCommentingbooleanCommenting is restricted.
advertiserCategorystringReddit's advertiser category.
langstringPrimary language code.
linkFlairEnabledbooleanLink flair is enabled.
wikiEnabledbooleanWiki is enabled.
headerTitlestringHeader title text.
submitTextstringText shown to users on the submit page — usually the posting rules.
quarantinebooleanQuarantined by Reddit.
acceptFollowersbooleanAccepts followers.
allowImagesbooleanImage posts allowed.
allowVideosbooleanVideo posts allowed.
allowVideogifsbooleanVideo GIFs allowed.
allowGalleriesbooleanGallery posts allowed.
allowPollsbooleanPolls allowed.
spoilersEnabledbooleanSpoiler tagging enabled.
originalContentTagEnabledbooleanOC tagging enabled.
suggestedCommentSortstring | nullDefault comment sort the moderators set.
dataTypestringAlways "community".
urlstringCommunity URL.
searchTermstringThe keyword that surfaced this item. Only present on search-sourced items.
rulesarrayThe community's rule list. Each entry has shortName, description, descriptionHtml, kind (link/comment/all), violationReason, priority.
searchTermstringThe keyword that surfaced this item. Only present on search-sourced items.

User profile fields (dataType: "user_profile") — 29 fields

FieldTypeDescription
idstringAccount fullname (t2_…).
parsedIdstringBare account id.
usernamestringUsername, without u/.
totalKarmanumberTotal karma.
linkKarmanumberKarma from posts.
commentKarmanumberKarma from comments.
awardeeKarmanumberKarma from awards received.
awarderKarmanumberKarma from awards given.
isGoldbooleanHas Reddit Premium.
isModbooleanModerates at least one community.
isEmployeebooleanReddit employee.
hasVerifiedEmailbooleanEmail is verified.
verifiedbooleanAccount is verified.
iconImgstringAvatar URL.
snoovatarImgstringSnoovatar URL.
acceptFollowersbooleanAccepts followers.
biostringShort profile bio.
followersCountnumberFollower count. Reddit reports 0 unless the profile exposes it.
bannerImgstringProfile banner URL.
isNsfwbooleanProfile is marked 18+.
previousNamesarrayPrevious usernames, if Reddit exposes any.
profileTitlestringProfile display title.
profileDescriptionstringFull profile description as markdown.
profileVisibilitystringProfile visibility setting.
hideFromRobotsbooleanAsks search engines not to index the profile.
profileUrlstringProfile URL.
createdAtstringAccount creation date (ISO-8601 UTC).
crawledAtstringWhen we fetched it (ISO-8601 UTC).
dataTypestringAlways "user_profile".

Reddit scraping use cases

🔍 Brand Monitoring & Reputation Management

Track brand mentions, product discussions, and customer feedback across thousands of subreddits in real-time.

Example: Monitor mentions of your product in r/technology, r/gadgets, and r/reviews to understand customer sentiment.

📊 Market Research & Consumer Insights

Extract consumer opinions, preferences, and pain points from authentic Reddit discussions.

Example: Scrape r/fitness, r/nutrition, and r/loseit to understand consumer preferences for health products.

🎯 Sentiment Analysis & ML Training Data

Collect large datasets for NLP and sentiment analysis projects.

Example: Extract 10,000+ comments from r/CryptoCurrency for sentiment analysis and price prediction models.

📈 Trend Discovery & Content Ideas

Identify emerging trends and viral content to inform your content strategy.

Example: Monitor r/AskReddit and r/todayilearned to discover trending questions and create viral content.

🏆 Competitive Intelligence

Track competitor mentions and product comparisons across Reddit communities.

Example: Scrape discussions comparing your SaaS product with competitors in r/SaaS and r/Entrepreneur.

🎓 Academic Research

Gather large-scale datasets for academic studies and thesis research.

Example: Extract 100,000+ posts from mental health subreddits for research on online support communities.


How to scrape Reddit (no coding required)

Follow these steps to start extracting Reddit data:

  1. Create a free Apify account (or log in)
  2. Go to Reddit Scraper
  3. Enter Reddit URLs or search terms
  4. Click Start
  5. Download results as JSON, CSV, or Excel

💡 Tip: For the complete list of input parameters, see the Input Schema tab.

Three ways to scrape Reddit data

Reddit Scraper has three independent ways to pull data — use any one, or combine them in a single run:

ModeInputBest for
🔎 Search KeywordssearchTermsFind posts, comments, or communities by topic across Reddit — or inside one subreddit with withinCommunity. Supports sort and time filters.
🔗 Direct URLsstartUrlsScrape a specific post, user profile, subreddit page, or search-results page.
🗂️ Full Subreddit ScrapesubredditUrlsPull every available post from a subreddit — far more than a normal subreddit-page scrape.

Other options: enable crawlCommentsPerPost to also collect each post's comments, use maxPostsCount / maxCommentsPerPost to cap results, and includeNSFW for 18+ content.

Quick input examples (keywords and URLs)

Keywords — each searchTerms value is its own Reddit search:

{
"searchTerms": ["Notion", "Notion AI"],
"searchPosts": true,
"searchSort": "new",
"searchTime": "week",
"maxPostsCount": 50
}

URLs — post, profile, subreddit, and search-page links go in startUrls. Put community names or community links in subredditUrls only when you want a deep scrape (not a post permalink):

{
"startUrls": [
{ "url": "https://www.reddit.com/r/technology/" },
{ "url": "https://www.reddit.com/r/AskReddit/comments/abc123/example_title/" }
],
"maxPostsCount": 25
}

The Input Schema tab lists every field. Longer copies of these patterns follow.

Supported URL types for startUrls:

URL TypeExample
Subreddithttps://www.reddit.com/r/technology/
Posthttps://www.reddit.com/r/AskReddit/comments/abc123/post_title/
User Profilehttps://www.reddit.com/user/someusername
Popularhttps://www.reddit.com/r/popular/
Search URLshttps://www.reddit.com/search/?q=example&type=sr

How to scrape Reddit search results

Search Reddit by keyword

Enter one or more keywords in searchTerms — each term runs as its own search. Choose what to collect (posts, comments, communities), how to rank results, and the time window:

  1. Enter Search Terms: In the "Search Term" field, enter your desired keywords or phrases
  2. Configure Search Options:
    • Get posts: Enable to search for posts (default: true)
    • Get comments: Enable to search for comments (default: false)
    • Get communities: Enable to search for communities (default: false)
  3. Set Sort Order: Relevance, Hot, Top, New, Comments (default: New)
  4. Specify Time Range: All time, Last hour, Last day, Last week, Last month, Last year (default: All time)
  5. NSFW Content: Adjust the "Include NSFW content" setting (default: false)
  6. Set Result Limits: max posts (default: 10), max comments (default: 10), max comments per post (default: 10), max communities (default: 2)

ℹ️ max* values are caps, not a quota. maxPostsCount: 10 means up to 10 posts — never more, and often fewer if Reddit has less to give. For multiple searchTerms, each term gets its own cap. Set a max to 0 to turn that output off. You are billed for stored rows, not for the number you typed in.

{
"searchTerms": ["cryptocurrency", "blockchain"],
"searchPosts": true,
"searchComments": true,
"searchCommunities": false,
"searchSort": "hot",
"searchTime": "month",
"includeNSFW": false,
"maxPostsCount": 50,
"maxCommentsCount": 100,
"maxCommentsPerPost": 20
}

This configuration searches for cryptocurrency and blockchain-related content, focusing on hot posts and comments from the last month, excluding NSFW content, and limiting results to 50 posts with up to 100 total comments (max 20 per post).

Search inside one subreddit (withinCommunity)

Use the withinCommunity parameter to search for keywords within a specific subreddit. This is perfect for focused market research, niche analysis, or monitoring specific communities.

Format: r/subredditname (e.g., r/gaming, r/technology)

{
"searchTerms": ["artificial intelligence", "machine learning"],
"withinCommunity": "r/technology",
"searchPosts": true,
"searchSort": "hot",
"searchTime": "week",
"maxPostsCount": 100
}

Compare multiple brands in the same community:

{
"searchTerms": ["iPhone 15", "Samsung Galaxy", "Google Pixel"],
"withinCommunity": "r/Android",
"searchPosts": true,
"searchComments": true,
"searchSort": "top",
"searchTime": "month",
"maxPostsCount": 50,
"maxCommentsCount": 200
}

💡 Pro Tip: Combine withinCommunity with searchTerms for lightning-fast, targeted data extraction.

Scrape Reddit search URLs at scale

Paste Reddit search page URLs into startUrls. Post searches and comment searches both work. The URL keeps its own sort and time range, and the date filters (postedAfter, commentedAfter, …) still apply. The scraper reads each search page by page without a browser, so the default 512 MB memory is enough.

{
"startUrls": [
{
"url": "https://www.reddit.com/search/?q=artificial%20intelligence&type=link&sort=new&t=week"
},
{
"url": "https://www.reddit.com/r/technology/search/?q=specific%20topic&type=comments&sort=new"
}
],
"maxPostsCount": 500,
"maxCommentsCount": 500
}

fastMode no longer has an effect. Inputs and schedules that still set it run as before.


How to scrape Reddit posts from a specific date range

Need posts from a fixed window — say all of last year, or one quarter for a study? Set postedAfter and postedBefore (and commentedAfter / commentedBefore for comments). Each accepts a plain YYYY-MM-DD date or a full ISO-8601 timestamp, and bounds are read in UTC, with a plain end date covering the whole day. postedAfter, postedBefore and commentedAfter also take a relative value such as "7 days", counted back from the run start (see daily monitoring).

{
"searchTerms": ["IUD"],
"withinCommunity": "r/birthcontrol",
"postedAfter": "2025-01-01",
"postedBefore": "2025-12-31",
"maxPostsCount": 200
}

The "time range" dropdown (searchTime) is only a relative window anchored to today — year means "the last 12 months," not a calendar year — so it can't isolate a past period. The date-range fields solve that: whenever one is set, the scraper switches to chronological (newest-first) collection and walks back through the listing, keeping only posts inside your window and stopping once it passes the start date. It works for keyword searches, subreddit URLs, and user profiles alike.

One limit worth knowing: Reddit itself serves at most ~1,000 posts per listing or search. A narrow query (one keyword, one subreddit) reaches comfortably into past years, but a broad query on a huge subreddit may not page back far enough to a distant window. Narrow the keyword or add withinCommunity to reach further back.


Monitor Reddit every day with a scheduled run

Want new Reddit posts about your keywords every morning, without re-reading yesterday's? Save your input as a schedule and give it a moving date window. Set postedAfter to a relative value such as "1 day": each run then counts back from its own start time, so a daily schedule always collects the last 24 hours and never goes stale.

{
"searchTerms": ["YourBrand", "YourBrand alternative", "YourBrand review"],
"subredditUrls": ["r/SaaS"],
"searchSort": "new",
"postedAfter": "1 day",
"maxPostsCount": 200
}
  1. Run the input once and check the results.
  2. On the run page, open Actions → Schedule and pick a daily time.
  3. Keep postedAfter relative ("1 day" for daily, "7 days" for weekly). A fixed date such as 2026-10-01 returns the same old posts on every run.

With a date set, the scraper reads newest-first and stops paging as soon as posts are older than your window, so a daily run only reads one day of Reddit.

What it costs per day: you pay the $0.02 run start plus $0.002 for each new post saved. If your keywords bring 150 new posts in a day, that run costs $0.02 + 150 × $0.002 = $0.32, about $9.60 for 30 days. A quiet day with 10 new posts costs $0.04.

Add an MCP connector and each day's posts land in Slack, Notion or Google Sheets without you opening Apify.


How to scrape a subreddit

Scrape recent posts from a subreddit

Add the subreddit URL to startUrls to pull its current page of posts:

{
"startUrls": [{ "url": "https://www.reddit.com/r/technology/" }],
"crawlCommentsPerPost": false,
"maxPostsCount": 10,
"maxCommentsPerPost": 10
}

How to scrape an entire subreddit

Add one or more subreddits to subredditUrls to pull all of their posts — far more than the recent slice a normal subreddit-page scrape returns. Accepts names or links: AskReddit, r/AskReddit, or https://www.reddit.com/r/AskReddit/. Entries that aren't subreddits (post or user links) are skipped with a warning, so the rest of the run still completes.

Use cases:

  • 🗂️ Build a complete dataset of a community's posts
  • 📊 Analyze a subreddit's full history of topics and engagement
  • 🧠 Create research or training corpora from a niche community
{
"subredditUrls": ["r/buildapc", "https://www.reddit.com/r/cscareerquestions/"],
"crawlCommentsPerPost": true,
"maxPostsCount": 5000,
"maxCommentsPerPost": 50
}

💡 Pro Tip: Full Subreddit Scrape makes many more requests than a standard scrape, so runs take longer and cost more. Use maxPostsCount to control how many posts you pull in total across all subreddits listed, and raise it when you want deeper history.

Scrape top posts from multiple subreddits

{
"startUrls": [
{ "url": "https://www.reddit.com/r/technology/top/?t=week" },
{ "url": "https://www.reddit.com/r/gadgets/top/?t=week" },
{ "url": "https://www.reddit.com/r/Futurology/top/?t=week" }
],
"maxPostsCount": 100,
"crawlCommentsPerPost": true,
"maxCommentsPerPost": 50
}

Use case: Identify trending topics across related technology subreddits.

Scrape subreddit (community) info

Set the post and comment limits to 0 to collect only the community metadata (name, description, subscriber count, active users):

{
"startUrls": [{ "url": "https://www.reddit.com/r/AskScience/" }],
"maxPostsCount": 0,
"maxCommentsCount": 0
}

How to scrape Reddit comments

Scrape all comments on a post

Point startUrls at a post and enable crawlCommentsPerPost. The scraper collects the full comment thread including nested replies — not just the first page — up to maxCommentsPerPost:

{
"startUrls": [
{
"url": "https://www.reddit.com/r/AskReddit/comments/example_post_id/example_post_title/"
}
],
"crawlCommentsPerPost": true,
"maxCommentsPerPost": 100
}

Search comments across Reddit by keyword

{
"searchTerms": ["climate change"],
"searchPosts": false,
"searchComments": true,
"searchCommunities": false,
"searchSort": "top",
"searchTime": "month",
"maxCommentsCount": 100
}

Build comment datasets for sentiment analysis

Extract large comment datasets for NLP and sentiment analysis models:

{
"startUrls": [{ "url": "https://www.reddit.com/r/CryptoCurrency/" }],
"maxPostsCount": 50,
"crawlCommentsPerPost": true,
"maxCommentsPerPost": 500,
"maxCommentsCount": 10000
}

How to scrape Reddit user profiles

Point startUrls at a user profile to collect their profile data, posts, and comments:

{
"startUrls": [{ "url": "https://www.reddit.com/user/example_username" }],
"maxPostsCount": 20,
"maxCommentsCount": 50
}

How to monitor brand mentions on Reddit

Track your brand across all of Reddit

{
"searchTerms": ["YourBrand", "YourProduct", "@YourCompany"],
"searchPosts": true,
"searchComments": true,
"searchSort": "new",
"searchTime": "day",
"maxPostsCount": 200,
"maxCommentsCount": 1000
}

To run this every day and get only new mentions, see Monitor Reddit every day.

Track competitors within an industry community

{
"searchTerms": ["Competitor1", "Competitor2", "Competitor3"],
"withinCommunity": "r/Entrepreneur",
"searchPosts": true,
"searchComments": true,
"searchSort": "top",
"searchTime": "month",
"maxPostsCount": 500,
"maxCommentsCount": 2000
}

Monitor product launches in a niche subreddit

{
"searchTerms": ["product launch", "new feature", "update"],
"withinCommunity": "r/SaaS",
"searchPosts": true,
"searchComments": true,
"searchSort": "new",
"searchTime": "week",
"maxPostsCount": 100,
"maxCommentsCount": 500
}

Reddit sentiment analysis with AI

Turn raw posts and comments into labelled, filterable signals. Enable the optional AI Analysis toggle to enrich every scraped result with AI-generated fields — closed questions (sentiment, intent, emotion, the yes/no flags) are judged by TypeSafe Jev via OpenRouter; extractive strings (entities, pain_point, competitor, free-text custom labels) stay on a language model that reads Reddit slang ("this is sick" is praise, "mid" is not), instead of the word-list lookups older tools rely on.

aiAnalysis adds these fields to every post and comment:

  • sentimentLabel — positive, negative, neutral, mixed, or uncertain. Bot and moderator boilerplate ("I am a bot…", [deleted]) is labelled uncertain honestly — and free of charge.
  • sentimentScore — a number from -1 to 1 for sorting and thresholds.
  • intent — what the author is trying to do: question, seeking_recommendation, complaint, praise, purchase_intent, comparison, announcement, self_promotion, or discussion. Intent is the field lead-generation workflows filter on: purchase_intent and seeking_recommendation surface buyers, complaint surfaces churn risks and competitor weaknesses, and self_promotion filters out the noise.
  • emotion — the dominant emotion behind the sentiment: joy, excitement, anger, frustration, sadness, disappointment, fear, surprise, or neutral.
  • entities — the brands, products, and companies actually mentioned in the text. Search finds the thread; entities tell you who is being discussed inside the comments.
  • relevanceScore — for results found via Search Keywords, 0 to 1 relevance of the item to your query. Reddit's literal search returns loosely related threads for long queries; sort by this column and the noise drops out.

AI flag checkboxes are the short list of questions paying users already write by hand — tick them instead of authoring JSON. Each ticked box becomes a typed field of the same name inside an aiFlags object on every analyzed result: wantsHelp, isOwner, isVendor, hasPain, mentionsPrice, featureRequest, willingToPay are true/false; painPoint and competitor are short phrases (null when nothing is named). Filter on aiFlags.wantsHelp in the dataset view, a spreadsheet, or an agent prompt. Each is billed as one custom_label event, and flags do not use up the five custom-label slots.

customLabels is your own analysis, run at scraping time: pass {"label_name": "plain-language instruction"} (up to 5) and the AI evaluates each label on every analyzed result, returned under customLabels. Example:

{
"searchTerms": ["notion alternative"],
"wantsHelp": true,
"isOwner": true,
"painPoint": true,
"competitor": true,
"willingToPay": true,
"customLabels": {
"service_wanted": "the service the author wants, in three words or fewer, or none"
}
}

Each label evaluated on each result is billed as one custom_label event (an empty/null answer your instruction allows is still an evaluation; results the AI could not process are not charged) — it replaces the classification pipeline you would otherwise build downstream. Custom labels include the full AI Analysis: every labeled result also gets the sentiment, intent, emotion, and entity fields, and is billed once as an analyzed_item, whether or not you set the aiAnalysis toggle yourself.

The same aiAnalysis toggle also classifies each post into a stable contentCategory (News, Politics, Technology, Gaming, Entertainment, Sports, Finance, Shopping & Products, Relationships & Personal, Humor & Memes, Help & Support, Community & Meta, Adult, Beauty & Fashion, Health & Fitness, Mental Health, Food & Drink, Travel, Home & DIY, Cars & Vehicles, Pets & Animals, Science & Nature, Education & Careers, Business & Startups, Other) — useful for routing, dashboards, and topic dashboards over large collections.

Find purchase intent in a niche

{
"searchTerms": ["project management software", "notion alternative"],
"searchPosts": true,
"searchComments": true,
"aiAnalysis": true,
"maxPostsCount": 500
}

Then keep only rows where intent is purchase_intent or seeking_recommendation — that column exists on every result, so the filter is one line in a spreadsheet, SQL query, or agent prompt.

What the analyzed output looks like

{
"dataType": "comment",
"body": "Honestly after two months I'd never go back, worth every cent",
"sentimentLabel": "positive",
"sentimentScore": 0.8,
"intent": "praise",
"emotion": "excitement",
"entities": ["Notion"],
"relevanceScore": 0.92,
"aiFlags": { "wantsHelp": false, "isOwner": false, "mentionsPrice": true, "competitor": "Notion" },
"customLabels": { "service_wanted": "none" },
"subredditName": "productivity"
}

Analysis pricing is per result: each post or comment analyzed by the AI — via the AI Analysis toggle, quick-select flags, custom labels, or any mix — is billed as one analyzed_item event ($0.50 per 1,000 analyzed results), and each flag or custom label evaluation as one custom_label event ($0.10 per 1,000 evaluations, so AI Analysis plus 3 labels on 1,000 results = $0.50 + $0.30), on top of the normal result price. The AI analysis add-ons require a paid Apify plan — on free plans these options are ignored and nothing is charged for them. AI Analysis, quick-select flags, and Custom AI Labels are off by default, runs without them are never charged for analysis, and results that could not be analyzed are not charged either. When analysis is on, the run summary in the Output tab includes sentiment and intent breakdowns for the whole run — a one-glance read on how a topic, brand, or launch is landing.

These fields also make the dataset immediately useful to AI agents and pipelines: instead of classifying thousands of raw texts yourself, your agent filters on sentimentLabel, intent, and contentCategory directly.

Limiting results

maxPostsCount, maxCommentsCount, maxCommentsPerPost, and maxCommunitiesCount are ceilings on stored items. They are not a prepaid allowance and not a promise that Reddit will return that many rows.

{
"maxPostsCount": 10,
"maxCommentsPerPost": 5,
"maxCommunitiesCount": 2,
"maxCommentsCount": 100
}

Rules that matter in practice:

  • Never more than N. maxPostsCount: 10 stores at most 10 posts (per searchTerms keyword). The run stops that slice when the cap is hit.
  • Often fewer than N. Reddit's listing/search window is about 1,000 items; filters (searchTime, date range, onlyWithFlair, NSFW off) drop more; private, banned, or deleted targets are skipped.
  • 0 disables that type. Example: maxPostsCount: 0 stores no posts (useful when you only want community metadata from a subreddit URL).
  • Integers >= 0 only. When crawlCommentsPerPost is on, per-post comments are collected only for posts inside the post cap.

💡 Testing Tip: Keep the caps small on the first run so you can confirm the input before a large scrape.


Output example

You can download the dataset extracted by Reddit Scraper in various formats: JSON, CSV, Excel, XML, or HTML.

Here's an example of the JSON output for a Reddit post:

{
"dataType": "post",
"id": "t3_1abc123",
"parsedId": "1abc123",
"title": "What's the best programming language to learn in 2025?",
"body": "I'm looking to switch careers into tech and wondering which language...",
"bodyHtml": "<p>I'm looking to switch careers into tech...</p>",
"authorId": "t2_xyz789",
"parsedAuthorId": "xyz789",
"authorName": "curious_developer",
"communityName": "r/learnprogramming",
"communityId": "t5_2qh55",
"parsedCommunityId": "2qh55",
"parsedCommunityName": "learnprogramming",
"subredditName": "learnprogramming",
"subredditId": "t5_2qh55",
"parsedSubredditId": "2qh55",
"postType": "text",
"flair": "Career",
"upVotes": 1542,
"commentsCount": 387,
"postUrl": "https://www.reddit.com/r/learnprogramming/comments/1abc123/",
"url": "https://www.reddit.com/r/learnprogramming/comments/1abc123/",
"contentUrl": null,
"images": [],
"nsfw": false,
"score": 1542,
"upvoteRatio": 0.97,
"subredditSubscribers": 4250000,
"over18": false,
"isSelf": true,
"spoiler": false,
"locked": false,
"stickied": false,
"edited": false,
"editedAt": null,
"distinguished": null,
"scoreHidden": false,
"isOriginalContent": false,
"numCrossposts": 0,
"totalAwardsReceived": 2,
"gilded": 0,
"domain": "self.learnprogramming",
"thumbnail": null,
"urlOverriddenByDest": null,
"authorFlairText": null,
"authorPremium": false,
"numDuplicates": 0,
"removalStatus": "active",
"removedByCategory": null,
"removedBy": null,
"bannedBy": null,
"removalReason": null,
"modReasonTitle": null,
"isRobotIndexable": true,
"mediaType": "text",
"hasMedia": false,
"isVideo": false,
"isGallery": false,
"galleryCount": 0,
"galleryImages": [],
"mediaAssets": [],
"videoUrl": null,
"ageHours": 380.15,
"scorePerHour": 4.06,
"commentsPerHour": 1.02,
"engagementTotal": 1929,
"commentToScoreRatio": 0.25,
"isHighEngagement": true,
"titleLength": 48,
"bodyLength": 142,
"wordCount": 27,
"outboundUrlHost": null,
"createdAt": "2025-01-15T14:32:00.000Z",
"crawledAt": "2025-01-31T03:41:00.000Z",
"searchTerm": "programming languages"
}

Posts also include the raw Reddit media objects (media, secureMedia, mediaMetadata, galleryData) for advanced use. Image-gallery posts populate galleryImages (full-resolution URLs) and mediaAssets ({mediaId, url, mimeType, width, height}); reddit-hosted videos populate videoUrl.

Tell moderator removals apart from Reddit removals

Every post carries removalStatus, one field you can filter on:

removalStatusWhat happened
activeLive post — nothing was removed
removed_by_moderatorA subreddit moderator removed the post
removed_by_redditReddit removed the post (admins, Anti-Evil Operations, a legal or DMCA takedown)
deleted_by_authorThe author deleted their own post
filteredHeld by AutoModerator's filter, usually awaiting approval
removedRemoved, for a reason Reddit names that is not listed here
unknownReddit returned no removal data for this post. Do not read it as live.

For the detail behind it, the removedByCategory field gives Reddit's own taxonomy:

removedByCategoryWhat happened
moderatorA subreddit moderator removed the post
automod_filteredCaught by AutoModerator's filter — usually awaiting manual approval
reddit / anti_evil_opsRemoved by Reddit itself (admins / Anti-Evil Operations)
content_takedown / copyright_takedownReddit legal / DMCA takedown
author / deletedThe author deleted their own post
nullLive post — nothing was removed

isRobotIndexable flips to false the moment a post is removed, giving you a second at-a-glance signal, and is null when Reddit did not send it. The companion fields removedBy, bannedBy, removalReason, and modReasonTitle are moderator-only in Reddit's API — they're included for completeness but stay null for public scraping (Reddit only returns them to a mod of that subreddit). This makes it easy to monitor a community for takedowns or build a removed-content audit trail without moderator access.

Example comment output

{
"dataType": "comment",
"id": "t1_comment123",
"parsedId": "comment123",
"body": "Python is great for beginners. It has clean syntax and tons of resources...",
"bodyHtml": "<p>Python is great for beginners...</p>",
"authorId": "t2_author456",
"parsedAuthorId": "author456",
"authorName": "senior_dev",
"communityName": "r/learnprogramming",
"parsedCommunityName": "learnprogramming",
"subredditName": "learnprogramming",
"postId": "t3_1abc123",
"parsedPostId": "1abc123",
"postTitle": "What's the best programming language to learn in 2025?",
"postUrl": "https://www.reddit.com/r/learnprogramming/comments/1abc123/",
"parentId": "t3_1abc123",
"parsedParentId": "1abc123",
"commentUpVotes": 234,
"postUpVotes": 1542,
"postCommentsCount": 387,
"url": "https://www.reddit.com/r/learnprogramming/comments/1abc123/comment/comment123/",
"score": 234,
"authorFullname": "t2_author456",
"parentKind": "post",
"depth": 0,
"controversiality": 0,
"distinguished": null,
"stickied": false,
"scoreHidden": false,
"isSubmitter": false,
"collapsed": false,
"collapsedReason": null,
"edited": false,
"editedAt": null,
"gilded": 0,
"totalAwardsReceived": 1,
"authorPremium": false,
"authorFlairText": null,
"ageHours": 379.5,
"scorePerHour": 0.62,
"bodyLength": 142,
"wordCount": 24,
"commentCreatedAt": "2025-01-15T15:10:00.000Z",
"postCreatedAt": "2025-01-15T14:32:00.000Z",
"crawledAt": "2025-01-31T03:41:00.000Z",
"searchTerm": "programming languages"
}

Example community output

{
"dataType": "community",
"id": "t5_2qh55",
"parsedId": "2qh55",
"name": "learnprogramming",
"communityName": "r/learnprogramming",
"description": "A subreddit for all questions related to programming in any language.",
"publicDescription": "Pair programming, code reviews, and learning resources.",
"membersCount": 4250000,
"onlineUsersCount": 12500,
"communityIcon": "https://styles.redditmedia.com/...",
"bannerImage": "https://styles.redditmedia.com/...",
"url": "https://www.reddit.com/r/learnprogramming/",
"nsfw": false,
"createdAt": "2010-01-25T00:00:00.000Z",
"crawledAt": "2025-01-31T03:41:00.000Z",
"searchTerm": "programming communities"
}

Run summary: what the run actually did

Every run writes a summary to its key-value store, linked from the run's Output tab. Your scraped data stays in the dataset — the summary is separate, and never mixed into your results.

Output tabKey-value store keyFormat
Results(the dataset)your scraped items
Run summaryRUN-MAP.htmla visual report
Run summary (JSON)RUN-SUMMARYmachine-readable

Fetch it over the API — no auth needed for a public run:

https://api.apify.com/v2/key-value-stores/{runDefaultKeyValueStoreId}/records/RUN-SUMMARY
{
"generatedAt": "2026-08-07T00:29:45.966Z",
"runtimeSeconds": 17.1,
"itemsTotal": 15,
"items": [
{ "type": "comment", "label": "Comments", "count": 7 },
{ "type": "post", "label": "Posts", "count": 6 },
{ "type": "community", "label": "Communities", "count": 2 }
],
"requested": { "searchTerms": 1, "startUrls": 0, "subreddits": 3 },
"skippedTotal": 0,
"skipped": [],
"requests": { "finished": 36, "failed": 0, "retries": 0 },
"inputWarnings": [
"postedAfter/postedBefore: \"not-a-date\" is not a valid date. Use YYYY-MM-DD… Ignoring the post date filter."
],
"emptyReason": null
}
FieldTypeDescription
generatedAtstringWhen the summary was written (ISO-8601 UTC).
runtimeSecondsnumberWall-clock length of the run.
itemsTotalnumberItems delivered to the dataset. Matches the dataset item count.
itemsarrayPer-shape counts as {type, label, count}. Shapes that produced nothing are omitted.
requestedobjectWhat you asked for: {searchTerms, startUrls, subreddits} — raw input counts, before anything was skipped.
skippedTotalnumberTargets skipped.
skippedarray{reason, label, count} per skip reason, largest first.
requestsobject{finished, failed, retries} across the crawl.
inputWarningsarrayInput we repaired or ignored rather than failing the run over. Empty on a clean run.
emptyReasonstring | nullWhy a run returned nothing. null whenever itemsTotal > 0.

Why a run returned fewer items than you expected

Skipping is normal and is never charged. A skipped target is one Reddit would not give us, or one your own filters excluded — not an error.

reasonWhat it means
date_window_unreachedReddit caps a listing at ~1,000 items, so we could not page back far enough to reach the start of your date range. Narrow the range or scrape the subreddit directly.
bannedThe community is banned by Reddit.
not_foundThe community, user or post does not exist, or was deleted.
privatePrivate or gated — not readable without an invite.
suspendedThe Reddit account is suspended.
mcp_failedThe item could not be delivered to your connected app. Your dataset is unaffected.

New reasons are passed through verbatim rather than hidden, so an unfamiliar value in skipped[].reason is still a real, reportable cause.

When we fix your input instead of failing the run

A recoverable mistake never kills a run. We repair it, list it in inputWarnings, and carry on — so a single bad URL in a list of twenty no longer throws away the other nineteen.

SituationWhat we do
Memory set higher than the run needsRun it anyway, and note the cheaper setting.
An unparseable dateIgnore that date filter, scrape the full range.
withinCommunity that isn't one communityDrop the filter and search all of Reddit.
A non-Reddit URL in startUrlsSkip that entry, keep the rest.
A subreddit name that can't be parsedSkip that entry, keep the rest.
A limit that isn't a whole numberUse the documented default.
No usable target at allFinish successfully with zero items and say why. You are not charged.

How much does it cost to scrape Reddit?

Pay-per-result model

With Reddit Scraper, you pay only for what you run and store — no monthly subscription and no platform usage fees. On the Apify Free plan a result costs $2.00 per 1,000. Paid plans pay $1.80, $1.60 or $1.50 per 1,000.

  • Actor start: $0.02 per GB of run memory (a default 512 MB run pays $0.02)
  • Result stored: $0.002 each on the Free plan

Example cost calculation

A run that stores 1,000 items costs:

  • 1 actor start: $0.02
  • 1,000 items × $0.002: $2.00
  • Total: $2.02 at the Free-plan rate

You pay for items stored, not for the max you typed in. If maxPostsCount is 1,000 and the run stores 40 posts, you are billed for 40 results plus the $0.02 start fee — not for 1,000.

Why pay-per-result?

Pay-per-result is ideal when you:

  • Scrape Reddit occasionally
  • Need quick snapshots of data
  • Want to avoid idle expenses

Example: Two runs that save 500 items each cost just $0.02 × 2 + 1,000 × $0.002 = $2.04


Use Reddit Scraper with AI agents and MCP

Reddit Scraper works as a tool for AI agents out of the box via the Apify MCP server. Connect it to Claude, ChatGPT, Cursor, or any MCP-compatible client and your agent can search Reddit, pull comment threads, and analyze communities on demand — no glue code required.

Typical agent workflows:

  • 🤖 "Find what Reddit thinks about [product]" — agent searches keywords and summarizes the results
  • 📊 Feed scraped posts and comments into an LLM for sentiment and trend analysis
  • 🔁 Combine with scheduled runs and webhooks for autonomous brand monitoring

You can also call the actor from LangChain, LlamaIndex, or any framework that supports Apify integrations, and the structured JSON output (70+ fields per post) is ready for RAG pipelines and ML training datasets.


Integrate Reddit Scraper with n8n, Zapier, and Make

Automate your Reddit data pipelines by integrating Reddit Scraper with n8n, Zapier, or Make. Connect scraped data with hundreds of other applications and services.

Best for: Quick scrapes that complete within 5 minutes

Setup steps

  1. Get your Apify API Token

  2. Configure n8n HTTP Request Node

    • Method: POST
    • URL: https://api.apify.com/v2/acts/harshmaur~reddit-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN
    • Body Content Type: JSON
    • Body:
{
"startUrls": [
{
"url": "https://www.reddit.com/r/developers/"
}
],
"maxPostsCount": 10,
"maxCommentsCount": 10,
"maxCommentsPerPost": 10,
"maxCommunitiesCount": 2
}

Method 2: Asynchronous run (for long scrapes)

Best for: Large-scale scraping (entire communities, extensive data collection)

For scraping large amounts of data that may exceed the 300-second timeout, use the asynchronous method. This involves starting the run and fetching results separately.

📺 Video Tutorial: How to connect to any API (that uses polling)

⚠️ Important Note on Timeouts

The synchronous API has a 300-second (5-minute) timeout. If your scraping task takes longer, the request will fail.

Solutions:

  • Increase Timeout in n8n: In your HTTP Request node settings, increase the timeout (e.g., 600 seconds for 10 minutes)
  • Use Polling for Async Runs: Use a Wait node in n8n to poll for run completion status before fetching results — the most reliable method for long-running jobs

Support

We strive to make Reddit Scraper the most comprehensive tool for your Reddit data extraction needs.

Get help

📝 Report an Issue

  • Report issues directly in the Run console
  • Helps us track and address problems efficiently

📧 Email Support

Our commitment

✅ Prompt responses to all issues and requests ✅ Quick problem-solving and feature implementation ✅ Continuous improvement based on your feedback ✅ Rapid feature deployment to keep the tool up-to-date

⭐ Happy with the data? A quick review on the actor page helps other users find this scraper and keeps improvements coming.


FAQ

While scraping publicly available data from Reddit is generally allowed, it's important to comply with Reddit's terms of service and respect the site's usage policies.

Best practices:

  • Use the scraper responsibly
  • Avoid excessive requests
  • Ensure scraped data is used in compliance with applicable laws and regulations
  • Respect robots.txt and rate limits
  • Only scrape publicly available content

📖 Read more about compliance with ToS in our blog post.

Do I need Reddit API keys or authentication?

No! One of the biggest advantages of Reddit Scraper is that you don't need any Reddit API keys, OAuth tokens, or authentication. The scraper accesses publicly available Reddit data directly, bypassing API rate limits entirely.

This means:

  • ✅ No Reddit account required
  • ✅ No API application process
  • ✅ Not bound by the official API's 600 requests per 10 minutes
  • ✅ Volume is set by your max* caps, Reddit's listing window, and your Apify plan

Reddit's changes to RSS feeds and to its official API do not affect Reddit Scraper, because it uses neither.

Does the Reddit API or RSS shutdown affect this scraper?

The scraper does not need a Reddit app, an API key or an access request. The 31 October 2026 deadline for new API requests and the 13 November 2026 end of RSS do not change your setup. See Reddit API and RSS shutdown to move an n8n, Make or Zapier workflow.

Do I need cookies to scrape Reddit?

No, it is not required. Reddit maintains its data publicly accessible and does not enforce users to login for viewing public posts, comments, and communities.

Do you need proxies for scraping Reddit?

Yes. Proxies are required for Reddit scraping to ensure reliable and uninterrupted data extraction. We recommend using Apify's residential proxies for best results.

Why proxies are necessary:

  • Prevent IP blocking from Reddit
  • Distribute requests across multiple IPs
  • Maintain scraping reliability
  • Enable large-scale data extraction

IP rotation is handled inside the actor, so none of the examples need a proxy field.

How do I scrape an entire subreddit?

Add the subreddit to the Full Subreddit Scrape input (subredditUrls) — by name (AskReddit), as r/AskReddit, or a full link. This pulls far more posts than placing a subreddit URL in Direct URLs (which returns only the most recent page). Raise maxPostsCount to go deeper, and enable crawlCommentsPerPost to collect comments too. Larger pulls make more requests, so they take longer and cost more.

How do I scrape Reddit comments?

Two ways: enable crawlCommentsPerPost to collect the full comment thread (including nested replies) of every post the run finds, or enable searchComments with searchTerms to search comments across Reddit by keyword. Use maxCommentsPerPost and maxCommentsCount to control volume.

How many comments can I get per post?

As many as you set with maxCommentsPerPost. When crawlCommentsPerPost is enabled, the scraper collects the full comment thread up to that limit — not just the first page — including nested replies.

Do I still need Fast Mode?

No. Since October 2026 every Reddit search page URL is read without a browser, so the fastMode setting does nothing. You can leave it in old inputs.

Can I scrape Reddit posts from a specific date range?

Yes. Set postedAfter and postedBefore (use commentedAfter / commentedBefore for comments) with either YYYY-MM-DD dates or ISO-8601 timestamps, read in UTC. The scraper then collects newest-first and keeps only posts inside the window — unlike the relative searchTime dropdown, which only counts back from today. Because Reddit serves at most ~1,000 items per listing, narrow queries reach years back while broad ones on huge subreddits may not; see scraping a date range for details.

Can I get only posts that have a flair?

Yes — enable onlyWithFlair and the scraper keeps only posts that have a flair assigned, dropping flairless ones. It works alongside the date range and the keyword/subreddit inputs, and the kept posts still carry their flair value in the output. Handy when a community uses flairs to tag post types (e.g. "Discussion", "Question") and you only want the categorized ones.

How does the withinCommunity parameter work?

The withinCommunity parameter allows you to search for keywords within a specific subreddit, enabling targeted data extraction.

Format: r/subredditname (e.g., r/technology, r/gaming)

Example use cases:

  • Monitor brand mentions in specific communities
  • Analyze sentiment within niche subreddits
  • Research topics in targeted industries
  • Track competitor discussions in relevant communities

What data can I extract from Reddit?

Reddit Scraper can extract comprehensive data including:

Post data: title, content, URL, author, upvotes, score, comment count, timestamp, subreddit, awards, flair, images, videos, and media links

Comment data: text, author, score, timestamp, permalink, parent relationships, depth level, and awards

User data: username, profile information, post and comment history, karma scores, account age

Community data: subreddit name, description, subscriber count, active users, community rules

How much does it cost to scrape Reddit?

Reddit Scraper uses a pay-per-result pricing model. You pay $2.00 per 1,000 results on the Apify Free plan, and $1.80 to $1.50 per 1,000 on paid plans:

  • Actor start: $0.02 per GB of run memory
  • Result stored: $0.002 per item on the Free plan

Example costs (Free plan, default memory):

  • 1,000 items: $2.02
  • 10,000 items: $20.02
  • 100,000 items: $200.02

No monthly subscription fees or platform charges. You only pay for what you use!

What does $5 of free credit buy?

Apify gives each Free-plan account $5 of credit every month. Every post and every comment is one result at $0.002, and each run starts with $0.02. Some typical runs:

RunResultsCost
1 keyword, maxPostsCount: 5050$0.12 (more than 40 such runs fit in $5)
5 keywords, maxPostsCount: 50250$0.52
1 subreddit, full scrape of 1,000 posts1,000$2.02
50 posts with up to 200 comments eachup to 10,050up to $20.12

maxPostsCount applies to each keyword, subreddit and URL on its own, so 5 keywords at 50 posts can save 250 posts. The last run does not fit in $5: it stops near 2,490 results, when the credit runs out. Comments add up fast, so set maxCommentsPerPost low when you only need a sample of each thread.

Why did my run stop early?

Each run has a charge limit. When you run on free credit, the credit you have left also limits it. When a run reaches that amount, it stops, keeps everything it saved, and the run summary shows "This run is incomplete". To get the rest, raise the charge limit in the run options before you start. If your credit is used up, wait for the monthly free credit to renew, or upgrade your Apify plan for more credit and a lower price per result.

Why don't all results contain my keyword?

Reddit's own search picks the matching posts, and it matches loosely. A post can match only part of a multi-word query, so some titles do not show your keyword. With searchSort: "new", the newest posts come first, and many of them are loose matches. For tighter results, use searchSort: "relevance", put exact phrases in quotes, and keep each keyword short. Comment rows are replies in a matching thread, so a comment does not have to contain the keyword.

Can I export Reddit data to CSV or Excel?

Yes! Reddit Scraper supports multiple export formats:

  • ✅ JSON - For API integration and data processing
  • ✅ CSV - For Excel and spreadsheet analysis
  • ✅ Excel (XLSX) - Direct Excel format
  • ✅ XML - For structured data exchange
  • ✅ HTML - For web viewing

You can download your data in any format directly from the Apify platform after your scraping run completes.

Can AI agents use Reddit Scraper?

Yes. Reddit Scraper is available to AI agents through the Apify MCP server, so MCP-compatible clients like Claude, ChatGPT, and Cursor can run it as a tool. It also works with LangChain, LlamaIndex, and other frameworks via Apify integrations. See Use Reddit Scraper with AI agents and MCP.

How do I integrate Reddit Scraper with other tools?

Reddit Scraper offers multiple integration options:

1. n8n Integration - Automate workflows with 300+ app connections

2. Apify API - RESTful API for custom integrations

3. Webhooks - Real-time notifications when scraping completes

4. Zapier - Connect with 5,000+ apps (via Apify integration)

5. Make (Integromat) - Visual automation workflows

6. MCP - Expose the scraper as a tool to AI agents

See the n8n integration section for detailed setup instructions.

What are the rate limits or scraping limits?

This actor does not use Reddit's official API quota (600 requests per 10 minutes). How much you store is still limited by:

  • The max* caps you set (maxPostsCount, maxCommentsCount, maxCommentsPerPost, maxCommunitiesCount) — never more than N, not a billed quota
  • Reddit's own listing/search window (~1,000 items per listing or keyword)
  • Your Apify plan and the run's charge limit

A cap is a ceiling, not a fill-or-fail target. See Limiting results.

Why did my run return no results, or fewer than maxPostsCount?

max* fields stop the run from storing more than N. They do not make Reddit return N items. If the dataset is empty or short, check these first:

  • Tight keyword or time window — a rare phrase plus searchTime: "hour" or "day" often matches nothing. Widen the window or shorten the keyword.
  • NSFW off (default) — 18+ posts are dropped unless includeNSFW is true.
  • A cap is 0 — that result type is switched off.
  • Wrong URL field — post permalinks belong in startUrls. Community names belong in subredditUrls. A post link in subredditUrls is skipped.
  • Date window vs Reddit's ~1,000 listing cap — a distant postedAfter on a huge subreddit may never be reached (date_window_unreached in the run summary). Narrow the query or add withinCommunity.
  • Gone or gated targets — banned, private, deleted, or suspended communities/users are skipped and not charged.

Open Output → Run summary for emptyReason and skipped. Empty runs that stored nothing are not billed for results. Use the run's Issues tab if that still does not explain it.

How long does it take to scrape Reddit data?

Scraping time depends on several factors:

  • 100 posts: ~30 seconds
  • 1,000 posts: ~3-5 minutes
  • 10,000 posts: ~30-45 minutes

Can I schedule automatic Reddit scraping?

Yes! Apify supports scheduled runs for automated data collection:

  • Set up daily, weekly, or custom schedules
  • Monitor brand mentions automatically
  • Track trending topics in real-time
  • Build time-series datasets

On a finished run, open Actions → Schedule. Set postedAfter to "1 day" so each daily run returns only the posts from the last 24 hours.


Other Actors

Check out these related Apify Actors:

ActorDescription
Reddit Comments ScraperEvery comment and nested reply from any post URL
Reddit Search ScraperKeyword search across posts, comments, and communities
Reddit User ScraperUser profiles with full post and comment history
Subreddit ScraperEntire subreddits, past the ~1,000-post listing cap

Resources


Try Reddit Scraper

Built by Harsh Maur • Questions? Contact support