Resumen
Este es el full de extremo un extremo pipeline: descubrir local businesses via Google Maps, filtrar for esos con phone numbers, verify numbers contra business sitios web usando el Extraer endpoint, generar personalized WhatsApp plantillas, y registro el outreach con respuesta seguimiento. Designed for local marketing agencies running outreach campanas a escala.
Desencadenador
Manual (ejecutar per campana batch)
Programación
On-demand (per campana batch)
Pasos del flujo de trabajo
Search Google Maps for objetivo businesses
Consulta Scavio con plataforma google y tipo maps for cada categoria/ubicacion combination. Recopilar todos local_results.
Filtrar y deduplicate
Eliminar entradas sin phone numbers. Deduplicate by phone numero to avoid messaging el same business twice a traves de overlapping searches.
Verify phone via Extraer
For cada lead con un sitio web, call Scavio Extraer endpoint to verificar if el phone numero appears on el business sitio web. Mark as verified o unverified.
Generar WhatsApp plantillas
Crear personalized mensaje plantillas usando business nombre, categoria, y ubicacion. Keep bajo 160 characters. Avoid spam activa.
Exportar to outreach herramienta
Escribir verified leads con plantillas to CSV. Importar en WhatsApp Business API o manual outreach flujo de trabajo. Include un seguimiento columna for respuesta estado.
Implementacion en 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)")Implementacion en 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)`);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA