Google Maps business data is essential for lead generation, local SEO audits, and market research. Scraping Google Maps directly triggers aggressive anti-bot protections including CAPTCHAs, IP bans, and JavaScript challenges. The Scavio API lets you search for local businesses by query and location, returning structured JSON with business name, address, rating, review count, phone number, and website. This tutorial shows how to query Google Maps data for any business category and location, then export the results for outreach or analysis.
Prerequisites
- Python 3.8 or higher
- requests library installed
- A Scavio API key
- A target business category and location to search
Walkthrough
Step 1: Search for local businesses
POST to the Scavio endpoint with a Google Maps-style query including the business type and location. The local_results field contains structured business listings.
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_maps(query: str, location: str) -> list[dict]:
response = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": f"{query} in {location}", "country_code": "us"}
)
response.raise_for_status()
return response.json().get("local_results", [])Step 2: Extract business details
Parse each local result for name, address, phone, rating, review count, and website URL.
def extract_business(result: dict) -> dict:
return {
"name": result.get("title"),
"address": result.get("address"),
"phone": result.get("phone"),
"rating": result.get("rating"),
"reviews": result.get("reviews"),
"website": result.get("website"),
}Step 3: Filter by minimum rating
Keep only businesses above a rating threshold for quality lead lists.
def filter_by_rating(businesses: list[dict], min_rating: float = 4.0) -> list[dict]:
return [
b for b in businesses
if b.get("rating") and float(b["rating"]) >= min_rating
]Step 4: Export to CSV
Write the filtered business list to a CSV file for use in CRM imports or outreach tools.
import csv
def export_csv(businesses: list[dict], filename: str = "leads.csv") -> None:
with open(filename, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["name", "address", "phone", "rating", "reviews", "website"])
writer.writeheader()
writer.writerows(businesses)
print(f"Exported {len(businesses)} businesses to {filename}")Python Example
import os
import csv
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_maps(query: str, location: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": f"{query} in {location}", "country_code": "us"})
r.raise_for_status()
return r.json().get("local_results", [])
def extract(result: dict) -> dict:
return {
"name": result.get("title"),
"address": result.get("address"),
"phone": result.get("phone"),
"rating": result.get("rating"),
"reviews": result.get("reviews"),
"website": result.get("website"),
}
if __name__ == "__main__":
results = search_maps("dentists", "San Francisco, CA")
businesses = [extract(r) for r in results]
high_rated = [b for b in businesses if b["rating"] and float(b["rating"]) >= 4.5]
with open("leads.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=list(high_rated[0].keys()))
w.writeheader()
w.writerows(high_rated)
print(f"Exported {len(high_rated)} leads")JavaScript Example
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const fs = require("fs");
async function searchMaps(query, location) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: `${query} in ${location}`, country_code: "us" })
});
const data = await res.json();
return (data.local_results || []).map(r => ({
name: r.title, address: r.address, phone: r.phone,
rating: r.rating, reviews: r.reviews, website: r.website
}));
}
async function main() {
const businesses = await searchMaps("dentists", "San Francisco, CA");
const filtered = businesses.filter(b => b.rating && parseFloat(b.rating) >= 4.5);
const header = "name,address,phone,rating,reviews,website";
const rows = filtered.map(b => Object.values(b).join(","));
fs.writeFileSync("leads.csv", [header, ...rows].join("\n"));
console.log(`Exported ${filtered.length} leads`);
}
main().catch(console.error);Expected Output
{
"local_results": [
{
"title": "Pacific Heights Dental",
"address": "2100 Webster St, San Francisco, CA 94115",
"phone": "(415) 555-0123",
"rating": "4.9",
"reviews": 342,
"website": "https://pacificheightsdental.com",
"hours": "Open until 5:00 PM"
}
]
}