Reddit Search Scraper: Keyword Monitor avatar

Reddit Search Scraper: Keyword Monitor

Pricing

$1.00 / 1,000 posts

Go to Apify Store
Reddit Search Scraper: Keyword Monitor

Reddit Search Scraper: Keyword Monitor

Search public Reddit posts by keyword across all subreddits, with hot/new/top/rising ordering. Author, text, engagement counts, nested comments. Optional monitor mode bills only for new posts. No login, no API key. Works in Claude, ChatGPT and any MCP agent.

Pricing

$1.00 / 1,000 posts

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

8

Monthly active users

a day ago

Last modified

Share

40 Reddit posts with comments in 57 seconds: a recorded run searched all of Reddit for a phrase and delivered 40 top posts of the month, each with its comment tree

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Why choose this actor?

  • 40 posts with their comment threads in 57 seconds, with no Reddit account. A recorded run searched all of Reddit for the top posts of the month on one phrase and delivered 40 posts, each with its nested comment tree, in 57 seconds at 512 MB. You do not need a Reddit login, a password or an API key.
  • One search across every subreddit. It runs Reddit's own site search, so one keyword covers all of public Reddit, and Reddit's search syntax works: quoted phrases, subreddit:, author:, title:, OR and NOT. Sort by hot, new, top or rising.
  • $1 per 1,000 posts, flat, with no start fee. Comments ride inside the post row at no extra charge. Empty searches, blocked runs, summary rows and error rows cost nothing, and monitor mode charges only for posts you have not received before.

Run it on Apify

Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Twitter / X Scraper.

Try it in one minute

Paste this into the input's JSON tab and start the run. It returns the 10 hottest posts on Reddit right now that match "artificial intelligence". Our daily health check runs the same search for 5 posts and finishes in about 5 seconds.

{
"searchQuery": "artificial intelligence",
"sortBy": "hot",
"maxPosts": 10
}

There is one input that says what you want: searchQuery, a keyword or phrase in Reddit's own search syntax. Plain words match posts that contain them anywhere, "quoted phrases" match the exact phrase, subreddit:Name keeps results inside one community, and author:, title:, OR and NOT work the way they do on reddit.com. Everything else (sort order, time window, comments, monitor mode) shapes the results.

Apify's free plan includes $5 of credit every month, which covers about 5,000 posts at this actor's price ($0.001 per post, with no start fee).

Copy to your AI assistant

themineworks/reddit-search-scraper on Apify. Searches all of public Reddit by keyword with Reddit's own search syntax and returns one row per matching post (title, body, subreddit, author, score, upvote ratio, comment count, links, timestamps), optionally with the post's nested comment tree, with no Reddit login or API key. Call ApifyClient("TOKEN").actor("themineworks/reddit-search-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: searchQuery (string; supports quoted phrases, subreddit:, author:, title:, OR, NOT). Optional: sortBy ("hot" default, "new", "top", "rising"), timeframe ("all" default; "hour", "day", "week", "month", "year"; used only with sortBy "top"), maxPosts (default 25, up to 1000), includeComments (default false), maxCommentsPerPost (default 100, up to 500), maxDepth (default 3, up to 10), monitorMode (default false; delivers and charges only posts not delivered in an earlier run of this actor in the same Apify account). Post rows have no _type field; each run also writes one row with _type "summary", one with _type "info" when posts were delivered, and a row with _type "error" for each failed request; none of these extra rows is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~reddit-search-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • Site wide keyword search. One query covers every public subreddit. Results come in Reddit's own order for the sort you pick: hot, new, top (with a timeframe from the past hour to all time) or rising.
  • 21 fields per post. ID, full name, subreddit and its ID, title, author and author ID, score, upvote ratio, link, permalink, body text, text post flag, domain, flair, comment count, creation time, pinned and locked flags, award count and capture time, all flat top level fields that drop straight into a spreadsheet.
  • Optional nested comment trees. Turn on includeComments and each post carries a comments array with replies nested inside replies, up to 500 comments per post and 10 levels deep. Branches Reddit collapses arrive as a small more stub with the count and IDs of the hidden comments.
  • Up to 1,000 posts per run. The actor reads Reddit's search 100 results at a time, one second apart, until it reaches maxPosts or Reddit has no more results for the query.
  • Monitor mode for schedules. With monitorMode on, the actor remembers up to 50,000 post IDs it has already delivered in your account and skips them on later runs, so a daily run delivers and charges only new posts.
  • No proxy and no browser. It reads Reddit through Reddit's anonymous app sign in, the installed client flow that read only Reddit apps use, at 512 MB of memory.

How to use it

Basic: top posts of the week for a phrase

{
"searchQuery": "\"lab grown diamonds\"",
"sortBy": "top",
"timeframe": "week",
"maxPosts": 50
}

The quotes inside the query ask Reddit for the exact phrase. Without them Reddit matches posts that contain the words anywhere, which is broader: our recorded run searched four loose words (AI ad went viral brand) and got posts from 32 different communities, from r/isitAI to r/formula1.

Posts with their comment threads

{
"searchQuery": "AI ad went viral brand",
"sortBy": "top",
"timeframe": "month",
"maxPosts": 40,
"includeComments": true,
"maxCommentsPerPost": 15,
"maxDepth": 3
}

This is the input of our recorded run: 40 posts with comment trees in 57 seconds. Each post with comments needs one more request and a one second pause, so plan on 1 to 2 seconds per post. For more than about 150 posts with comments, raise the run timeout above the default 300 seconds in the run options.

Brand mention alerts, delivered daily

{
"searchQuery": "\"your brand name\"",
"sortBy": "new",
"maxPosts": 100,
"monitorMode": true
}

Save this as a task and put it on a daily schedule (Apify Console, Schedules, Create new). The first run delivers everything it finds and remembers those posts. Every later run delivers and charges only posts that were not in an earlier run.

Pain point research inside a few communities

{
"searchQuery": "(subreddit:smallbusiness OR subreddit:Entrepreneur) (\"is there a tool\" OR \"so frustrating\")",
"sortBy": "top",
"timeframe": "year",
"maxPosts": 200
}

subreddit: and OR narrow a site wide search to the communities you care about. One run per phrase family, then read titles and bodies for repeated problems.

Competitor watch with comments, weekly

{
"searchQuery": "\"competitor name\" OR \"competitor product\"",
"sortBy": "new",
"maxPosts": 50,
"includeComments": true,
"maxCommentsPerPost": 20,
"maxDepth": 2,
"monitorMode": true
}

A weekly schedule with monitor mode gives you each new thread about a competitor once, with the first replies, so you see what people praise and complain about without paying for the same thread twice.

Input parameters

ParameterTypeDefaultWhat it does
searchQuerystringnone (prefilled with artificial intelligence)Required. Keyword or phrase in Reddit's search syntax: quoted phrases, subreddit:, author:, title:, OR, NOT.
sortBystringhothot, new, top or rising.
timeframestringallhour, day, week, month, year or all. Only used with sortBy: "top".
maxPostsinteger25Most posts delivered in the run, 1 to 1,000. Also your cost cap.
includeCommentsbooleanfalseAdds each post's comment tree as a comments array. One extra request per post, so runs take longer.
maxCommentsPerPostinteger100Comment limit sent to Reddit for each post, 1 to 500. Used when includeComments is on.
maxDepthinteger3How many levels of replies to follow, 1 to 10. 1 returns top level comments plus their direct replies; each step adds one level.
monitorModebooleanfalseDelivers and charges only posts not delivered in an earlier run of this actor in your account.

What data do you get?

One row per post, plus one summary row per run. Post rows have no _type field, so filtering on _type separates them from the rest.

The post: id (such as 1wubmcn), name (the full Reddit ID, t3_1wubmcn), title, selftext (body text, empty for link and image posts), is_self, url (the linked page or image, or the thread itself for text posts), permalink, domain, flair.

Where and who: subreddit, subreddit_id, author (username without u/), author_fullname.

Engagement and status: score, upvote_ratio, num_comments, awards_count, is_pinned, is_locked, created_utc (Unix seconds), scraped_at (ISO time the row was written).

Comments (when includeComments is on): each comment has id, name, author, body, score, created_utc, is_submitter (true when the post's author wrote it), depth (0 for top level) and replies, a list of comments in the same shape. A collapsed branch appears as {"kind": "more", "id", "name", "count", "children"}, where children holds the IDs Reddit did not expand. If Reddit refuses the comment request for one post, that post is still delivered, with an empty comments list.

Summary row (_type: "summary", never charged): posts_requested, posts_scraped, posts_failed, subreddits_processed (always 0 in this search only actor), charged_for, last_after_cursor (Reddit's position marker where the run stopped, when there were more results), monitor and scraped_at. With monitor mode on, it also counts the posts already known, the new ones and the ones skipped. When nothing was delivered, it says why in one sentence.

Info row (_type: "info", never charged): written on runs that delivered at least one post, with the count and a note on scheduling.

Error rows (_type: "error", never charged): one per request Reddit refused, with an error type (such as not found, access denied or rate limited), the search or post it concerns, a reason and the HTTP status.

Stable fields for automations

These fields were present in all 57 post rows of our three most recent runs with different inputs. Their names will not change, so a Google Sheet, Zapier zap or n8n flow can map them once.

FieldWhat it is
idReddit post ID, the key to store and join on
nameFull ID with the t3_ prefix
subredditCommunity name, without r/
titlePost title
authorAuthor's username, or [deleted]
scoreUpvotes minus downvotes at the time of the run
upvote_ratioShare of votes that are upvotes, 0 to 1
num_commentsComment count Reddit shows on the post
urlLinked page or image, or the thread for text posts
permalinkFull link to the Reddit thread
selftextBody text, empty string for link posts
is_selfTrue for text posts
created_utcPost time in Unix seconds, UTC
is_pinnedTrue for moderator pinned posts
scraped_atWhen this row was written, ISO 8601

flair is left out when the post has none (14 of the 57 rows), and author_fullname can be missing for deleted accounts, so treat both as optional. The comments key appears only when comments were fetched in that run.

Output examples

A post with its comment tree (recorded run JWDKgwZGvXipnAmH6, 25 Sep 2026; body trimmed, and only one of the post's 9 top level comment entries shown, with its more stubs trimmed):

{
"id": "1w94pwz",
"name": "t3_1w94pwz",
"subreddit": "isitAI",
"subreddit_id": "t5_7lwd8h",
"title": "AI food looked so gross I ended up leaving without eating",
"author": "ShaggysShed",
"author_fullname": "t2_vaoxq6dka",
"score": 31532,
"upvote_ratio": 0.98,
"url": "https://i.redd.it/nki3cpbe5ynh1.jpeg",
"permalink": "https://www.reddit.com/r/isitAI/comments/1w94pwz/ai_food_looked_so_gross_i_ended_up_leaving/",
"selftext": "Went to a place that is known for having one of the best cheesesteaks in town, was excited to try until I saw the menu. STOP USING AI FOR FOOD PROMOTION!!! ...",
"is_self": false,
"domain": "i.redd.it",
"num_comments": 1175,
"created_utc": 1788720835,
"is_pinned": false,
"is_locked": false,
"awards_count": 0,
"scraped_at": "2026-09-25T10:40:53.766Z",
"comments": [
{
"id": "p87pru6",
"name": "t1_p87pru6",
"author": "ColonelCrikey",
"body": "If your poster is slop there's an obvious assumption to be made about the food.",
"score": 107,
"created_utc": 1788721148,
"is_submitter": false,
"depth": 0,
"replies": [
{
"id": "p87s75k",
"name": "t1_p87s75k",
"author": "ShaggysShed",
"body": "That’s the saddest part too cause they are known for having some really good food, ...",
"score": 44,
"created_utc": 1788721804,
"is_submitter": true,
"depth": 1,
"replies": [
{ "kind": "more", "id": "p87szpf", "name": "t1_p87szpf", "count": 20, "children": ["p87szpf", "p8a4qfk"] }
]
},
{ "kind": "more", "id": "p87xuq0", "name": "t1_p87xuq0", "count": 29, "children": ["p87xuq0", "p87wf7i", "p89nm0t"] }
]
}
]
}

This post has no flair, so the key is missing. is_submitter is true on the reply written by the post's author.

A plain post, without comments (our health check run 5igbKckyaQHfd5rhG, 1 Oct 2026):

{
"id": "1wubmcn",
"name": "t3_1wubmcn",
"subreddit": "ProgrammerHumor",
"subreddit_id": "t5_2tex6",
"title": "artificialSuperIntelligence",
"author": "Donghoon",
"author_fullname": "t2_9xyqnev",
"score": 32,
"upvote_ratio": 0.72,
"url": "https://i.redd.it/lml0y7h93psh1.png",
"permalink": "https://www.reddit.com/r/ProgrammerHumor/comments/1wubmcn/artificialsuperintelligence/",
"selftext": "",
"is_self": false,
"domain": "i.redd.it",
"flair": "Meme",
"num_comments": 10,
"created_utc": 1790790421,
"is_pinned": false,
"is_locked": false,
"awards_count": 0,
"scraped_at": "2026-10-01T09:02:35.507Z"
}

The summary row of the recorded run (40 posts asked for, 40 delivered and charged):

{
"_type": "summary",
"posts_requested": 40,
"posts_scraped": 40,
"posts_failed": 0,
"subreddits_processed": 0,
"charged_for": 40,
"last_after_cursor": "t3_1wiiyig",
"monitor": false,
"scraped_at": "2026-09-25T10:41:40.370Z"
}

A search that ran out early (run I6jnQhpk8by0CKb4h, same day: 40 posts asked for, Reddit had 12, so 12 were charged and there is no last_after_cursor):

{
"_type": "summary",
"posts_requested": 40,
"posts_scraped": 12,
"posts_failed": 0,
"subreddits_processed": 0,
"charged_for": 12,
"monitor": false,
"scraped_at": "2026-09-25T10:41:01.227Z"
}

Pricing

Pay per event. You are charged for each post delivered to your dataset, and nothing else. The price is the same on every Apify plan.

EventFreeBronzeSilverGold and above
Post delivered (post-scraped), per post$0.001$0.001$0.001$0.001
Per 1,000 posts$1.00$1.00$1.00$1.00
Run startnonenonenonenone

No start fee. This actor has no apify-actor-start or other per run event, so a run that finds nothing costs nothing.

Comments are free. A post's comment tree rides inside the post row, so a post with 500 comments costs the same as a post with none.

Never charged: the summary row, the info row, error rows, posts that fail to save, and posts skipped by monitor mode because you already have them.

What real jobs cost: the recorded run (40 posts with comments) cost $0.04. A daily brand search in monitor mode that finds 20 new posts costs $0.02 a day. 1,000 posts cost $1.00.

There is no price change scheduled for this actor. The Pricing tab on this page always shows the current rate.

FAQ

What does this actor search? Public Reddit posts, through Reddit's own site search. One query covers every public subreddit, and you can narrow it with Reddit's operators. It returns posts and, if you ask, their comments; it does not search comments on their own.

How is this different from Reddit Scraper? This actor and our Reddit Scraper read Reddit the same way. This one does one job, keyword search across all of Reddit. Reddit Scraper also reads a subreddit's feed, a user's posts or specific post URLs.

How many posts can I get? Up to 1,000 per run (maxPosts). Reddit decides how deep a search goes: when it has no more results the run ends with what it found, as in the example above where a narrow search returned 12 of the 40 posts asked for. To go further, split one broad search into narrower ones or vary sortBy and timeframe.

How fresh is the data? Live. Every run asks Reddit at the moment it runs. Scores, upvote ratios and comment counts are the values Reddit showed then, stamped in scraped_at.

Do I need a Reddit account, API key or cookies? No. The actor uses Reddit's anonymous app sign in, the kind read only Reddit apps use, with a shared app ID. It never asks for or stores a Reddit login.

Do I need a proxy? No. The actor does not use one. When Reddit asks it to slow down, it waits 5, 10 and then 20 seconds before retrying; if Reddit still refuses, the run writes an error row and stops without charging for anything it did not deliver.

Why did I get fewer posts than maxPosts? The search ran out of matches (common with narrow phrases or short time windows), monitor mode skipped posts you already had, or a request was refused, which leaves an error row. The summary row shows posts_scraped and, when nothing was delivered, the reason.

How does monitor mode decide what is new? It keeps the IDs of up to 50,000 posts it has delivered in a key value store named monitor-reddit-search-scraper in your own Apify account, and skips those IDs on later runs. That store is shared by every run of this actor in your account, whatever the query. So if you monitor two keywords and one post matches both, you get it once, from whichever run finds it first. If the store cannot be opened, the run says so in its log and delivers everything instead of skipping.

Can I limit the search to one subreddit? Yes, inside the query: subreddit:Python "type hints". To read a subreddit's whole feed rather than search it, use Reddit Scraper.

My run with comments stopped early. Why? Each post with comments takes about one and a half seconds, and the default run timeout is 300 seconds. A run with comments on more than about 150 posts can reach that limit; the posts delivered by then stay in your dataset (and are charged), but the summary row is not written. Raise the timeout in the run options for big comment runs.

How do I get the data out? From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. JSON keeps the nested comments tree intact; CSV and Excel flatten nested fields, so use JSON for comment work.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/reddit-search-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http reddit-search-scraper "https://mcp.apify.com/?tools=themineworks/reddit-search-scraper".

Is it legal to scrape Reddit? The actor reads only public posts and comments, the content anyone can see without logging in. Public posts can still contain personal data such as usernames. You are responsible for how you use the data, including Reddit's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice. This actor is independent and not affiliated with or endorsed by Reddit.

Integrations

Results land in a standard Apify dataset, so they connect without extra code:

  • Google Sheets: send each run's posts to a sheet with Apify's Google Sheets integration.
  • Make, Zapier and n8n: start a run and read its dataset with the official Apify apps and nodes.
  • Webhooks: get a call to your own URL when a run succeeds, then fetch the dataset.
  • API and SDKs: start runs and read results with the Apify API, or the Python and JavaScript clients.
  • MCP clients: Claude, ChatGPT, Cursor and other MCP clients can call the actor through https://mcp.apify.com/?tools=themineworks/reddit-search-scraper.

More from The Mine Works

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field? Open an issue on the Issues tab of this actor. To ask for a new source, email dmineworks@gmail.com.

Reddit Search Scraper searches all of public Reddit by keyword and returns posts with optional comment threads, no login, at $1 per 1,000 posts with no start fee.