# Hacker News Lead Finder — Buyer-Intent Posts (`signalengine/hn-lead-finder`) Actor

Search Hacker News for buyer-intent posts and comments ("looking for", "alternative to", "recommendations for") and Show HN founders, returned as leads with author, links, and the product/company URL.

- **URL**: https://apify.com/signalengine/hn-lead-finder.md
- **Developed by:** [James Taylor](https://apify.com/signalengine) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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

## 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

## Hacker News Lead Finder — Buyer-Intent Posts

This **Hacker News scraper** turns HN into a lead list: it searches Hacker News for **buyer-intent posts and comments** — people asking *"looking for"*, *"alternative to"*, *"recommendations for"* — plus **Show HN** founders, and returns each as a clean lead with the HN user, the post/comment, a direct link to the thread, and the **product/company URL** when there is one.

It's a **Hacker News lead finder** built for founders, marketers, agencies, and sales teams who want to **catch demand and new products on HN the moment they appear** — without building a scraper or babysitting feeds.

### Why this instead of a generic Hacker News scraper?

Most HN scrapers hand you *everything* and leave you to dig for the handful of threads that actually matter. This one is opinionated: it filters to **purchase intent** first, so the output is a short, high-signal list. Every lead is a person who just raised their hand — *"Ask HN: best CRM for a small team?"*, *"Show HN: my new analytics tool"* — so you decide whether to reply in-thread, reach out, or add them to a research list. You can also swap in your own queries for niche-specific buying language.

It runs entirely on Hacker News's **public, key-less search API** (the **HN Algolia API**), so there's **no login, no API key, and no proxy** — and no anti-bot to fight.

### What it does

- Searches Hacker News for your **queries** (or a built-in set of buyer-intent phrases) across **stories, Ask HN, Show HN, comments, or stories + comments** via the `searchIn` setting.
- Sorts **newest-first** and filters to the **last N days** (`daysBack`) so you get fresh intent, not a stale dump.
- De-duplicates results, caps the run at `maxLeads`, and returns each lead with the HN author, title, text, points, HN permalink, and the external/company URL when the item carries one.

### Who it's for

- **B2B founders & marketers** spotting people who need exactly what you sell.
- **Agencies** sourcing prospects in client niches (developer tools, SaaS, infra, fintech).
- **Sales teams** building warm, intent-based lists from real HN questions.
- **Recruiters & talent teams** mining HN — point custom `queries` at hiring language (e.g. *"who is hiring"*, *"is hiring"*, *"hiring remote"*) across stories/comments to surface companies actively hiring.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array | built-in intent phrases | Phrases/keywords to search on HN; empty = the built-in buyer-intent set (*"looking for"*, *"alternative to"*, *"recommendations for"*, …). |
| `searchIn` | string | `story` | Which HN content to search: `story` (incl. Ask/Show/Launch HN), `ask_hn`, `show_hn`, `(story,comment)`, or `comment`. |
| `daysBack` | integer | `30` | Only include items from the last N days (`0` = no limit). |
| `maxLeads` | integer | `100` | Stop after this many leads (caps your spend). |
| `hitsPerQuery` | integer | `30` | Results pulled per query (1–1000). |
| `maxConcurrency` | integer | `4` | Parallel queries (1–20). |

#### Example input

```json
{
  "queries": ["looking for", "alternative to", "any recommendations for"],
  "searchIn": "story",
  "daysBack": 14,
  "maxLeads": 50
}
````

### How to run

1. Click **Try for free** (or open the actor in your Apify Console).
2. Leave **queries** empty to use the built-in buyer-intent phrases, or enter your own keywords.
3. Pick **searchIn** — `story` gives the cleanest leads (Ask HN / Show HN included); choose `ask_hn` or `show_hn` to target one, or `(story,comment)` to widen the net.
4. Set **daysBack** for freshness and **maxLeads** to cap your spend.
5. Click **Start**. When the run finishes, open the **Dataset** tab and export to JSON/CSV/Excel, or pull it via the API (below).

Run it on a **schedule** (Apify Schedules) for a fresh HN intent list every morning, or call it from **Make / Zapier / n8n** via the Apify integrations.

### Output

Each item in the dataset:

```json
{
  "type": "lead",
  "source": "hackernews",
  "author": "alice",
  "matchedQuery": "looking for",
  "title": "Ask HN: best CRM for a small team?",
  "text": "Anyone got a good CRM rec? We're 8 people…",
  "points": 14,
  "hnUrl": "https://news.ycombinator.com/item?id=111",
  "website": "https://acme.example.com",
  "createdAt": "2026-06-03T09:36:48.000Z"
}
```

Field notes:

- **`author`** is the HN username — engage them in-thread via `hnUrl`.
- **`matchedQuery`** is the query that surfaced this item (a built-in phrase, or one of your own `queries`).
- **`website`** is the item's submitted URL — the product/company site for Show HN and most story leads. It's `null` for plain comments and for self-text posts (we never fabricate it).
- **`points`** is HN karma when the API exposes it, otherwise `null`.
- **`hnUrl`** is the canonical `news.ycombinator.com/item?id=…` permalink to the thread.

#### Export & API

```bash
## Last run's dataset items as JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=json&token=<APIFY_TOKEN>"
```

Or use the **run-sync-get-dataset-items** endpoint to run-and-wait in a single call — handy for embedding the actor in your own backend.

### Limitations

- **Intent is matched by your search queries** against HN's index — broaden `queries` to widen the net, or narrow them to sharpen it.
- **Comments and self-text posts have no `website`** — only items with a submitted URL (stories / Show HN) carry one.
- **Algolia coverage.** The HN Algolia API returns the most relevant/recent matches per query, not a complete historical export; pull more `hitsPerQuery` or run on a schedule for broader reach.
- **Rate limits.** The API is free and key-less; the actor retries on `429`/`5xx` with backoff and keeps concurrency modest, but very large query sets are paced accordingly.
- **No dedicated "Who is hiring?" tag.** HN's API has no jobs/hiring tag exposed here — reach hiring threads via custom `queries` (e.g. *"who is hiring"*) against stories/comments.

### Compliance

This actor uses Hacker News's **public search API only** — it does not log in, post, vote, or message. You are responsible for using the output in line with Hacker News's guidelines and any outreach or marketing rules that apply to you.

### FAQ

**Do I need a Hacker News account, API key, or proxy?** No — it reads the public HN Algolia search API directly, with no login and no proxy.

**How is it priced and how do I control cost?** Apify Pay-Per-Event — you're charged per **lead** returned. Set `maxLeads` to cap spend; duplicate and non-matching items are never charged.

**Can I use my own keywords?** Yes — fill `queries` with any phrases or keywords. Leave it empty and the built-in buyer-intent set (*"looking for"*, *"alternative to"*, *"recommendations for"*, …) is used instead, and the matching phrase is recorded in each lead's `matchedQuery`.

**How do I find founders and new products?** Set `searchIn` to `show_hn` (or keep `story`, which includes Show HN). For Show HN and most stories the `website` field is the submitted product/company URL — so you often get a company website for free.

**Can I mine Ask HN threads?** Yes — set `searchIn` to `ask_hn` to focus on questions, or keep `story` (which includes Ask HN) to capture them alongside other submissions. Ask HN is where buyer-intent questions like *"best tool for…"* tend to live.

**Can recruiters use it for hiring signals?** Yes — point `queries` at hiring language across `story` or `(story,comment)` to surface companies actively hiring on Hacker News. There's no built-in jobs tag, so hiring coverage is exactly as broad as the queries you supply.

**How fresh is the data?** Each run hits the live API and sorts newest-first; use `daysBack` to bound recency and a schedule to catch intent as it's posted.

**Why is `website` sometimes null?** Because that item has no submitted URL — it's a comment or a self-text post. We return `null` rather than inventing a site.

***

#### Want this turned into outreach?

This actor finds the intent. If you'd like the **whole loop** — intent discovery, contact enrichment, AI-personalised outreach, and reply handling — done for you, that's what we build at **[SignalEngine](https://engine.signalsprint.io)**. This actor is a taste of the engine behind it.

# Actor input Schema

## `queries` (type: `array`):

Phrases/keywords to search on HN. Leave empty to use a built-in set of buyer-intent phrases ("looking for", "alternative to", "recommendations for", …).

## `searchIn` (type: `string`):

Which HN content to search.

## `daysBack` (type: `integer`):

Only include items from the last N days (0 = no limit).

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

Stop after this many leads (caps your spend).

## `hitsPerQuery` (type: `integer`):

How many results to pull per query (1-1000).

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

Parallel queries.

## Actor input object example

```json
{
  "queries": [],
  "searchIn": "story",
  "daysBack": 30,
  "maxLeads": 100,
  "hitsPerQuery": 30,
  "maxConcurrency": 4
}
```

# Actor output Schema

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

HN authors expressing buyer intent (with HN link + any product/company URL).

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("signalengine/hn-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("signalengine/hn-lead-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 '{}' |
apify call signalengine/hn-lead-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hacker News Lead Finder — Buyer-Intent Posts",
        "description": "Search Hacker News for buyer-intent posts and comments (\"looking for\", \"alternative to\", \"recommendations for\") and Show HN founders, returned as leads with author, links, and the product/company URL.",
        "version": "0.1",
        "x-build-id": "GMEubQRqh5o5P3pCt"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/signalengine~hn-lead-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-signalengine-hn-lead-finder",
                "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/signalengine~hn-lead-finder/runs": {
            "post": {
                "operationId": "runs-sync-signalengine-hn-lead-finder",
                "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/signalengine~hn-lead-finder/run-sync": {
            "post": {
                "operationId": "run-sync-signalengine-hn-lead-finder",
                "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": {
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Phrases/keywords to search on HN. Leave empty to use a built-in set of buyer-intent phrases (\"looking for\", \"alternative to\", \"recommendations for\", …).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchIn": {
                        "title": "Search in",
                        "enum": [
                            "story",
                            "ask_hn",
                            "show_hn",
                            "(story,comment)",
                            "comment"
                        ],
                        "type": "string",
                        "description": "Which HN content to search.",
                        "default": "story"
                    },
                    "daysBack": {
                        "title": "Days back",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include items from the last N days (0 = no limit).",
                        "default": 30
                    },
                    "maxLeads": {
                        "title": "Max leads",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stop after this many leads (caps your spend).",
                        "default": 100
                    },
                    "hitsPerQuery": {
                        "title": "Results per query",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "How many results to pull per query (1-1000).",
                        "default": 30
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Parallel queries.",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
