google-maps-list-builder
Skill1 starsChanged 2 months agoMITView on GitHub
Use when targeting local SMBs (restaurants, clinics, gyms, salons, contractors) by category and location and the list should come from Google Maps as a CSV ready for enrichment. Also use when a US-wide category search needs zip-code or city splitting.
- Reads credentials
- Installs packages
We split this skill into the rules it gives an agent
10 rules. About 0 are common, 4 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 20
Run this skill → CSV of businesses with company_domain
- Very specific: line 22
Run /blitz-list-builder with the filtered CSV → adds owners/managers to each business
- Very specific: line 23
Run /email-waterfall → fills in missing emails
- Very specific: line 24
Run /cold-email-starter-kit's smartlead-add-leads.ts → upload to Smartlead
- Distinctive: line 37
Stop when 2 rounds show no corrections
- Distinctive: line 54
Create a new project directory and initialize it:
- Very specific: line 63
Add to package.json scripts:
- Distinctive: line 216
Cost: Check your RapidAPI plan. The free tier usually gives you enough for testing.
- Very specific: line 224
After owner discovery: /email-waterfall to fill missing emails, then /list-quality-scorecard to grade.
- Distinctive: line 226
Or wait: if your scrape returned <200 businesses, your query + location is too narrow.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Google Maps List Builder
A self-contained tool for scraping business listings from Google Maps. Give it a search query (e.g., "pizza restaurant") and a location (zip code, city, or coordinates), and it returns structured data for every matching business — written to CSV.
How this fits in the cold email flow
Google Maps gives you COMPANIES (name, domain, phone, address, ratings). It does NOT give you PEOPLE. To run cold email:
- Run this skill → CSV of businesses with
company_domain - Run
/icp-prompt-builderon a sample of 50 — tune a qualification prompt to filter out bad fits before paying for downstream enrichment - Run
/blitz-list-builderwith the filtered CSV → adds owners/managers to each business - Run
/email-waterfall→ fills in missing emails - Run
/cold-email-starter-kit'ssmartlead-add-leads.ts→ upload to Smartlead
This skill is only the first step.
Required step: Qualify with /icp-prompt-builder
This is a required step. Do not skip it.
Google Maps will happily return 10,000 "pizza restaurants in Illinois," but most of those won't match your actual ICP (maybe you only want 50-200 seat operators, or only ones without online ordering). Before spending on enrichment, sample ~50 results and run /icp-prompt-builder:
- Evaluate 10 results with an AI qualification prompt
- You flag "this one should be NO, they're a chain franchise"
- Refine, run next 10
- Stop when 2 rounds show no corrections
- Apply tuned prompt to filter the rest of the scrape
Why required: downstream owner-finding (via /blitz-list-builder) and email waterfall cost $0.10-$0.30 per contact. On a 10,000-business scrape, that's $1K-$3K. Qualifying upfront saves 50-80% of that spend on average.
What You Need Before Starting
- Node.js 18+ and npm installed
- A RapidAPI account (free tier available) with a subscription to the Maps Data API:
- Sign up at https://rapidapi.com
- Subscribe to the API: https://rapidapi.com/alexanderxbx/api/maps-data
- Copy your RapidAPI key from the dashboard (it's in the
X-RapidAPI-Keyheader on any endpoint page)
That's it. No Google Cloud account, no OAuth, no billing setup beyond RapidAPI.
Project Setup
Create a new project directory and initialize it:
mkdir google-maps-scraper && cd google-maps-scraper
npm init -y
npm install typescript bottleneck
npm install -D @types/node tsxAdd to package.json scripts:
{
"scripts": {
"scrape": "tsx src/index.ts"
}
}Create tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"esModuleInterop": true,
"strict": true,
"outDir": "dist",
"rootDir": "src",
"skipLibCheck": true
},
"include": ["src"]
}Set your API key as an environment variable:
export RAPIDAPI_KEY=your_key_hereOr create a .env file (add .env to .gitignore):
RAPIDAPI_KEY=your_key_hereFile Structure
google-maps-scraper/
data/
us-zip-codes.csv # 42,734 US zip codes with city, state, lat/lng, population
src/
index.ts # CLI entry point
client.ts # RapidAPI Maps Data client with rate limiting
types.ts # TypeScript interfaces
csv.ts # CSV export
zips.ts # Zip code loader (filter by state, city, population)Bundled Zip Code Database
The repo includes data/us-zip-codes.csv — a complete US zip code reference with 42,734 entries. Columns:
zip,primary_city,state,timezone,area_codes,world_region,country,latitude,longitude,irs_estimated_populationThis lets you scrape an entire state or metro area without manually listing zip codes. The src/zips.ts loader provides filtering by state, city, and minimum population.
Core Files
Moved to references/core-files.md — the full source of every file in the project (copy them in when setting up).
Running It
Local CLI
# Search pizza places in 3 NYC zip codes
npm run scrape -- --query="pizza restaurant" --zips=10014,10013,10012
# Search ALL dentists in Texas (zips with population >= 5000)
npm run scrape -- --query="dentist" --state=TX --min-pop=5000
# Every gym in California (all 2,657 zip codes — takes a while)
npm run scrape -- --query="gym" --state=CA
# Search dentists across specific cities
npm run scrape -- --query="dentist" --cities="Austin TX,Dallas TX,San Antonio TX"
# Custom output file
npm run scrape -- --query="gym" --zips=90210 --output=./data/gyms.csvProgrammatic Usage
import { GoogleMapsClient } from './client.js';
const client = new GoogleMapsClient({
apiKey: process.env.RAPIDAPI_KEY!,
requestsPerSecond: 2,
});
// Simple search
const places = await client.search({
query: 'coffee shop in 94105',
limit: 20,
});
// Search with coordinates
const { lat, lng } = await client.geocode('94105');
const nearby = await client.search({
query: 'coffee shop',
lat,
lng,
zoom: 14,
limit: 20,
});Deploying as a Web App (Optional)
Moved to references/web-app.md — optional web UI deployment.
API Reference
The underlying API is the Maps Data API on RapidAPI: https://rapidapi.com/alexanderxbx/api/maps-data
Key Endpoints Used
| Endpoint | Purpose | Example |
searchmaps.php | Search businesses by query + location | ?query=pizza+in+10014&limit=20 |
geocoding.php | Convert address/zip to lat/lng | ?query=10014,+US |
nearby.php | Search near a lat/lng point | ?query=pizza&lat=40.73&lng=-74.00 |
place.php | Get full details for one business | ?place_id=ChIJ... |
Rate Limits
The free tier on RapidAPI has request limits (check your plan). The client is hard-coded to 2 requests/second with automatic retries on 429s. Adjust requestsPerSecond if your plan allows more.
Response Fields
Each result includes:
place_id— unique Google Maps identifiername— business nameaddress— full street addressphone— phone number (if listed)website— website URL (if listed)rating— star rating (1-5)reviews_count— number of Google reviewslat/lng— coordinatestypes/category— business categories (e.g., "pizza_restaurant")
Tips
- "query in zipcode" format works best for US searches. No coordinates needed.
- 20 results per search is the max. To get more coverage, search multiple overlapping zip codes.
- Dedup by
place_id— the same business often shows up in adjacent zip code searches. - Cuisine/category filtering: The
typesfield tells you what kind of business it is. Use it to filter out irrelevant results (e.g., filter out "bar" when searching for "restaurant"). - Cost: Check your RapidAPI plan. The free tier usually gives you enough for testing. Paid plans are cheap for bulk scraping.
What to do next
Run /icp-prompt-builder on a 50-business sample (required step above). Then /blitz-list-builder with the filtered domains to find owner contacts — Google Maps returns businesses, not people.
After owner discovery: /email-waterfall to fill missing emails, then /list-quality-scorecard to grade.
Or wait: if your scrape returned <200 businesses, your query + location is too narrow. Widen before proceeding.
Related skills
/icp-prompt-builder— required qualification pass/blitz-list-builder— find owner contacts at each business/email-waterfall— fill missing emails/list-quality-scorecard— grade the final list
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 2
- growthenginenowoslawski/coldoutboundskills★ 75929% same
- Moussaoui-Ghiles/claude-skills★ 420% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository58 other files it gives its agents.
- abm-measurementSkill
- abm-retargetingSkill
- abm-target-accountsSkill
- auto-research-publicSkill
- b2b-cold-email-copywritingSkill
- blitz-list-builderSkill
- buying-committee-mapperSkill
- campaign-copywritingSkill
- campaign-strategySkill
- champion-move-detectionSkill
- clay-playbooksSkill
- closed-won-replication-playSkill
- cold-email-kickoffSkill
- cold-email-starter-kitSkill
- cold-email-weekly-rhythmSkill
- competitor-engagersSkill
- deliverability-incident-responseSkill
- deliverability-test-publicSkill
- disco-likeSkill
- email-deliverability-auditSkill
- email-gateway-detectionSkill
- email-waterfallSkill
- experiment-designSkill
- icp-onboardingSkill
- icp-prompt-builderSkill
- lead-magnet-brainstormSkill
- list-builderSkill
- list-expanderSkill
- list-quality-scorecardSkill
- personalization-subagent-patternSkill
- playbook-ad-librarySkill
- playbook-ai-specificitySkill
- playbook-case-study-pageSkill
- playbook-company-name-cleaningSkill
- playbook-creative-ideasSkill
- playbook-first-name-cleaningSkill
- playbook-fundraisingSkill
- playbook-google-site-searchSkill
- playbook-hiring-surgeSkill
- playbook-job-posting-languageSkill
- playbook-linkedin-engagementSkill
- playbook-lookalikesSkill
- playbook-name-to-other-prospectsSkill
- playbook-new-in-roleSkill
- playbook-pricing-pageSkill
- playbook-social-link-findingSkill
- playbook-social-postsSkill
- playbook-tech-on-websiteSkill
- playbook-warm-introsSkill
- positive-reply-scoringSkill
- prospeo-full-exportSkill
- prospeo-search-apiSkill
- smartlead-apiSkill
- smartlead-campaign-upload-publicSkill
- smartlead-inbox-managerSkill
- smartlead-spintaxSkill
- spam-word-checkerSkill
- zapmail-domain-setup-publicSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

