Prospector
This skill should be used when the user wants to find leads, prospects, or contacts matching their ICP (Ideal Customer Profile). It searches for companies via Exa and enriches contacts via Apollo, out
This skill should be used when the user wants to find leads, prospects, or contacts matching their ICP (Ideal Customer Profile). It searches for companies via Exa and enriches contacts via Apollo, out
Real data. Real impact.
Growing
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Find leads matching your ICP via Exa company search + Apollo contact enrichment.
Run
/prospector:setup first to configure your API keys:
You can also set keys via environment variables:
PROSPECTOR_EXA_API_KEYPROSPECTOR_APOLLO_API_KEYPROSPECTOR_ATTIO_API_KEY (optional)/prospector:setup
Collects and validates API keys, stores securely in
~/.config/prospector/config.json.
/prospector
Asks ICP questions, searches Exa, enriches via Apollo, outputs CSV to Desktop.
When the user invokes
/prospector, follow this workflow:
First, verify env vars or config exist:
python3 -c " import json import os from pathlib import Path config_path = Path.home() / '.config' / 'prospector' / 'config.json' env_exa = bool(os.getenv('PROSPECTOR_EXA_API_KEY')) env_apollo = bool(os.getenv('PROSPECTOR_APOLLO_API_KEY')) env_attio = bool(os.getenv('PROSPECTOR_ATTIO_API_KEY')) if not config_path.exists(): print('NOT_FOUND') else: with open(config_path) as f: config = json.load(f) print('FOUND') print(f'exa: {bool(config.get(\"exa_api_key\"))}') print(f'apollo: {bool(config.get(\"apollo_api_key\"))}') print(f'attio: {bool(config.get(\"attio_api_key\"))}') print(f'env_exa: {env_exa}') print(f'env_apollo: {env_apollo}') print(f'env_attio: {env_attio}') "
If NOT_FOUND and env vars are not set, tell user to run
/prospector:setup first.
Use AskUserQuestion to collect ICP criteria in order:
Question 1: Industry
header: "Industry" question: "What industry are you targeting?" options: - label: "SaaS" description: "Software as a Service companies" - label: "Fintech" description: "Financial technology companies" - label: "Healthcare" description: "Healthcare and health tech" - label: "E-commerce" description: "Online retail and marketplaces" - label: "AI/ML" description: "Artificial intelligence and machine learning" - label: "Any" description: "No industry filter" multiSelect: false
Question 2: Company Size
header: "Size" question: "What company size are you targeting?" options: - label: "1-10" description: "Early stage startups" - label: "11-50" description: "Seed to Series A" - label: "51-200" description: "Series A to B" - label: "201-500" description: "Growth stage" - label: "500+" description: "Enterprise" - label: "Any" description: "No size filter" multiSelect: false
Question 3: Funding Stage
header: "Funding" question: "What funding stage are you targeting?" options: - label: "Pre-seed" description: "Pre-product market fit" - label: "Seed" description: "Building initial product" - label: "Series A" description: "Scaling product" - label: "Series B+" description: "Growth and expansion" - label: "Any" description: "No funding filter" multiSelect: false
Question 4: Geography
header: "Geography" question: "What geography are you targeting?" options: - label: "United States" description: "US-based companies" - label: "Europe" description: "European companies" - label: "Global" description: "Worldwide" - label: "Any" description: "No geography filter" multiSelect: false
Question 5: Keywords (optional)
header: "Keywords" question: "Any specific keywords that should appear in company descriptions? (optional)" options: - label: "Skip" description: "No keyword filter" - label: "Enter keywords" description: "I'll type specific keywords" multiSelect: false
If "Enter keywords", ask for the text input.
Question 6: Contact Count
header: "Count" question: "How many contacts do you want to find?" options: - label: "25" description: "Quick search, lower API usage" - label: "50" description: "Balanced (recommended)" - label: "100" description: "Larger batch, more API usage" multiSelect: false
Execute the Python script with the collected ICP:
cd [skill_directory]/scripts python3 -c " from prospector import run_search, export_csv, Configicp = { 'industry': '[INDUSTRY]', 'company_size': '[SIZE]', 'funding_stage': '[FUNDING]', 'geography': '[GEOGRAPHY]', 'keywords': '[KEYWORDS or empty string]' }
leads = run_search(icp, num_contacts=[COUNT]) if leads: path = export_csv(leads) print(f'SUCCESS: {len(leads)} leads saved to {path}') else: print('NO_RESULTS: No leads found matching criteria') "
Replace placeholders with actual values from questions.
If Attio is configured and leads were found, ask:
header: "Attio" question: "Sync leads to Attio CRM?" options: - label: "Yes" description: "Sync companies and contacts to Attio" - label: "No" description: "Just keep the CSV" multiSelect: false
If yes:
cd [skill_directory]/scripts python3 -c " from prospector import sync_to_attio, Config, Lead import jsonLoad leads from the CSV we just created (or pass them directly)
For simplicity, re-run with sync
leads = [...] # Pass leads from previous step
companies, people = sync_to_attio(leads) print(f'SYNCED: {companies} companies, {people} contacts') "
Tell the user:
/prospector:setupNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.