Google Maps Scraper
Pricing
from $1.00 / 1,000 place scrapeds
Google Maps Scraper
Stop wasting your budget on slow, resource-heavy browser-based scrapers. This is the fastest, most cost-effective, and data-rich Google Maps scraper on Apify, designed for high-scale lead generation and market research.
Pricing
from $1.00 / 1,000 place scrapeds
Rating
5.0
(1)
Developer
VortexData
Actor stats
2
Bookmarked
10
Total users
7
Monthly active users
a day ago
Last modified
Categories
Share
Google Maps Scraper — fast HTTP, 30+ fields per place
The fastest, cheapest, most data-rich Google Maps scraper on Apify. Pure HTTP via
curl_cffiChrome TLS impersonation. Zero browser. Quad-tree subdivision unlocks scraping more than Google's hard 120-results-per-area limit.
📖 Introduction
This Actor extracts business data from Google Maps without launching a browser. Where most Google Maps scrapers boot a headless Chromium for every page (slow, memory-hungry, expensive on Apify compute units), this one talks directly to the same internal /search?tbm=map JSON endpoint that Google's own JavaScript hits — using curl_cffi to perfectly impersonate a real Chrome TLS handshake so anti-bot doesn't notice the difference.
I built it because I wanted to scrape whole cities, not just neighbourhoods. Google's web interface caps a single map viewport at ~120 results no matter how far you scroll. The Actor breaks that ceiling with quad-tree viewport subdivision: when a viewport saturates (≥18 of the first 20 results are new), it auto-splits into 4 child viewports at one zoom level deeper and recurses up to a configurable depth. With maxSubdivisionDepth=4 you get up to 256 viewports per seed — enough to drain Google's index across an entire metro area.
On top of that the Actor parses every field reachable through the search XHR — 46 distinct fields per place including the structured address (street/city/state/postal/country), the full amenities tree (additionalInfo with Accessibility / Service options / Payments / Atmosphere), place tags (Identifies as women-owned, LGBTQ+ friendly, Latino-owned), owner info, current open/closed status with next opening time, hotel-specific data (stars, price, check-in/out, amenities), restaurant menu URLs, plus code, sponsored-result detection, and more. Optional website-contacts enrichment visits each business's site and pulls emails + 8 social-media handles.
Why pick this Actor
| This Actor | Browser-based Google Maps scrapers | |
|---|---|---|
| Engine | curl_cffi Chrome TLS impersonation | Headless Chromium |
| Memory | 256–512 MB | 2–4 GB |
| Speed | 51 places in 3.7 s (local, no proxy) | 60–120 s for the same set |
| Cost on Apify | pennies per 1 000 places | 5–10× more compute units |
| Coverage per area | unlimited via quad-tree subdivision | capped at Google's ~120 per viewport |
| Fields per place | 30–46 fields | 15–25 typical |
| Built-in filters | 5 free post-fetch filters | usually missing |
| Resumability | auto-resumes on Apify migration | often re-scrapes from scratch |
🎯 Use cases
- 🧲 Lead generation — 84 %+ phone & website coverage, optional email + social-media enrichment from each business's site, unclaimed-listing detection (
claimThisBusinessUrl), built-inwithoutWebsitefilter for cold-outreach lists. - 📊 Competitor monitoring — quad-tree scans entire metro areas; structured
addressPartsmakes geo-grouping trivial;placeTagssegment by ownership and demographics. - 📈 Market analysis — full
additionalInfoamenities tree segments places by accessibility, payment methods, dining options, atmosphere;categoriesarray surfaces secondary classifications Google hides behind the primary one. - 🏨 Travel & hospitality — hotel-specific block:
hotelStars,hotelPrice,hotelCheckInDate/hotelCheckOutDate,hotelAmenities, full multi-paragraphlongDescription. - 🔎 Local SEO audits —
ownerName,claimThisBusinessUrl,kgmid(Knowledge Graph IDs), canonical Maps URL,placeIdcross-reference. - 🗺 POI database building — every place ships with
placeId+fid+cid+kgmidfor stable cross-system referencing. - 🌐 Multilingual datasets —
additionalLanguagesre-runs the same area in extra languages to catch translations and regional categories.
⚙️ Input
You can feed the Actor in three ways — combine any of them in one run:
- Search terms + location — the most common path. Example:
["restaurant", "cafe", "bakery"]near "Brooklyn, New York". Each term is searched independently across all viewports & languages. - Direct Google Maps URLs — pass
/maps/place/...URLs instartUrlsto scrape specific places without going through search. - Place IDs — pass a list of Google Place IDs (
ChIJ…) inplaceIds; each is fetched directly.
Coverage controls
maxCrawledPlacesPerSearch— hard cap per term (default500).maxPlacesPerViewport— per-viewport cap; Google maxes at ~120.enableSubdivision+maxSubdivisionDepth— quad-tree splitting (the magic that unlocks > 120 per area).multiZoomDelta— search each seed at zoom-N..zoom+N for +30–70 % extra unique places.language+additionalLanguages— re-search same area in multiplehl=codes.customGeolocation— GeoJSON Polygon / MultiPolygon / Point withradiusKm.- Discrete geo composite:
countryCode/state/county/city/postalCode(used whenlocationQueryis empty).
Built-in filters (post-fetch, free)
placeMinimumStars— drop places belowtwo/twoAndHalf/ … /fourAndHalf.websiteFilter—allPlaces/withWebsite/withoutWebsite.skipClosedPlaces— drop permanently/temporarily closed.searchMatching—all/only_includes/only_exact(title vs term).categoryFilterWords— keep only matching categories.
Optional add-on: website-contacts enrichment
extractContactsFromWebsite(defaultfalse) — visit each business's site and extractemails,additionalPhones, and 8 social-media URL fields (Facebook, Instagram, LinkedIn, Twitter/X, YouTube, TikTok, Pinterest, WhatsApp). Domain-level cache means chain stores share one fetch.
Performance
concurrency— parallel viewport tasks (default8).proxyConfiguration— Apify residential proxy is strongly recommended.
📤 Output
One row per unique place, deduped by placeId across all viewports, languages, and search terms. Three pre-built dataset views are available in the Apify Console: Overview, Lead generation, Hotels.
{"title": "Bird & Branch Coffee Roasters","subTitle": "Family-run specialty coffee shop","description": "Signature coffee drinks including burnt marshmallow, turmeric, & nut milks…","categoryName": "Coffee shop","categories": ["Coffee shop", "Cafe", "Corporate gift supplier"],"address": "359 W 45th St, New York, NY 10036, United States","addressParts": {"street": "359 W 45th St","city": "New York","state": "New York","postalCode": "10036","neighborhood": "Manhattan","countryCode": "US"},"location": {"lat": 40.7602998, "lng": -73.9907758},"entranceLocation": {"lat": 40.7602896, "lng": -73.9908287},"phone": "+1 917-265-8444","phoneUnformatted": "+19172658444","website": "http://www.birdandbranch.com/","emails": ["hello@birdandbranch.com"],"instagrams": ["https://www.instagram.com/birdandbranchnyc"],"facebooks": ["https://www.facebook.com/birdandbranchnyc"],"totalScore": 4.6,"openingHoursToday": {"day": "Wednesday", "hours": "7 AM–7:30 PM"},"currentStatus": "Closed · Opens 7 AM","nextOpensAt": "06:30","permanentlyClosed": false,"temporarilyClosed": false,"placeId": "ChIJTVhsxFNYwokRXgPwYnY0vgI","fid": "0x89c25853c46c584d:0x2be347662f0035e","cid": "197653116721562462","kgmid": "/g/11hbtg2w_k","url": "https://www.google.com/maps/search/?api=1&query=…&query_place_id=ChIJ…","timezone": "America/New_York","ownerName": "Bird & Branch Coffee Roasters","placeTags": ["Identifies as women-owned", "Identifies as Asian-owned"],"additionalInfo": {"Accessibility": [{"Wheelchair-accessible car park": true}],"Service options": [{"Dine-in": true}, {"Takeout": true}],"Payments": [{"NFC mobile payments": true}, {"Credit cards": true}]},"imagesCount": 944,"imageUrl": "https://lh6.googleusercontent.com/…/photo.jpg","menu": "https://slicelife.com/restaurants/…/menu","language": "en","rank": 1,"scrapedAt": "2026-05-02T15:42:18Z","isAdvertisement": false}
For hotels you also get hotelStars, hotelPrice, hotelCheckInDate, hotelCheckOutDate, hotelAmenities, and the full multi-paragraph hotel longDescription. After every run a JSON summary is written to the OUTPUT key of the default key-value store (totals, durations, filters applied, dataset URL).
Export formats from the Apify Console: JSON / JSON Lines / CSV / Excel / HTML / RSS, or paginated API access.
💡 Miscellaneous
💰 Pricing — pay-per-event
The Actor charges per result extracted, with optional bonus events when richer data is found:
| Event | When it fires | Suggested price |
|---|---|---|
place-scraped | every place pushed to the dataset | $0.0005 per result ($0.50 / 1 000) |
place-with-emails | website enrichment yielded ≥ 1 email | $0.0015 ($1.50 / 1 000) |
place-with-socials | website enrichment yielded ≥ 1 social URL | $0.0005 ($0.50 / 1 000) |
Without enrichment you pay only place-scraped. With enrichment you pay extra only for results that actually included contacts — never charged for failed fetches.
🧠 Tips for maximum coverage
- Use multiple search terms instead of one — Google's category tagging is brittle, e.g.
["coffee", "cafe", "espresso bar", "coffee roaster"]. The Actor dedupes byplaceIdso overlap is free. - Increase
maxSubdivisionDepthfrom 4 → 5 for very dense urban scrapes (each level multiplies viewports by 4). - Set
multiZoomDelta=1to add 30–70 % more unique places at the cost of 3× the search requests. - For non-English regions add
additionalLanguages: ["es", "fr", "zh"]— Google returns slightly different translations and categories perhl=.
❓ FAQ
How does this compare to the official Google Places API? The Places API caps each query at 60 results, costs $17 per 1 000 calls, and exposes fewer fields than this Actor. Quad-tree subdivision plus richer extraction gives this Actor a 30× cost advantage at city scale.
Will I get blocked by Google? Not with Apify residential proxies (the default). Chrome TLS impersonation rotates per request, sticky sessions per viewport keep IPs anchored, and intelligent backoff handles 429/503. We routinely run thousands of requests without captchas.
Does this extract reviews / photos / popular times? No. Google's review listing endpoint, photo metadata endpoint, and popular-times XHR all require browser-bound session tokens that JavaScript constructs from in-memory state — impossible from HTTP-only requests. If you need them, use a browser-based scraper (which will be 5–10× more expensive). For the 95 % of users who need leads, addresses, contacts, ratings, hotel data, and place identifiers, this Actor is the optimal choice.
Can I resume an interrupted run?
Yes. State is checkpointed every 30 s and on Apify's PERSIST_STATE event. Migrated runs auto-resume without re-pushing duplicates.
Which fields are 100 % reliable?
title, categories, structured address (street/city/state/postalCode/countryCode), location, placeId, fid, cid, kgmid, totalScore, url, timezone, ownerName, imagesCount, language, rank, scrapedAt. Phone & website are present on 84 %+ of places.
🔌 Integrations
Works with the full Apify integration ecosystem: webhooks (ACTOR_RUN_SUCCEEDED/FAILED), Apify Schedules (cron), Apify Tasks (saved input presets), the Apify CLI for CI/CD, the Apify MCP server (drive from Claude / GPT / any LLM), plus Make, Zapier, n8n, Airtable, Google Sheets, Slack, Gmail.
🛠 Tech stack
curl_cffi (Chrome TLS impersonation, fingerprint rotation) + apify SDK ≥ 3.3 + crawlee ≥ 1.5 + Python 3.12. No Node.js. No browser. No headless detection risk.
📝 Honest limitations
The Actor does not extract review text, individual reviews, full week opening hours, popular times histograms, per-photo URL lists, Q&A, or reviewsCount for non-hotels — Google has progressively locked these endpoints down to require browser-bound session tokens that aren't reconstructable from HTTP. Everything else is fair game.
💬 Your feedback
Built and maintained by an independent developer. Bug reports and feature requests welcome on the Issues tab of this Actor — every report gets a response. If this Actor saves you time or money, please leave a ⭐️ review on the Apify Store.
📅 Changelog
See ./CHANGELOG.md for the full version history.