Enrich cold email prospects by loading a CSV of target domains, searching Google for each company's recent activity, parsing signals like funding rounds, tech stack mentions, hiring pages, and news coverage, scoring each prospect by signal strength, and exporting an enriched CSV ready for outreach. Generic cold emails get ignored. Enriched emails that reference a company's recent funding round or tech stack choice convert at 3-5x the rate. This pipeline automates the research step that sales reps do manually.
Prerequisites
- Python 3.8+ installed
- requests library installed
- A Scavio API key from scavio.dev
- A CSV file with prospect domains or company names
Walkthrough
Step 1: Load the prospect CSV
Read the prospect list and prepare it for enrichment.
import os, requests, csv, json
API_KEY = os.environ['SCAVIO_API_KEY']
def load_prospects(csv_path: str) -> list:
prospects = []
with open(csv_path) as f:
reader = csv.DictReader(f)
for row in reader:
prospects.append({
'company': row.get('company', row.get('name', '')),
'domain': row.get('domain', row.get('website', '')),
'email': row.get('email', ''),
})
return prospects
# Demo data
prospects = [
{'company': 'Acme Corp', 'domain': 'acme.com', 'email': 'cto@acme.com'},
{'company': 'Beta Labs', 'domain': 'betalabs.io', 'email': 'founder@betalabs.io'},
]
print(f'Loaded {len(prospects)} prospects')Step 2: Search each domain for signals
Run targeted Google searches for each prospect to find funding, hiring, tech stack, and news signals.
SIGNAL_QUERIES = [
('{company} funding round 2026', 'funding'),
('{company} hiring engineers 2026', 'hiring'),
('{company} tech stack', 'tech_stack'),
('{company} news 2026', 'news'),
]
def search_signals(company: str) -> dict:
signals = {}
for query_template, signal_type in SIGNAL_QUERIES:
query = query_template.format(company=company)
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=10)
results = resp.json().get('organic_results', [])[:3]
signals[signal_type] = [{
'title': r.get('title', ''),
'snippet': r.get('snippet', ''),
'url': r.get('link', ''),
} for r in results]
return signals
signals = search_signals('Vercel')
for sig_type, results in signals.items():
print(f'{sig_type}: {len(results)} results')Step 3: Parse and extract key signals
Extract meaningful signals from search results: funding amounts, tech mentions, and hiring indicators.
import re
def parse_signals(raw_signals: dict) -> dict:
parsed = {'funding': '', 'hiring': False, 'tech_stack': [], 'recent_news': ''}
# Funding
for r in raw_signals.get('funding', []):
text = f"{r['title']} {r['snippet']}"
amounts = re.findall(r'\$[\d.]+[MBK]', text)
if amounts:
parsed['funding'] = amounts[0]
break
# Hiring
for r in raw_signals.get('hiring', []):
text = f"{r['title']} {r['snippet']}".lower()
if any(w in text for w in ['hiring', 'open position', 'join our team', 'careers']):
parsed['hiring'] = True
break
# Tech stack
tech_keywords = ['react', 'python', 'node', 'aws', 'gcp', 'kubernetes', 'typescript', 'go', 'rust']
for r in raw_signals.get('tech_stack', []):
text = f"{r['title']} {r['snippet']}".lower()
for tech in tech_keywords:
if tech in text and tech not in parsed['tech_stack']:
parsed['tech_stack'].append(tech)
# News
if raw_signals.get('news'):
parsed['recent_news'] = raw_signals['news'][0].get('title', '')
return parsed
parsed = parse_signals(signals)
print(json.dumps(parsed, indent=2))Step 4: Score each prospect
Assign a signal score to each prospect based on the richness of data found.
def score_prospect(parsed_signals: dict) -> int:
score = 0
if parsed_signals.get('funding'):
score += 3 # Strong buy signal
if parsed_signals.get('hiring'):
score += 2 # Growth signal
if len(parsed_signals.get('tech_stack', [])) >= 2:
score += 2 # Tech-aware prospect
if parsed_signals.get('recent_news'):
score += 1 # Active company
return score
def enrich_prospects(prospects: list) -> list:
enriched = []
for p in prospects:
signals = search_signals(p['company'])
parsed = parse_signals(signals)
score = score_prospect(parsed)
enriched.append({**p, **parsed, 'score': score})
print(f"{p['company']}: score={score}")
enriched.sort(key=lambda x: x['score'], reverse=True)
return enriched
enriched = enrich_prospects(prospects)
for e in enriched:
print(f" {e['company']}: score={e['score']}, funding={e.get('funding', 'N/A')}")Step 5: Export enriched CSV
Write the enriched prospect data to a new CSV ready for import into your outreach tool.
def export_enriched(enriched: list, output_path: str = 'enriched_prospects.csv'):
if not enriched:
print('No prospects to export')
return
fieldnames = ['company', 'domain', 'email', 'score', 'funding', 'hiring', 'tech_stack', 'recent_news']
with open(output_path, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction='ignore')
writer.writeheader()
for e in enriched:
row = {**e}
row['tech_stack'] = ', '.join(e.get('tech_stack', []))
writer.writerow(row)
print(f'Exported {len(enriched)} enriched prospects to {output_path}')
export_enriched(enriched)Python Example
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def enrich(company):
signals = {}
for q in [f'{company} funding 2026', f'{company} tech stack']:
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': q}).json()
signals[q] = [r.get('snippet', '')[:100] for r in data.get('organic_results', [])[:2]]
return signals
print(enrich('Vercel'))JavaScript Example
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function enrich(company) {
const signals = {};
for (const q of [`${company} funding 2026`, `${company} tech stack`]) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query: q})
});
signals[q] = ((await r.json()).organic_results || []).slice(0, 2).map(r => r.snippet?.slice(0, 100));
}
return signals;
}
enrich('Vercel').then(console.log);Expected Output
An enriched prospect CSV with funding signals, hiring indicators, tech stack mentions, and recent news for each company, scored and sorted by signal strength.