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
15
Total users
10
Monthly active users
16 hours 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.