Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $1.00 / 1,000 place scrapeds

Go to Apify Store
Google Maps Scraper

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

VortexData

Maintained by Community

Actor stats

2

Bookmarked

10

Total users

7

Monthly active users

a day ago

Last modified

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_cffi Chrome 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 ActorBrowser-based Google Maps scrapers
Enginecurl_cffi Chrome TLS impersonationHeadless Chromium
Memory256–512 MB2–4 GB
Speed51 places in 3.7 s (local, no proxy)60–120 s for the same set
Cost on Apifypennies per 1 000 places5–10× more compute units
Coverage per areaunlimited via quad-tree subdivisioncapped at Google's ~120 per viewport
Fields per place30–46 fields15–25 typical
Built-in filters5 free post-fetch filtersusually missing
Resumabilityauto-resumes on Apify migrationoften 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-in withoutWebsite filter for cold-outreach lists.
  • 📊 Competitor monitoring — quad-tree scans entire metro areas; structured addressParts makes geo-grouping trivial; placeTags segment by ownership and demographics.
  • 📈 Market analysis — full additionalInfo amenities tree segments places by accessibility, payment methods, dining options, atmosphere; categories array surfaces secondary classifications Google hides behind the primary one.
  • 🏨 Travel & hospitality — hotel-specific block: hotelStars, hotelPrice, hotelCheckInDate / hotelCheckOutDate, hotelAmenities, full multi-paragraph longDescription.
  • 🔎 Local SEO auditsownerName, claimThisBusinessUrl, kgmid (Knowledge Graph IDs), canonical Maps URL, placeId cross-reference.
  • 🗺 POI database building — every place ships with placeId + fid + cid + kgmid for stable cross-system referencing.
  • 🌐 Multilingual datasetsadditionalLanguages re-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 in startUrls to scrape specific places without going through search.
  • Place IDs — pass a list of Google Place IDs (ChIJ…) in placeIds; each is fetched directly.

Coverage controls

  • maxCrawledPlacesPerSearch — hard cap per term (default 500).
  • 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 multiple hl= codes.
  • customGeolocation — GeoJSON Polygon / MultiPolygon / Point with radiusKm.
  • Discrete geo composite: countryCode / state / county / city / postalCode (used when locationQuery is empty).

Built-in filters (post-fetch, free)

  • placeMinimumStars — drop places below two / twoAndHalf / … / fourAndHalf.
  • websiteFilterallPlaces / withWebsite / withoutWebsite.
  • skipClosedPlaces — drop permanently/temporarily closed.
  • searchMatchingall / only_includes / only_exact (title vs term).
  • categoryFilterWords — keep only matching categories.

Optional add-on: website-contacts enrichment

  • extractContactsFromWebsite (default false) — visit each business's site and extract emails, 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 (default 8).
  • 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:

EventWhen it firesSuggested price
place-scrapedevery place pushed to the dataset$0.0005 per result ($0.50 / 1 000)
place-with-emailswebsite enrichment yielded ≥ 1 email$0.0015 ($1.50 / 1 000)
place-with-socialswebsite 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 by placeId so overlap is free.
  • Increase maxSubdivisionDepth from 4 → 5 for very dense urban scrapes (each level multiplies viewports by 4).
  • Set multiZoomDelta=1 to 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 per hl=.

❓ 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.