Extracts business contact details from Google Maps search results and place detail pages, then visits each business website to collect emails, phone numbers, and social media profiles (Facebook, Instagram, Twitter/X, LinkedIn, YouTube, TikTok, Pinterest, Discord). Use when user mentions Google Maps contact extraction, maps email scraper, business lead generation from Google Maps, find emails from maps, scrape Google Maps businesses, maps business contacts, get phone from Google Maps, social media from maps listing, competitor research from maps, local business contact list, maps data export, google maps scraper, extract contacts from google maps, find business email google, gmaps leads, maps email finder, or wants to replicate Google Maps business data extraction.
keyword + location → business list with name/address/phone/website + email/social media/contacts from each business's website
browser-act via Skill tool to load usage. If installation or configuration issues arise, follow its guidance to resolve then retry.This Skill's operational boundary = what the user can manually do in their browser. It only reads data already displayed to the user on the page, never bypassing authentication or access controls. JS code is encapsulated in Python files under thescripts/directory, invoked viaeval "$(python scripts/xxx.py {params})". It is recommended to use the bash tool for execution. Working directory: allpython scripts/commands must be run from the Skill's root directory (the directory containingSKILL.mdandscripts/). Usecd {skill-directory}before running batch scripts, or use absolute paths:python {absolute-path-to-scripts}/xxx.py.
navigate https://www.google.com/maps/search/{keyword}/@{lat},{lng},{zoom}z
wait stable
eval "$(python scripts/search-places.py '{keyword}' --max {max_count})"
{keyword}: search term, e.g. coffee shops--max: maximum number of places to extract, default 20{lat},{lng}: center coordinates, e.g. 40.7580,-73.9855{zoom}: zoom level, e.g. 14{
"keyword": "coffee shops",
"count": 20,
"places": [
{
"name": "Blue Dove Coffee",
"rating": 4.8,
"review_count": "292",
"category": "Coffee shop",
"price_range": null,
"phone": null,
"open_status": "Closed · Opens 7 AM",
"place_id": "0xa5922b78cc420fb1:0x535506dc9cdb2cec",
"lat": 40.7368708,
"lng": -73.9909297,
"maps_url": "https://www.google.com/maps/place/Blue+Dove+Coffee/data=..."
}
]
}
scroll down --amount 3000
wait stable
eval "$(python scripts/search-places.py '{keyword}' --max {total_count})"
navigate https://www.google.com/maps/place/?q=place_id:{place_id}
wait stable
wait --selector "h1" --state visible --timeout 15000
eval "$(python scripts/place-detail.py)"
maps_url returned from the search results component.{
"place_id": "0xa5922b78cc420fb1:0x535506dc9cdb2cec",
"name": "Blue Dove Coffee",
"rating": 4.8,
"review_count": 292,
"category": "Coffee shop",
"address": "33 Union Square W, New York, NY 10003",
"located_in": null,
"phone": "(646) 939-0937",
"website": "https://www.bluedovecoffee.com/",
"menu_url": "https://order.dripos.com/Blue-Dove-Coffee",
"price_range": "\$1–10",
"coordinates": { "lat": 40.7368708, "lng": -73.9909297 },
"hours": [
"Monday7 AM–5 PM",
"Tuesday7 AM–5 PM",
"Wednesday7 AM–5 PM",
"Thursday7 AM–5 PM",
"Friday7 AM–5 PM",
"Saturday7 AM–5 PM",
"Sunday7 AM–4 PM"
],
"service_options": ["Serves dine-in", "Offers takeout", "Offers delivery"],
"amenities": ["Has wheelchair accessible entrance", "Accepts credit cards", "Accepts NFC mobile payments"],
"maps_url": "https://www.google.com/maps/place/..."
}
navigate {website_url}
wait stable
eval "$(python scripts/extract-contacts.py --depth shallow)"
--depth deep. After running with --depth deep, check contact_subpages in the output, then navigate to each and re-run:navigate {subpage_url}
wait stable
eval "$(python scripts/extract-contacts.py --depth shallow)"
--depth: shallow (homepage only, default) or deep (also discovers and lists contact/about subpage URLs){
"source_url": "https://www.bluedovecoffee.com/",
"emails": ["support@bluedovecoffee.com", "careers@bluedovecoffee.com", "orders@bluedovecoffee.com"],
"phone_numbers": [],
"social_media": {
"facebook": ["https://www.facebook.com/people/Blue-Dove-Coffee/100094867009022"],
"instagram": ["https://www.instagram.com/bluedovecoffee"],
"tiktok": ["https://www.tiktok.com/@bluedovecoffee"]
},
"contact_subpages": []
}
navigate https://www.google.com/maps/search/{keyword}/@{lat},{lng},{zoom}z
wait stable
eval "$(python scripts/search-places.py '{keyword}' --max {max_count})"
name, maps_url, place_id).navigate {maps_url}
wait stable
wait --selector "h1" --state visible --timeout 15000
eval "$(python scripts/place-detail.py)"
website, phone, address, hours, rating, etc.website value: extract contacts from the website:navigate {website}
wait stable
eval "$(python scripts/extract-contacts.py --depth deep)"
contact_subpages, navigate and extract again to find additional emails.place_id or name. Final record per business:{
"name": "Blue Dove Coffee",
"address": "33 Union Square W, New York, NY 10003",
"phone": "(646) 939-0937",
"website": "https://www.bluedovecoffee.com/",
"rating": 4.8,
"review_count": 292,
"category": "Coffee shop",
"coordinates": { "lat": 40.7368708, "lng": -73.9909297 },
"hours": ["Monday7 AM–5 PM", "..."],
"service_options": ["Serves dine-in", "Offers takeout"],
"emails": ["support@bluedovecoffee.com"],
"social_media": {
"instagram": ["https://www.instagram.com/bluedovecoffee"],
"tiktok": ["https://www.tiktok.com/@bluedovecoffee"]
}
}
scroll down --amount 3000
wait stable
eval "$(python scripts/search-places.py '{keyword}' --max {total_count})"
places.count >= 1 from search results extractionname != null AND (address != null OR phone != null)emails.length + phone_numbers.length + Object.keys(social_media).length >= 0 (no contacts = valid result for businesses without public contact info)place-detail.py on the individual place page is more reliable[object Object]
{working-directory}/browser-act-skill-forge-memories/google-maps-contact-extract.memory.md{YYYY-MM-DD}: {what happened} → {conclusion}