Apify Store
AS
Apify Store
/harshmaur/reddit-scraper

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,

liveasyncunknown~30s typical
social medialead generationaireddit
$0.0025
per result + $0.005 call
plus $0.001 platform fee per run
Actor charges $0.002 per result; Cracked adds 25% plus a $0.005 call fee
Bring your own Apify Store key: provider portion drops to $0.
$Set up https://cracked-ai-pearl.vercel.app/SKILL.md, then use Cracked to run apify /harshmaur/reddit-scraper for me.

Input

FieldTypeDescription
searchTermsarrayEnter 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. Leave empty if you only want to scrape Direct URLs below. default []
searchPostsbooleanInclude posts in keyword search results. default true
searchCommentsbooleanInclude comments in keyword search results. default false
searchCommunitiesbooleanInclude communities (subreddits) in keyword search results. default false
withinCommunitystringRestrict keyword search to a single subreddit. Accepts a bare name (developers), r/developers, or a full subreddit URL. Leave empty to search all of Reddit. Only applies to Search Keywords. default ""
searchSortstring ( | relevance | hot | top | new | comments)Controls how keyword search results are ranked. Only applies to Search Keywords, not Direct URLs. default "new"
searchTimestring (all | hour | day | week | month | year)Limit keyword search results to posts from a specific time window. Only applies to Search Keywords. default "all"
startUrlsarrayAdd 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. default []
fastModebooleanSpeeds up scraping of search page URLs at the cost of some accuracy — some posts may be missed. Disable if you need exact results matching what you see on Reddit. Search Keywords always use fast mode automatically. default true
subredditUrlsarraySubreddits 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. default []
postedAfterstringOnly keep posts created on or after this date (interpreted as 00:00 UTC). 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.
postedBeforestringOnly keep posts created on or before this date (interpreted as the end of that day, 23:59:59 UTC).
commentedAfterstringOnly keep comments created on or after this date (UTC). Applies when comments are collected (comment search, or 'Scrape comments for each post').
commentedBeforestringOnly keep comments created on or before this date (UTC).
onlyWithFlairbooleanWhen 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. default false
crawlCommentsPerPostbooleanWhen enabled, comments will be collected for every post found from both Search Keywords and Direct URLs. This significantly increases run time and data output. default false
includeNSFWbooleanInclude posts marked as Not Safe For Work in results. Applies to both Search Keywords and Direct URLs. default false
maxPostsCountintegerMaximum number of posts to save across all search results, subreddit pages, and user profiles. To pull an entire subreddit, use the Full Subreddit Scrape input and raise this limit. Max: 50000. default 25
maxCommentsCountintegerMaximum comments returned per search keyword (when 'Search for comments' is enabled). Does not affect per-post comment scraping. default 200
maxCommentsPerPostintegerMaximum comments to scrape per individual post (when 'Scrape comments for each post' is enabled). default 100
maxCommunitiesCountintegerMaximum communities returned from keyword search (when 'Search for communities' is enabled). default 2
aiAnalysisbooleanAdds 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). Posts also receive a `contentCategory`. The model understands Reddit slang and sarcasm; bot and moderator boilerplate is labelled `uncertain` free of charge. Each analyzed result is billed once as an `analyzed_item` event — see the Pricing tab. Requires a paid Apify plan and is ignored on free plans. default false
customLabelsobjectDefine 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). Each label evaluated on each result is billed as one `custom_label` event — 3 labels on 1,000 results = 3,000 events. An evaluation that finds nothing (an empty/null answer, when your instruction allows it) is still an evaluation and is charged; nothing is charged for results the AI could not process. Paid add-on: requires a paid Apify plan; ignored on free plans. default {}
mcpConnectorstringPick 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.
mcpModestring (perPost | summary)perPost: send one message/record per scraped post. summary: send a single digest of the whole run. default "perPost"
mcpTargetstringWhere 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.
mcpCommentsstring (ignore | bundle | separate)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. default "ignore"
mcpCommentsPerPostintegerHow many top comments (by score) to include per post when bundling or sending comments. Requires 'Scrape comments for each post'. default 5
mcpMessagestringTemplate 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. default "**{{title}}**\n{{postUrl}}"
mcpToolstringForce 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.
mcpArgumentsobjectExtra/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.
mcpMaxItemsintegerSafety cap on how many posts are piped to the connector per run (perPost mode). Protects against flooding the destination. default 50
mcpServerUrlstringAdvanced/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.
mcpServerTokenstringBearer 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.
proxyobjectEither use Apify proxy, or provide your own proxy servers. default {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}

Call it

curl
curl https://cracked-ai-pearl.vercel.app/v1/run \
  -H "Authorization: Bearer ck_live_..." -H "content-type: application/json" \
  -d '{"provider":"apify","endpoint":"/harshmaur/reddit-scraper","input":{"searchSort":"new","searchTime":"all","startUrls":[{"url":"https://www.reddit.com/r/generativeAI/comments/1l64st7/have_we_reached_a_point_where_aigenerated_video/"}],"maxPostsCount":3,"maxCommentsCount":3,"maxCommentsPerPost":3,"maxCommunitiesCount":2,"mcpMode":"perPost","mcpComments":"ignore","mcpCommentsPerPost":5,"mcpMessage":"**{{title}}**\n{{postUrl}}","mcpMaxItems":3,"proxy":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}},"wait":false}'
poll
curl "https://cracked-ai-pearl.vercel.app/v1/runs/<runId>?wait=30" -H "Authorization: Bearer ck_live_..."
cli
npx cracked-ai run -p apify -e /harshmaur/reddit-scraper -i '{"searchSort":"new","searchTime":"all","startUrls":[{"url":"https://www.reddit.com/r/generativeAI/comments/1l64st7/have_we_reached_a_point_where_aigenerated_video/"}],"maxPostsCount":3,"maxCommentsCount":3,"maxCommentsPerPost":3,"maxCommunitiesCount":2,"mcpMode":"perPost","mcpComments":"ignore","mcpCommentsPerPost":5,"mcpMessage":"**{{title}}**\n{{postUrl}}","mcpMaxItems":3,"proxy":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}' -w 120
mcp
run_tool({ provider: "apify", endpoint: "/harshmaur/reddit-scraper", input: {"searchSort":"new","searchTime":"all","startUrls":[{"url":"https://www.reddit.com/r/generativeAI/comments/1l64st7/have_we_reached_a_point_where_aigenerated_video/"}],"maxPostsCount":3,"maxCommentsCount":3,"maxCommentsPerPost":3,"maxCommunitiesCount":2,"mcpMode":"perPost","mcpComments":"ignore","mcpCommentsPerPost":5,"mcpMessage":"**{{title}}**\n{{postUrl}}","mcpMaxItems":3,"proxy":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}, wait: false })

Try it

Runs against your signed-in workspace balance. Sign in if you have not.