Google Maps Scraper Apify Skill
Overview
This skill helps an AI agent run the Apify Google Maps Scraper actor for local business collection and enrichment.
Default actor:
- Actor ID:
kLdarP5qiTvc9CwtP - Actor name:
x_guru/google-maps-scraper - Store page:
https://apify.com/x_guru/google-maps-scraper
Use this skill when a user asks to:
- collect Google Maps places by search term and location
- scrape direct Google Maps search URLs or place URLs
- enrich existing Google Place IDs
- build local lead lists with websites, phones, addresses, ratings, and coordinates
- add public website contact extraction
- extract Google Maps reviews or images
- create Apify-ready JSON payloads for n8n, CRM, Sheets, or API workflows
Quick Workflow
- Clarify the target: business type, location, desired count, and whether add-ons are needed.
- Build the smallest useful payload first.
- Set a budget guard with Apify
maxTotalChargeUsdwhen the user cares about spend. - Run the actor through
scripts/google_maps_scraper_actor.pyor the Apify API. - Return summary metrics and dataset rows.
- Explain missing fields as normal best-effort behavior when Google Maps or the business website does not expose data.
Payload Rules
- Standard discovery uses
searchStringsArray,locationQuery, andmaxCrawledPlacesPerSearch. - Exact Google Maps URLs use
startUrlsas objects:[{"url": "https://www.google.com/maps/..."}]. - Exact Google Place IDs use
placeIds. - Structured search area uses
countryCode,city,state,county,postalCode,customGeolocation, andstrictLocationBounds;locationQueryhas priority when present. - Broad visible-map collection uses
allPlacesNoSearchAction="all_visible"and optionalallPlacesZoom; use it only for concrete local areas. - Paid filters include
placeCategories,customPlaceCategories,searchMatching,minStars,website, andskipClosedPlaces. - Use
scrapeCompanyContactsonly when the user needs public website emails, phones, or social links. - Use
maxReviewsonly when the user explicitly needs review rows or review fields. - Use
maxImagesonly when the user needs image URLs beyond the main image. - Use
scrapePlaceDetailPagefor richer opening hours, menu links, plus code, inside places, web results, and detailed place metadata. - Place details can be extended with
scrapeTableReservationProviderData,scrapeOrderOnlineWidgetData,includeWebResults, andscrapeInsidePlaces. - Image extraction can be extended with
scrapeImageAuthors. - Keep initial tests small: 10-50 places before scaling.
Authentication
Use the Apify API token from the environment:
export APIFY_TOKEN='apify_api_xxx'
Never hardcode or print the full token in user-facing output.
Script Usage
Install requirements if your runtime expects a requirements step:
pip install -r requirements.txt
Run a quick search:
APIFY_TOKEN='apify_api_xxx' \
python3 scripts/google_maps_scraper_actor.py quick-search \
--query "bike repair shop" \
--location "Portland, Oregon, USA" \
--limit 25 \
--budget-usd 1
Run with reviews:
APIFY_TOKEN='apify_api_xxx' \
python3 scripts/google_maps_scraper_actor.py quick-search \
--query "dentist" \
--location "Austin, Texas, USA" \
--limit 20 \
--reviews 10 \
--reviews-sort newest \
--budget-usd 1
Run with website contacts:
APIFY_TOKEN='apify_api_xxx' \
python3 scripts/google_maps_scraper_actor.py quick-search \
--query "roofing contractor" \
--location "Denver, Colorado, USA" \
--limit 50 \
--with-contacts \
--only-with-website \
--budget-usd 2
Run a custom payload:
APIFY_TOKEN='apify_api_xxx' \
python3 scripts/google_maps_scraper_actor.py run \
--input-file references/sample_input.json \
--budget-usd 2
Recommended Inputs
Local business discovery
{
"searchStringsArray": ["bike repair shop"],
"locationQuery": "Portland, Oregon, USA",
"maxCrawledPlacesPerSearch": 100,
"language": "en"
}
Exact URLs
{
"startUrls": [
{
"url": "https://www.google.com/maps/search/restaurants+near+New+York,+NY"
}
],
"maxCrawledPlacesPerSearch": 100,
"language": "en"
}
Place IDs
{
"placeIds": ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
"maxCrawledPlacesPerSearch": 1,
"scrapePlaceDetailPage": true
}
Add-on Fields
scrapePlaceDetailPage: extra place details.scrapeCompanyContacts: website contact enrichment.maxReviews: reviews per place.reviewsStartDate: optionalYYYY-MM-DDreview date filter.reviewsSort:newest,mostRelevant,highestRanking, orlowestRanking.reviewsFilterString: keyword filter for review text.reviewsOrigin:allorgoogle.scrapeReviewsPersonalData: include reviewer profile data when allowed.maxImages: additional image URLs per place.
Output Contract
The runner returns JSON with:
okactorIdfetchedAtinputUseditemCountrows[]
Rows are actor dataset items. Common fields include: Core identity:
titlesubTitledescriptionpricecategoryNamecategoriesrankisAdvertisement
Address and geography:
addressneighborhoodstreetcitystatepostalCodecountryCodelocationlocatedInfloorplusCode
Contacts and web presence:
websitephonephoneUnformattedemailsadditionalPhonesfacebooksinstagramslinkedInstwittersyoutubestiktoks
Ratings, reviews, and media:
totalScorereviewsCountreviewsDistributionreviewsreviewsScrapedreviewsFetchStatusreviewsFetchMethodreviewsDateFilterStatusimageUrlimagesimagesCountimageFetchStatusimageFetchMethodimageAuthorsStatusimageCategories
Details and identifiers:
openingHoursadditionalOpeningHourspopularTimesLiveTextpopularTimesLivePercentpopularTimesHistogrammenuservicesLinkreserveTableUrlgoogleFoodUrlpeopleAlsoSearchplacesTagsreviewsTagsgasPriceshotelStarshotelDescriptionhotelAdsplaceIdfidcidkgmidurlsearchPageUrlsearchPageLoadedUrlsearchStringlanguagescrapedAtadditionalInfo
The hosted actor output page also exposes:
- dataset link:
results - run diagnostics link:
summary, pointing toRUN_SUMMARY
Agent Response Rules
- If a run succeeds with zero rows, say that the actor finished but Google Maps returned no matching places for the requested input.
- If add-on fields are missing, explain that they are best-effort and depend on Google Maps or the business website exposing data.
- For lead generation requests, recommend
scrapeCompanyContactspluswebsite=withWebsitewhen the user needs emails. - For large jobs, split by city, keyword, or area and use budget limits per run.
- For compliance-sensitive review workflows, turn
scrapeReviewsPersonalDataoff unless the user explicitly needs reviewer profile fields.
References
references/actor-input-guide.mdreferences/sample_input.jsonreferences/troubleshooting.md
Scan to join WeChat group