Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Google Maps Scraper

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

Scraping Dino

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

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

  • 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 placeIds or 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 photos without 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 enrichmentErrors without 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

GoalUse
“Coffee shops in Austin” style listssearchStringsArray + locationQuery
Several categories in one cityMultiple searchStringsArray terms
Around a pin / storesearchMode: "nearby" or "radius" + lat/lng
A map rectanglesearchMode: "boundingBox" + north/south/east/west
Named districtsearchMode: "area" + area or locationQuery
Many free-form queriessearchMode: "bulk" + queries
You already have IDsplaceIds (and optional enrichment toggles)
You have Maps linksstartUrls (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 enrichment
  • skipClosedPlaces — keep only operating businesses
  • businessCategory / categoryFilterWords — tighten category match

Enrichment toggles

ToggleEffect
scrapePlaceDetailPageMerge full business details into each place
scrapePhotos or maxPhotosPerPlace > 0Attach gallery under photos
scrapeReviews or maxReviewsPerPlace > 0Attach reviews under reviews
scrapePostsAttach 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 another
  • maxRequestRetries (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

  1. Set searchStringsArray to your niche and locationQuery to the city.
  2. Enable skipClosedPlaces and a minimum star rating.
  3. Turn on scrapePlaceDetailPage for phone and website.
  4. Export CSV into your CRM.

Monitor competitors’ reputation

  1. Feed known placeIds.
  2. Enable reviews with reviewsSort: "newest" and a weekly schedule.
  3. Diff new reviewIds in your warehouse.

Map a trade area around a store

  1. Use searchMode: "radius" with store coordinates.
  2. Collect categories and ratings only (search or light details).
  3. Visualize density in your BI tool.

Content and listing QA

  1. Search or use place IDs.
  2. Enable photos + posts to audit visual freshness and owner updates.
  3. Flag listings with missing website, phone, or hours.

Multi-category market scan

  1. Use bulk mode with several “{category} in {city}” queries.
  2. Deduplication collapses overlapping hits into one row per business.
  3. Segment the export by category.

Performance

ConcernBehavior
PaginationSearch, photos, and reviews follow API cursors until your max counts
ConcurrencyEnrichment runs in parallel (maxConcurrency); search terms are sequential
RetriesHTTP client retries 429/5xx with backoff; enrichment steps retry per business
ReliabilityFailed enrichment does not drop the place; errors go to enrichmentErrors
Rate limitsUpstream 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):

PlacesTypical 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 (dataset endpoints) 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 posts array 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 placeIds for 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 enrichmentErrors populated.
  • 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

  1. Filter early — use placeMinimumStars, skipClosedPlaces, and category filters before enabling heavy review/photo caps.
  2. Start small — validate with maxResults: 10 and modest maxReviewsPerPlace / maxPhotosPerPlace, then scale.
  3. Use Place IDs for monitoring — search once, store IDs, then enrich on a schedule without rediscovering.
  4. Tune concurrency — default 5 is a solid balance. Raise carefully (up to 50) for large enrichment jobs; lower if you see throttling.
  5. Don’t over-fetch media — photos and reviews dominate cost and time. Cap them to what your workflow actually needs.
  6. Prefer keyword + location for deep lists — use bulk for breadth; use keyword pagination when you need more results per query.
  7. Plan large jobs by city — split national coverage into regional runs for clearer cost control and easier retries.
  8. Keep JSON for nested data — export CSV for outreach columns; keep JSON when you need full reviews and photos.

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

  1. Open this actor on Apify and click Try for free (or run locally with your API key).
  2. Paste a keyword + location example from above.
  3. Enable the enrichments you need.
  4. Run and open the Dataset tab.

For local development:

cd google-maps-scraper
cp .env.example .env # set API_KEY
npm install
npm 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.