# Reddit Lead And Intent Finder (`b2b_leads/reddit-lead-and-intent-finder`) Actor

Find warm B2B leads on Reddit the moment they show buying or help intent. Scans posts & comments for phrases like "best CRM for…" or "alternative to…", matches your keywords, and scores each lead 0–100. No API key, no browser. Push to CRM, Slack, or Sheets.

- **URL**: https://apify.com/b2b\_leads/reddit-lead-and-intent-finder.md
- **Developed by:** [Chidubem Aneke](https://apify.com/b2b_leads) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Reddit Lead & Intent Finder — Turn Reddit Into a Warm Lead Pipeline

**Find people on Reddit who are actively asking to buy, switch, or get help — right now.** This Actor scans posts and comments for real **buying and help intent** ("looking for a tool that…", "recommend an alternative to X", "anyone know how to…", "frustrated with Y", "best CRM for startups") and hands you a clean, **scored list of warm leads** — the person, what they said, the matched intent, and a **0–100 relevance score**.

**Stop scrolling Reddit manually.** Give it your product keywords and a few subreddits (or search queries), click **Start**, and pipe fresh, qualified leads straight to your **CRM, Slack, Google Sheets, Zapier, or Make** — no setup, no browser, with optional built-in proxy support.

> ⚡ **Built for speed & cost.** A lightweight lead engine — runs fast, uses as little as **256–512 MB RAM**, and costs a fraction of heavy browser-based tools.

***

### Why this Actor

- **🔥 Real intent, not noise** — five tunable intent categories (recommendation, alternative-seeking, problem/help, pain points, buying signals) plus your own custom phrases and regex.
- **🎯 On-topic by default** — a lead must mention your product/topic **and** show intent, so you get prospects, not chatter.
- **📊 Scored & ranked** — every lead gets a **0–100 relevance score** with a transparent breakdown (intent, topic, recency, engagement). Filter with `minRelevance`.
- **🧹 Bot & throwaway filtering** — optional author enrichment (karma, account age, verified) with `minKarma` / `minAccountAgeDays` gates.
- **🔁 Incremental by design** — scheduled runs remember what they've seen and emit **only new leads**.
- **🔔 Instant delivery** — push each new lead to a **webhook** in JSON or **Slack** format.
- **✅ Works out of the box** — no Reddit developer account or API setup required.
- **🤖 MCP-friendly** — documented input/output schemas and copy-paste JSON for Apify MCP & LLM agents.

***

### Who is this for?

| You are… | You get… |
|----------|----------|
| **B2B / SaaS founder** | People openly shopping for (or complaining about) tools like yours |
| **Growth / demand-gen team** | A steady feed of warm, intent-scored prospects to reach out to |
| **Agency / lead-gen shop** | Repeatable lead pipelines per client, delivered to their CRM |
| **Social seller** | Real conversations to join — with the exact quote and a direct link |
| **Competitor conquesting** | Catch "alternative to \<competitor>" and "switching from \<competitor>" the moment they post |
| **Community / support team** | Spot frustrated users and unanswered questions to help first |

***

### How it works (3 steps)

1. **Tell it what you sell** — add `topicKeywords` (your category + competitor names).
2. **Pick where to look** — `searchQueries` for Reddit search, and/or `subreddits` to scan recent posts & comments. Choose `mode: "both"` to do both.
3. **Get scored leads** — each matching post/comment becomes a lead row with the matched intent phrase, intent category, topic keywords, a snippet, and a relevance score. Optionally stream them to a webhook.

***

### Intent categories

Toggle any of these built-in presets (or use all), and add your own phrases on top:

| Category | Signals it catches (examples) |
|----------|-------------------------------|
| `seeking_recommendation` | "recommend", "any suggestions", "what should I use", "looking for a", "best … for" |
| `alternative_seeking` | "alternative to", "switching from", "instead of", "replacement for", "vs" |
| `problem_help` | "how do I", "anyone know", "need help", "struggling with", "can't figure out" |
| `pain_point` | "frustrated with", "hate that", "too expensive", "wish there was" |
| `buying_intent` | "ready to buy", "budget for", "pricing", "worth it", "free trial" |

Add `customIntentPhrases`, choose `matchMode` (`substring`, `word`, or `regex`), and toggle `caseSensitive` for full control.

***

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `topicKeywords` | string\[] | – | Product/category/competitor terms a lead must mention. **Recommended.** |
| `searchQueries` | string\[] | – | Queries for search mode. |
| `subreddits` | string\[] | – | Subreddits to scan / scope search. Use `["all"]` to search across **all of Reddit** instead of specific communities. |
| `mode` | string | `both` | `search`, `scan`, or `both`. |
| `stream` | string | `posts` | `posts`, `comments`, or `both` (scan mode). |
| `intentPresets` | string\[] | all | Which built-in intent categories to use. |
| `customIntentPhrases` | string\[] | `[]` | Extra intent phrases / regex. |
| `matchMode` | string | `substring` | `substring`, `word`, or `regex`. |
| `caseSensitive` | boolean | `false` | Case-sensitive phrase matching. |
| `requireTopicMatch` | boolean | `true` | Require a topic keyword **and** an intent phrase. |
| `ignoreKeywords` | string\[] | `[]` | Skip content containing these words. |
| `searchSort` | string | `relevance` | `relevance`, `hot`, `top`, `new`, `comments`. |
| `searchTime` | string | `all` | `hour`, `day`, `week`, `month`, `year`, `all`. |
| `resultsPerQuery` | integer | `50` | Search results to examine per query (1–1000). |
| `lookback` | integer | `50` | Recent posts/comments to scan per subreddit (1–1000). |
| `enrichAuthor` | boolean | `false` | Fetch author karma/age/verified. |
| `minAccountAgeDays` | integer | `0` | Drop authors newer than this (auto-enriches). |
| `minKarma` | integer | `0` | Drop authors below this total karma (auto-enriches). |
| `minRelevance` | integer | `0` | Only keep leads scoring at/above this (0–100). Guide: `0` = all matches, `40–55` = balanced, `60–75` = strong leads, `80+` = strictest. |
| `minScore` | integer | `0` | Minimum net upvotes (upvotes − downvotes). `0` keeps fresh leads; raise to 5–20 for more-validated threads. |
| `includeNsfw` | boolean | `false` | Include NSFW posts. |
| `excludeLockedOrRemoved` | boolean | `true` | Skip locked/removed content. |
| `authorAllowlist` | string\[] | `[]` | Only these usernames. |
| `authorDenylist` | string\[] | `[]` | Never these usernames. |
| `sinceId` | string | `""` | Only leads newer than this Reddit fullname. |
| `maxLeads` | integer | `0` | Stop after N leads (0 = unlimited). |
| `webhookUrl` | string | `""` | POST each new lead here **in addition to** saving it to the dataset. |
| `webhookFormat` | string | `json` | `json` or `slack`. |
| `includeRaw` | boolean | `false` | Attach the full raw object. |
| `proxyConfiguration` | object | Apify Proxy (US Residential) | Connection settings. |

***

### Output

One row per lead, tagged `featureType: "lead"`:

| Field | Description |
|-------|-------------|
| `leadType` | `post` or `comment` |
| `discoveryMode` | `search` or `scan` |
| `subreddit`, `author`, `authorFullname` | Where and who |
| `title`, `body`, `url`, `permalink`, `postUrl` | The content + direct outreach link |
| `score`, `numComments`, `createdAtISO` | Engagement & recency |
| `matchedIntentCategory` | Primary intent category |
| `matchedIntentCategories`, `matchedIntentPhrases` | All matched categories & phrases |
| `matchedTopicKeywords` | Topic keywords that matched |
| `matchedSnippet`, `matchedIn` | Snippet around the match + where it matched |
| `relevanceScore` | 0–100 overall score |
| `scoreBreakdown` | `{ intent, topic, recency, engagement }` |
| `authorProfile` | Karma, account age, verified (when enrichment is on) |

#### Dataset views

- **Overview** — score, intent, author, title, snippet, link.
- **Leads** — full detail with intent phrases, topics, and score breakdown.
- **Post leads** — leads sourced from posts.
- **Comment leads** — leads sourced from comments.

#### Example lead

```json
{
  "featureType": "lead",
  "leadType": "post",
  "discoveryMode": "scan",
  "subreddit": "smallbusiness",
  "author": "growthhacker22",
  "title": "HubSpot is too expensive for a 5-person team — alternatives?",
  "matchedIntentCategory": "alternative_seeking",
  "matchedIntentPhrases": ["alternative to", "too expensive"],
  "matchedTopicKeywords": ["hubspot", "CRM"],
  "matchedSnippet": "…HubSpot is too expensive, looking for an alternative to it for our small team CRM…",
  "matchedIn": "title+body",
  "relevanceScore": 84,
  "scoreBreakdown": { "intent": 34, "topic": 20, "recency": 20, "engagement": 10 },
  "postUrl": "https://www.reddit.com/r/smallbusiness/comments/abc123/..."
}
```

***

### Run it via API / MCP

Example input payload for the Apify API, SDK, or an MCP/LLM agent:

```json
{
  "topicKeywords": ["CRM", "hubspot", "salesforce"],
  "searchQueries": ["best CRM for startups", "hubspot alternative"],
  "subreddits": ["smallbusiness", "sales", "Entrepreneur"],
  "mode": "both",
  "stream": "both",
  "intentPresets": ["seeking_recommendation", "alternative_seeking", "pain_point", "buying_intent"],
  "requireTopicMatch": true,
  "minRelevance": 55,
  "enrichAuthor": true,
  "minAccountAgeDays": 30,
  "maxLeads": 200,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ",
  "webhookFormat": "slack"
}
```

Start a run with the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~reddit-lead-and-intent-finder/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "topicKeywords": ["CRM","hubspot"], "subreddits": ["smallbusiness"], "mode": "scan" }'
```

***

### Scheduling, webhooks & CRM/Slack

- **Leads always land in the dataset.** The webhook is an *additional* real-time push — every lead is saved to the run's dataset regardless, so nothing is lost and your run always produces output.
- **Schedule** the Actor (e.g. every 15–60 minutes) from the Apify console. Thanks to the built-in incremental cursor, each run returns **only new leads** — no duplicates.
- **Slack:** set `webhookFormat: "slack"` and paste a Slack **Incoming Webhook** URL into `webhookUrl` to get a formatted alert per lead.
- **CRM / Sheets / Zapier / Make:** set `webhookFormat: "json"` and point `webhookUrl` at your endpoint or automation to create a contact/row per lead.
- **Bulk export:** download the dataset as JSON, CSV, or Excel, or pull it from the dataset API.

***

### FAQ

**Do I need any setup or API keys?**
No. It works out of the box — just add your keywords and subreddits, then click Start.

**How does the relevance score work?**
It blends four signals — intent strength, topic keyword hits, recency, and engagement — into a single 0–100 score, with a per-lead `scoreBreakdown` so you can see why.

**How do I only get leads about my product?**
Keep `requireTopicMatch: true` (the default) and set `topicKeywords` to your category and competitor names. A lead must then match a topic **and** an intent phrase.

**Will scheduled runs give me duplicates?**
No. The Actor persists a per-source cursor and only emits leads newer than the last run. You can also pass `sinceId` for a manual floor.

**Can I search comments?**
Comment leads come from **scan mode** (`stream: "comments"` or `"both"`). Search mode returns post leads.

**How do I filter out bots and throwaway accounts?**
Enable `enrichAuthor` and set `minKarma` and/or `minAccountAgeDays`.

**Why use a proxy?**
Optional but recommended for the most reliable results on scheduled runs. The default Apify Proxy (US Residential) works well for most users.

***

### Need something custom? Let's build it

Beyond this Actor, I take on **custom projects** — and I'd love to help with yours:

- 🕷️ **Custom scrapers & data pipelines** — any website or platform, any scale, delivered as a ready-to-run Apify Actor, API, or scheduled data feed.
- 🌐 **Web apps of any kind** — dashboards, internal tools, SaaS products, landing pages, automations, and full-stack builds.
- 🔗 **Integrations & automation** — connect your data to CRMs, Slack, Google Sheets, Zapier/Make, or your own backend.

If you need a bespoke scraping solution, a web app, or an integration built end to end, get in touch and let's make it happen.

- **📧 Email:** <dubem115@gmail.com>
- **💻 GitHub:** [github.com/DrunkCodes](https://github.com/DrunkCodes)

# Actor input Schema

## `topicKeywords` (type: `array`):

Product category, competitor names, or topics a lead must mention (e.g. "CRM", "hubspot", "project management"). By default a lead must match a topic keyword AND an intent phrase. Highly recommended.

## `searchQueries` (type: `array`):

Queries to run through Reddit search when using search mode (site-wide or scoped to the subreddits below). Example: "best CRM for startups", "hubspot alternative".

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

Subreddits to scan for recent posts/comments (scan mode) and to scope search queries. To search across ALL of Reddit instead of specific communities, add a single entry: all. Otherwise list one or more subreddit names or URLs (e.g. smallbusiness, r/sales).

## `mode` (type: `string`):

search = run your queries through Reddit search; scan = pull recent posts/comments from subreddits; both = do both.

## `stream` (type: `string`):

Which content to analyse in scan mode. Search mode always returns posts.

## `intentPresets` (type: `array`):

Built-in intent categories to detect. Leave empty to use all of them.

## `customIntentPhrases` (type: `array`):

Extra phrases (or regex when match mode is regex) that signal intent, added on top of the selected presets.

## `matchMode` (type: `string`):

substring = phrase appears anywhere; word = whole-word match; regex = treat every phrase as a regular expression.

## `caseSensitive` (type: `boolean`):

Match intent phrases and custom patterns case-sensitively. Off by default.

## `requireTopicMatch` (type: `boolean`):

When on, a lead must match at least one topic keyword AND an intent phrase. Turn off to return any intent match.

## `ignoreKeywords` (type: `array`):

Skip any post/comment that contains one of these words (e.g. giveaway, hiring, meme).

## `searchSort` (type: `string`):

Sort order for Reddit search results (search mode).

## `searchTime` (type: `string`):

Time filter for search results (applies to relevance/top sorts).

## `resultsPerQuery` (type: `integer`):

How many search results to examine per query (1–1000). Pages in batches of 100.

## `lookback` (type: `integer`):

How many recent posts/comments to scan per subreddit in scan mode (1–1000). Pages in batches of 100.

## `enrichAuthor` (type: `boolean`):

Fetch each lead author's karma, account age, and verified status. Also enables bot/throwaway filtering.

## `minAccountAgeDays` (type: `integer`):

Drop leads whose author account is younger than this many days. 0 = no minimum. Requires author enrichment (auto-enabled when set).

## `minKarma` (type: `integer`):

Drop leads whose author has less than this total karma. 0 = no minimum. Requires author enrichment (auto-enabled when set).

## `minRelevance` (type: `integer`):

Only return leads scoring at or above this value (0–100). Each lead's relevance score blends four signals: how strong the intent is, how many of your topic keywords it matches, how recent it is, and how much engagement (upvotes) it has — see scoreBreakdown on every lead. Guide: 0 = keep all matches (most volume); 40–55 = balanced quality (good default); 60–75 = only strong, on-topic, high-intent leads; 80+ = very strict, fewer but hottest leads.

## `minScore` (type: `integer`):

Only keep posts/comments with at least this many net upvotes (upvotes minus downvotes — the number shown on Reddit). 0 = keep everything (recommended for finding fresh leads, since brand-new posts usually sit at 1). Set to 5–20 to focus on threads that already have some visibility/validation. Higher values can hide new leads.

## `includeNsfw` (type: `boolean`):

Include posts marked over\_18 (NSFW). Off by default.

## `excludeLockedOrRemoved` (type: `boolean`):

Skip locked or removed posts (and stickied comments) since you can't reply to them.

## `authorAllowlist` (type: `array`):

If set, only return leads from these usernames.

## `authorDenylist` (type: `array`):

Never return leads from these usernames.

## `sinceId` (type: `string`):

Optional Reddit fullname (e.g. t3\_abc123). Only return leads newer than this ID. Scheduled runs also persist a per-source cursor automatically.

## `maxLeads` (type: `integer`):

Stop after this many leads. 0 = unlimited.

## `webhookUrl` (type: `string`):

Optional. Every lead is always saved to the run's dataset — this webhook is an ADDITIONAL real-time push. When set, each new lead is also POSTed to this URL (CRM, Slack incoming webhook, Zapier, Make, Google Sheets).

## `webhookFormat` (type: `string`):

json = full lead object; slack = Slack-friendly message payload.

## `includeRaw` (type: `boolean`):

Attach the full raw Reddit object under the raw field (larger output).

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

Use Apify Proxy with US Residential for best results. Leave the default unless you know you need something else.

## Actor input object example

```json
{
  "topicKeywords": [
    "CRM",
    "hubspot"
  ],
  "searchQueries": [
    "best CRM for startups",
    "hubspot alternative"
  ],
  "subreddits": [
    "smallbusiness",
    "sales"
  ],
  "mode": "both",
  "stream": "posts",
  "intentPresets": [
    "seeking_recommendation",
    "alternative_seeking",
    "problem_help",
    "pain_point",
    "buying_intent"
  ],
  "customIntentPhrases": [],
  "matchMode": "substring",
  "caseSensitive": false,
  "requireTopicMatch": true,
  "ignoreKeywords": [],
  "searchSort": "relevance",
  "searchTime": "all",
  "resultsPerQuery": 50,
  "lookback": 50,
  "enrichAuthor": false,
  "minAccountAgeDays": 0,
  "minKarma": 0,
  "minRelevance": 0,
  "minScore": 0,
  "includeNsfw": false,
  "excludeLockedOrRemoved": true,
  "authorAllowlist": [],
  "authorDenylist": [],
  "sinceId": "",
  "maxLeads": 0,
  "webhookUrl": "",
  "webhookFormat": "json",
  "includeRaw": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Complete dataset with every field for each lead.

## `overview` (type: `string`):

Compact table — score, intent, subreddit, author, title, snippet, and link.

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

Full lead detail including intent phrases, topics, and score breakdown.

## `posts` (type: `string`):

Leads sourced from posts.

## `comments` (type: `string`):

Leads sourced from comments.

# 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 = {
    "topicKeywords": [
        "CRM",
        "hubspot"
    ],
    "searchQueries": [
        "best CRM for startups",
        "hubspot alternative"
    ],
    "subreddits": [
        "smallbusiness",
        "sales"
    ],
    "intentPresets": [
        "seeking_recommendation",
        "alternative_seeking",
        "problem_help",
        "pain_point",
        "buying_intent"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/reddit-lead-and-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 = {
    "topicKeywords": [
        "CRM",
        "hubspot",
    ],
    "searchQueries": [
        "best CRM for startups",
        "hubspot alternative",
    ],
    "subreddits": [
        "smallbusiness",
        "sales",
    ],
    "intentPresets": [
        "seeking_recommendation",
        "alternative_seeking",
        "problem_help",
        "pain_point",
        "buying_intent",
    ],
}

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

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

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

```

## CLI example

```bash
echo '{
  "topicKeywords": [
    "CRM",
    "hubspot"
  ],
  "searchQueries": [
    "best CRM for startups",
    "hubspot alternative"
  ],
  "subreddits": [
    "smallbusiness",
    "sales"
  ],
  "intentPresets": [
    "seeking_recommendation",
    "alternative_seeking",
    "problem_help",
    "pain_point",
    "buying_intent"
  ]
}' |
apify call b2b_leads/reddit-lead-and-intent-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=b2b_leads/reddit-lead-and-intent-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SxpcS79yUO0zUWbsS/builds/RPmAlDsoFhlYPQmLt/openapi.json
