Google Maps Scraper
Pricing
from $2.90 / 1,000 results
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.90 / 1,000 results
Rating
4.4
(2)
Developer
Boztek LTD
Actor stats
5
Bookmarked
1.3K
Total users
174
Monthly active users
0.29 hours
Issues response
10 hours ago
Last modified
Categories
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
- Fast Mode (default): captures data directly from search result cards — no individual page visits
- Detail Mode: visits each place's detail page for complete data including phone, opening hours, and website
Related Tool
If you want a hosted version of this scraper, check out: 👉 https://basedonb.com
Scraping Modes
Fast Mode (detailGeneration: false, default)
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.
Detail Mode (detailGeneration: true)
Visits each place's individual page to extract the full dataset.
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.
Best for: complete business profiles where phone numbers, hours, and websites are needed.
Pricing
| Mode | Dataset item fee | Usage-based fee | Total (est.) |
|---|---|---|---|
| Fast Mode | $2.90 / 1,000 places | — | ~$2.90 / 1,000 |
| Detail Mode | $2.90 / 1,000 places | $10 / 1,000 detail pages | ~$12.90 / 1,000 |
An initial actor fee of $0.008 is charged per run.
Free Tier
Free tier users receive a pre-built sample dataset of 100 New York City restaurants (Detail Mode format) instead of live scraping. No proxy or browser resources are used — results are returned instantly.
- If you request fewer than 100 results, only that many sample results are returned.
- The sample dataset includes: title, address, phone, website, coordinates, opening hours, ratings, and more.
- To scrape custom locations and search terms with live data, upgrade to a paid plan.
How billing events work
- Fast Mode — No usage-based fee. Only the standard Apify dataset item fee applies ($0.0029 per result).
- Detail Mode — 1
detail-generationevent ($0.01) is charged for each emitted place item whendetailGeneration: true→ $10 per 1,000.
Proxy Auto-Selection
The actor automatically selects the right proxy type — you do not need to configure this manually.
| Condition | Proxy type | Reason |
|---|---|---|
Country unknown (no country input) | Datacenter | Cannot route without a country code |
| United States + Fast Mode | Datacenter | US datacenter IPs are reliable and cheap for list-level scraping |
| United States + Detail Mode | Residential (US) | Detail pages require local IPs to avoid geo-filtering |
| Any non-US country, any mode | Residential (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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchStringsArray | Array | — | One or more search terms (e.g. ["restaurant", "cafe"]) |
city | String | New York | City for pool search and scrape tasks |
country | String | USA | Country 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). |
maxCrawledPlacesPerSearch | Integer | 50 | Global maximum number of places to scrape across all grid cells |
language | String | en | Language for Google Maps results |
detailGeneration | Boolean | false | Enable Detail Mode (visits each place page) |
startUrls | Array | — | Direct Google Maps search or place URLs |
placeIds | Array | — | List of Google Maps Place IDs |
maxRequestRetries | Integer | 3 | Retries per failed request |
maxConcurrency | Integer | 5 | Parallel browser pages |
navigationTimeoutSecs | Integer | 20 | Page load timeout in seconds |
verboseLog | Boolean | false | Enable 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):
- Resolve location — The actor uses
cityandcountryfor the Supabasesearch_placesRPC (or centroid + radius whencustomGeolocationis set). - Pool then tasks — Matching rows are returned from your pool; if more places are needed, a
scrape_tasksrow is created with the same city, country, and query so workers can fill the gap. If you usecustomGeolocationonly, you can skipcountryfor the geo pool step, but you must still providecountry(and optionallycity) when the pool cannot satisfymaxCrawledPlacesPerSearch, 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","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öywithcountryTurkey) for tighter, more targeted pool matches when your data supports it. maxCrawledPlacesPerSearchis a global ceiling — the actor stops as soon as this many places are collected, regardless of how many grid cells remain.- Fast Mode is recommended for discovery and lead generation at scale. Switch to Detail Mode only when phone numbers or opening hours are required.
- For direct place lookups, use
placeIdsorstartUrls— these skip the search step entirely.