Free Google Maps Scraper — Places + Contact Details + Photos
Pricing
$2.50 / 1,000 place scrapeds
Free Google Maps Scraper — Places + Contact Details + Photos
Pricing
$2.50 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
20
Total users
6
Monthly active users
2 days ago
Last modified
Categories
Share
Free Google Maps Scraper — Places, Contact Details, Hours, Lat/Lng
A Google Maps scraper that returns every business detail Google's /maps/search page renders — name, rating, review count, category, full address, phone number, website, opening hours, latitude / longitude — as clean structured JSON. No browser automation, no Google Places API key, no $17-per-1k Places-API bill at the end of the month. One AJAX call per query returns up to ~300 places — far past Google Maps' 120-per-screen web limit — at $0.0025 each.
What you get
- Business name, primary category (e.g.
Italian restaurant), and the fullcategorieslist - Rounded star rating (1-5) plus total review count as an integer (
reviews_count: 1248) - Stable identifiers:
place_id(ChIJ…),fid(0x…:0x…), andkgmid(/g/…) - Full address plus parsed parts —
street,city,postal_code,state,country_code,neighborhood - Phone number in international format when Google has it on file
- Website URL — the outbound link Google Maps points to (typically the merchant's own domain, not a redirector)
- Price range (
price_range: "€30–40") when Google has it current_status("Open · Closes 12 am", "Closed · Opens 5 pm") and the full 7-dayopening_hoursscheduleadditional_info— service options, accessibility, amenities, payments, atmosphere, and more, grouped exactly as Google labels them- Latitude and longitude as decimal floats, accurate to ~1 meter
- Search query echoed on every row so you can join multi-keyword runs into one dataset
Why scrape Google Maps for places data
Google Places API costs are punishing for any volume use case. The new Places API (New) bills $17/1000 for Place Details (Basic), $32/1000 for Place Details (Advanced) with phone + website + opening hours, and $32/1000 for Text Search (Basic) before you even fetch a single detail. A lead-gen agency pulling 50,000 dentists across the US pays Google $1,600 minimum for that one job — and Places API is rate-limited to a few hundred QPS unless you negotiate a custom quota. Worse, Google deprecated the legacy Places API in March 2025 and is forcing migration to the New API which has stricter field masks and higher per-call billing.
This actor solves that by hitting Google's internal /search?tbm=map AJAX endpoint with curl_cffi (Chrome TLS impersonation) plus a fresh anonymous Google session cookie from a managed minter pool. One call returns up to ~300 places with the full structured payload — name, rating, address, phone, website, hours, lat/lng — for $0.0025 per place, or $2.50 per 1000. That's 13× cheaper than Google Places (Basic) and 6× cheaper than competing Google Maps scrapers on the Apify Store such as compass/crawler-google-places (which charges per-result on a sliding scale that lands around $4-7 per 1000 places). No browser, no Selenium, no headful Playwright — just one HTTP call per query.
Concrete buyer math: a B2B lead-gen agency building a list of 25,000 plumbers across 100 US cities pays $0.0025 × 25,000 = $62.50 for the whole job, finishing in ~30 minutes. The same job through Google Places API (Advanced fields) costs $32 × 25 = $800, takes a week to clear quota approval, and still doesn't include the lat/lng on the cheap tier.
Input
| Field | Default | Description |
|---|---|---|
queries | required | Array of Google Maps search queries ("restaurants Amsterdam", "plumbers in NYC", "dentists London") |
max_results_per_query | 120 | Cap places per query (1-400). A single call returns Google's full inventory for the area — typically up to ~300 places |
hl | en | Language code (en, nl, de, es, fr, it, ja) |
gl | us | Two-letter country code controlling locale + currency |
use_cookies | true | Use a fresh anonymous Google session — bypasses the EU consent banner and reduces CAPTCHA at scale |
use_proxy | false | Optional. Adds extra IP rotation for very high volume |
Output
{"search_position": 3,"name": "De Kas","fid": "0x47c609e91734d71b:0x…","place_id": "ChIJG9c0F-kJxkcR…","kgmid": "/g/1tf…","address": "Kamerlingh Onneslaan 3, 1097 DE Amsterdam","street": "Kamerlingh Onneslaan 3","city": "Amsterdam","postal_code": "1097 DE","state": null,"country_code": "NL","neighborhood": "Watergraafsmeer","lat": 52.3471242,"lng": 4.9264883,"category": "Modern European restaurant","categories": ["Modern European restaurant", "Restaurant"],"rating": 4.5,"reviews_count": 1842,"price_range": "€100+","phone": "+31 20 462 4562","website": "https://restaurantdekas.com/","website_domain": "restaurantdekas.com","current_status": "Open · Closes 4 pm","opening_hours": [{"day": "Monday", "hours": "12–2 pm, 6–10 pm"},{"day": "Tuesday", "hours": "12–2 pm, 6–10 pm"}],"additional_info": {"Service options": [{"Outdoor seating": true}, {"Dine-in": true}],"Offerings": [{"Alcohol": true}, {"Vegetarian options": true}]},"search_query": "restaurants Amsterdam"}
Use place_id / fid to dedupe across multi-keyword runs and as a stable join key into your own systems.
Use cases
B2B lead-gen agency building niche prospect lists. You sell SEO services to dentists. You queue 100 queries ("dentist <city>" for the top 100 US metros) and run the actor — each dense metro returns up to ~300 dentists with name, phone, website, and rating, so a 100-metro sweep can pull well over 10,000 leads in one run. Filter for rating < 4.0 (low-rated practices that need reputation work) and you have an outbound list segmented by exact pain point.
Local SEO consultant auditing a market. Your client is a Brooklyn pizzeria. You pull "pizza Brooklyn", "pizzeria Brooklyn", and "italian restaurant Brooklyn" — each returning the full local field of competitors in one call. Sort by reviews_count descending and you instantly see who the real local competitors are, their ratings, and their websites for backlink prospecting.
Real-estate analyst mapping commercial supply. You need every coffee shop in a 5-city catchment to model retail density. Five queries return the full coffee-shop inventory per city — hundreds of places — with lat/lng ready to load into PostGIS or Mapbox. Compare to Google Places API at $32/1000 with rate limits; you're done in minutes for a few dollars.
Travel-app developer seeding a points-of-interest database. Your itinerary app needs 50 POI categories across 50 cities = 2,500 queries, each returning up to ~300 places. At $0.0025/place a 50,000-place database costs ~$125. Through Places API (Text Search + Place Details Advanced): $1,600 + 2-week quota request. Same data, ship two weeks earlier.
How it compares
| Actor | Price per 1000 places | Phone | Website | Hours | Lat/Lng |
|---|---|---|---|---|---|
| This actor (s-r/free-google-maps-scraper) | $2.50 | yes | yes | yes | yes |
compass/crawler-google-places (#2 on google maps scraper SERP) | ~$4-7 sliding scale | yes | yes | yes | yes |
gosom/google-maps-scraper (#3 SERP, open-source CLI) | self-hosted (your infra) | yes | yes | partial | yes |
| Outscraper Google Maps (#1 SERP) | ~$3-5 | yes | yes | yes | yes |
| Google Places API (Advanced) | $32 + quota approval | yes | yes | yes | yes |
The headline competitor on Apify is compass/crawler-google-places, which is the top-ranking Maps scraper on Apify Store with thousands of monthly users — but its sliding-scale pricing lands around $4-7 per 1000 results for typical workloads, and its run-times are slower because it uses headless Chrome under the hood. This actor is pure HTTP (curl_cffi + cookies) which is why it can sustain 13 places/sec at $2.50/1000.
Coverage per call: the Google Maps website caps any single map screen at 120 places, and most scrapers inherit that ceiling per scroll. This actor hits the underlying AJAX endpoint directly and returns Google's full inventory for the area — up to ~300 places — in a single request, so you get past the 120 limit without scroll loops, browser sessions, or extra requests.
Pricing
This actor uses Apify's pay-per-event monetization at $0.0025 per place returned — that's $2.50 per 1000 places, or roughly 60-90% cheaper than the closest Apify alternatives. All pricing is pay-per-event — you only pay for results you receive. No actor-start fee, no per-compute-unit charges, no charge for empty queries or rate-limit retries.
Limits and gotchas
- A single
/search?tbm=mapcall returns Google's full inventory for the search area — typically up to ~300 places, capped at 400. That already beats Google Maps' own 120-per-screen web limit. For denser coverage (thousands), split into geographically narrower queries (e.g."sushi Amsterdam Centrum","sushi Amsterdam Zuid") - Phone, website, price, and hours are populated only when Google has them on file; expect ~90% website, ~90% phone, ~95% hours coverage in mature markets, lower in emerging ones
- Both
current_status(live "Open · Closes 10 PM" string) and the full 7-dayopening_hoursarray are included — no follow-up call needed plus_codeandhours_statusare legacy fields not populated by this endpoint and may be removed in a future version — uselat/lngandopening_hours/current_statusinstead- Apify residential proxy is not required — the cookie pool plus
curl_cffi's Chrome TLS fingerprint is enough for sustained throughput; leavinguse_proxy=falsesaves you ~$8/GB glcontrols the result locale —gl=ussearching"hairdresser Amsterdam"will still return Amsterdam results but with US English UI strings; for native locale results setgl=nlandhl=nl- Cold-start time is ~2-4 seconds for the first request; subsequent queries in the same run reuse the session pool and complete in ~0.8s each
- Email addresses are not included — Google Maps doesn't expose emails on place panels. To get emails, pass the
websiteURL to a website-scraper actor and parsemailto:links
FAQ
How do I scrape Google Maps without the Places API?
This actor calls Google's internal /search?tbm=map AJAX endpoint directly with curl_cffi (Chrome TLS impersonation) and a fresh anonymous Google session cookie. No Google Cloud account, no API key, no quota approval. You only pay Apify's per-result rate.
Is Google Maps scraping legal? Scraping publicly visible business listings from Google Maps is generally treated as fair use under hiQ Labs v. LinkedIn (US 9th Circuit) and similar EU case law — the data is public-by-design (Google publishes it for searchers to find). What's not legal is downloading copyrighted Maps tiles or reverse-engineering Google's auth flow. This actor only reads public place panels.
What's the cost to scrape 10,000 Google Maps places? 10,000 × $0.0025 = $25. For comparison: Google Places API (Advanced) costs $320 for the same 10,000 places, before you factor in quota approval and rate limits.
Can I get business emails from Google Maps?
No — Google Maps doesn't expose email addresses on place panels. Most lead-gen workflows use this actor to get the website URL, then run a website-scraper actor to crawl the contact page and parse mailto: links.
Will Google rate-limit my scraping?
At default settings (fresh session cookies, default IP) the actor sustains ~12-15 places/second without throttling. For sustained >50/sec throughput, enable use_proxy=true and supply a residential proxy URL via the PROXY_URL env var.
Related Actors
- Free Google Maps Reviews Scraper — every review for any place URL (stars, text, author, owner reply, photos)
- Free Google Maps Images Scraper — bulk photo URLs for any place URL
- Free Google Hotels Scraper — Google Hotels search with per-room pricing and 18-31 OTA price comparison