Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $2.60 / 1,000 results

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

Extract data from thousands of Google Maps locations and businesses, including reviews, reviewer details, images, contact info, including full name, email, opening hours, prices & more. Export data, run via API, schedule and monitor runs, or integrate with other tools.

Pricing

from $2.60 / 1,000 results

Rating

4.0

(9)

Developer

Boztek LTD

Boztek LTD

Maintained by Community

Actor stats

8

Bookmarked

2.5K

Total users

171

Monthly active users

0.034 hours

Issues response

10 hours ago

Last modified

Share

A fast, reliable Google Maps scraping actor built for clean, consistent place data. Give it search terms plus city and country (or a custom geolocation) — get a structured dataset with the fields you actually need.

What it does

  • Searches Google Maps by keywords, URLs, or Place IDs
  • Divides the target area into a geographic grid for maximum coverage
  • Scrolls through Google Maps search results and extracts place data
  • Detail Mode (default): visits each place's detail page and enriches available business websites with published emails, social profiles, and detected technologies
  • Fast Mode: captures data directly from search result cards — no individual page visits

If you want a hosted version of this scraper, check out: 👉 https://basedonb.com

On basedonb.com, Detail Mode (full place details — phone, website, opening hours, and more) is included for free, with no per-place add-on fee.

Scraping Modes

Detail Mode (detailGeneration: true, default)

Visits each place's individual page to extract the full dataset.

Pricing notice: Detail Mode is enabled by default for paying users and adds a per-place detail-generation charge. Set detailGeneration: false to use the lower-cost Fast Mode.

Fields captured: Everything in Fast Mode, plus — Full Address (street, city, postal code, state), Phone, Website, Coordinates (precise), Plus Code, Opening Hours, Additional Info (amenities, accessibility, etc.), Place ID, published website emails, social profiles, and detected CMS/technology stack.

Website enrichment is requested only when a business website is available. The actor waits up to enrichmentTimeoutSecs for each result batch, then returns all fields available so far together with enrichmentStatus and emailEnrichmentStatus. A missing website, an email that is not publicly listed, or a site that cannot be reached does not fail the run.

Best for: complete business profiles where phone numbers, hours, and websites are needed.

Fast Mode (detailGeneration: false)

Captures data directly from Google Maps search result lists without opening individual place pages.

Fields captured: Title, Rating, Review Count, Category, Partial Address, Google Maps URL.

Best for: large-scale searches where speed matters and basic info is sufficient.


Pricing

Prices depend on your Apify subscription plan. The advertised "from $2.60 / 1,000 results" price is the Business-plan price for Fast Mode.

Apify planFast Mode result feeDetail generation add-onDetail Mode total
Free$2.90 / 1,000 placesCharged per place (sample dataset)Sample dataset only
Starter$2.80 / 1,000 places$25 / 1,000 places$27.80 / 1,000
Scale$2.70 / 1,000 places$22 / 1,000 places$24.70 / 1,000
Business$2.60 / 1,000 places$15 / 1,000 places$17.60 / 1,000

An actor-start fee is also charged per run: $0.008 on Free, $0.007 on Starter, $0.006 on Scale, and $0.005 on Business. Platform usage is included.

Free Tier

Free-tier runs return a built-in sample dataset instead of a live search, so you can inspect the exact output format before you subscribe.

Free tier limits

  • No live search. Search terms, country/state/city, custom areas, place IDs and start URLs are not used on the free tier. Every free run returns the same bundled sample, and a warning in the log says so.
  • The sample dataset. 200 real Google Maps places from Chicago, USA, spanning 84 local business categories. It ships inside the actor at src/data/free-tier-sample-places.json.
  • Max 100 places per run. maxCrawledPlacesPerSearch is automatically clamped to 100 on the free tier, so a run returns the first 1–100 places of the 200-place dataset. The slice is deterministic and stays category-diverse.
  • Every feature is unlocked — including Detail Mode. detailGeneration: true works on the free tier and is billed with the same detail-generation event as paid plans (set the Free-plan price for that event in the Apify Console). Nothing is scraped or enriched at run time; the fields come straight from the dataset.

Every place in the sample carries the full Detail Mode payload: opening hours, place attributes and plus code, review count, coordinates, website technology stack, and — where a business publishes them — social profiles and contact emails. Coverage is what a real run yields: 100% opening hours and attributes, 94% tech stack, 79% social profiles, 56% email.

Upgrade to a paid Apify plan to search your own locations live, or scrape unlimited places directly on basedonb.com.

Concurrent task limit

Each Apify user can have at most 2 active live-search tasks at a time. Pending, generating, running, active, assigned, and paused tasks all count toward this limit. A run that finds all requested places in the existing pool does not create a live-search task and therefore does not consume a slot.

How billing events work

  • Fast Mode — Only the result fee applies: $2.90, $2.80, $2.70, or $2.60 per 1,000 emitted places, depending on the user's Apify plan.
  • Detail Mode — One detail-generation event is charged for every emitted place when detailGeneration: true. The add-on costs $25, $22, or $15 per 1,000 places on Starter, Scale, or Business. Website email, social-profile, and technology enrichment are bundled into this event; there is no separate enrichment event.
  • Free tier — Same events as any other plan. Free runs serve the pre-enriched sample dataset, and detailGeneration: true still charges one detail-generation event per emitted place.

Proxy Auto-Selection

The actor automatically selects the right proxy type — you do not need to configure this manually.

ConditionProxy typeReason
Country unknown (no country input)DatacenterCannot route without a country code
United States + Fast ModeDatacenterUS datacenter IPs are reliable and cheap for list-level scraping
United States + Detail ModeResidential (US)Detail pages require local IPs to avoid geo-filtering
Any non-US country, any modeResidential (target country)Non-US datacenter IPs are routinely blocked or return wrong regional content, even for list searches

The target country is taken from the country input (and optional city). For example:

  • Searching in Istanbul → Turkish residential IPs in both modes
  • Searching in São Paulo → Brazilian residential IPs in both modes
  • Searching in New York → US datacenter (Fast Mode) or US residential (Detail Mode)

If the target country cannot be determined, the actor falls back to datacenter proxy automatically.


Input Parameters

ParameterTypeDefaultDescription
searchStringsArrayArrayOne or more search terms (e.g. ["restaurant", "cafe"])
cityStringNew YorkCity for pool search and scrape tasks
countryStringUSACountry or region; required for search_places when not using customGeolocation. With geo, omit only if the pool alone satisfies your quota; if workers must fill the gap, set country (and optionally city).
maxCrawledPlacesPerSearchInteger50Global maximum number of places to scrape across all grid cells
languageStringenLanguage for Google Maps results
detailGenerationBooleantrueDetail Mode (visits each place page); set false for Fast Mode
enrichmentTimeoutSecsInteger180Maximum Detail Mode wait per available result batch for website enrichment; returns partial fields and statuses on timeout
startUrlsArrayDirect Google Maps search or place URLs
placeIdsArrayList of Google Maps Place IDs
maxRequestRetriesInteger3Retries per failed request
maxConcurrencyInteger5Parallel browser pages
navigationTimeoutSecsInteger20Page load timeout in seconds
verboseLogBooleanfalseEnable debug-level logging

Breaking change: The old locationQuery field was removed. Use city and country instead (for example, replace "Istanbul, Turkey" with city: "Istanbul" and country: "Turkey").


How Geographic Search Works

When searchStringsArray is used with city / country (or with customGeolocation for geo-based pool search):

  1. Resolve location — The actor uses city and country for the Supabase search_places RPC (or centroid + radius when customGeolocation is set).
  2. Pool then tasks — Matching rows are returned from your pool; if more places are needed, a scrape_tasks row is created with the same city, country, and query so workers can fill the gap. If you use customGeolocation only, you can skip country for the geo pool step, but you must still provide country (and optionally city) when the pool cannot satisfy maxCrawledPlacesPerSearch, or the run fails before creating an invalid task.

See .actor/INPUT_SCHEMA.json for the full list of options (e.g. placeIds, startUrls, customGeolocation).


Example Output

Fast Mode

{
"title": "Karadeniz Pide Fırını",
"totalScore": 4.6,
"reviewsCount": 892,
"categories": ["Pide restaurant"],
"address": "Moda Cd. No:12, Kadıköy",
"url": "https://www.google.com/maps/place/Karadeniz+Pide+Fırını/...",
"scrapedAt": "2025-03-06T14:22:10.000Z"
}

Detail Mode

{
"title": "Karadeniz Pide Fırını",
"totalScore": 4.6,
"reviewsCount": 892,
"categories": ["Pide restaurant"],
"address": "Moda Cd. No:12, 34710 Kadıköy/İstanbul",
"phone": "+90 216 345 67 89",
"website": "https://karadenizpide.com",
"hasWebsite": true,
"email": "info@karadenizpide.com",
"emails": [
{
"email": "info@karadenizpide.com",
"kind": "role",
"sourceUrl": "https://karadenizpide.com/contact",
"sameDomain": true
}
],
"socials": {
"instagram": "https://instagram.com/karadenizpide",
"facebook": "https://facebook.com/karadenizpide"
},
"techStack": {
"cms": "wordpress",
"detected": ["google-tag-manager", "cloudflare"]
},
"enrichmentStatus": "done",
"emailEnrichmentStatus": "done",
"coordinates": { "lat": 40.9897, "lng": 29.0275 },
"plusCode": "3GXJ+R2 Istanbul",
"openingHours": [
{ "day": "Monday", "hours": "08:00 to 22:00" },
{ "day": "Tuesday", "hours": "08:00 to 22:00" }
],
"additionalInfo": {
"Service options": [{ "Dine-in": true }, { "Takeaway": true }]
},
"placeId": "ChIJ...",
"url": "https://www.google.com/maps/place/Karadeniz+Pide+Fırını/...",
"scrapedAt": "2025-03-06T14:22:10.000Z"
}

Tips

  • Use a specific city (e.g. Kadıköy with country Turkey) for tighter, more targeted pool matches when your data supports it.
  • maxCrawledPlacesPerSearch is a global ceiling — the actor stops as soon as this many places are collected, regardless of how many grid cells remain.
  • Detail Mode (default) returns full business profiles with phone numbers, websites, opening hours, published website emails, social profiles, and detected technologies. Switch to Fast Mode (detailGeneration: false) for discovery and lead generation at scale when basic info is enough and you want to avoid the per-place usage fee.
  • For direct place lookups, use placeIds or startUrls — these skip the search step entirely.