Google Map Actor avatar

Google Map Actor

Under maintenance

Pricing

from $1.50 / 1,000 scraped results

Go to Apify Store
Google Map Actor

Google Map Actor

Under maintenance

Pricing

from $1.50 / 1,000 scraped results

Rating

5.0

(2)

Developer

Noushad Ali

Noushad Ali

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Categories

Share

๐Ÿ“ What is Google Maps Business Scraper? Google Maps Business Scraper lets you extract business data from Google Maps by keyword and location, helping you generate leads, confirm business listings, build local databases, and enrich address or review data.

  • Generate qualified leads: extract business names, full address breakdowns, phone numbers, and websites to build prospect lists for your sales team
  • Confirm and enrich listings: pull rating, review count, price level, business status, opening hours, and amenities for places you already know about
  • Analyze reputation: pull up to 5 of the most relevant reviews per place (author, rating, text, and timestamp) without opening Google Maps by hand
  • Cover a whole area, not just a partial view: the scraper automatically splits your search area into smaller tiles and de-duplicates results, so you get full coverage instead of a capped, partial result set
  • Control cost precisely: choose how much detail to fetch per place โ€” from a basic address confirmation up to full contact, reviews, and amenity info โ€” so you only pay for what you need

โš™๏ธ How it works

  1. Geocoding โ€” turns locationQuery into a bounding box (skipped if you supply customBounds directly).
  2. Grid tiling โ€” splits that box into overlapping circular tiles (gridSizeKm wide) so no single search has to cover more than 60-result cap.
  3. Text Search (place/textsearch/json) โ€” runs searchTerm against every tile, following next_page_token pagination, and de-duplicates everything by place_id.
  4. Place Details (place/details/json) โ€” for each unique place, optionally fetches richer data at the tier you choose (see detailsTier below).
  5. Every result is flattened into one row and pushed to the dataset.

๐Ÿ“ฆ What data does Google Maps Business Scraper extract?

Every row is fully flat (no nested objects/arrays) so it looks the same whether you export as JSON or CSV. Fields marked "Pro" or "Enterprise" only populate at that detailsTier or higher โ€” see Input below.

GroupFields
IdentityplaceId, title, businessStatus
Addressaddress, adrAddress, vicinity, streetNumber, route, premise, sublocality, neighborhood, city, county, state, stateShort, country, countryShort, zipCode
Locationlat, lng, viewportNortheastLat/Lng, viewportSouthwestLat/Lng, plusCodeCompound, plusCodeGlobal, utcOffsetMinutes
CategorycategoryPrimary, categories
Google signalsrating, reviewsCount, priceLevel, googleMapsUrl, icon, iconBackgroundColor, wheelchairAccessibleEntrance, editorialSummary
Contact (Pro+)phone, internationalPhone, website
Hours (Pro+)opening_openNow, opening_weekdayText, currentOpening_openNow, currentOpening_weekdayText
Amenities (Enterprise)curbsidePickup, delivery, dineIn, reservable, takeout, servesBeer, servesBreakfast, servesBrunch, servesDinner, servesLunch, servesVegetarianFood, servesWine
Reviews (Enterprise)review1_author โ€ฆ review5_author, review1_rating โ€ฆ review5_rating, review1_text โ€ฆ review5_text, review1_relativeTime โ€ฆ review5_relativeTime, review1_timestamp โ€ฆ review5_timestamp, reviewsReturnedCount
Search contextgeoChunk โ€” center of the search-grid tile the place was found in
Full fidelity fallbackrawPlaceDetailsJson โ€” the complete, unflattened Place Details response as a JSON string, in case you need a field that isn't broken out above

* rating/reviewsCount/editorialSummary need at least the enterprise tier โ€” priceLevel, amenities, and reviews are Enterprise-only.

โฌ‡๏ธ Input

The input is a search term plus a location (or a custom bounding box).

FieldRequiredDefaultDescription
searchTermyesโ€”e.g. "restaurant", "plumber", "coffee shop"
locationQueryyes*โ€”Free text location, e.g. "Austin, TX, USA"
customBoundsnoโ€”{"north":..,"south":..,"east":..,"west":..} โ€” overrides locationQuery
gridSizeKmno3The search area is split into tiles of roughly this size for full coverage. Smaller = more complete coverage in dense areas, but a longer run
maxPlacesno200Stop once this many unique places are found (0 = no limit)
fetchPlaceDetailsnotrueFetches extra detail per place โ€” takes longer, adds far more data

* locationQuery is required unless customBounds is supplied.

Search term guidance

A focused, single-purpose term ("coffee shop") generally performs better than a long list of near-duplicate terms ("coffee shop", "cafe", "coffee") โ€” the latter just slows the run down without adding real coverage.

Grid size guidance

gridSizeKm is a coverage/speed knob: smaller tiles catch more places in dense urban areas but increase run time. Start around 3โ€“5 km and shrink it only if you're missing results in a dense area.

โฌ†๏ธ Output

Results are pushed to the Actor's default dataset as flat rows, one per unique place. Every field is a scalar or a delimited string, so JSON and CSV exports carry the same information โ€” arrays like opening hours or reviews are joined into readable strings (| for hours, one column set per review) instead of nested structures that CSV can't represent.

Example row (enterprise detail level, trimmed to the highlights โ€” the real row also includes every field from the table above):

{
"placeId": "ChIJd2Sm_soDDTkR62jsR0f47Y0",
"title": "Dr Arun Gupta | Interventional radiologist in Delhi",
"businessStatus": "OPERATIONAL",
"address": "Department of Interventional Radiology, SIR GANGA RAM HOSPITAL, G20 - A, near ultrasound dept, Old Rajinder Nagar, Rajinder Nagar, New Delhi, Delhi, 110060, India",
"premise": "Department of Interventional Radiology",
"city": "New Delhi",
"state": "Delhi",
"stateShort": "DL",
"country": "India",
"countryShort": "IN",
"zipCode": "110060",
"lat": 28.6384582,
"lng": 77.1895559,
"categoryPrimary": "doctor",
"categories": "doctor, establishment, health, point_of_interest",
"rating": 4.8,
"reviewsCount": 117,
"phone": "099584 74870",
"internationalPhone": "+91 99584 74870",
"website": "https://www.interventionalradiologyindia.com/",
"googleMapsUrl": "https://maps.google.com/?cid=10227103313861306603",
"wheelchairAccessibleEntrance": true,
"opening_openNow": false,
"opening_weekdayText": "Monday: 12:00 AM โ€“ 5:00 PM | Tuesday: 12:00 AM โ€“ 5:00 PM | ... | Sunday: Closed",
"photoCount": 9,
"photoReferences": "Aa-ngMbUb2ZFd...; Aa-ngMatZVZ-b7Y5...; ...",
"review1_author": "Pradeep Sharrma",
"review1_rating": 5,
"review1_text": "I have done life saver surgery by DR Arun gupta in 2025...",
"review1_relativeTime": "3 weeks ago",
"reviewsReturnedCount": 5,
"geoChunk": "28.6390,77.1900",
"rawPlaceDetailsJson": "{\"place_id\":\"ChIJd2Sm_soDDTkR62jsR0f47Y0\", ...full payload...}"
}

โš ๏ธ Known limitations

  • Reviews are capped at 5 per place โ€” that's Google's own limit on the Place Details reviews field, not something this Actor can raise
  • No "popular times" histograms, Q&A, or owner updates
  • A single run covers one locationQuery or customBounds area; for multiple non-contiguous areas, run the Actor once per area

โ“ FAQ

How does this Actor cover a whole area instead of a limited result set? It splits your search area into a grid of overlapping tiles (sized by gridSizeKm), searches each tile independently, and de-duplicates the results by placeId. Smaller tiles in dense areas find more unique places overall.

Can I get the full, unflattened Google response for a place? Yes โ€” every row's rawPlaceDetailsJson field is the complete Place Details payload as a JSON string, in addition to the flattened columns.

Will the CSV export lose data that's in the JSON export? No. Every field is already a scalar or a joined string, so the CSV and JSON exports contain the same information.