Overview
This workflow discovers new local SMB leads daily by querying Google for service categories across target cities. It extracts business names, ratings, and snippets from local pack results, deduplicates against previously discovered leads, and outputs new leads for sales outreach. Designed for agencies and sales teams targeting local businesses where Apollo coverage is poor.
Trigger
Cron schedule (daily at 9 AM UTC)
Schedule
Runs daily at 9:00 AM UTC
Workflow Steps
Load service categories and cities
Read the target service types and geographic areas to search.
Query local searches
For each service-city combination, query Scavio Google to get local pack results.
Extract business leads
Parse business names, links, ratings, and review snippets from results.
Deduplicate against known leads
Compare against the existing lead database to identify only new businesses.
Output new leads
Write new leads to the CRM or output file for sales team review.
Python Implementation
import requests
import json
from pathlib import Path
API_KEY = "your_scavio_api_key"
def discover_leads(services: list[str], cities: list[str]) -> list[dict]:
seen_path = Path("seen_leads.json")
seen = set(json.loads(seen_path.read_text())) if seen_path.exists() else set()
new_leads = []
for service in services:
for city in cities:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": f"{service} in {city}"},
timeout=15,
)
if not res.ok:
continue
for r in res.json().get("organic", [])[:10]:
link = r.get("link", "")
if link and link not in seen:
seen.add(link)
new_leads.append({
"service": service,
"city": city,
"name": r.get("title", ""),
"link": link,
"snippet": r.get("snippet", ""),
})
seen_path.write_text(json.dumps(list(seen)))
return new_leads
leads = discover_leads(["plumber", "electrician", "hvac"], ["Austin TX", "San Antonio TX"])
print(f"New leads: {len(leads)}")
for lead in leads[:5]:
print(f" [{lead['service']}] {lead['city']}: {lead['name'][:50]}")JavaScript Implementation
const API_KEY = "your_scavio_api_key";
async function discoverLeads(services, cities) {
const seen = new Set();
const leads = [];
for (const svc of services) {
for (const city of cities) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: `${svc} in ${city}` }),
});
if (!res.ok) continue;
for (const r of ((await res.json()).organic ?? []).slice(0, 10)) {
if (r.link && !seen.has(r.link)) {
seen.add(r.link);
leads.push({ service: svc, city, name: r.title ?? "", link: r.link });
}
}
}
}
return leads;
}
const leads = await discoverLeads(["plumber"], ["Austin TX"]);
console.log(`Found ${leads.length} new leads`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews