# Buyer Intent Radar: Reddit, Stack Overflow, HN Leads (`scrapemint/buyer-intent-radar-pipeline`) Actor

Find people actively voicing a need or buying intent for your topic now. Chains Reddit, Stack Overflow, and Hacker News lead monitors, scores intent 0 to 100 from evaluation language plus recency and engagement, groups by person, and tiers leads hot, warm, or mention. No API keys needed.

- **URL**: https://apify.com/scrapemint/buyer-intent-radar-pipeline.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Buyer Intent Radar: Reddit, Stack Overflow, HN Leads

Find the people who are **actively voicing a need or buying intent** for your topic right now, across three independent public forums, and get them back as ranked, outreach-ready leads.

The pipeline reads **Reddit**, **Stack Overflow**, and **Hacker News**, keeps only posts that carry real intent language, scores each lead 0 to 100 from that language plus recency and engagement, groups posts by person, and tiers every lead as **hot**, **warm**, or **mention**. All three sources are **antibot-free public feeds and APIs**. No API keys, no developer accounts, no OAuth.

### What it does

1. **Reddit.** Searches your keywords and any subreddits you name, pre-filtered to intent-bearing language such as "looking for", "recommend", "alternative to", and "best tool". This is where purchase and switching intent shows up.
2. **Stack Overflow.** Pulls questions matching your tags and keywords. A question is an unmet need by definition, and an unanswered one is the hottest.
3. **Hacker News.** Pulls Ask HN and story matches for your keywords. "Ask HN: best tool for X" is explicit evaluation intent.
4. **Normalize and dedupe.** Every post becomes a common signal. Signals already delivered in a previous run are skipped, so you are never charged twice for the same lead.
5. **Group by person.** Posts from the same author on the same platform collapse into one lead, so a person who asked three times is one strong lead, not three rows.
6. **Score and tier.** Intent language sets the base, recency and engagement add to it, and asking more than once adds a little more. The total decides hot vs warm vs mention.

### Scoring

A lead score (0 to 100) is the sum of:

- **Intent language (up to 50).** High intent (evaluation, purchase, switching, recommendation requests) scores well above problem or help language. Extra distinct phrases add a little more.
- **Recency (up to 25).** A post from today scores far above one from last month.
- **Engagement (up to 15).** Stack Overflow score and whether the question is still unanswered; Hacker News points and comments. Reddit RSS does not expose vote or comment counts, so Reddit leans on intent and recency.
- **Repeat asking (up to 10).** Someone who posted about this more than once.

Tiers:

- **hot_lead** — score 60+ **and** explicit high-intent language. The most outreach-ready.
- **warm_lead** — score 40+, or any explicit high-intent language.
- **mention** — cleared the noise gate but only light or topical intent.

A lead below `minIntentScore` (default 20) is dropped and never charged.

### Output

One row per person per platform:

```json
{
  "platform": "reddit",
  "author": "some_user",
  "authorUrl": "https://www.reddit.com/user/some_user",
  "leadScore": 73,
  "tier": "hot_lead",
  "hasHighIntent": true,
  "intentPhrases": ["looking for", "recommend", "alternative to"],
  "topics": ["crm"],
  "signalCount": 2,
  "bestSignal": {
    "title": "Looking for a CRM recommendation for a small team",
    "url": "https://www.reddit.com/r/smallbusiness/comments/.../",
    "snippet": "We outgrew spreadsheets and need something simple ...",
    "createdAt": "2026-06-06T21:15:50.000Z",
    "intentPhrases": ["looking for", "recommend"]
  },
  "signals": [
    { "title": "...", "url": "...", "createdAt": "..." }
  ],
  "engagement": null,
  "scoredAt": "2026-06-07T08:00:00.000Z"
}
````

### Input

- `keywords` — product, category, or competitor terms searched across all three platforms.
- `subreddits` — optional subreddits to monitor (without the r/ prefix).
- `stackTags` — optional Stack Overflow tags (surfaces people struggling with a specific technology).
- `hnFeeds` — Hacker News feeds to pull, default `ask`.
- `extraIntentKeywords` — add your own high-intent phrases or competitor product names to the built-in lexicon.
- `includeReddit` / `includeStackOverflow` / `includeHackerNews` — turn any source on or off.
- `maxAgeHours`, `maxItemsPerSource`, `minIntentScore` — window and thresholds.

Provide at least one of `keywords`, `subreddits`, or `stackTags`.

### Pricing and combined cost

This actor charges per scored lead: **mention $0.03**, **warm $0.08**, **hot $0.15**. The first 3 hot leads per run are free so you can validate output.

This is a pipeline: it runs three child actors, and **each child also bills you for its own per-item usage** (reddit-lead-monitor, stackoverflow-lead-monitor, and hn-lead-monitor each charge per item they return). Your total for a run is the lead charges above **plus** those child charges. Use `maxItemsPerSource` and `minIntentScore` to control volume and cost.

### Notes on sources

- Reddit serves its `.json` listing and search behind OAuth now, so this pipeline reads Reddit's public RSS feeds instead. RSS carries the title, author, body, link, subreddit, and timestamp, but not vote or comment counts.
- Stack Overflow and Hacker News are read from their public APIs.
- Cross-platform identity is not claimed: usernames differ across forums, so a person is grouped only within a single platform.

# Actor input Schema

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

Product, category, or competitor terms to search across all three platforms. Examples: \["crm", "project management tool", "salesforce alternative"].

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

Specific subreddits to monitor in addition to the keyword search, without the r/ prefix. Examples: \["smallbusiness", "sales", "marketing"].

## `stackTags` (type: `array`):

Stack Overflow tags to monitor in addition to the keyword search. Tag-based pulls surface people struggling with a specific technology. Examples: \["salesforce", "hubspot-api", "stripe"].

## `hnFeeds` (type: `array`):

Which HN feeds to pull alongside the keyword search. Valid: ask (Ask HN, the strongest intent), show, top, best, new. Default ask.

## `extraIntentKeywords` (type: `array`):

Add your own high-intent phrases to the built-in lexicon (looking for, recommend, alternative to, best tool, switching from, pricing, and more). Useful for niche buying language or competitor product names.

## `includeReddit` (type: `boolean`):

Pull Reddit posts (RSS feeds), pre-filtered to intent-bearing language.

## `includeStackOverflow` (type: `boolean`):

Pull Stack Overflow questions (an unanswered question is an active unmet need).

## `includeHackerNews` (type: `boolean`):

Pull Hacker News Ask/Show/stories matching your keywords.

## `maxAgeHours` (type: `integer`):

Ignore posts older than this. 168 = one week.

## `maxItemsPerSource` (type: `integer`):

Cap on raw items pulled from each platform before scoring. Higher finds more leads but raises the child per-item cost.

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

A lead scoring below this 0-100 threshold is dropped as noise and never charged. 20 keeps light topical mentions; raise to 40+ for only active buyers.

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

Proxy passed through to the child actors. Reddit needs residential; the default is recommended.

## Actor input object example

```json
{
  "keywords": [
    "crm",
    "project management tool"
  ],
  "subreddits": [],
  "stackTags": [],
  "hnFeeds": [
    "ask"
  ],
  "extraIntentKeywords": [],
  "includeReddit": true,
  "includeStackOverflow": true,
  "includeHackerNews": true,
  "maxAgeHours": 168,
  "maxItemsPerSource": 100,
  "minIntentScore": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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",
        "project management tool"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/buyer-intent-radar-pipeline").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",
        "project management tool",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/buyer-intent-radar-pipeline").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 '{
  "keywords": [
    "crm",
    "project management tool"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapemint/buyer-intent-radar-pipeline --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapemint/buyer-intent-radar-pipeline",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Buyer Intent Radar: Reddit, Stack Overflow, HN Leads",
        "description": "Find people actively voicing a need or buying intent for your topic now. Chains Reddit, Stack Overflow, and Hacker News lead monitors, scores intent 0 to 100 from evaluation language plus recency and engagement, groups by person, and tiers leads hot, warm, or mention. No API keys needed.",
        "version": "0.1",
        "x-build-id": "WelI8XpWz9CS7W4nG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapemint~buyer-intent-radar-pipeline/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapemint-buyer-intent-radar-pipeline",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapemint~buyer-intent-radar-pipeline/runs": {
            "post": {
                "operationId": "runs-sync-scrapemint-buyer-intent-radar-pipeline",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapemint~buyer-intent-radar-pipeline/run-sync": {
            "post": {
                "operationId": "run-sync-scrapemint-buyer-intent-radar-pipeline",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Keywords / topics",
                        "type": "array",
                        "description": "Product, category, or competitor terms to search across all three platforms. Examples: [\"crm\", \"project management tool\", \"salesforce alternative\"].",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "subreddits": {
                        "title": "Subreddits (optional)",
                        "type": "array",
                        "description": "Specific subreddits to monitor in addition to the keyword search, without the r/ prefix. Examples: [\"smallbusiness\", \"sales\", \"marketing\"].",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "stackTags": {
                        "title": "Stack Overflow tags (optional)",
                        "type": "array",
                        "description": "Stack Overflow tags to monitor in addition to the keyword search. Tag-based pulls surface people struggling with a specific technology. Examples: [\"salesforce\", \"hubspot-api\", \"stripe\"].",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "hnFeeds": {
                        "title": "Hacker News feeds",
                        "type": "array",
                        "description": "Which HN feeds to pull alongside the keyword search. Valid: ask (Ask HN, the strongest intent), show, top, best, new. Default ask.",
                        "default": [
                            "ask"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "extraIntentKeywords": {
                        "title": "Extra intent phrases (optional)",
                        "type": "array",
                        "description": "Add your own high-intent phrases to the built-in lexicon (looking for, recommend, alternative to, best tool, switching from, pricing, and more). Useful for niche buying language or competitor product names.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeReddit": {
                        "title": "Include Reddit",
                        "type": "boolean",
                        "description": "Pull Reddit posts (RSS feeds), pre-filtered to intent-bearing language.",
                        "default": true
                    },
                    "includeStackOverflow": {
                        "title": "Include Stack Overflow",
                        "type": "boolean",
                        "description": "Pull Stack Overflow questions (an unanswered question is an active unmet need).",
                        "default": true
                    },
                    "includeHackerNews": {
                        "title": "Include Hacker News",
                        "type": "boolean",
                        "description": "Pull Hacker News Ask/Show/stories matching your keywords.",
                        "default": true
                    },
                    "maxAgeHours": {
                        "title": "Max age (hours)",
                        "minimum": 24,
                        "maximum": 2160,
                        "type": "integer",
                        "description": "Ignore posts older than this. 168 = one week.",
                        "default": 168
                    },
                    "maxItemsPerSource": {
                        "title": "Max items per source",
                        "minimum": 20,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Cap on raw items pulled from each platform before scoring. Higher finds more leads but raises the child per-item cost.",
                        "default": 100
                    },
                    "minIntentScore": {
                        "title": "Minimum intent score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "A lead scoring below this 0-100 threshold is dropped as noise and never charged. 20 keeps light topical mentions; raise to 40+ for only active buyers.",
                        "default": 20
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy passed through to the child actors. Reddit needs residential; the default is recommended.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
