Google Maps Places Scraper
Last updated November 9, 2026
Search Google Maps and get one row per place: name, phone, website, address, coordinates, categories, rating, review count, hours, and attributes. Look up known place IDs too. Repeats and places outside your country filter are free.
Install
npx @mambalabsdev/mcp-google-maps-places-scraperEvery tool here also runs hosted, with no install at all, through Apify's MCP endpoint.
Features
- One row per place with phone, website, address, coordinates, rating, hours, and attributes.
- Search by term and location, or look up known place IDs and Maps URLs.
- Repeats and places outside your country filter are not charged.
- Each search ends with a free summary row, so an empty search says why.
- Pay per event: Place row at $0.0015.
Input
search_termsarrayoptionalWhat to search on Google Maps, such as dentist in Austin, TX. One search per entry. Each search returns up to about 120 to 200 places, so split a large area into neighborhoods.
locationsarrayoptionalOptional. Each search term is run once per location, as "term in location". Leave empty when your searches already name the place.
placesarrayoptionalOptional. Look up places you already know: a ChIJ place ID, or a Google Maps place URL. Each costs one place row.
max_places_per_searchstringoptionalWhole number from 1 to 500. Default 20. Google stops most searches between 120 and 200 places.
only_countrystringoptionalOptional 2 letter country code, such as DE. Places in other countries are dropped and not charged. A search for Berlin can otherwise return Berlin, New Jersey, on later pages.
dedupestringoptionalyes or no. Default yes: a place found twice in a run is returned and charged once.
languagestringoptionalLanguage code for names and categories, such as en or de. Default en.
results_countrystringoptional2 letter code Google uses to tailor results. Default us. It does not limit results to that country; use only_country for that.
max_charge_usdstringoptionalOptional. The run stops before a charge that would pass this amount. Summary rows are always returned.
Output schema
{
"row_type": "string",
"input": "string",
"rank": "integer",
"name": "string",
"place_id": "string",
"cid": "string",
"feature_id": "string",
"google_maps_url": "string",
"website": "string",
"website_domain": "string",
"phone": "string",
"phone_international": "string",
"address": "string",
"street": "string",
"neighborhood": "string",
"city": "string",
"postal_code": "string",
"state": "string",
"country_code": "string",
"latitude": "number",
"longitude": "number",
"time_zone": "string",
"primary_category": "string",
"categories": "array",
"rating": "number",
"review_count": "integer",
"reviews_url": "string",
"description": "string",
"attributes": "array",
"hours_text": "string",
"open_status_text": "string",
"photo_url": "string",
"places_found": "integer",
"places_returned": "integer",
"places_skipped": "integer",
"pages_read": "integer",
"row_status": "string",
"error_reason": "string",
"billable_events_json": "string",
"scraped_at": "string"
}Pricing
| Event | Free plan price |
|---|---|
| Place row | $0.0015 |
| Actor Start | $0.004 |
Pay per event on the Apify platform. Paid Apify plans pay less per event. No subscription, no seat license.
On the Apify free plan the actor stops at $1.50 of charges a month, about 1,000 places. Any paid Apify plan removes the cap.
Limits
- Google ends most searches between 120 and 200 places. For a larger area, split it into neighborhoods or nearby cities.
- No popular times, review text, menus, or photos beyond one. Popular times were absent on all 4 busy places tested with this route, logged out.
- No price level: the field was empty on the places tested.
- No owner name, owner account, or review author data. No emails: this actor does not read websites.
- A service area business can have no address. Its row has an empty country_code, and only_country keeps it.
- A search that keeps no place ends with a free summary row: after 1 page before the run has returned any place, or 3 pages after. A place only found on a later page can be missed by a narrow only_country.
- Result order can change between runs, because the proxy pool mixes exit countries.
- results_country tailors results but does not limit them. Use only_country to limit them.
- Google's terms restrict automated collection and bulk export of Maps content. Read them and decide what your use allows.