The Problem
Scraping directories like Yelp or Yellow Pages for leads gives you aggregator listings, not the actual businesses, so half your list is stale rows, closed shops, and duplicate entries pointing at the directory instead of the company. You then burn send reputation emailing addresses that bounce. The cold-email builders on Reddit who get this right say the same thing: pull only real business websites, not directories. The fix is to start from the live Google SERP for a niche-and-location query and keep only the results that resolve to a business's own domain.
The Scavio Solution
Query Google for the niche plus location ("plumbers in Austin TX"), take the organic results, and filter out the known directory and social domains. What remains is a list of real business sites you can enrich, deduplicate by domain, and hand to outreach. Because you started from what actually ranks, the businesses are live and findable, which is already a qualification signal. It is not a replacement for a full local-data provider if you need phone-verified records at scale, but for finding real, active businesses in a niche it beats directory scraping on lead quality.
Before
Scrape a directory, import 2,000 rows, and discover a large share are duplicates, aggregator pages, or closed businesses only after your bounce rate spikes.
After
Query the SERP per niche and city, keep only owned-domain results, deduplicate by domain, and start outreach on businesses that are provably live and findable.
Who It Is For
Agencies and solo founders building their own cold-outreach lists who want real, active businesses in a niche instead of directory-scraped rows that bounce.
Key Benefits
- Leads are real business sites, not directory or aggregator listings
- Ranking at all is a built-in signal the business is active
- Deduplicate cleanly by domain instead of by messy listing rows
- One Google call per niche-and-city (1-2 credits) instead of a scraping job to maintain
- The same SERP gives you a personalization hook (their own page title and offering)
Python Example
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
DIRECTORIES = {"yelp.com", "yellowpages.com", "facebook.com", "instagram.com",
"linkedin.com", "mapquest.com", "bbb.org", "thumbtack.com"}
def leads(niche, city):
q = f"{niche} in {city}"
data = requests.post("https://api.scavio.dev/api/v1/google", headers=H,
json={"query": q}).json()
seen, out = set(), []
for o in data.get("organic_results", []):
domain = o["link"].split("/")[2].replace("www.", "")
if domain in DIRECTORIES or domain in seen:
continue
seen.add(domain)
out.append({"domain": domain, "title": o["title"], "url": o["link"]})
return out
print(leads("plumbers", "Austin TX"))JavaScript Example
const H = { Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`, "Content-Type": "application/json" };
const DIRECTORIES = new Set(["yelp.com","yellowpages.com","facebook.com","linkedin.com","bbb.org"]);
async function leads(niche, city) {
const r = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST", headers: H, body: JSON.stringify({ query: `${niche} in ${city}` }),
});
const data = await r.json();
const seen = new Set();
return (data.organic_results ?? []).flatMap((o) => {
const domain = new URL(o.link).hostname.replace("www.", "");
if (DIRECTORIES.has(domain) || seen.has(domain)) return [];
seen.add(domain);
return [{ domain, title: o.title, url: o.link }];
});
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews