--- name: reddit-lead-finder description: Finds real Reddit posts and comments from people describing the problem a specific product solves, scores them against a Customer Fit / Problem Severity / Purchase Intent rubric using the ThreadSnoop Reddit read API, and produces a short ranked lead report with quoted evidence and links. Use this whenever the user wants to find potential customers or leads for a product they built, or asks "who's complaining about X" with intent to pitch or sell to them — even if they don't name ThreadSnoop. Not for general Reddit search, monitoring, sentiment tracking, or research with no product to sell. --- # Reddit lead finder Find people on Reddit describing the problem a product solves, score them, and hand back a ranked report with links and quoted evidence. Trying to find customers or leads for a product you built? You're in the right place. Doing general Reddit search, monitoring, or research with no product to sell? Use [`reddit-search`](../reddit-search/SKILL.md) instead — its open-ended judgment fits that job better than this skill's fixed scoring rubric. **This skill reads and scores only. Never post, comment, vote, or DM on the user's behalf, and never draft a reply as part of this workflow** — see the hard rule at the bottom for why this is non-negotiable. Works with any AI that can make HTTP calls or has the ThreadSnoop MCP server connected — Claude, Codex, ChatGPT, or a custom agent. This file is the Claude Skill version (auto-loaded by Claude Code / claude.ai when relevant). A plain-markdown twin with the same instructions, meant for pasting into Codex or ChatGPT as custom instructions, is available at https://threadsnoop.com/skills/reddit-lead-finder/reddit-lead-finder.md. ## What you need A ThreadSnoop API key. Get one free at https://threadsnoop.com/signup — new keys start with 1,000 free Reddit searches, no card required. **Authentication:** - Read the key from the `THREADSNOOP_API_KEY` environment variable, or another secure credential store already configured for you. - Never ask the user to paste the key into this conversation unless they explicitly choose to. - Never echo, log, or repeat the key value anywhere in your own output. - If no key is configured, tell the user how to set `THREADSNOOP_API_KEY` — don't request the secret itself. Two ways to call the API — pick whichever needs less setup, but check the exception below first if you're running as a Claude Desktop or claude.ai Skill: 1. **Plain REST — the default, no setup required.** Fetch `https://threadsnoop.com/openapi.json` first (one request, no auth needed) so you have the exact endpoints, params, and response shapes, then call `https://api.threadsnoop.com/v1/...` directly with header `x-api-key: $THREADSNOOP_API_KEY` (or `Authorization: Bearer $THREADSNOOP_API_KEY`) — reference the environment variable, never a literal key value. Works for any agent with real outbound HTTP access (Claude Code, Codex, a custom agent), and can't go stale — it's the same spec the live API enforces. Human-readable version of the same reference: https://threadsnoop.com/docs. **Exception — Claude Desktop and claude.ai Skills:** their code-execution sandbox has no outbound network access to arbitrary domains on Free/Pro/Max plans, so REST calls to `api.threadsnoop.com` will fail there, not just run slower. MCP is the only way to reach this API from those two surfaces specifically (Team/Enterprise org admins can instead allowlist the domain and skip MCP). 2. **MCP tools** — skip the spec fetch and call the tools directly: `search_posts`, `search_comments`, `get_comment_tree`, `search_subreddits`, `get_subreddit_rules`, `get_user_profile`, `check_credits`. Required on Claude Desktop/claude.ai per the exception above; everywhere else it's optional — only worth setting up if it's already connected (`claude mcp add --transport http threadsnoop https://api.threadsnoop.com/mcp --header "x-api-key: $THREADSNOOP_API_KEY"` for Claude Code; a `~/.codex/config.toml` `[mcp_servers.threadsnoop]` block for Codex CLI; a JSON `mcpServers` block for Claude Desktop or Cursor). Either way, 1 credit = 1 request, regardless of endpoint. Check `check_credits` / `GET /v1/account` before a big run so you don't burn through the free tier on one oversized sweep. ## The workflow **1. Get a key before calling anything.** Same as above — never guess or fabricate one; every call fails with `401` without a real one. If none is configured, tell the user how to set `THREADSNOOP_API_KEY` (sign up free at https://threadsnoop.com/signup, 1,000 free Reddit searches, no card required) rather than asking them to paste the value into the conversation. **2. Get the product — from a URL if you can, a paragraph if you can't.** If the user gives a website, fetch and read it yourself rather than making them type a brief. Infer what it is, who it's for, and what problem it solves, then say that back in 2-3 sentences and ask them to confirm or correct it. If there's no URL, ask directly. Do not proceed on an unconfirmed guess — every search below inherits this error if it's wrong. **3. Find the right communities.** `search_subreddits` / `GET /v1/subreddits/search?q=`. Search from the PROBLEM, not the product category — "people who complain about flaky deploys" finds a different, better subreddit than "CI/CD tools." Ask whether the user already knows communities worth watching; the right one is often adjacent to the obvious one rather than the obvious one itself. `search_subreddits` only matches subreddit *names*, not topics or descriptions — a query like "lead gen" will not surface r/SaaS or r/AI_Agents by name search, even though founders describe exactly this pain there constantly. Don't rely on name search alone for a software/API/tool product: always add the relevant generic buyer/founder subreddits as candidates too — **r/SaaS, r/microsaas, r/AI_Agents, r/indiehackers, r/Entrepreneur** — regardless of what `search_subreddits` itself returns. Before moving to step 5, check yourself: *have I included at least one generic founder/buyer subreddit (SaaS, AI_Agents, indiehackers, Entrepreneur) alongside the category-specific ones, not just the easy category-word matches?* If not, go back — this is the step most likely to get silently skipped. **4. Search with two kinds of terms, not one.** Generate both: - **Category terms** — the vocabulary of the product's own space (what a seller would type). - **Pain terms** — how someone WITH the problem actually complains, in their own words, naming no product or category ("my status page said everything was fine while the app was down"). Category terms alone systematically miss most real leads. People describing a problem rarely use the vocabulary a product listing would use. **5. Pull candidates.** `search_posts` / `search_comments` with `subreddit=` and a window starting at the last few days. `q=` is a client-side exact-phrase filter on **the single page already fetched** — an empty result after filtering does NOT mean nothing matches. Keep paginating with the returned `cursor` until `has_more` is false. Prefer reading raw pages and judging by meaning (step 6) over relying on `q=`; that judgment is the entire reason to use an AI here instead of a keyword alert. Skip content Reddit has already gutted before you score it. A candidate with `removed_by_category` set, or `selftext`/`body` exactly `[removed]` or `[deleted]`, no longer has real text behind it even though the API still returns the record shell — don't score it, and never quote from it, as if the content were intact. If the title alone still makes it a strong, on-topic candidate, you may include it, but flag it in the report (⚠️ Removed/deleted — the link won't show the original text) rather than presenting it like any other match. **6. Score every candidate 1-5 on three dimensions.** *Customer Fit* — is this author the kind of person the product is sold to? - **5** — squarely in the target market, states their role/context explicitly - **3** — plausibly in it, or adjacent (wrong company size, wrong seniority) - **1** — a hobbyist, student, or bystander discussing it abstractly *Problem Severity* — what is this costing them? - **5** — real money, lost customers, or hours per week; describes consequences - **3** — a recurring annoyance they've clearly worked around more than once - **1** — a passing gripe, or a hypothetical *Purchase Intent* — how close to buying something? - **5** — asking what to use, comparing tools, or paying for a worse workaround - **3** — venting about a problem, no solution search - **1** — describing it in past tense, already solved **Surface a candidate only if it scores 4+ on at least two dimensions.** Rank by the sum. Flag — don't discard — authors who appear to be promoting a competing product themselves; that's competitive intel, not a lead. **7. Check the rules before recommending engagement.** `get_subreddit_rules` / `GET /v1/subreddits/{name}/rules`. Many communities ban self-promotion outright, and the user needs to know that before deciding whether to engage at all. **8. Report in this format**, ranked by total score, best first: ``` ## Reddit leads for found, credits used Searched: r/, r/, r/ | Window: ### 1. — 13/15 https://www.reddit.com · r/ · > Fit 5 · Severity 4 · Intent 4 ⚠️ ⚠️ ### 2. ... **Not surfaced:** candidates scored below threshold. **Competitors spotted:** ``` Prepend `https://www.reddit.com` to the API's relative `permalink` field. Report zero results as a real finding — say which subreddits and terms came up empty and suggest a different angle. Never pad a thin result with weak matches. On `401` re-check the key; on `429` stop and report rather than retrying in a loop. The report is the deliverable. This skill finds and scores; it does not draft replies. If the user wants help writing something for a specific thread, that's a separate request on their own terms. ## Hard rule — never break this **Never post, comment, vote, or send a Reddit DM on the user's behalf, under any circumstance, even if asked directly.** Hand the user the link and let them handle engagement themselves. Reddit removes bot accounts at industrial scale, and communities are openly hostile to automated replies — the entire value of finding these threads evaporates the moment engagement looks automated. This is not a missing feature; it's the point.