Reddit Buying Intent Finder
Under maintenancePricing
from $1.00 / 1,000 results
Reddit Buying Intent Finder
Under maintenanceFind Reddit posts where users are actively asking for product/service recommendations in your niche. Give it a list of subreddits + intent keywords, get back warm leads with post URLs, scores, snippets, and match reason — perfect for service businesses, agencies, and SaaS.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
sky
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Apify Actor — given a list of subreddits and (optionally) intent keywords, extract Reddit posts where users are actively asking for product/service recommendations. For service businesses, agencies, and SaaS doing Reddit-based lead generation.
What it does
- Subreddit scan — fetches the recent feed of each subreddit you provide (e.g.
r/freelance,r/smallbusiness,r/webdev) via Reddit's publicold.reddit.com/r/<sub>/search.jsonendpoint. No OAuth required. - Intent filter — runs every post through a built-in buying-intent detector that matches phrases like:
- "looking for" / "searching for"
- "recommend me a…" / "anyone recommend…"
- "best X for Y" / "best Y to use"
- "anyone use / know / tried…"
- "what do you use" / "what should I use"
- "I need a…" / "need recommendations"
- "alternative to…" / "switching from/to"
- "X vs Y" You can also supply your own intent keywords; matching is case-insensitive substring across title (and optionally the post body).
- Output — emits a single Apify dataset record containing:
- The matching posts (deduplicated, sorted newest-first, capped to
maxPosts), - Per-subreddit match counts,
- The original input echoed back for reference.
- The matching posts (deduplicated, sorted newest-first, capped to
Each emitted post includes subreddit, postId, title, url, snippet, score, numComments, author, createdUtc, isSelf, flair, and intentMatches (which patterns fired).
Why
Many Apify Reddit scrapers exist but they are all "give me all posts in subreddit X." This one is opinionated: it returns only posts where a real person is shopping for what you sell. That's what you want when running a weekly lead-generation check before responding on Reddit.
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
subreddits | array of strings | yes | — | Subreddits to search, WITHOUT the r/ prefix. Example: ["fitness","webdev","smallbusiness"]. 1–10 recommended. |
intentKeywords | array of strings | no | [] | Optional extra intent patterns matched as case-insensitive substrings in title (and body, if matchBody=true). Example: ["crm","invoicing tool"]. |
timeframe | string enum | no | month | One of hour, day, week, month, year, all. Mapped to Reddit's t= parameter. |
maxPosts | int 1–500 | no | 50 | Cap on matching posts in the output. |
maxPostsPerSub | int 1–100 | no | 100 | Posts scanned per subreddit (the intent filter runs on this pool). Reddit caps at 100/page; we hard-cap at 5 pages. |
matchBody | bool | no | false | If true, intent patterns and intentKeywords are also matched against the post's selftext. Off by default to reduce false positives from off-topic bodies. |
minScore | int ≥ 0 | no | 0 | If set, only posts with at least this many upvotes are returned. |
Output shape
{"generatedAt": "2026-07-05T18:40:00.000Z","inputSubreddits": ["freelance", "smallbusiness"],"timeframe": "month","subSummaries": [{ "subreddit": "freelance", "matchedCount": 7 },{ "subreddit": "smallbusiness", "matchedCount": 3 }],"totalMatched": 10,"returnedCount": 10,"posts": [{"subreddit": "freelance","postId": "abc123","title": "Looking for a good invoicing tool for solo freelancers?","url": "https://www.reddit.com/r/freelance/comments/abc123/looking_for/","snippet": "I've tried Wave but it doesn't do X...","score": 14,"numComments": 6,"author": "alice","createdUtc": 1751300000,"isSelf": true,"flair": "Question","intentMatches": ["looking for", "custom:invoicing tool"]}]}
Limits and known constraints
- No login. We use Reddit's public JSON endpoint, which returns 200 anonymously. If Reddit rate-limits or returns HTML, posts on that page are skipped (the actor keeps going on the next page / subreddit).
- 5 pages per subreddit max. Hard-coded internal ceiling so a single request that hits a rate-limit doesn't loop forever. Tunable in
fetchSubredditPostsif you want more depth. - Public posts only. Posts in private/quarantined subreddits, or posts removed before our crawl, are not returned.
- No comment threads. This actor returns posts only, not the replies. Useful as a lead list; you'd open the URL to see what people are saying.
Pricing model
Suggested on the Apify Store: PAY_PER_EVENT ~$0.002 / matching post (i.e. $0.002 × matchedCount). One actor run can return up to maxPosts results.
Local development
# 1. Installnpm install# 2. Structural tests only (no network, fast)npm test# 3. Full test suite + live Reddit fetchnpm run test:live# 4. Smoke test: fetch real data against one subredditnode check_trends.js# 5. End-to-end run locally with the bundled test input# On Windows PowerShell:$env:APIFY_LOCAL_INPUT_PATH='.\test_input.json'; node src/main.js# On macOS/Linux:APIFY_LOCAL_INPUT_PATH=./test_input.json node src/main.js
Local mode writes results to ./output.json. In Apify, results are pushed to the default dataset.
File map
reddit-buying-intent-finder/├── .actor/│ ├── actor.json # Apify actor manifest│ └── input_schema.json # Apify input UI schema├── src/│ └── main.js # all logic (pure functions + run() + CLI entry)├── test_input.json # sample input for local runs├── test_local.js # structural + live integration tests├── check_trends.js # quick smoke-check (live, one subreddit)├── package.json├── Dockerfile # apify/actor-node:18├── .gitignore└── README.md
Test coverage
- 39 structural tests (no network): URL builder, intent patterns (positive + negative cases for each built-in pattern),
matchBodytoggle,minScorefilter, input validation (subreddit normalisation, timeframe enum, ranges),extraKeywordssubstring matching, snippet truncation, de-dup contract viashapePost. - 2 live integration tests (network):
- Real fetch against
r/announcements, verifying the parser normalises whatever Reddit returns today. - Direct JSON fetch against
r/fitness/search.jsonto confirm the endpoint is reachable.
- Real fetch against
Run npm run test:live to exercise both.