Aperçu
Voici le pipeline complet de bout en bout : découvrez les entreprises locales via Google Maps, filtrez celles qui ont des numéros de téléphone, vérifiez les numéros sur les sites web des entreprises à l'aide de l'endpoint Extract, générez des modèles WhatsApp personnalisés et enregistrez la prospection avec un suivi des réponses. Conçu pour les agences de marketing local qui mènent des campagnes de prospection à grande échelle.
Déclencheur
Manuel (exécuté par campagne par lot)
Planification
À la demande (par campagne par lot)
Étapes du workflow
Rechercher des entreprises cibles sur Google Maps
Interroger Scavio avec platform google et type maps pour chaque combinaison catégorie/lieu. Collecter tous les local_results.
Filtrer et dédupliquer
Supprimer les entrées sans numéro de téléphone. Dédupliquer par numéro de téléphone pour éviter de contacter deux fois la même entreprise lors de recherches qui se chevauchent.
Vérifier le téléphone via Extract
Pour chaque prospect avec un site web, appeler l'endpoint Extract de Scavio pour vérifier si le numéro de téléphone apparaît sur le site web de l'entreprise. Marquer comme vérifié ou non vérifié.
Générer des modèles WhatsApp
Créer des modèles de messages personnalisés utilisant le nom de l'entreprise, la catégorie et le lieu. Rester sous 160 caractères. Éviter les déclencheurs de spam.
Exporter vers un outil de prospection
Écrire les prospects vérifiés avec les modèles dans un CSV. Importer dans l'API WhatsApp Business ou un workflow de prospection manuel. Inclure une colonne de suivi pour l'état de la réponse.
Implémentation Python
import requests, os, csv
SCAVIO_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": SCAVIO_KEY}
SEARCHES = [
"dentist Miami FL", "dentist Fort Lauderdale FL",
"plumber Austin TX", "electrician Houston TX"
]
def get_map_leads(query: str) -> list:
resp = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "google", "query": query, "type": "maps"}, timeout=10)
return [r for r in resp.json().get("local_results", []) if r.get("phone")]
def verify_phone(website: str, phone: str) -> bool:
try:
page = requests.post("https://api.scavio.dev/api/v1/extract", headers=H,
json={"url": website}, timeout=15).json()
return phone in page.get("text", "")
except Exception:
return False
all_leads = []
seen_phones = set()
for query in SEARCHES:
for lead in get_map_leads(query):
if lead["phone"] not in seen_phones:
seen_phones.add(lead["phone"])
verified = verify_phone(lead.get("website", ""), lead["phone"]) if lead.get("website") else False
all_leads.append({
"name": lead["title"], "phone": lead["phone"],
"address": lead.get("address", ""), "rating": lead.get("rating", ""),
"verified": verified, "query": query,
"template": f"Hi {lead['title']}, quick question about your online presence?"
})
with open("verified_leads.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=all_leads[0].keys())
w.writeheader()
w.writerows(all_leads)
print(f"Total: {len(all_leads)} leads ({sum(1 for l in all_leads if l['verified'])} verified)")Implémentation JavaScript
const SEARCHES = [
"dentist Miami FL", "dentist Fort Lauderdale FL",
"plumber Austin TX", "electrician Houston TX"
];
async function getMapLeads(query) {
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "google", query, type: "maps" })
});
return ((await resp.json()).local_results || []).filter(r => r.phone);
}
async function verifyPhone(website, phone) {
try {
const page = await fetch("https://api.scavio.dev/api/v1/extract", {
method: "POST",
headers: { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ url: website })
}).then(r => r.json());
return (page.text || "").includes(phone);
} catch { return false; }
}
const allLeads = [];
const seenPhones = new Set();
for (const query of SEARCHES) {
for (const lead of await getMapLeads(query)) {
if (!seenPhones.has(lead.phone)) {
seenPhones.add(lead.phone);
const verified = lead.website ? await verifyPhone(lead.website, lead.phone) : false;
allLeads.push({ name: lead.title, phone: lead.phone, verified,
template: `Hi ${lead.title}, quick question about your online presence?` });
}
}
}
console.log(`Total: ${allLeads.length} leads (${allLeads.filter(l => l.verified).length} verified)`);Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA