# Reddit Leads / Purchase Intent Finder (`coregent/reddit-leads-purchase-intent-finder`) Actor

Find Reddit posts and comments where people ask for recommendations, alternatives, tools or services. Explainable 0–100 intent score, HOT/WARM/COLD tiers, competitor-switching, budget and urgency, vendor filtering, one row per person, only-new monitoring. No Reddit login or API key.

- **URL**: https://apify.com/coregent/reddit-leads-purchase-intent-finder.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 qualified leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Reddit Leads / Purchase Intent Finder

![Reddit Leads / Purchase Intent Finder](https://raw.githubusercontent.com/coregentdevspace/reddit-leads-purchase-intent-finder-assets/main/thumbnail-reddit-leads-purchase-intent-finder.png "Reddit Leads / Purchase Intent Finder — Reddit buyers with a 0–100 intent score and the reason behind it")

Find Reddit posts and comments where people are actively looking for products, services, tools,
alternatives or recommendations. Every result gets a 0–100 purchase-intent score **with the reason
behind it**: the buying signals that fired, the exact phrases that fired them, and a point-by-point
breakdown. Competitor switching, budgets and urgency are extracted, vendors and self-promoters are
filtered out, and you get one row per person. No Reddit login, API key or AI cost.

**Not just `score = 87` — why this person is a lead.**

### What it does

- Searches **all of Reddit or the subreddits you choose** for your keywords and your competitors'
  names, within a time window (past hour to all time).
- Scores **posts and their comments**. Many of the best leads are replies in recommendation
  threads — "same here, did you find one?", "we're leaving HubSpot too".
- Detects **18 buying signals** (recommendation requests, looking for a tool or provider, hiring,
  switching, alternatives, competitor replacement, price comparison, budget, deadline, pain with a
  current solution, trial interest, migration, local service needs …) and **8 negative signals**
  (vendor promotion, affiliate links, job seekers, academic surveys, past purchases, no current
  need, people giving advice rather than asking, bots).
- Tiers every result **HOT / WARM / COLD**, extracts **budget** (amount, range, currency, period)
  and **urgency**, and estimates the **buyer-journey stage**.
- Returns **one row per person** (lead mode) with their best post or comment and every other
  qualifying mention — or one row per post/comment (mention mode).
- **Only-new monitoring**: schedule it hourly or daily and get only leads you have not seen.
- Adds each lead's public **karma and account age**.

### Quick start

The minimal run — one keyword, all of Reddit, the past month:

```json
{
    "keywords": ["CRM"],
    "timeRange": "MONTH",
    "maxPostsPerKeyword": 100,
    "scanComments": true,
    "minIntentScore": 50
}
```

Competitor churn — people leaving HubSpot or Salesforce in two communities:

```json
{
    "keywords": ["CRM"],
    "competitors": ["HubSpot", "Salesforce"],
    "subreddits": ["SaaS", "sales"],
    "timeRange": "MONTH",
    "intentTiers": ["HOT", "WARM"],
    "scanComments": true
}
```

Local service leads:

```json
{
    "keywords": ["plumber", "electrician", "builder"],
    "subreddits": ["canberra"],
    "timeRange": "WEEK",
    "scanComments": true,
    "minIntentScore": 60
}
```

Only-new monitoring for a daily schedule:

```json
{
    "keywords": ["website redesign", "web developer"],
    "subreddits": ["smallbusiness", "Entrepreneur"],
    "timeRange": "DAY",
    "scanComments": true,
    "onlyNewLeads": true,
    "monitorKey": "web-agency-leads",
    "intentTiers": ["HOT", "WARM"]
}
```

### FAQ

#### What counts as purchase intent?

Someone who is about to choose, buy, switch, hire, trial or compare. The engine looks for phrase
families such as:

| Signal | Example phrasing |
|---|---|
| `REQUESTING_RECOMMENDATION` | "can anyone recommend", "what CRM should I use", "has anyone used" |
| `ASKING_WHAT_TO_BUY` | "should I buy", "is it worth it?", "what would you buy" |
| `LOOKING_FOR_TOOL` / `LOOKING_FOR_PROVIDER` | "I'm looking for a…", "need a plumber", "is there an app that…" |
| `LOOKING_TO_HIRE` | "looking to hire", "\[Hiring]", "need someone to…" |
| `LOOKING_TO_SWITCH` / `ALTERNATIVE_REQUEST` | "switching from", "alternative to", "need a HubSpot alternative" |
| `COMPETITOR_REPLACEMENT` | one of your competitors named next to a switching word |
| `PRICE_COMPARISON` | "cheaper than", "how much does it cost", "getting quotes" |
| `BUDGET_MENTION` | "budget is $100/month", "under €500", "$2k–3k" |
| `TIME_SENSITIVE` / `PURCHASE_TIMELINE` | "asap", "this week", "by Friday" / "this month", "before launch" |
| `CURRENT_SOLUTION_PROBLEM` / `PAIN_POINT` | "too expensive", "keeps crashing", "frustrated with" |
| `TRIAL_OR_DEMO_INTEREST`, `MIGRATION_INTENT`, `IMPLEMENTATION_INTENT` | "free trial", "migrate our data", "setting up a new…" |
| `LOCAL_SERVICE_NEED` | a provider need tied to a place: "near me", "in Canberra" |
| `CUSTOM_INTENT_PHRASE` | one of your own `intentPhrases` |

Purchase intent is **inferred from public text, not guaranteed**.

#### Do you scan posts and comments?

Yes. Every post found is scored. With `scanComments` on (the default), the comments of threads that
ask, compare, complain or name a competitor are scored too, up to `maxCommentsPerPost` each. A reply
that echoes a buying thread ("same here — did you find one?") inherits that thread's intent. Each
comment row keeps its parent post's title and URL.

#### Can I search all of Reddit? Can I restrict subreddits?

Both. Leave `subreddits` empty to search all of Reddit, or list communities (`SaaS`, `r/SaaS` or the
full URL). With subreddits listed, each keyword is searched in each of them. Turn on
`includeSubredditNewPosts` to also read each community's newest posts — those still have to mention
a keyword or competitor to qualify.

#### Can I track competitors?

Yes — list them in `competitors`. Each is searched by name, and a post or comment that names one
next to a switching word ("leaving", "alternative to", "replacing", "too expensive") is flagged
`COMPETITOR_REPLACEMENT`. Complaints about a named competitor are `CURRENT_SOLUTION_PROBLEM`.

#### How is the intent score calculated?

The strongest buying signal sets a base (15–50 points); a second, different kind of intent, a stated
budget, a deadline, specific requirements, a local need, a named competitor and asking a question
add to it; negative signals subtract. Every lead carries a `scoreBreakdown`, so the arithmetic is
never hidden:

```json
"scoreBreakdown": [
    { "factor": "COMPETITOR_REPLACEMENT", "points": 50 },
    { "factor": "SECOND_INTENT_FAMILY", "points": 10 },
    { "factor": "BUDGET_MENTION", "points": 15 },
    { "factor": "URGENCY_HIGH", "points": 15 },
    { "factor": "COMPETITOR_NAMED", "points": 5 }
]
```

A plain "What CRM should I use?" scores 50. Without any buying signal a result is capped at 25, so a
topic mention with a dollar figure in it never passes as a buyer.

#### What do HOT / WARM / COLD mean?

| Tier | Score | Meaning |
|---|---|---|
| **HOT** | 70–100 | Clear near-term action: a budget, a deadline, actively switching or hiring |
| **WARM** | 50–69 | A real need, request or comparison with less urgency |
| **COLD** | 0–49 | A relevant pain point or topic with little current buying intent |

The default returns HOT and WARM. To receive COLD as well, add it to `intentTiers` **and** lower
`minIntentScore`.

#### Are vendors and self-promoters filtered?

Yes, by default (`excludeVendors`). "We offer", "our product", "DM me", "I built", "check out my",
affiliate and promo codes are detected, and the same promotional text posted by one author in three
or more threads is treated as spam. Replies that **give advice** ("you probably don't need a full
CRM yet", "been using Pipedrive for two years") are scored down, because the buying phrases in them
describe someone else. Founders writing about their own product ("I'm building…", "our free trial",
"paying customers", "day 15 of 30"), launch posts, pilot recruitment, "Top 10 / 6 best" articles and
job-board ads are scored down or filtered too. You can add your own `excludePhrases` and
`excludeAuthors`.

#### Is AI required?

No. Scoring is a transparent rule engine — no LLM call, no AI cost, and the same text always gets
the same score.

#### Can I find only new leads?

Yes: `onlyNewLeads: true`. The Actor remembers what it delivered under your `monitorKey` (a named
key-value store in your account) and skips it next time. Without a `monitorKey`, one is derived from
your keywords, competitors and subreddits.

#### Can the same author appear more than once?

Not in lead mode: mentions are merged by username, the highest-scoring one becomes `bestSource`, and
the rest are listed in `allMatchedSources`. A lead's budget and urgency come from whichever of their
mentions states them. Deleted or anonymous authors are never merged — each of their mentions is its
own row. In mention mode, every qualifying post or comment is its own row. With `onlyNewLeads`, an
author already delivered is not delivered again.

#### Is karma / account age included?

Yes, by default (`includeAuthorProfile`): total, post and comment karma and the account creation
date, looked up only for leads that are delivered. `author.profileStatus` says when a profile could
not be read (`deleted`, `not_found_or_suspended`, `unavailable`). Accounts Reddit marks as automated
are dropped.

#### Is budget extracted?

When it is written down: `budget.text`, `amountMin`, `amountMax`, `currency` and `period` (MONTH,
YEAR, PER_USER …). "I paid $500 last year" is not a budget; "budget is $500" is. Nothing is inferred.

#### Can I schedule hourly or daily runs?

Yes — use an Apify schedule with `timeRange` `HOUR` or `DAY` and `onlyNewLeads` on.

#### How does pricing work?

Pay per result: you are charged once per **qualified result delivered** — one lead in lead mode, one
post or comment in mention mode. Posts and comments that are scanned but do not qualify, vendors,
bots, merged duplicates, leads already delivered to your monitor, profile lookups and failed
searches are never charged. Rows are delivered best-first, so a spending limit keeps the
highest-intent leads. See the **Pricing** tab for the current rate — this README deliberately does
not quote figures.

#### Can I use the API / MCP?

Yes. Run it like any Apify Actor through the API, the JavaScript/Python clients, integrations
(Make, Zapier, n8n) or Apify's MCP server, and read the dataset views below.

### Input reference

| Field | Default | What it does |
|---|---|---|
| `keywords` | `["CRM"]` | What your buyers look for. Required. |
| `competitors` | — | Products whose unhappy users you want to find. |
| `subreddits` | — (all of Reddit) | Communities to search in. |
| `timeRange` | `MONTH` | `HOUR`, `DAY`, `WEEK`, `MONTH`, `YEAR`, `ALL`. |
| `sort` | `NEW` | `NEW`, `RELEVANCE`, `TOP`, `HOT`, `COMMENTS`. |
| `maxPostsPerKeyword` | `100` | Posts scanned per keyword or competitor (per subreddit when listed). |
| `scanComments` | `true` | Score the comments of buying threads. |
| `maxCommentsPerPost` | `50` | Comments scored per thread. |
| `includeSubredditNewPosts` | `false` | Also read each listed subreddit's newest posts. |
| `minIntentScore` | `50` | 0–100. |
| `intentTiers` | `HOT`, `WARM` | Tiers to return. |
| `intentPhrases` | — | Your own buying phrases. |
| `excludePhrases` | — | Drop anything containing these. |
| `excludeAuthors` | — | Usernames to ignore. |
| `excludeVendors` | `true` | Drop self-promotion and affiliate copy. |
| `outputMode` | `LEAD` | `LEAD` (one row per person) or `MENTION` (one row per post/comment). |
| `includeAuthorProfile` | `true` | Karma and account age. |
| `includeReplyAngle` | `false` | A one-line, rule-based suggestion of what a helpful reply would address. |
| `onlyNewLeads` | `false` | Skip what earlier runs delivered. |
| `monitorKey` | derived | Names the memory `onlyNewLeads` uses. |

### Output

#### Leads (default) — one row per person

![Reddit Leads / Purchase Intent Finder — Leads view, table (author, score, tier, why, best source, karma)](https://raw.githubusercontent.com/coregentdevspace/reddit-leads-purchase-intent-finder-assets/main/reddit-leads-purchase-intent-finder-output-leads-table-view.png "Reddit Leads / Purchase Intent Finder — Leads view, table")

A real lead from a `CRM` search in r/SaaS and r/smallbusiness (username anonymised):

```json
{
    "rowType": "lead",
    "author": {
        "username": "example_user_1",
        "profileUrl": "https://www.reddit.com/user/example_user_1/",
        "karma": 66,
        "linkKarma": 56,
        "commentKarma": 10,
        "accountCreatedAt": "2026-06-10T00:00:00.000Z",
        "isVerified": false,
        "profileStatus": "found"
    },
    "intentScore": 85,
    "intentTier": "HOT",
    "intentSignals": [
        "REQUESTING_RECOMMENDATION",
        "LOOKING_FOR_TOOL",
        "ALTERNATIVE_REQUEST",
        "TIME_SENSITIVE"
    ],
    "matchedKeywords": [
        "CRM"
    ],
    "matchedCompetitors": [],
    "matchedPhrases": [
        "any suggestion",
        "i need a",
        "any good wiza alternatives",
        "right now"
    ],
    "budget": {
        "mentioned": false,
        "text": null,
        "amountMin": null,
        "amountMax": null,
        "currency": null,
        "period": null
    },
    "urgency": "HIGH",
    "buyerJourneyStage": "PURCHASE_READY",
    "leadReason": "Asking for an alternative and asking for recommendations; gives a near-term timeline (\"right now\").",
    "replyAngle": null,
    "scoreBreakdown": [
        {
            "factor": "REQUESTING_RECOMMENDATION",
            "points": 45
        },
        {
            "factor": "SECOND_INTENT_FAMILY",
            "points": 20
        },
        {
            "factor": "URGENCY_HIGH",
            "points": 15
        },
        {
            "factor": "QUESTION",
            "points": 5
        }
    ],
    "bestSource": {
        "type": "POST",
        "id": "t3_1x512b2",
        "postId": "1x512b2",
        "commentId": null,
        "subreddit": "SaaS",
        "title": "Any good wiza alternatives? I don't really like the credit system",
        "text": "We're using wiza for outbound at an industrial maintenance SaaS right now, it's the usual thing like we go after plant and ops people in the UK, Germany and sometimes Italy.\n\nI have no problem with the linkedin side but my outbound volume is all over the place (it's an internal issue ik)\n\nBecause sometimes we're running a new territory campaign and everything's on fire, then other months goes quiet and all the credits we didnt use are wasted. And I am not liking the fact that I need to pay overages again next month for the next campaign\n\nI also got a bunch of older CRM lists where I need a decent direct mobile and work email so I really don't wanna pay for some huge unlimited plan.\n\nSo do you guys have any suggestion that works better for our case?",
        "textAvailable": true,
        "url": "https://www.reddit.com/r/SaaS/comments/1x512b2/any_good_wiza_alternatives_i_dont_really_like_the/",
        "postUrl": "https://www.reddit.com/r/SaaS/comments/1x512b2/any_good_wiza_alternatives_i_dont_really_like_the/",
        "publishedAt": "2026-10-13T16:18:49.080Z",
        "score": 1,
        "commentsCount": 8,
        "intentScore": 85,
        "intentTier": "HOT",
        "intentSignals": [
            "REQUESTING_RECOMMENDATION",
            "LOOKING_FOR_TOOL",
            "ALTERNATIVE_REQUEST",
            "TIME_SENSITIVE"
        ]
    },
    "mentionCount": 1,
    "subreddits": [
        "SaaS"
    ],
    "allMatchedSources": [
        {
            "type": "POST",
            "id": "t3_1x512b2",
            "postId": "1x512b2",
            "commentId": null,
            "subreddit": "SaaS",
            "title": "Any good wiza alternatives? I don't really like the credit system",
            "text": "We're using wiza for outbound at an industrial maintenance SaaS right now, it's the usual thing like we go after plant and ops people in the UK, Germany and sometimes Italy. I have no problem with the linkedin side but my outbound volume is all over the place (it's an internal issue ik) Because…",
            "textAvailable": true,
            "url": "https://www.reddit.com/r/SaaS/comments/1x512b2/any_good_wiza_alternatives_i_dont_really_like_the/",
            "postUrl": "https://www.reddit.com/r/SaaS/comments/1x512b2/any_good_wiza_alternatives_i_dont_really_like_the/",
            "publishedAt": "2026-10-13T16:18:49.080Z",
            "score": 1,
            "intentScore": 85,
            "intentTier": "HOT",
            "intentSignals": [
                "REQUESTING_RECOMMENDATION",
                "LOOKING_FOR_TOOL",
                "ALTERNATIVE_REQUEST",
                "TIME_SENSITIVE"
            ]
        }
    ],
    "searchQueries": [
        "CRM in r/SaaS"
    ],
    "firstSeenAt": "2026-10-14T13:50:46.769Z",
    "scrapedAt": "2026-10-14T13:54:19.863Z",
    "capturedSequence": 1
}
```

#### Mentions — one row per qualifying post or comment

`outputMode: "MENTION"` returns every qualifying post or comment as its own row, with the post's
title and URL on comment rows. A post from the same run, laid out as a mention row (username
anonymised):

```json
{
    "rowType": "mention",
    "sourceType": "POST",
    "sourceId": "t3_1wusags",
    "postId": "1wusags",
    "commentId": null,
    "subreddit": "SaaS",
    "author": {
        "username": "example_user_2",
        "profileUrl": "https://www.reddit.com/user/example_user_2/",
        "karma": 3907,
        "linkKarma": 1684,
        "commentKarma": 2223,
        "accountCreatedAt": "2020-07-14T00:00:00.000Z",
        "isVerified": false,
        "profileStatus": "found"
    },
    "title": "What CRM are you using to manage customers?",
    "text": "I'm at the point where I need some kind of CRM/customer management system, but I'm not sure if I should use an existing tool or build something myself.\n\nMy current setup is pretty simple: React + Convex. I don't have 3rd party analytics on the dashboard right now, so I don't really have detailed user segmentation or a proper view of what each customer is doing and i like to keep it that way for privacy reasons.\n\nWhat I'd ideally like to manage from one place:\n\n* Customer communication\n* Support tickets\n* Abuse reports / account issues\n* Custom offers for specific users or groups\n\nI'm not looking for a full-blown sales CRM. Most of my needs are around managing existing SaaS users and communicating with them.\n\nHas anyone else had a similar setup? Is there an off-the-shelf tool that works well for this, or would it make more sense to build a simple internal dashboard on top of Convex and connect separate tools for email/support?",
    "textAvailable": true,
    "url": "https://www.reddit.com/r/SaaS/comments/1wusags/what_crm_are_you_using_to_manage_customers/",
    "postUrl": "https://www.reddit.com/r/SaaS/comments/1wusags/what_crm_are_you_using_to_manage_customers/",
    "publishedAt": "2026-10-01T06:38:42.263Z",
    "score": 4,
    "commentsCount": 11,
    "intentScore": 60,
    "intentTier": "WARM",
    "intentSignals": [
        "LOOKING_FOR_TOOL",
        "TIME_SENSITIVE"
    ],
    "matchedKeywords": [
        "CRM"
    ],
    "matchedCompetitors": [],
    "matchedPhrases": [
        "looking for a",
        "right now"
    ],
    "budget": {
        "mentioned": false,
        "text": null,
        "amountMin": null,
        "amountMax": null,
        "currency": null,
        "period": null
    },
    "urgency": "HIGH",
    "buyerJourneyStage": "PURCHASE_READY",
    "leadReason": "Looking for a product or tool; gives a near-term timeline (\"right now\").",
    "replyAngle": null,
    "scoreBreakdown": [
        {
            "factor": "LOOKING_FOR_TOOL",
            "points": 40
        },
        {
            "factor": "URGENCY_HIGH",
            "points": 15
        },
        {
            "factor": "QUESTION",
            "points": 5
        }
    ],
    "searchQueries": [
        "CRM in r/SaaS"
    ],
    "firstSeenAt": "2026-10-14T13:50:46.769Z",
    "scrapedAt": "2026-10-14T13:54:19.953Z"
}
```

#### Why each score — the explainability view

Signals, the phrases that fired them and the points each one added — the breakdown always sums to
the score (username anonymised):

```json
{
    "rowType": "lead",
    "author": {
        "username": "example_user_3"
    },
    "intentScore": 80,
    "intentTier": "HOT",
    "intentSignals": [
        "REQUESTING_RECOMMENDATION",
        "LOOKING_FOR_TOOL",
        "LOOKING_TO_SWITCH",
        "CURRENT_SOLUTION_PROBLEM"
    ],
    "matchedPhrases": [
        "would you recommend",
        "i need some",
        "leaving my",
        "pain in the",
        "compatible with"
    ],
    "scoreBreakdown": [
        {
            "factor": "REQUESTING_RECOMMENDATION",
            "points": 45
        },
        {
            "factor": "SECOND_INTENT_FAMILY",
            "points": 20
        },
        {
            "factor": "SPECIFIC_REQUIREMENTS",
            "points": 10
        },
        {
            "factor": "QUESTION",
            "points": 5
        }
    ],
    "budget": {
        "mentioned": false,
        "text": null,
        "amountMin": null,
        "amountMax": null,
        "currency": null,
        "period": null
    },
    "urgency": "UNKNOWN",
    "buyerJourneyStage": "COMPARISON",
    "leadReason": "Planning to switch away from a current solution and asking for recommendations.",
    "searchQueries": [
        "CRM in r/smallbusiness"
    ]
}
```

`null` means "not available", never "no": an author whose profile could not be read has `karma: null`.
`textAvailable: false` marks a post whose body could not be read (only its title was scored).

#### Dataset views and run records

| View / record | What it shows |
|---|---|
| **Leads** | Author, score, tier, why, best source, karma — the lead-mode table |
| **Mentions** | One row per post or comment — the mention-mode table |
| **Why each score** | Signals, matched phrases and the score breakdown |
| `RUN_SUMMARY` | Posts and comments scanned, candidates per tier, vendors filtered, authors merged, leads saved, what each delivered lead cost to find |
| `SOURCE_SUMMARY` | Each search's status: `SUCCESS`, `NO_RESULTS`, `INVALID_KEYWORD`, `INVALID_SUBREDDIT`, `SUBREDDIT_NOT_FOUND`, `RATE_LIMITED`, `BLOCKED`, `PARTIAL_RESULT`, `TEMPORARY_REDDIT_ERROR` |

One failed keyword or subreddit never fails the run; it is reported there.

### Limitations

- **Search depth is bounded.** Reddit's search returns roughly 250 results per query, sort and time
  window. To go deeper, narrow the window or add subreddits.
- **Results vary by sort and time window**, as they do on Reddit itself.
- **Comments are capped** per thread, and only the comments Reddit shows first (by its "best" ranking)
  are read; comment scanning covers threads that mention one of your keywords or competitors and
  ask, compare, complain or name a competitor.
- **Keyword matching is literal**, not topical: a post that mentions your keyword in passing ("a PC
  for work, CRM apps and gaming") can qualify if it shows buying intent of another kind.
- **Long runs stop early to deliver.** Shortly before the run's timeout, searching stops and the
  leads found so far are delivered (the status message says so). Raise the timeout to search further.
  Leads are delivered at the end of a run, so aborting a run part-way can leave it with none.
- **Deleted, removed and private content is unavailable.**
- **Coverage is not exhaustive** — this finds people who are visibly asking, not every buyer on
  Reddit. Rule-based scoring is transparent but not perfect: read the `leadReason` and the source.
- When a post's body cannot be read, it is scored on its title alone (`textAvailable: false`).

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy (the default) or **no proxy** — both work for Reddit search and
comment pages at this Actor's conservative request rate.

**Apify Residential proxy is not supported.** The Actor fails at startup if `apifyProxyGroups`
includes `RESIDENTIAL`. Reason: on pay-per-result Actors residential bandwidth is billed to the
developer, not the run, and Reddit comment pages are large, while Reddit serves the same pages to
datacenter addresses.

If you genuinely need residential routing, supply your own provider through the proxy editor's
**Custom proxy URLs** field — that traffic goes through your provider, not Apify:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

### Responsible use

This is an unofficial tool and is not affiliated with Reddit. It reads **public** posts and comments
only, with no login.

- Purchase intent is inferred, not guaranteed.
- You are responsible for lawful and respectful outreach. Reddit users may not expect unsolicited
  commercial contact — follow each subreddit's rules and Reddit's terms.
- Do not use the output for harassment or spam.

The Actor never sends messages or posts replies, never looks for private contact details, and never
infers sensitive attributes. `replyAngle` is a prompt for a human, not a message to send.

### Related Actors

- [Reddit Posts & Search Scraper](https://apify.com/coregent/reddit-posts-search-scraper) — every post for a search or subreddit, not just the leads
- [Reddit Comments Scraper](https://apify.com/coregent/reddit-comments-scraper) — whole comment threads
- [Reddit User Scraper](https://apify.com/coregent/reddit-user-scraper) — full public profiles and activity

### Changelog

- **1.0** — first release: posts + comments, 18 buying signals and 8 negative signals with score
  breakdowns, HOT/WARM/COLD tiers, budget and urgency extraction, vendor and advice filtering, lead
  and mention modes, only-new monitoring, author karma and account age.

# Actor input Schema

## `keywords` (type: `array`):

What your buyers are looking for — a product category, a service, a problem. One per line, e.g. CRM, plumber, website builder, accounting software. Each keyword is searched across Reddit (or in each subreddit below), and every post and comment found is scored for purchase intent.

## `competitors` (type: `array`):

Products or companies whose unhappy users you want to find, e.g. HubSpot, Salesforce, Monday.com. Each is searched by name; posts and comments asking for an alternative, switching away, or complaining about one are flagged COMPETITOR_REPLACEMENT / ALTERNATIVE_REQUEST / CURRENT_SOLUTION_PROBLEM.

## `subreddits` (type: `array`):

Restrict the search to these communities. SaaS, r/SaaS and https://www.reddit.com/r/SaaS/ all work. Leave empty to search all of Reddit.

## `timeRange` (type: `string`):

Only posts from this window. Use DAY or HOUR for scheduled monitoring.

## `sort` (type: `string`):

Reddit's search ordering. NEW finds the freshest leads; RELEVANCE and TOP find the strongest matches across the whole window.

## `maxPostsPerKeyword` (type: `integer`):

How many posts to scan for each keyword and competitor — per subreddit when subreddits are listed. Reddit's search itself stops at roughly 250 results per query, sort and time window.

## `scanComments` (type: `boolean`):

Also score the comments of threads where people ask, compare, complain or name a competitor. Many of the best leads are replies — "same here, did you find one?" or "we're switching too".

## `maxCommentsPerPost` (type: `integer`):

How many of each thread's top comments to score (replies included). 25–50 covers the comments most people read.

## `includeSubredditNewPosts` (type: `boolean`):

Besides the keyword searches, read the newest posts of every listed subreddit. They still have to mention a keyword or competitor to qualify. Useful for small communities where search misses fresh posts.

## `minIntentScore` (type: `integer`):

0–100. A plain "What CRM should I use?" scores 50; adding a budget, a deadline or a competitor to leave pushes it toward 100. Each lead's scoreBreakdown shows exactly where its points came from.

## `intentTiers` (type: `array`):

HOT (70+): clear near-term action — a budget, a deadline, actively switching or hiring. WARM (50–69): a real need or comparison with less urgency. COLD (below 50): a relevant pain point with little current buying intent — also lower the minimum score to receive these.

## `intentPhrases` (type: `array`):

Your own buying phrases, matched as whole words, e.g. "need a quote", "shortlisting vendors". A match adds the CUSTOM_INTENT_PHRASE signal.

## `excludePhrases` (type: `array`):

Drop any post or comment containing one of these, e.g. "I sell", "my agency", "affiliate", "discount code".

## `excludeAuthors` (type: `array`):

Reddit usernames to ignore — your own account, competitor staff, known bots. u/name or name.

## `excludeVendors` (type: `boolean`):

Drop posts and comments that promote a product or service ("we offer", "DM me", "I built", affiliate and promo codes). Counted in the run summary as vendorsFiltered.

## `outputMode` (type: `string`):

LEAD: one row per Reddit user, with their highest-intent post or comment as bestSource and every other qualifying mention in allMatchedSources. MENTION: one row per qualifying post or comment.

## `includeAuthorProfile` (type: `boolean`):

Look up each delivered lead's public karma and account creation date. Never charged separately. Accounts Reddit marks as automated are dropped.

## `includeReplyAngle` (type: `boolean`):

Add a one-line, rule-based suggestion of what a helpful reply would address (their competitor, budget or deadline). A prompt for a human, never an automated message.

## `onlyNewLeads` (type: `boolean`):

Remember what earlier runs delivered and skip it: an author already delivered is not delivered again (LEAD), a post or comment already delivered is not delivered again (MENTION). For scheduled hourly or daily runs.

## `monitorKey` (type: `string`):

A name for the memory 'Only new leads' uses, e.g. web-agency-leads. Runs with the same key share it. Leave empty to derive one from your keywords, competitors and subreddits.

## `maxConcurrency` (type: `integer`):

How many searches and threads are read at once (1–5). Reddit's own rate limits are respected per connection.

## `debugMode` (type: `boolean`):

Write every scored post and comment — kept or dropped, with its signals — to the key-value store record DEBUG_MENTIONS.

## `proxyConfiguration` (type: `object`):

Apify Datacenter proxy (the default) or no proxy both work. Apify RESIDENTIAL proxy is refused and fails the run at startup: Reddit pages are large and residential bandwidth is billed to the Actor, while Reddit serves the same data to datacenter addresses. To route through your own residential provider, use Custom proxy URLs — that traffic goes through your account and is honoured.

## Actor input object example

```json
{
  "keywords": [
    "CRM"
  ],
  "competitors": [],
  "subreddits": [
    "smallbusiness",
    "SaaS"
  ],
  "timeRange": "MONTH",
  "sort": "NEW",
  "maxPostsPerKeyword": 100,
  "scanComments": true,
  "maxCommentsPerPost": 50,
  "includeSubredditNewPosts": false,
  "minIntentScore": 50,
  "intentTiers": [
    "HOT",
    "WARM"
  ],
  "intentPhrases": [],
  "excludePhrases": [],
  "excludeAuthors": [],
  "excludeVendors": true,
  "outputMode": "LEAD",
  "includeAuthorProfile": true,
  "includeReplyAngle": false,
  "onlyNewLeads": false,
  "maxConcurrency": 3,
  "debugMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per Reddit user with purchase intent, best source first.

## `mentions` (type: `string`):

One row per qualifying post or comment (MENTION mode).

## `explainability` (type: `string`):

Signals, matched phrases and the point-by-point score breakdown.

## `runSummary` (type: `string`):

Posts and comments scanned, tier counts, vendors filtered, authors merged, cost per lead.

## `sourceSummary` (type: `string`):

Status of every keyword and subreddit search (SUCCESS, NO_RESULTS, BLOCKED …).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "CRM"
    ],
    "subreddits": [
        "smallbusiness",
        "SaaS"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/reddit-leads-purchase-intent-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["CRM"],
    "subreddits": [
        "smallbusiness",
        "SaaS",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/reddit-leads-purchase-intent-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "CRM"
  ],
  "subreddits": [
    "smallbusiness",
    "SaaS"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/reddit-leads-purchase-intent-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coregent/reddit-leads-purchase-intent-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/siP8Hjzn5TgHdcG0p/builds/2g15JxC566AW698J4/openapi.json
