KOL Discovery Engine
Kol discovery

Find Key Opinion Leaders (KOLs) in a given domain by combining web research with LinkedIn post search. Given a company/idea and target domain, generates authority keywords, searches LinkedIn posts to find prolific authors with high…
--- name: kol-discovery description: > Find Key Opinion Leaders (KOLs) in a given domain by combining web research with LinkedIn post search. Given a company/idea and target domain, generates authority keywords, searches LinkedIn posts to find prolific authors with high engagement, and merges with web-researched influencers. Use when someone wants to "find influencers in X space" or "who are the KOLs for Y industry." tags: [outreach] --- # KOL Discovery Find Key Opinion Leaders in any domain by searching LinkedIn posts for prolific, high-engagement authors and merging with web-researched influencers. **Core principle:** Search for **authority/thought-leadership keywords**, not pain-language. We want people who shape conversation in the space — conference speakers, newsletter writers, podcast hosts, and prolific LinkedIn posters. ## Phase 0: Intake
Overview
Find Key Opinion Leaders in any domain by searching LinkedIn posts for prolific, high-engagement authors and merging with web-researched influencers.
Manual install (npx, ZIP)
npx skills add gooseworks-ai/goose-skills --skill kol-discovery -g -a claude-codemkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/gooseworks-ai/goose-skills/tar.gz/615c685f34f8 \
| tar -xz -C ~/.claude/skills --strip-components=4 goose-skills-615c685f34f8/skills/social/capabilities/kol-discoveryNew-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/6629016e20fbc2b7265d/kol-discovery.zip" -OutFile "$env:TEMP\kol-discovery.zip"; Expand-Archive "$env:TEMP\kol-discovery.zip" -DestinationPath "$HOME\.claude\skills" -ForceConnects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md6.1 KBskill.meta.json286 Bscripts/1 file · 22.3 KB
Read the files here
Show the full text167 lines
KOL Discovery
Find Key Opinion Leaders in any domain by searching LinkedIn posts for prolific, high-engagement authors and merging with web-researched influencers.
Core principle: Search for authority/thought-leadership keywords, not pain-language. We want people who shape conversation in the space — conference speakers, newsletter writers, podcast hosts, and prolific LinkedIn posters.
Phase 0: Intake
Ask the user these questions:
Domain & Audience
- What does your company/product do? What space are you in?
- What specific domain or topic are the KOLs you want to find expert in?
- Who is your target audience? (The people the KOLs influence)
- Any KOLs you already know about? (LinkedIn URLs — these become the baseline)
- Anyone to EXCLUDE? (Competitors, your own team, irrelevant voices)
Phase 1: Generate Domain Keywords
Based on intake, generate 15-25 topic/authority keywords. These are NOT pain-language — they're the terms thought leaders use when sharing expertise:
- Industry terms — "freight tech", "supply chain innovation"
- Thought leadership signals — "lessons learned in logistics", "future of dispatch"
- Conference/event terms — "supply chain summit keynote"
- Content creator signals — "newsletter freight", "podcast logistics"
Also generate:
- KOL title keywords — titles that signal thought leadership (vp, founder, analyst, editor, host)
- Vendor exclusion keywords — titles to filter out (software engineer, recruiter, saas)
- Domain relevance keywords — core industry terms for relevance scoring
Present keywords to user for approval before running.
Save config in the current working directory or wherever the user prefers:
Config JSON structure:
{
"client_name": "example",
"domain_keywords": ["\"freight tech\" thought leadership", "supply chain innovation"],
"exclusion_patterns": ["hiring.*position", "we.re recruiting"],
"kol_title_keywords": ["vp", "founder", "analyst", "editor", "host"],
"vendor_exclude_keywords": ["software engineer", "saas", "recruiter"],
"domain_relevance_keywords": ["freight", "logistics", "supply chain"],
"country_filter": "",
"max_posts_per_keyword": 50,
"min_posts": 2,
"min_total_engagement": 50,
"top_n_kols": 50
}
Phase 2: Run KOL Discovery Pipeline
python3 skills/kol-discovery/scripts/kol_discovery.py \
--config kol-discovery.json \
--output-dir . \
[--test] [--web-kols kol-web-kols.json] [--yes]
Flags:
--config(required) — path to client config JSON--output-dir— directory for output CSV (default: current working directory)--test— limit to 5 keywords (validation run)--web-kols— path to web-researched KOL JSON (agent generates this)--yes— skip cost confirmation prompts--max-runs— override Apify run limit
What the script does:
- Keyword search —
apimaestro/linkedin-posts-search-scraper-no-cookiesfor each domain keyword - Author aggregation — Group posts by author, compute engagement metrics
- Scoring — Composite KOL score: engagement volume (log-scaled) + consistency (post count) + quality (avg engagement) + relevance (keyword breadth) + web research bonus
- Merge — Combine post-data KOLs with web-researched KOLs, flag overlaps
- Export — Ranked CSV
Cost estimate: ~$0.10 per keyword. Full run with 20 keywords: ~$2-3.
Always run with --test first.
Phase 2b: Web Research (Agent-Driven)
Before or alongside the script, do web research to find known KOLs:
- Search for "top [industry] influencers on LinkedIn"
- Find conference speakers, newsletter authors, podcast hosts
- Check industry publications for frequent contributors
Save as JSON in the current working directory:
[
{
"name": "Jane Doe",
"linkedin_url": "https://www.linkedin.com/in/janedoe/",
"source": "FreightWaves conference speaker 2025",
"notes": "Hosts weekly logistics podcast"
}
]
Pass to script via --web-kols.
Phase 3: Review & Refine
Present results:
- Top 20 KOLs — rank, name, headline, KOL score, total engagement, top post
- Source breakdown — how many from post-data vs web-research vs both
- Keyword performance — which keywords surfaced the most KOLs
Common adjustments:
- Too many irrelevant authors — refine domain keywords, add exclusion patterns
- Missing known KOLs — add more keyword variants, expand web research
- Too few results — lower
min_postsormin_total_engagementthresholds
Phase 4: Output
CSV exported to the current working directory:
| Column | Description |
|---|---|
| Rank | Overall rank by KOL Score |
| Name | Full name |
| LinkedIn URL | Profile link |
| Headline | From LinkedIn |
| KOL Score | Composite score |
| Total Posts | Posts found in search |
| Total Reactions | Sum of reactions across posts |
| Total Comments | Sum of comments across posts |
| Avg Engagement | Average reactions+comments per post |
| Top Post URL | Highest engagement post |
| Top Post Preview | First 100 chars of top post |
| Source | post-data / web-research / both |
Tools Required
- Apify API token — set as
APIFY_API_TOKENin.env - Apify actors used:
apimaestro/linkedin-posts-search-scraper-no-cookies(keyword search)
Example Usage
Trigger phrases:
- "Find KOLs in the freight/logistics space"
- "Who are the influencers in [industry]?"
- "Discover thought leaders for [domain]"
- "Run KOL discovery for [client]"
With existing config:
python3 skills/kol-discovery/scripts/kol_discovery.py \
--config clients/example/configs/kol-discovery.json \
--output-dir clients/example/leads --yes
| 1 | |
| 2 | name kol-discovery |
| 3 | description > |
| 4 | Find Key Opinion Leaders (KOLs) in a given domain by combining web research |
| 5 | with LinkedIn post search. Given a company/idea and target domain, generates |
| 6 | authority keywords, searches LinkedIn posts to find prolific authors with |
| 7 | high engagement, and merges with web-researched influencers. Use when someone |
| 8 | wants to "find influencers in X space" or "who are the KOLs for Y industry." |
| 9 | tags [outreach] |
| 10 | |
| 11 | |
| 12 | # KOL Discovery |
| 13 | |
| 14 | Find Key Opinion Leaders in any domain by searching LinkedIn posts for prolific, high-engagement authors and merging with web-researched influencers. |
| 15 | |
| 16 | **Core principle:** Search for **authority/thought-leadership keywords**, not pain-language. We want people who shape conversation in the space — conference speakers, newsletter writers, podcast hosts, and prolific LinkedIn posters. |
| 17 | |
| 18 | ## Phase 0: Intake |
| 19 | |
| 20 | Ask the user these questions: |
| 21 | |
| 22 | ### Domain & Audience |
| 23 | |
| 24 | What does your company/product do? What space are you in? |
| 25 | What specific domain or topic are the KOLs you want to find expert in? |
| 26 | Who is your target audience? (The people the KOLs influence) |
| 27 | Any KOLs you already know about? (LinkedIn URLs — these become the baseline) |
| 28 | Anyone to EXCLUDE? (Competitors, your own team, irrelevant voices) |
| 29 | |
| 30 | ## Phase 1: Generate Domain Keywords |
| 31 | |
| 32 | Based on intake, generate 15-25 topic/authority keywords. These are NOT pain-language — they're the terms thought leaders use when sharing expertise: |
| 33 | |
| 34 | **Industry terms** — "freight tech", "supply chain innovation" |
| 35 | **Thought leadership signals** — "lessons learned in logistics", "future of dispatch" |
| 36 | **Conference/event terms** — "supply chain summit keynote" |
| 37 | **Content creator signals** — "newsletter freight", "podcast logistics" |
| 38 | |
| 39 | Also generate: |
| 40 | **KOL title keywords** — titles that signal thought leadership (vp, founder, analyst, editor, host) |
| 41 | **Vendor exclusion keywords** — titles to filter out (software engineer, recruiter, saas) |
| 42 | **Domain relevance keywords** — core industry terms for relevance scoring |
| 43 | |
| 44 | **Present keywords to user for approval before running.** |
| 45 | |
| 46 | Save config in the current working directory or wherever the user prefers: |
| 47 | |
| 48 | Config JSON structure: |
| 49 | |
| 50 | { |
| 51 | "client_name": "example", |
| 52 | "domain_keywords": ["\"freight tech\" thought leadership", "supply chain innovation"], |
| 53 | "exclusion_patterns": ["hiring.*position", "we.re recruiting"], |
| 54 | "kol_title_keywords": ["vp", "founder", "analyst", "editor", "host"], |
| 55 | "vendor_exclude_keywords": ["software engineer", "saas", "recruiter"], |
| 56 | "domain_relevance_keywords": ["freight", "logistics", "supply chain"], |
| 57 | "country_filter": "", |
| 58 | "max_posts_per_keyword": 50, |
| 59 | "min_posts": 2, |
| 60 | "min_total_engagement": 50, |
| 61 | "top_n_kols": 50 |
| 62 | } |
| 63 | |
| 64 | |
| 65 | ## Phase 2: Run KOL Discovery Pipeline |
| 66 | |
| 67 | |
| 68 | python3 skills/kol-discovery/scripts/kol_discovery.py \ |
| 69 | --config kol-discovery.json \ |
| 70 | --output-dir . \ |
| 71 | [--test] [--web-kols kol-web-kols.json] [--yes] |
| 72 | |
| 73 | |
| 74 | **Flags:** |
| 75 | `--config` (required) — path to client config JSON |
| 76 | `--output-dir` — directory for output CSV (default: current working directory) |
| 77 | `--test` — limit to 5 keywords (validation run) |
| 78 | `--web-kols` — path to web-researched KOL JSON (agent generates this) |
| 79 | `--yes` — skip cost confirmation prompts |
| 80 | `--max-runs` — override Apify run limit |
| 81 | |
| 82 | **What the script does:** |
| 83 | |
| 84 | **Keyword search** — `apimaestro/linkedin-posts-search-scraper-no-cookies` for each domain keyword |
| 85 | **Author aggregation** — Group posts by author, compute engagement metrics |
| 86 | **Scoring** — Composite KOL score: engagement volume (log-scaled) + consistency (post count) + quality (avg engagement) + relevance (keyword breadth) + web research bonus |
| 87 | **Merge** — Combine post-data KOLs with web-researched KOLs, flag overlaps |
| 88 | **Export** — Ranked CSV |
| 89 | |
| 90 | **Cost estimate:** ~$0.10 per keyword. Full run with 20 keywords: ~$2-3. |
| 91 | |
| 92 | **Always run with `--test` first.** |
| 93 | |
| 94 | ## Phase 2b: Web Research (Agent-Driven) |
| 95 | |
| 96 | Before or alongside the script, do web research to find known KOLs: |
| 97 | Search for "top [industry] influencers on LinkedIn" |
| 98 | Find conference speakers, newsletter authors, podcast hosts |
| 99 | Check industry publications for frequent contributors |
| 100 | |
| 101 | Save as JSON in the current working directory: |
| 102 | |
| 103 | |
| 104 | [ |
| 105 | { |
| 106 | "name": "Jane Doe", |
| 107 | "linkedin_url": "https://www.linkedin.com/in/janedoe/", |
| 108 | "source": "FreightWaves conference speaker 2025", |
| 109 | "notes": "Hosts weekly logistics podcast" |
| 110 | } |
| 111 | ] |
| 112 | |
| 113 | |
| 114 | Pass to script via `--web-kols`. |
| 115 | |
| 116 | ## Phase 3: Review & Refine |
| 117 | |
| 118 | Present results: |
| 119 | **Top 20 KOLs** — rank, name, headline, KOL score, total engagement, top post |
| 120 | **Source breakdown** — how many from post-data vs web-research vs both |
| 121 | **Keyword performance** — which keywords surfaced the most KOLs |
| 122 | |
| 123 | Common adjustments: |
| 124 | **Too many irrelevant authors** — refine domain keywords, add exclusion patterns |
| 125 | **Missing known KOLs** — add more keyword variants, expand web research |
| 126 | **Too few results** — lower `min_posts` or `min_total_engagement` thresholds |
| 127 | |
| 128 | ## Phase 4: Output |
| 129 | |
| 130 | CSV exported to the current working directory: |
| 131 | |
| 132 | | Column | Description | |
| 133 | |--------|-------------| |
| 134 | | Rank | Overall rank by KOL Score | |
| 135 | | Name | Full name | |
| 136 | | LinkedIn URL | Profile link | |
| 137 | | Headline | From LinkedIn | |
| 138 | | KOL Score | Composite score | |
| 139 | | Total Posts | Posts found in search | |
| 140 | | Total Reactions | Sum of reactions across posts | |
| 141 | | Total Comments | Sum of comments across posts | |
| 142 | | Avg Engagement | Average reactions+comments per post | |
| 143 | | Top Post URL | Highest engagement post | |
| 144 | | Top Post Preview | First 100 chars of top post | |
| 145 | | Source | post-data / web-research / both | |
| 146 | |
| 147 | ## Tools Required |
| 148 | |
| 149 | **Apify API token** — set as `APIFY_API_TOKEN` in `.env` |
| 150 | **Apify actors used:** |
| 151 | `apimaestro/linkedin-posts-search-scraper-no-cookies` (keyword search) |
| 152 | |
| 153 | ## Example Usage |
| 154 | |
| 155 | **Trigger phrases:** |
| 156 | "Find KOLs in the freight/logistics space" |
| 157 | "Who are the influencers in [industry]?" |
| 158 | "Discover thought leaders for [domain]" |
| 159 | "Run KOL discovery for [client]" |
| 160 | |
| 161 | **With existing config:** |
| 162 | |
| 163 | python3 skills/kol-discovery/scripts/kol_discovery.py \ |
| 164 | --config clients/example/configs/kol-discovery.json \ |
| 165 | --output-dir clients/example/leads --yes |
| 166 | |
| 167 |
Details
- Updated
- Sep 21, 2026
- License
- MIT
- Stars on the repo
- ★ 1,220
- Checked
- Source
- gooseworks-ai/goose-skills ↗
- Creator
- gooseworks-ai · 205 listings
Similar skills
See all →
SkillCompany Firmographic Research
SkillPeople Search Engine
SkillApollo Lead Discovery
SkillDecision-Maker Finder
SkillCompany Funding Search
SkillCompany Intelligence ReportsMore from gooseworks-ai
SkillAd Angle Miner
SkillAd Campaign Analyzer
SkillLead Quality Analyzer
SkillMessage Match Auditor
SkillAI Search Visibility
SkillAmazon Product Search