Overview
Local lead lists live in Google Maps: names, websites, phone numbers, addresses, and review counts, all public. The old way was buying slow scraping software (LeadSwift starts at $24.99/mo for one search/day) or fighting proxies yourself. A search API returns the same local pack as structured JSON, so you can pull a niche and city, filter for businesses that are actually operating, and export a clean list without a browser.
Trigger
Run on demand per niche and city, or on a schedule to refresh a target market weekly.
Schedule
On demand, or weekly per target market
Workflow Steps
Query the Maps endpoint by niche and city
POST to /api/v2/google/maps/search with a query like 'hvac contractors in tampa'. The ll param (map center @lat,lng,zoom) controls where results come from, which matters more than the text for local precision. Returns local_results with title, address, phone, website, rating, and reviews.
Filter for real operating businesses
Keep businesses with a website and 10+ reviews. As the r/Coldemailing workflow that hit 4-8% reply rates noted, this filter drops dead listings and leaves real operators worth contacting.
Deduplicate and enrich
Dedupe by phone and domain. For each survivor you now have the website, which feeds a decision-maker lookup and email verification step downstream.
Export to CSV or your CRM
Write the cleaned rows out. A single Maps call covers one local pack; page through the city by neighborhood ll centers to build a full market.
Python Implementation
import os, csv, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
def maps(query, ll=None):
body = {"query": query}
if ll: body["ll"] = ll
return requests.post("https://api.scavio.dev/api/v2/google/maps/search",
headers=H, json=body).json()
res = maps("hvac contractors in tampa", ll="@27.9506,-82.4572,12z")
leads = [b for b in res.get("local_results", [])
if b.get("website") and (b.get("reviews") or 0) >= 10]
with open("leads.csv", "w", newline="") as f:
w = csv.writer(f); w.writerow(["name","phone","website","rating","reviews"])
for b in leads:
w.writerow([b.get("title"), b.get("phone"), b.get("website"),
b.get("rating"), b.get("reviews")])
print(len(leads), "qualified leads")JavaScript Implementation
import { Scavio } from "scavio";
import { writeFileSync } from "fs";
const client = new Scavio({ apiKey: process.env.SCAVIO_API_KEY });
const res = await client.google.mapsSearch({
query: "hvac contractors in tampa", ll: "@27.9506,-82.4572,12z",
});
const leads = (res.local_results || [])
.filter(b => b.website && (b.reviews || 0) >= 10);
const rows = [["name","phone","website","rating","reviews"],
...leads.map(b => [b.title, b.phone, b.website, b.rating, b.reviews])];
writeFileSync("leads.csv", rows.map(r => r.join(",")).join("\n"));
console.log(leads.length, "qualified leads");