Les agences d'automatisation perdent du temps à faire du démarchage téléphonique auprès d'entreprises aléatoires. Une approche plus intelligente : utiliser les données de recherche pour trouver des entreprises qui cherchent activement de l'aide en automatisation, qui se plaignent de processus manuels, ou qui embauchent pour des postes que l'automatisation pourrait remplacer. Ce tutoriel construit un pipeline de découverte de clients qui interroge Google et Reddit pour détecter des signaux indiquant qu'une entreprise a besoin de services d'automatisation, à $0.005 par recherche via l'API Scavio.
Prérequis
- Python 3.9+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Un créneau clair pour votre agence d'automatisation
Parcours
Étape 1: Définir les requêtes de découverte de clients
Créez des requêtes de recherche qui révèlent des entreprises ayant besoin d'automatisation. Les offres d'emploi pour des postes manuels, les plaintes sur Reddit concernant des processus manuels et les recherches de comparaison d'outils sont autant de signaux d'opportunité.
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"]}')Étape 2: Rechercher et extraire les signaux de prospects
Exécutez les requêtes de découverte et extrayez les entreprises qui montrent un besoin d'automatisation. Les sites d'emploi révèlent les entreprises ayant des processus manuels, Reddit révèle les points douloureux.
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]}')Étape 3: Enrichir les prospects avec des données d'entreprise
Recherchez chaque domaine d'entreprise unique pour obtenir plus de contexte : ce qu'ils font, leur taille et les opportunités d'automatisation spécifiques.
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]}')Étape 4: Générer un contexte de prospection pour chaque prospect
Créez des points de discussion de prospection personnalisés basés sur le signal d'automatisation spécifique détecté. Chaque prospect reçoit un angle d'approche sur mesure.
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)Exemple Python
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')Exemple JavaScript
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');Sortie attendue
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.085Tutoriels associés
- Comment construire un pipeline de leads basé sur l'intention avec des données de recherche
- Comment construire une couche d'enrichissement B2B sans le verrouillage Apollo
- Comment enrichir des leads avec les données de recherche Google pour le cold email
- Comment extraire des données d'entreprise locale sans code