harshmaur/reddit-scraper
harshmaur--reddit-scraperDestructive
This tool calls the Actor "harshmaur/reddit-scraper" and retrieves its output results. Actor description: 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.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| hasPain | No | Adds `aiFlags.hasPain` (true/false) to every analyzed post and comment: true when the author describes a problem, a failed tool, or something not working. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| isOwner | No | Adds `aiFlags.isOwner` (true/false) to every analyzed post and comment: true when the author founded, owns, or operates a business (not a customer or employee). Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| mcpMode | No | perPost: send one message/record per scraped post. summary: send a single digest of the whole run. Example values: "perPost" | perPost |
| mcpTool | No | Force a specific tool name on the connector (e.g. send_message, create_page, append_row). Leave empty to auto-detect the connector's write/notify tool. | |
| isVendor | No | Adds `aiFlags.isVendor` (true/false) to every analyzed post and comment: true when the author is selling, promoting, or recruiting testers for their own product or service. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| waitSecs | No | Max seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget. | |
| mcpTarget | No | Where to write — the destination ID the tool needs: a Notion database/page ID, a Google Sheet ID, a Slack channel, or owner/repo. Leave blank for connectors that post to a default location. Advanced shapes go in Arguments JSON below. | |
| painPoint | No | Adds `aiFlags.painPoint` (text) to every analyzed post and comment: the problem or unmet need in under 15 words, or none. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| startUrls | No | Add one or more Reddit URLs to scrape directly. Supports post URLs, subreddit URLs, user profile URLs, and search page URLs. The Search Keywords options above (sort, time, community filter) do NOT apply to these URLs. Example values: [{"url":"https://www.reddit.com/r/generativeAI/comments/1l64st7/have_we_reached_a_point_where_aigenerated_video/"}] | |
| wantsHelp | No | Adds `aiFlags.wantsHelp` (true/false) to every analyzed post and comment: true when the author is looking for a product, service, or person to solve their problem — the classic lead signal. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| aiAnalysis | No | Adds AI-judged fields to posts and comments: `sentimentLabel` (positive / negative / neutral / mixed / uncertain), `sentimentScore` (-1 to 1), `intent` (question, seeking_recommendation, complaint, praise, purchase_intent, comparison, announcement, self_promotion, discussion), `emotion` (joy, excitement, anger, frustration, sadness, disappointment, fear, surprise, neutral), `entities` (brands, products and companies mentioned), and — for keyword-search results — `relevanceScore` (0 to 1). [Description truncated] | |
| competitor | No | Adds `aiFlags.competitor` (text) to every analyzed post and comment: the competing product, brand, or tool mentioned, or none. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| mcpMessage | No | Template for each message. Use {{field}} placeholders from ANY post field — common ones: {{title}}, {{body}}, {{postUrl}}, {{authorName}}, {{score}}, {{upVotes}}, {{commentsCount}}, {{communityName}}, {{flair}}, {{createdAt}}. Nested/array fields work via dot or [index] paths: {{mediaAssets.0.url}}, {{galleryImages[0]}}, {{media.reddit_video.fallback_url}}. (Full field list in the README.) Missing fields render empty. Example values: "**{{title}}**\n{{postUrl}}" | **{{title}}** {{postUrl}} |
| searchSort | No | Controls how keyword search results are ranked. Only applies to Search Keywords, not Direct URLs. Example values: "new" | new |
| searchTime | No | Limit keyword search results to posts from a specific time window. Only applies to Search Keywords. Example values: "all" | all |
| includeNSFW | No | Include posts marked as Not Safe For Work in results. Applies to both Search Keywords and Direct URLs. | |
| mcpComments | No | When 'Scrape comments for each post' is on, choose how comments reach your app. Ignore: send posts only (comments still saved to the dataset). Bundle: attach each post's top comments inside its message. Separate: send each top comment as its own message/record. Example values: "ignore" | ignore |
| mcpMaxItems | No | Safety cap on how many posts are piped to the connector per run (perPost mode). Protects against flooding the destination. Example values: 50 | |
| postedAfter | No | Only keep posts created on or after this date (00:00 UTC), or within a relative period counted back from the run start, e.g. '1 day' for a daily schedule or '7 days' for a weekly one. When set, results are fetched newest-first (sort=new) and the search Time range is ignored. Reddit caps each listing at ~1,000 posts, so a window behind a very high-volume query may be only partly reachable. Applies to Search Keywords, subreddit URLs, the Full Subreddit Scrape, and user profiles. | |
| searchPosts | No | Include posts in keyword search results. Example values: true | |
| searchTerms | No | Enter one or more keywords to search Reddit (e.g. "best laptops 2025", "AI news"). Each keyword runs as a separate search. Free Apify plans search the first 40 keywords per run (paid plans are unlimited) — extra keywords are skipped and noted in the run log. Quoted phrases return fewer posts, especially inside one community. Leave empty if you only want to scrape Direct URLs below. | |
| customLabels | No | Define your own labels as `{"label_name": "plain-language instruction"}` and the AI evaluates each one on every analyzed post and comment, returning them under `customLabels` on each result. Example: `{"mentions_pricing": "true if the text complains about pricing or cost", "competitor": "name the competing product mentioned, or none"}`. Up to 5 labels; names must be short identifiers (letters, digits, underscore). The AI flag checkboxes above do not count against this cap. [Description truncated] Example values: {} | |
| mcpArguments | No | Extra/override arguments merged into each tool call as JSON — e.g. {"channel": "#reddit"} for Slack. {{field}} placeholders work inside string values too, so you can nest live data into any shape the tool needs — e.g. Notion: {"properties": {"Title": {"title": [{"text": {"content": "{{title}}"}}]}, "Link": {"url": "{{postUrl}}"}}}. Use it to satisfy required fields or fully control the payload. | |
| mcpConnector | No | Pick an authorized MCP connector (Slack, Notion, GitHub, Airtable, Supabase, …) to receive the scraped posts. This is the recommended, secure path — your credentials stay in Apify and are never exposed to this actor (Apify's proxy injects them). Leave empty to scrape only. Create connectors under Settings → API & Integrations → MCP connectors, or inline here. | |
| mcpServerUrl | No | Advanced/testing only. Connect directly to a raw MCP server URL, bypassing the MCP Connector above. For real use prefer a connector — with a connector your credentials stay in Apify and are never seen by this actor. When set, this overrides the connector. | |
| postedBefore | No | Only keep posts created on or before this date (the end of that day, 23:59:59 UTC). A relative value such as '1 day' keeps only posts at least one day old. | |
| willingToPay | No | Adds `aiFlags.willingToPay` (true/false) to every analyzed post and comment: true when the author names a budget, asks for a quote, or says they would pay. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| maxPostsCount | No | Maximum posts saved for EACH search keyword and EACH Reddit URL: 5 keywords × 50 = up to 250 posts. Full Subreddit Scrape uses this as one total. Each saved post is a billed result. Reddit search returns up to about 2,000 posts for a busy keyword; use Full Subreddit Scrape for more. Max: 50000. Example values: 50 | |
| mentionsPrice | No | Adds `aiFlags.mentionsPrice` (true/false) to every analyzed post and comment: true when the text mentions a price, fee, retainer, subscription cost, or money spent. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| onlyWithFlair | No | When enabled, drop posts with no flair and keep only those that have a flair assigned. Applies to Search Keywords, subreddit URLs, the Full Subreddit Scrape, and user profiles. | |
| subredditUrls | No | Subreddits to scrape in full. Enter subreddit names or links — e.g. `AskReddit`, `r/AskReddit`, or `https://www.reddit.com/r/AskReddit/`. This collects far more posts per subreddit than a standard scrape. It uses more requests, so runs take longer and cost more. Comments are also collected when 'Scrape comments for each post' is enabled — increase Max posts to allow more results per subreddit. | |
| commentedAfter | No | Only keep comments created on or after this date (UTC), or within a relative period such as '1 day' for a daily schedule. Applies when comments are collected (comment search, or 'Scrape comments for each post'). | |
| featureRequest | No | Adds `aiFlags.featureRequest` (true/false) to every analyzed post and comment: true when the author asks for or describes a feature or product that does not exist yet. Billed as one `custom_label` event per result ($0.10 per 1,000). | |
| mcpServerToken | No | Bearer token for the dev MCP server URL above. Note: a token entered here IS visible to the actor at runtime — for production use an MCP Connector instead, so credentials never leave Apify. Ignored unless the URL is set. | |
| searchComments | No | Include comments in keyword search results. Each comment is a billed result (up to 'Max search comments' per keyword). Example values: true | |
| commentedBefore | No | Only keep comments created on or before this date (UTC). | |
| withinCommunity | No | Restrict keyword search to a single subreddit. This is a name, not a post limit. Accepts a bare name (developers), r/developers, or a full subreddit URL. Leave empty to search all of Reddit. Only applies to Search Keywords. | |
| maxCommentsCount | No | Maximum comments returned per search keyword (when 'Search for comments' is enabled). Does not affect per-post comment scraping. Example values: 400 | |
| searchCommunities | No | Include communities (subreddits) in keyword search results. | |
| maxCommentsPerPost | No | Maximum comments to scrape per individual post (when 'Scrape comments for each post' is enabled). Each comment is a billed result: 50 posts × 200 comments can be 10,000 results. Example values: 200 | |
| mcpCommentsPerPost | No | How many top comments (by score) to include per post when bundling or sending comments. Requires 'Scrape comments for each post'. Example values: 5 | |
| maxCommunitiesCount | No | Maximum communities returned from keyword search (when 'Search for communities' is enabled). Example values: 2 | |
| crawlCommentsPerPost | No | When enabled, comments will be collected for every post found from both Search Keywords and Direct URLs. This significantly increases run time and data output. Each comment is a billed result: 50 posts × 200 comments can be 10,000 results. Example values: true |
Output Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key | |
| runId | Yes | Actor run ID | |
| stats | No | Run statistics | |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED | |
| actorId | Yes | Stable Apify Actor ID from the run record | |
| summary | Yes | Past-tense summary of the run state | |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) | |
| nextStep | Yes | One primary follow-up action with identifiers interpolated | |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. | |
| actorName | No | "username/actor-name" | |
| startedAt | No | ISO timestamp when the run started | |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) | |
| statusMessage | No | Pass-through from Apify run.statusMessage | |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |