Diagnostiquez et réduisez les taux de rebond d'Apollo.io en enrichissant chaque prospect avec des données de recherche en direct avant l'envoi. Les taux de rebond élevés proviennent généralement de données obsolètes : les gens changent d'emploi, les entreprises changent de nom et les domaines expirent. En exécutant une requête de recherche sur le nom et l'entreprise de chaque prospect avant la prospection, vous pouvez vérifier que la personne y travaille toujours, confirmer que le domaine est actif et trouver des coordonnées mises à jour. Cette étape d'enrichissement prend généralement moins d'une seconde par prospect et peut réduire considérablement les taux de rebond.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Un export de prospects Apollo.io (CSV)
Parcours
Étape 1: Charger les prospects Apollo depuis un CSV
Lire les prospects Apollo exportés et extraire les champs nécessaires à l'enrichissement.
import os, csv, requests, json
API_KEY = os.environ['SCAVIO_API_KEY']
def load_leads(csv_path: str) -> list:
leads = []
with open(csv_path) as f:
reader = csv.DictReader(f)
for row in reader:
leads.append({
'name': row.get('First Name', '') + ' ' + row.get('Last Name', ''),
'company': row.get('Company', ''),
'email': row.get('Email', ''),
'title': row.get('Title', ''),
'domain': row.get('Website', ''),
})
return leads
leads = load_leads('apollo_export.csv')
print(f'Loaded {len(leads)} leads')Étape 2: Enrichir chaque prospect via la recherche
Rechercher chaque prospect par nom et entreprise pour vérifier son poste actuel.
def enrich_lead(lead: dict) -> dict:
query = f"{lead['name']} {lead['company']} LinkedIn"
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=15)
results = resp.json().get('organic_results', [])
enriched = {**lead, 'verified': False, 'search_results': []}
for r in results[:3]:
title = r.get('title', '').lower()
snippet = r.get('snippet', '').lower()
enriched['search_results'].append(r.get('title', ''))
if lead['company'].lower() in title or lead['company'].lower() in snippet:
enriched['verified'] = True
break
return enriched
sample = enrich_lead(leads[0]) if leads else {}
print(f"Verified: {sample.get('verified')}")Étape 3: Valider que le domaine est actif
Vérifier que le domaine de l'entreprise est toujours résolu en le recherchant directement.
def check_domain(domain: str) -> bool:
if not domain:
return False
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': f'site:{domain}'}, timeout=15)
results = resp.json().get('organic_results', [])
return len(results) > 0
def enrich_with_domain(lead: dict) -> dict:
lead['domain_active'] = check_domain(lead.get('domain', ''))
return lead
for lead in leads[:3]:
lead = enrich_with_domain(lead)
print(f"{lead['company']}: domain active = {lead['domain_active']}")Étape 4: Évaluer le risque de rebond
Attribuer un score de risque à chaque prospect en fonction des signaux d'enrichissement.
def bounce_risk(lead: dict) -> str:
score = 0
if not lead.get('verified'):
score += 2
if not lead.get('domain_active'):
score += 3
if not lead.get('email'):
score += 3
if score >= 5:
return 'high'
elif score >= 2:
return 'medium'
return 'low'
def score_leads(leads: list) -> list:
for lead in leads:
enriched = enrich_lead(lead)
enriched = enrich_with_domain(enriched)
enriched['bounce_risk'] = bounce_risk(enriched)
lead.update(enriched)
return leads
scored = score_leads(leads[:5])
for lead in scored:
print(f"{lead['name']} ({lead['company']}): {lead['bounce_risk']} risk")Étape 5: Exporter les prospects nettoyés
Écrire les prospects vérifiés et à faible risque dans un nouveau CSV pour la prospection.
def export_clean(leads: list, output_path: str):
clean = [l for l in leads if l.get('bounce_risk') != 'high']
if not clean:
print('No clean leads found')
return
keys = ['name', 'company', 'email', 'title', 'domain', 'verified', 'domain_active', 'bounce_risk']
with open(output_path, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=keys, extrasaction='ignore')
writer.writeheader()
writer.writerows(clean)
print(f'Exported {len(clean)} clean leads (removed {len(leads) - len(clean)} high-risk)')
export_clean(scored, 'apollo_clean.csv')Exemple Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def verify_lead(name, company):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{name} {company} LinkedIn'}).json()
for r in data.get('organic_results', [])[:3]:
if company.lower() in (r.get('title', '') + r.get('snippet', '')).lower():
return True
return False
print(verify_lead('Jane Doe', 'Acme Corp'))Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function verifyLead(name, company) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: `${name} ${company} LinkedIn`})
});
const results = (await r.json()).organic_results || [];
return results.slice(0, 3).some(r =>
((r.title || '') + (r.snippet || '')).toLowerCase().includes(company.toLowerCase()));
}
verifyLead('Jane Doe', 'Acme Corp').then(console.log);Sortie attendue
A lead enrichment pipeline that verifies Apollo contacts via live search, scores bounce risk, and exports clean leads for outreach with reduced bounce rates.