Google Maps Scraper
Pricing
from $1.50 / 1,000 results
Google Maps Scraper
Scrape data from thousands of Google Maps businesses and places, including reviews, reviewer profiles, photos, contact details, names, emails, job titles, business hours, pricing, and more. Export results, automate via API, schedule runs, monitor progress, or connect with your favorite tools.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Scraping Dino
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Find Google Maps businesses and export structured place data — contacts, hours, photos, reviews, and posts — in one run.
This actor turns Google Maps discovery into clean dataset records. Search by keyword, location, coordinates, or place ID; optionally enrich each business with full details, photo galleries, customer reviews, and Google Business Profile posts. Every place is emitted once, with enrichments merged into a single object ready for CRM import, research, or automation.
- Discover places with keyword, nearby, radius, bounding-box, area, or bulk search
- Enrich each business with phone, website, address, hours, categories, and more
- Pull photo/video galleries, reviews (with sort and caps), and owner posts
- Filter by rating, category, and closed status before you pay for enrichment
- Deduplicate automatically and stream results into the Apify dataset as they finish
Why use this actor?
Google Maps is where local demand lives. This actor is built for teams that need that data in a pipeline — not a spreadsheet copy-paste.
Lead generation
Build lists of restaurants, clinics, contractors, or retailers in a city or radius. Export phone, website, address, and Maps URL into your CRM or outreach tool.
Competitor analysis
Pull ratings, review text, star distributions, and owner replies for businesses in your category. Compare review volume and sentiment across neighborhoods.
Market research
Map density of a category across bounding boxes or named areas. Track price levels, categories, and open/closed status at scale.
Brand and reputation monitoring
Watch reviews and Google posts for specific place IDs or Maps URLs on a schedule. Catch new complaints and owner responses early.
Local SEO and listing audits
Verify NAP consistency (name, address, phone), websites, categories, and hours across many listings in one export.
Growth and territory planning
Use nearby/radius search around store locations to size markets and spot gaps before you expand.
Features
Search
- Keyword search — one or many terms plus an optional location (
"pizza"in"Manhattan") - Nearby search — keyword around a lat/lng point
- Radius search — keyword within a meter radius of coordinates
- Bounding box — constrain results to north/south/east/west bounds
- Area search — keyword inside a named area
- Bulk search — submit multiple queries in one request
- Language and country — control response locale for keyword/bulk modes
- Direct targets — skip search and enrich known
placeIdsor Google Maps URLs
Place details
- Full business profile fields: name, description, categories, rating, review count
- Contact: phone, website, domain, Maps URL
- Location: street, neighborhood, city, state, country, postal code, lat/lng
- Hours, holiday hours, opening status
- Amenities, accessibility, parking, payments, service options (when present)
- Booking, order, menu, and reservation links when Google exposes them
- Owner metadata and star rating distribution
Photos
- Paginated photo/video gallery per place
- Cap with
maxPhotosPerPlace/maxImages(up to 500) - Structured media fields: URLs, type, upload time, coordinates when available
- Attached as
photoswithout overwriting details sample images
Reviews
- Paginated reviews per place (up to 5,000 per business via
maxReviewsPerPlace) - Sort: newest, highest rating, lowest rating, most relevant
- Optional reviews language (falls back to actor language)
- Author profile, Local Guide flags, ratings, text, photos, likes
- Owner replies and detailed review form scores when available
- Deduplicated by review ID
Posts
- Google Business Profile posts (owner updates)
- Cap with
maxPosts(up to 500) - Post text, images, publish time, and post URL
- Empty galleries are valid (many places simply have no posts)
Filtering
- Minimum star rating (
placeMinimumStars) - Skip closed / permanently closed places
- Category substring filter during search (
businessCategory) - Post-search category keyword filters (
categoryFilterWords)
Pagination and reliability
- Cursor pagination for search, photos, and reviews until your caps are hit
- API-level retries with backoff on 429 and 5xx
- Per-business enrichment retries (
maxRequestRetries) - Parallel enrichment (
maxConcurrency, default 5) - Search continues if one term fails; enrichment failures land in
enrichmentErrorswithout dropping the place
Export
- One dataset item per business
- Download as JSON, CSV, Excel, or XML from Apify
- Access via Apify API, webhooks, or integrations (Make, Zapier, n8n, etc.)
What can it scrape?
Each dataset item is one business. Search fields form the base; optional enrichments merge into the same record.
Identity and discovery
Place ID, business/Google ID, CID, name, categories, Maps URL, thumbnail/cover image, open/closed status.
Contact and location
Phone, website, domain, full address broken into street / city / state / country / postal code, plus latitude and longitude.
Reputation
Overall rating, total review count, and star distribution (1–5). With reviews enabled: full review objects including author, text, rating, photos, and owner replies.
Operations
Weekly opening hours, current opening status, price level, amenities and related “about” sections when the details API returns them.
Media and updates
- Photos — gallery array (
photos,photosCount) - Posts — owner update array (
posts,postsCount) - Search/details still keep sample image fields (
photosSample,imagesCount) separately
Diagnostics
If an enrichment step fails after retries, the place is still saved and the error is listed under enrichmentErrors.
Note: Fields such as Popular Times may appear as null. They are reserved for schema compatibility and are not populated by the current data source.
Input Options
How to discover places
| Goal | Use |
|---|---|
| “Coffee shops in Austin” style lists | searchStringsArray + locationQuery |
| Several categories in one city | Multiple searchStringsArray terms |
| Around a pin / store | searchMode: "nearby" or "radius" + lat/lng |
| A map rectangle | searchMode: "boundingBox" + north/south/east/west |
| Named district | searchMode: "area" + area or locationQuery |
| Many free-form queries | searchMode: "bulk" + queries |
| You already have IDs | placeIds (and optional enrichment toggles) |
| You have Maps links | startUrls (prefer Place IDs for full gallery enrichment) |
Caps and quality
maxResults/maxCrawledPlacesPerSearch— how many places per search (1–500, default 50)placeMinimumStars— drop low-rated listings before enrichmentskipClosedPlaces— keep only operating businessesbusinessCategory/categoryFilterWords— tighten category match
Enrichment toggles
| Toggle | Effect |
|---|---|
scrapePlaceDetailPage | Merge full business details into each place |
scrapePhotos or maxPhotosPerPlace > 0 | Attach gallery under photos |
scrapeReviews or maxReviewsPerPlace > 0 | Attach reviews under reviews |
scrapePosts | Attach posts under posts |
Photos and reviews can be enabled by setting their max values above zero. Posts require scrapePosts: true.
Runtime
maxConcurrency(1–50, default 5) — parallel enrichment workers; search terms still run one after anothermaxRequestRetries(default 3) — retries per enrichment step per business
Example Input
Keyword search (list building)
{"searchStringsArray": ["dentist", "dental clinic"],"locationQuery": "Austin, TX","maxResults": "50","country": "US","language": "en","placeMinimumStars": "4.0","skipClosedPlaces": true}
Search + full enrichment
{"searchStringsArray": ["pizza"],"locationQuery": "Manhattan, New York","maxResults": "20","country": "US","scrapePlaceDetailPage": true,"scrapePhotos": true,"maxPhotosPerPlace": 15,"scrapeReviews": true,"maxReviewsPerPlace": 50,"reviewsSort": "newest","scrapePosts": true,"maxPosts": 10,"maxConcurrency": 5}
Nearby / radius (around a point)
{"searchMode": "nearby","query": "coffee","latitude": 40.758,"longitude": -73.9855,"radius": 1500,"maxResults": "40","scrapePlaceDetailPage": true}
Bounding box
{"searchMode": "boundingBox","query": "gym","north": 40.78,"south": 40.74,"east": -73.96,"west": -74.01,"maxResults": "30"}
Bulk queries
{"searchMode": "bulk","queries": ["plumbers in Denver","electricians in Denver","HVAC in Denver"],"maxResults": "25","country": "US","scrapePlaceDetailPage": true}
Place IDs only (enrich known businesses)
{"placeIds": ["ChIJifIePKtZwokRVZ-UdRGkZzs","0x89c259ab3c1ef289:0x3b67a41175949f55"],"scrapePlaceDetailPage": true,"scrapeReviews": true,"maxReviewsPerPlace": 100,"reviewsSort": "highest_rating","scrapePhotos": true,"maxPhotosPerPlace": 30,"scrapePosts": true}
Example Output
One dataset item (fields truncated for readability):
{"name": "Joe's Pizza Broadway","placeId": "ChIJifIePKtZwokRVZ-UdRGkZzs","businessId": "0x89c259ab3c1ef289:0x3b67a41175949f55","category": "Pizza restaurant","categories": ["Pizza restaurant", "Pizza delivery", "Restaurant"],"rating": 4.4,"reviewCount": 26343,"reviewsDistribution": {"oneStar": 812,"twoStar": 541,"threeStar": 1488,"fourStar": 5900,"fiveStar": 17602},"phone": "+16465594878","website": "https://www.joespizzanyc.com/","address": "1435 Broadway, New York, NY 10018","city": "New York","postalCode": "10018","latitude": 40.7546795,"longitude": -73.9870291,"googleMapsUrl": "https://www.google.com/maps/place/...","businessStatus": "OPEN","openingHours": {"Monday": ["10 AM–3 AM"],"Friday": ["10 AM–5 AM"]},"detailsFetched": true,"photosFetched": true,"photosCount": 15,"photos": [{"photoId": "CIABIhBrIKF-fvEFDBYqhnU28VTF","mediaType": "photo","imageUrl": "https://lh3.googleusercontent.com/...","imageUrlLarge": "https://lh3.googleusercontent.com/..."}],"reviewsCountFetched": 50,"reviews": [{"reviewId": "Ci9DQUlRQUNvZENodHljRjlv...","authorName": "Amartya Ghosal","rating": 4,"reviewText": "We tried this iconic NY pizza spot...","publishedAt": "2026-07-02T21:16:46.819Z","authorIsLocalGuide": true}],"postsCount": 0,"posts": []}
Common Workflows
Build a lead list for a city
- Set
searchStringsArrayto your niche andlocationQueryto the city. - Enable
skipClosedPlacesand a minimum star rating. - Turn on
scrapePlaceDetailPagefor phone and website. - Export CSV into your CRM.
Monitor competitors’ reputation
- Feed known
placeIds. - Enable reviews with
reviewsSort: "newest"and a weekly schedule. - Diff new
reviewIds in your warehouse.
Map a trade area around a store
- Use
searchMode: "radius"with store coordinates. - Collect categories and ratings only (search or light details).
- Visualize density in your BI tool.
Content and listing QA
- Search or use place IDs.
- Enable photos + posts to audit visual freshness and owner updates.
- Flag listings with missing website, phone, or hours.
Multi-category market scan
- Use bulk mode with several “{category} in {city}” queries.
- Deduplication collapses overlapping hits into one row per business.
- Segment the export by
category.
Performance
| Concern | Behavior |
|---|---|
| Pagination | Search, photos, and reviews follow API cursors until your max counts |
| Concurrency | Enrichment runs in parallel (maxConcurrency); search terms are sequential |
| Retries | HTTP client retries 429/5xx with backoff; enrichment steps retry per business |
| Reliability | Failed enrichment does not drop the place; errors go to enrichmentErrors |
| Rate limits | Upstream API may throttle; retries handle transient limits |
Typical latency (live validation, small caps): about 2–3s per search page, ~2s details, ~1.5–2s for a short photos or reviews page, ~1.5s posts. A single place with search + details + photos + reviews + posts often completes in under ~10 seconds wall time.
Rough full-enrichment estimates (maxConcurrency: 5, modest photo/review caps):
| Places | Typical wall time |
|---|---|
| 10 | ~20–30 seconds |
| 100 | ~4–6 minutes |
| 1,000 | ~35–50 minutes |
Higher maxReviewsPerPlace / maxPhotosPerPlace increases runtime roughly with extra pages. Search-only runs are much faster.
Output
Results are stored in the default Apify dataset:
- View and filter in the Apify Console
- Download JSON, CSV, Excel, or XML
- Read via the Apify API (
datasetendpoints) or client SDKs - Connect to integrations (Make, Zapier, n8n, webhooks, Google Sheets, warehouses)
Each successful place is one item. There is no second “reviews-only” dataset — reviews and posts live on the same business object when enabled.
Limitations
Be aware of these constraints before you run production jobs:
- No browser automation — this actor uses HTTP APIs, not a headless Maps browser. Features that only exist in the Maps UI (for example Popular Times histograms, Q&A, mall directories, sponsored/ad flags, hotel-only modules) are not scraped.
- Popular Times — field may be present as
null; it is not filled by the current provider. - Photo authors — gallery items do not include uploader/author identity.
- Posts availability — many businesses have zero posts; an empty
postsarray is normal. - Direct Google Maps URLs — details enrichment can work from URLs, but photo/review/post galleries resolve best when a place ID or business ID is already known. Prefer
placeIdsfor ID-based enrichment. - Bulk search — single-response mode without cursor pagination; use keyword mode with multiple terms when you need deep paging.
- Closed or missing places — invalid IDs may produce enrichment errors; the row can still appear with
enrichmentErrorspopulated. - Upstream rate limits — heavy concurrency or large review caps may slow runs; lower concurrency or batch by city if you see repeated retries.
- Not a leads/email-verification product — you get Maps listing data (phone/website when public on the listing). There is no people-leads, email-verify, or AI competitor-report module.
FAQ
Can I scrape multiple search terms in one run?
Yes. Pass several values in searchStringsArray, or use bulk mode with queries.
Can I enrich places I already know?
Yes. Provide placeIds (Place IDs or hex business IDs) and enable the enrichment toggles you need.
Can I export to CSV or Excel?
Yes. Use the dataset export in Apify Console or the API. CSV works well for flat contact fields; nested reviews / photos arrays are richer in JSON.
How many places can I collect?
Up to 500 per search term via maxResults / maxCrawledPlacesPerSearch. Run multiple terms or schedules for larger markets.
How many reviews can I collect per place?
Up to 5,000 via maxReviewsPerPlace / maxReviews. Start lower for cost and speed, then raise for deep analysis.
What happens if reviews or photos fail for one business?
The place is still saved. The failure is recorded in enrichmentErrors. Other businesses continue.
What if a search term returns nothing?
That term contributes zero places. Other terms still run. An empty dataset means no matches after search and filters.
Can I skip closed businesses?
Yes — set skipClosedPlaces: true.
Can I sort reviews?
Yes — reviewsSort: newest, highest_rating, lowest_rating, or most_relevant.
Do I get one row per review?
No. By design you get one row per business, with reviews nested under reviews. That keeps lead lists and CRM imports clean.
Can I resume a failed run?
Apify may resurrect runs depending on platform settings; this actor does not implement custom checkpoint resume. Prefer smaller batches and schedules for very large jobs, and rely on place-ID dedupe across runs if you re-scrape.
Is Popular Times included?
Not with live data today. The field stays null when the provider does not return it.
Best Practices
- Filter early — use
placeMinimumStars,skipClosedPlaces, and category filters before enabling heavy review/photo caps. - Start small — validate with
maxResults: 10and modestmaxReviewsPerPlace/maxPhotosPerPlace, then scale. - Use Place IDs for monitoring — search once, store IDs, then enrich on a schedule without rediscovering.
- Tune concurrency — default
5is a solid balance. Raise carefully (up to 50) for large enrichment jobs; lower if you see throttling. - Don’t over-fetch media — photos and reviews dominate cost and time. Cap them to what your workflow actually needs.
- Prefer keyword + location for deep lists — use bulk for breadth; use keyword pagination when you need more results per query.
- Plan large jobs by city — split national coverage into regional runs for clearer cost control and easier retries.
- Keep JSON for nested data — export CSV for outreach columns; keep JSON when you need full
reviewsandphotos.
Why choose this actor?
One business, one record
Search, details, photos, reviews, and posts merge into a single structured object — ready for CRMs and warehouses without stitching multiple actors.
Practical Maps coverage
The workflows teams actually run: find places, get contacts, pull reviews and media. No browser farm required.
Controlled cost
Enrichment is opt-in. Search and filter first; only then pay for details, galleries, and review depth.
Built for Apify
Incremental dataset writes, Console exports, API access, and scheduler-friendly inputs.
Transparent limits
Clear about what the API can and cannot return — so you can design pipelines that hold up in production.
Getting started
- Open this actor on Apify and click Try for free (or run locally with your API key).
- Paste a keyword + location example from above.
- Enable the enrichments you need.
- Run and open the Dataset tab.
For local development:
cd google-maps-scrapercp .env.example .env # set API_KEYnpm installnpm start
Support
Questions, edge cases, or feature requests: open an issue on the actor’s Apify page or contact the developer through Apify.
If this actor saves you time, a rating on the Apify Store helps others find it.