# Buyer Intent Lead Finder: Bluesky, Hacker News, Forums, Lemmy (`magnova/buyer-intent-lead-finder`) Actor

Find people asking for a product like yours. Give keywords (e.g. CRM); get recent public Bluesky, Hacker News, forum, Stack Exchange, Mastodon and Lemmy posts with buying intent: URL, text, handle, date, intent score 0-100 and reasons. $0.005/lead.

- **URL**: https://apify.com/magnova/buyer-intent-lead-finder.md
- **Developed by:** [Magnova](https://apify.com/magnova) (community)
- **Categories:** Lead generation, Social media, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 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

## Buyer Intent Lead Finder: Bluesky, Hacker News, Forums, Lemmy

**Buyer Intent Lead Finder finds recent public posts where people ask for a product like yours.** You give it keywords such as `CRM` or `password manager`; it searches Bluesky, Hacker News, 25 public Discourse forums (Spiceworks, Privacy Guides, Level1Techs, TrueNAS, Mac Power Users, Shopify Community and more), Stack Exchange, Mastodon and Lemmy (public posts, no login) and returns one row per lead with the post URL, text, public handle, date and a transparent 0-100 **intent score** that explains every point.

No login, no cookies, no API key. You pay **$0.005 per lead** returned, and nothing for errors or empty runs.

### What does Buyer Intent Lead Finder do?

It is social listening focused on one question: *who is shopping right now?* Most keyword monitors return every mention of "CRM", which is mostly vendors promoting themselves, job ads and stock chatter. This Actor keeps only posts that look like a buyer asking for help:

- "Can anyone recommend a simple CRM for a 3-person agency?"
- "What are folks using as an alternative to Proton's password manager?"
- "Which project management tool do y'all like the most?"
- "Is there a tool that turns invoices into…" / "We're switching from HubSpot…" / "Happy to pay for…"

Each post is scored by plain rules you can read in the `scoreReasons` field:

| Signal | Points |
|---|---|
| Buying-intent phrases (looking for, can anyone recommend, alternative to, is there a tool, what do you use, which tool do you use, switching from, replacement for, willing to pay, know a good…), asks naming your keyword ("any password manager suggestions?", "is there a CRM that…?", "thinking of setting up an auto reply") and problem questions (how do I, what to do?, how to keep…?, any way to…?, I need a way to, struggling with, tired of, "X is my biggest time sink") | up to +55 |
| Asks a question | +15 |
| Recency (24 h / 3 days / 7 days) | +15 / +10 / +5 |
| Engagement (replies, likes, reposts, points) | +5 to +10 |
| Stack Exchange Software Recommendations question / still unanswered / Ask HN | +10 / +5 / +10 |
| Self-promotion, hiring posts, announcements/news (launching soon, we're building, according to…), rhetorical marketing questions ("Running a small business? …"), promo calls-to-action, content-marketing threads, stock tickers, 5+ hashtags, promo links | −10 to −40 |
| Intent phrase far (>350 characters) from the keyword, or no first-person ask at all (news/opinion) | −20 |
| Keyword is not the object of the ask (mentioned in passing, e.g. "recommendations for a podcast host… instead of asking a chatbot" for `chatbot`) | intent points halved, score capped at 35 |
| Ask is clearly for a different thing ("keyword incidental: the ask is for 'site'") | −10 |
| Keyword negated or contrasted right before it (instead of, rather than, other than, without, unlike, not a, never, why would I need…) | −25 |
| Words of a multi-word keyword appear apart, not as one phrase | −10 (−25 if not the object of the ask) |

A post needs a buying/problem phrase or a first-person question near your keyword: a first-person question without an explicit phrase is capped at 35, and a plain mention (news, opinion, a question about something else) is capped at 10. Full intent credit also requires your keyword to be what the post asks for: in the same sentence as the intent phrase and within about 10 words of it ("recommend a X", "alternative to X", "which X do you use", "X suggestions?"), the subject of the poster's own problem ("my X keeps…"), or in the sentence right before a short ask ("…switched password manager. What should I try next?"). `scoreReasons` says which ("keyword is the target of the ask (object of 'alternative to')") or why not. So the default `minIntentScore` of 40 only returns posts with a real buying signal for your keyword; lower it to 30 to also see posts that mention it in passing.

**Spam is dropped before scoring and never charged:** escort/adult ads, posts with phone numbers, repeated "DM me / call me" promos, posts with 8+ hashtags and link-only posts. Each author contributes at most 2 leads per source per run, and a near-identical second post from the same author is dropped. The counts are in the run's `SUMMARY` (`perSource.droppedSpam`, `perSource.droppedAuthorCap`).

### Use cases

- **SaaS founders and indie hackers:** find people asking for your category or for an alternative to a competitor, and join the conversation with a helpful reply.
- **Sales and growth teams:** a daily feed of warm, public buying signals for outbound research.
- **Product marketing:** see the exact words buyers use, which competitors they want to leave and why.
- **Agencies:** monitor several clients' categories from one schedule.
- **AI agents:** a zero-shot tool that turns "find me people looking for a CRM" into structured leads.

### How to find buyer intent leads

1. Enter your **keywords**: a category (`CRM`), a competitor (`Notion alternative`) or a problem (`invoicing`). A post must contain all words of a phrase.
2. Optionally pick **sources**, **look-back days** and the **minimum intent score**.
3. Click **Start**. A run usually takes 10-40 seconds.
4. Open the **Leads** view, sorted by intent score, or export to CSV, Excel, JSON, Google Sheets, Slack or your CRM through Apify integrations.

#### Monitor mode (only new leads)

Pick or create a key-value store in **Seen-leads store**, turn on **Only new leads**, and add an Apify **Schedule** (for example daily with `lastNDays: 1` or `2`). Each run marks leads `isNew` and skips ones you already received, so you are only charged for fresh leads.

#### Search the forum where your customers hang out

Most lead tools only cover the big social networks. This one also searches **any public Discourse forum you name**, which is often where your best buyers ask for advice: the community of the tool they are leaving, an industry forum, or a hobby forum for your niche. Add the host names to `discourseForums`:

```json
{
  "keywords": ["Zapier alternative", "workflow automation"],
  "sources": ["discourse", "bluesky", "hackernews"],
  "discourseForums": ["community.zapier.com", "community.n8n.io", "community.make.com", "community.spiceworks.com"],
  "lastNDays": 30
}
```

Good targets:

- **A competitor's community forum**, where users post "looking for an alternative" or "moving away from X".
- **Your industry's forum**, such as IT admins (community.spiceworks.com), privacy (discuss.privacyguides.net), self-hosting and NAS (forums.truenas.com, help.nextcloud.com), Mac apps (talk.macpowerusers.com), e-commerce (community.shopify.com), 3D printing (forum.bambulab.com) or smart homes (community.hubitat.com).
- **Hobby and creative communities** for consumer products (blenderartists.org, krita-artists.org, discuss.pixls.us).

Many forums run on Discourse. If a forum's pages end in `/t/<topic-title>/<number>`, it almost certainly works. Leave `discourseForums` empty to use the built-in list of 25 forums. Only public opening posts are read, with no login.

### Input example

```json
{
  "keywords": ["CRM", "password manager"],
  "intentPhrases": ["need a quote"],
  "sources": ["bluesky", "hackernews", "stackexchange", "mastodon"],
  "lastNDays": 7,
  "minIntentScore": 40,
  "maxLeadsPerSource": 50
}
```

### Output example

```json
{
  "recordType": "lead",
  "source": "bluesky",
  "url": "https://bsky.app/profile/example.bsky.social/post/3m...",
  "title": null,
  "text": "What are folks using for an alternative to Proton's VPN, mail, and password manager?",
  "authorHandle": "example.bsky.social",
  "postedAt": "2026-10-29T14:02:11Z",
  "matchedKeyword": "password manager",
  "intentPhrase": "alternative to",
  "matchedIntentPhrases": ["alternative to", "what do you use"],
  "intentScore": 95,
  "scoreReasons": ["+55 intent phrases (alternative to, what do you use)", "+15 asks a question", "+15 recent (6h old)", "+10 engagement 10+"],
  "isQuestion": true,
  "likes": 12, "replies": 9, "reposts": 1, "points": null, "views": null,
  "sourceDetail": "post",
  "language": "en",
  "license": null,
  "attribution": null,
  "leadId": "a1b2c3d4e5f60718",
  "isNew": null,
  "foundAt": "2026-10-30T03:10:00Z",
  "error": null
}
```

Per-source problems (for example a source rate limit) appear as `recordType: "error"` rows and in the `SUMMARY` record of the run's key-value store, together with per-source counts (fetched, keyword-matched, spam dropped, author-capped, qualified, returned). Error and info rows are never charged, and one failing source never stops the others. Each Stack Exchange site is queried separately, so a misspelled or closed site name (e.g. `startups`) gives one error row for that site while the other sites still return leads.

### Use with AI agents / MCP

The Actor is built for agents: one required array field, working defaults, and a flat output with a self-explaining score. Through the Apify MCP server (`mcp.apify.com`) an agent can call `magnova/buyer-intent-lead-finder` with:

```json
{ "keywords": ["CRM"] }
```

and receive rows like `{"source":"hackernews","url":"https://news.ycombinator.com/item?id=...","text":"Can anyone recommend a CRM that...","intentScore":75,"scoreReasons":[...]}`. Agents can then draft a helpful reply, summarise demand, or add leads to a sheet. Pay-per-event pricing works with Apify's agentic payments.

### How much does it cost to find leads with Buyer Intent Lead Finder?

**$0.005 per lead** (that is $5 per 1,000 leads), pay-per-event, with no start fee and no platform usage on top. Apify subscribers get volume discounts: Silver $0.00425 and Gold $0.0035 per lead. Error rows, info rows and posts below your score threshold are free. A typical run with 3 keywords returns 5-30 leads, so it costs a few cents. `maxLeadsPerSource` and Apify's "max cost per run" cap spending; the Actor stops cleanly at your limit.

### Buyer intent API

Every run is also an API call. POST your input to `https://api.apify.com/v2/acts/magnova~buyer-intent-lead-finder/run-sync-get-dataset-items?token=YOUR_TOKEN` and get the leads back as JSON, or use the Apify Python/JavaScript clients, Make, Zapier, n8n or webhooks.

### Sources

| Source | Official API | What is searched |
|---|---|---|
| Discourse forums | Each forum's public `search.json` and `/raw` topic text (logged out) | Newest opening posts that mention each keyword, on 25 default forums or the ones you list in `discourseForums` |
| Reddit | Public search feed `reddit.com/search.rss` (logged out, no account) | Newest posts for each keyword plus an intent-phrase query (title + body) |
| Bluesky | AppView `app.bsky.feed.searchPosts` (public, unauthenticated) | Latest posts for each keyword plus intent-phrase variants |
| Hacker News | HN Search API by Algolia (`hn.algolia.com/api/v1/search_by_date`) | Stories and comments, exact word match |
| Stack Exchange | Stack Exchange API v2.3 `/search/advanced` | New questions on Software Recommendations, Web Applications, Super User (configurable) |
| Mastodon | Public hashtag timeline `/api/v1/timelines/tag/{tag}` | Each keyword as a hashtag on mastodon.social (configurable) |
| Lemmy | Official API `/api/v3/search` on lemmy.world (configurable) | Posts federated across Lemmy servers |
| dev.to (optional) | Forem API `/api/articles/latest` | Articles by tag |

X/Twitter, LinkedIn, Facebook, Instagram and Threads are **not** included because searching them needs a login. Reddit search returns posts (not comments), newest 100 per query, from up to the last year. **Reddit retires all its public feeds on November 13, 2026**, so from that date Reddit is no longer a default source; the other sources keep working. Unauthenticated Bluesky search returns one page of results per query, so very popular keywords are sampled through several intent-phrase variants rather than paged exhaustively.

### FAQ

#### How do I find people looking for my product on social media?

Enter the category or competitor names your buyers use as keywords and run the Actor. It returns only posts with buying intent, ranked by score, with a link to reply.

#### Is it legal?

It only reads posts anyone can see without an account (no login, no cookies, no CAPTCHA solving) and outputs only the public handle shown next to each post. Courts in the US have generally treated reading logged-out public pages as lawful, but some sites' terms restrict automated access, so check your own use case. Please respect each community's rules when you reply: be helpful, disclose that you are a vendor, and do not spam (Reddit, Bluesky and Stack Exchange rules forbid bulk unsolicited messaging).

#### Why are there only a few leads?

Real buying-intent posts are rare compared with plain mentions. Add more keywords (competitor names work well), raise `lastNDays`, or lower `minIntentScore` to 30 to include first-person questions without an explicit ask, or 0 to see every non-spam mention.

#### How is the intent score calculated?

By fixed, documented rules (table above). There is no black-box AI, so the same post always gets the same score and `scoreReasons` lists every rule applied.

#### Can I search a specific forum or community?

Yes. List any public Discourse forum in `discourseForums`, for example `["community.spiceworks.com", "discuss.privacyguides.net"]`. A competitor's own community forum is often the best place to find people who want to switch.

#### Can I add my own intent phrases?

Yes, `intentPhrases` adds your own phrases (+25 each when found).

#### How do I avoid getting the same leads twice?

Use monitor mode: pick a seen-leads store and turn on Only new leads.

### Alternatives

Most lead finders cover a single site, and generic Bluesky or Hacker News scrapers return every mention without intent filtering. Buyer Intent Lead Finder searches Bluesky, Hacker News, 25 public Discourse forums, Stack Exchange, Mastodon and Lemmy in one run, filters for buying intent with explainable scoring, dedupes across sources, and charges only for qualified leads.

### Legal and data

- **Bluesky:** public, unauthenticated AppView endpoints documented at docs.bsky.app ("many Bluesky Lexicon endpoints are public, and do not require authentication"). The Actor creates no interactions, in line with the Bluesky Developer Guidelines.
- **Hacker News:** HN Search API by Algolia, a public API with a documented limit of 10,000 requests per hour per IP; the Actor makes a few dozen.
- **Stack Exchange:** API v2.3 without a key (public content only). Content is user-contributed and licensed **CC BY-SA 4.0**; every Stack Exchange row carries its link, author handle, `license` and `attribution` fields, as the Stack Exchange API terms require ("visually indicate that the Stack Exchange Network is the source of the content").
- **Discourse forums:** each forum's public search endpoint, the same one its website uses for logged-out visitors. Only opening posts are read.
- **Reddit:** the public search feed served to logged-out visitors; requests go through Apify Proxy. No login, no account, no comments or private subreddits.
- **Lemmy:** the documented public Lemmy API; only public, non-deleted posts.
- **Mastodon:** public hashtag timelines that each server publishes without login; only public, non-boosted posts are used.
- **Personal data:** only the public handle shown with each post is returned; no names, emails, avatars or profile data. Use the data in line with GDPR/CCPA and each platform's rules, and honour removal requests.

Questions or a source you would like added? Open an issue on the Issues tab.

# Actor input Schema

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

What you sell, in the words buyers use: a product category, a competitor name or a problem. Each phrase is searched on every source and a post must contain all its words. One to 20 phrases. Examples: CRM, invoicing software, Notion alternative, password manager.

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

Optional. Your own buying-signal phrases on top of the built-in ones (looking for, can anyone recommend, alternative to, is there a tool, what do you use, switching from, willing to pay and more). Each phrase found in a post adds 25 points. Example: need a quote, cheaper than.

## `sources` (type: `array`):

Which public sources to search. Leave empty for Bluesky, Hacker News, Discourse forums, Stack Exchange, Mastodon and Lemmy (plus Reddit until Reddit retires its public feeds on Nov 13, 2026). dev.to is off by default because articles rarely show buying intent. Example: \["hackernews", "discourse"].

## `lastNDays` (type: `integer`):

Only posts from the last N days (1-60). Use 1 with a daily Schedule for monitoring. Example: 7.

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

Only return leads scoring at least this (0-100). 40 needs at least one buying-intent phrase; 60+ is strong intent (a question plus a clear ask). Set 0 to get every keyword mention. Example: 40.

## `maxLeadsPerSource` (type: `integer`):

Highest-scoring leads kept per source. Caps your cost: at most this many x number of sources leads are charged. Example: 50.

## `languages` (type: `array`):

ISO language codes to keep when a source reports the post language (Bluesky, Mastodon). Empty list = all languages. Example: en, de.

## `stackExchangeSites` (type: `array`):

Stack Exchange site names to search (api.stackexchange.com 'site' values). Software Recommendations (softwarerecs) is where people ask for tools. Example: softwarerecs, webapps, superuser, stackoverflow, wordpress.

## `mastodonInstances` (type: `array`):

Mastodon servers whose public hashtag timeline is read. Each keyword becomes a hashtag ("project management" -> #projectmanagement). Up to 5. Example: mastodon.social, fosstodon.org.

## `discourseForums` (type: `array`):

Public Discourse forums to search (host names). Leave empty for the built-in list of 25 IT, privacy, self-hosting, Linux, Mac, e-commerce, no-code and creative-software communities such as community.spiceworks.com, discuss.privacyguides.net, forum.level1techs.com and talk.macpowerusers.com. Add the forum where your buyers hang out. Up to 40. Example: community.spiceworks.com.

## `lemmyInstances` (type: `array`):

Lemmy servers to search (their search covers posts federated from other servers too). Up to 3. Example: lemmy.world.

## `seenStore` (type: `string`):

Optional. Pick or create a key-value store in your account (e.g. one named my-lead-monitor). The Actor remembers every lead it returned there, marks each lead isNew, and with 'Only new leads' on skips leads you already got. Use with an Apify Schedule.

## `onlyNew` (type: `boolean`):

Needs a seen-leads store. Skip leads returned in earlier runs so a daily schedule only delivers (and charges for) fresh ones. Example: true.

## Actor input object example

```json
{
  "keywords": [
    "CRM",
    "project management tool",
    "password manager",
    "note taking app",
    "email marketing",
    "invoicing"
  ],
  "intentPhrases": [],
  "sources": [
    "bluesky",
    "hackernews",
    "discourse",
    "stackexchange",
    "mastodon",
    "lemmy"
  ],
  "lastNDays": 7,
  "minIntentScore": 40,
  "maxLeadsPerSource": 50,
  "languages": [
    "en"
  ],
  "stackExchangeSites": [
    "softwarerecs",
    "webapps",
    "superuser"
  ],
  "mastodonInstances": [
    "mastodon.social"
  ],
  "lemmyInstances": [
    "lemmy.world"
  ],
  "onlyNew": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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",
        "password manager",
        "note taking app",
        "email marketing",
        "invoicing"
    ],
    "sources": [
        "bluesky",
        "hackernews",
        "discourse",
        "stackexchange",
        "mastodon",
        "lemmy"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("magnova/buyer-intent-lead-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",
        "project management tool",
        "password manager",
        "note taking app",
        "email marketing",
        "invoicing",
    ],
    "sources": [
        "bluesky",
        "hackernews",
        "discourse",
        "stackexchange",
        "mastodon",
        "lemmy",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("magnova/buyer-intent-lead-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",
    "project management tool",
    "password manager",
    "note taking app",
    "email marketing",
    "invoicing"
  ],
  "sources": [
    "bluesky",
    "hackernews",
    "discourse",
    "stackexchange",
    "mastodon",
    "lemmy"
  ]
}' |
apify call magnova/buyer-intent-lead-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,magnova/buyer-intent-lead-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/3LHehD6W8hu3DOG71/builds/cT38QFoA0NrO3cHGg/openapi.json
