Automation agencies waste time cold-calling random businesses. A smarter approach: use search data to find businesses actively looking for automation help, complaining about manual processes, or hiring for roles that automation could replace. This tutorial builds a client discovery pipeline that searches Google and Reddit for signals indicating a business needs automation services, at $0.005 per search via the Scavio API.
Prerequisites
- Python 3.9+ installed
- requests library installed
- A Scavio API key from scavio.dev
- A clear niche for your automation agency
Walkthrough
Step 1: Define client discovery queries
Create search queries that reveal businesses needing automation. Job postings for manual roles, Reddit complaints about manual processes, and tool comparison searches all signal opportunity.
import os, requests, time, re
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
URL = 'https://api.scavio.dev/api/v1/search'
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def build_discovery_queries(niche: str) -> list:
return [
# Job postings for manual roles (automation opportunity)
{'query': f'{niche} data entry hiring 2026', 'signal': 'hiring_manual'},
{'query': f'{niche} manual reporting job', 'signal': 'hiring_manual'},
# Reddit pain points
{'query': f'site:reddit.com {niche} spreadsheet nightmare', 'signal': 'pain_point'},
{'query': f'site:reddit.com {niche} automate manual process', 'signal': 'seeking_automation'},
# Tool research (actively looking for solutions)
{'query': f'{niche} automation tools 2026', 'signal': 'tool_research'},
{'query': f'{niche} workflow automation software', 'signal': 'tool_research'},
# Industry-specific
{'query': f'{niche} agency needs automation', 'signal': 'direct_need'},
]
queries = build_discovery_queries('real estate')
for q in queries:
print(f'[{q["signal"]:20s}] {q["query"]}')Step 2: Search and extract prospect signals
Run the discovery queries and extract companies showing automation need. Job boards reveal companies with manual processes, Reddit reveals pain points.
def search_for_prospects(queries: list) -> list:
prospects = []
for q in queries:
resp = requests.post(URL, headers=H,
json={'query': q['query'], 'country_code': 'us', 'num_results': 5})
for r in resp.json().get('organic_results', []):
domain = re.search(r'https?://(?:www\.)?([\w.-]+)', r.get('link', ''))
prospects.append({
'title': r['title'],
'url': r['link'],
'domain': domain.group(1) if domain else '',
'snippet': r.get('snippet', '')[:200],
'signal': q['signal'],
'query': q['query'],
})
time.sleep(0.3)
return prospects
def score_prospects(prospects: list) -> list:
scores = {
'direct_need': 10, 'seeking_automation': 9, 'pain_point': 8,
'hiring_manual': 7, 'tool_research': 5,
}
for p in prospects:
p['score'] = scores.get(p['signal'], 3)
# Boost if snippet mentions specific pain
snippet_lower = p['snippet'].lower()
if any(w in snippet_lower for w in ['manual', 'tedious', 'hours', 'spreadsheet']):
p['score'] += 2
prospects.sort(key=lambda x: x['score'], reverse=True)
return prospects
prospects = search_for_prospects(queries)
scored = score_prospects(prospects)
print(f'Found {len(scored)} prospect signals')
for p in scored[:5]:
print(f' [{p["score"]:2d}] {p["signal"]:20s} | {p["domain"]}')
print(f' {p["title"][:60]}')Step 3: Enrich prospects with company data
Search for each unique company domain to get more context: what they do, their size, and specific automation opportunities.
def enrich_prospect(domain: str) -> dict:
"""Get company details via search."""
resp = requests.post(URL, headers=H,
json={'query': domain, 'country_code': 'us', 'num_results': 3})
data = resp.json()
kg = data.get('knowledge_graph', {})
organic = data.get('organic_results', [])[:2]
return {
'domain': domain,
'description': kg.get('description', organic[0].get('snippet', '') if organic else ''),
'website': kg.get('website', f'https://{domain}'),
'type': kg.get('type', ''),
}
def build_prospect_profiles(scored_prospects: list, max_enrich: int = 10) -> list:
"""Enrich top prospects with company details."""
# Deduplicate by domain
seen = {}
for p in scored_prospects:
d = p['domain']
if d and d not in seen:
seen[d] = p
unique = sorted(seen.values(), key=lambda x: x['score'], reverse=True)[:max_enrich]
profiles = []
for p in unique:
enrichment = enrich_prospect(p['domain'])
p.update(enrichment)
profiles.append(p)
time.sleep(0.3)
return profiles
profiles = build_prospect_profiles(scored)
print(f'\nEnriched {len(profiles)} prospect profiles')
for p in profiles[:5]:
print(f'\n {p["domain"]} (Score: {p["score"]})')
print(f' Signal: {p["signal"]}')
print(f' Description: {p["description"][:80]}')Step 4: Generate outreach context for each prospect
Create personalized outreach talking points based on the specific automation signal detected. Each prospect gets a tailored pitch angle.
import csv
def generate_outreach(profiles: list) -> list:
signal_pitches = {
'hiring_manual': 'You are hiring for manual {niche} roles. Automation could handle this at 10x speed for the cost of one hire.',
'pain_point': 'Your team mentioned struggling with manual processes. We automate exactly this type of workflow.',
'seeking_automation': 'You are actively looking for automation solutions. We specialize in {niche} workflow automation.',
'tool_research': 'You are evaluating automation tools. We build custom solutions that integrate your existing stack.',
'direct_need': 'You have expressed a direct need for automation. We can scope a solution in a 30-minute call.',
}
for p in profiles:
p['pitch'] = signal_pitches.get(p['signal'], 'We help companies automate manual workflows.').format(niche='your')
# Export
with open('agency_prospects.csv', 'w', newline='') as f:
w = csv.DictWriter(f, fieldnames=['domain', 'score', 'signal', 'description', 'pitch', 'url'],
extrasaction='ignore')
w.writeheader()
w.writerows(profiles)
total_searches = len(queries) + len(profiles) # discovery + enrichment
print(f'Exported {len(profiles)} prospects to agency_prospects.csv')
print(f'Total searches: {total_searches}')
print(f'Cost: ${total_searches * 0.005:.3f}')
return profiles
generate_outreach(profiles)Python Example
import os, requests, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def find_clients(niche):
queries = [f'{niche} automate manual process', f'site:reddit.com {niche} spreadsheet help',
f'{niche} automation tools 2026']
leads = []
for q in queries:
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': q, 'country_code': 'us', 'num_results': 5})
for r in resp.json().get('organic_results', []):
leads.append({'title': r['title'], 'url': r['link'], 'query': q})
time.sleep(0.3)
print(f'Found {len(leads)} automation-need signals for {niche}')
print(f'Cost: ${len(queries) * 0.005:.3f}')
for l in leads[:5]:
print(f' {l["title"][:60]}')
find_clients('real estate')JavaScript Example
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function findClients(niche) {
const queries = [`${niche} automate manual process`, `site:reddit.com ${niche} spreadsheet help`,
`${niche} automation tools 2026`];
const leads = [];
for (const q of queries) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: q, country_code: 'us', num_results: 5 })
});
for (const r of ((await resp.json()).organic_results || [])) {
leads.push({ title: r.title, url: r.link, query: q });
}
}
console.log(`Found ${leads.length} signals for ${niche}`);
leads.slice(0, 5).forEach(l => console.log(` ${l.title.slice(0, 60)}`));
}
findClients('real estate');Expected Output
Found 28 prospect signals
[12] hiring_manual | realtycorp.com
Hiring: Data Entry Specialist for Property Listings
[10] seeking_automation | reddit.com
r/realtors - How do you automate listing updates?
Enriched 10 prospect profiles
realtycorp.com (Score: 12)
Signal: hiring_manual
Description: Full-service real estate brokerage with 200+ agents
Exported 10 prospects to agency_prospects.csv
Total searches: 17
Cost: $0.085