How to scrape Google Maps places, reviews, and contact data
Last updated
Datapika's Google Maps scraper API returns structured place records, business name, address, phone, website, rating, review count, opening hours, coordinates, and optionally the top 10 reviews, from any Maps search query, with no Google API key. Pricing is a flat $0.003 per place with no volume tiers, so 1,000 places cost $3.00 and 5,000 cost $15.00. Google Maps caps a single search at roughly 120 places, so larger datasets come from running several narrower queries. The actor runs on Apify via REST API, CLI, or MCP server.
What data does the Google Maps scraper API return?
Every place in the dataset is a flat JSON record built from the Google Maps listing, not a raw HTML page. The core fields are title, category, address, phone, website, review_rating, review_count, status, description, and price_range. Location comes as latitude, longitude, plus_code, and an IANA timezone, and every row keeps a direct link back to the place on Google Maps plus Google's numeric cid identifier.
Two fields are lists rather than scalars. open_hours is keyed by weekday, and images holds up to 5 photo URLs per place. reviews is null unless you enable review scraping, in which case it carries the top 10 reviews for that listing.
Each record also stores search_query and an ISO scraped_at timestamp, so you can merge several runs into one table and still know which query produced which row and when. The dataset exports as JSON, CSV, or Excel, or you can read it item by item through the Apify API.
- Contact fields: phone, website, and full street address for lead lists
- Reputation fields: review_rating on a 1.0 to 5.0 scale plus total review_count
- Location fields: latitude, longitude, plus_code, and timezone for mapping
- Hours and status: open_hours per weekday and an Open / Closed / Temporarily closed status
- Media: up to 5 image URLs per place, plus the top 10 reviews when enabled
- Provenance: search_query and scraped_at on every row
How much does it cost to scrape Google Maps places?
Pricing is pay per result at a flat $0.003 per place, taken from the actor's live Apify billing as of August 2026. There are no volume tiers: the first place and the ten thousandth place cost the same. The only other event is an actor start charge of $0.00005 per run, which is small enough to ignore in any budget. You are billed only for places actually written to the dataset, and no Google Cloud account or API key is involved.
The math is easy to check. A quick 50-place test costs $0.15, a full single query of about 120 places costs $0.36, and 1,000 places cost $3.00. At 5,000 places the run costs $15.00, and 10,000 places cost $30.00, which is the same $0.003 per place at every scale.
The Apify Store lists the actor at $0.003 per place as its headline event price and shows 559 completed runs as of August 2026. The billing lists no separate per-review price; the input notes flag review scraping as slower, so budget extra run time rather than extra spend per place.
- Flat rate: $0.003 per place at any volume (live Apify billing, August 2026)
- Actor start event: $0.00005 per run, negligible in practice
- No volume tiers, so the per-place cost never changes with run size
- Worked examples: 1,000 places = $3.00, 5,000 = $15.00, 10,000 = $30.00
- You pay only for places delivered to the dataset, per the pay-per-result model
Why does one Google Maps search stop at about 120 places?
Google Maps itself renders only about 120 results for any one search no matter how far you scroll, and the actor's input notes flag the same ceiling. Setting maxResults to 500 on a single broad query like restaurants in New York will not return 500 places, it will return roughly 120 and stop. This is a property of Google Maps, not a quota on the actor.
The way around it is narrower queries. Split by neighborhood (restaurants in Williamsburg Brooklyn), by category (vegan restaurants in New York, pizza in New York), or by both, and run one query per slice. Ten neighborhood queries at up to 120 places each yield close to 1,000 places, with each run billed at the same flat $0.003 per place.
Deduplicate on the cid or link field when merging slices, because a business near a neighborhood boundary can appear in two searches. Concurrency defaults to 5 parallel place fetches and the input caps it at 10, the level where the actor's notes say Google rate limiting begins.
- Roughly 120 places per query is a Google Maps display limit, not an actor limit
- maxResults accepts 1 to 500, default 20, but a single query rarely exceeds about 120
- Split by neighborhood, district, postcode, or sub-category to multiply coverage
- Merge runs on the cid or link field to drop duplicates across overlapping areas
- Keep concurrency at the default 5; the input caps it at 10 to avoid rate limiting
How do you scrape Google Maps reviews with the actor?
Reviews are off by default because they add work per place. Set scrapeReviews to true and the actor opens each listing's review panel and captures the top 10 reviews, each with reviewer name, star rating, date, and review text. The input notes put the overhead at about 3 seconds per place, so 100 places with reviews add roughly 5 minutes to a run.
The reviews field is an array nested inside the place record, so a 20-place coffee shop query returns 20 rows and up to 200 review objects. There is no separate per-review charge in the actor's billing, the flat $0.003 place price covers them.
Ten reviews per place is enough to sample sentiment, catch recent complaints, or feed a summarization step in an agent pipeline. It is not a full review history, so for a business showing 843 reviews you get the 10 that Google surfaces first, not all 843.
- Enable with scrapeReviews: true in the input JSON
- Each review carries reviewer name, rating, date, and text
- Up to 10 reviews per place, nested in the reviews array
- Adds about 3 seconds per place, per the actor's input notes
- Pair with review_count and review_rating for a complete reputation snapshot
How do AI agents and scripts call the Google Maps scraper?
The actor is built to be called by code and by agents, not only from the Apify console. Over REST you POST the input JSON to the actor's run-sync-get-dataset-items endpoint with your Apify token and receive the place records in the same response, which fits a serverless function or a cron job. The Apify CLI and the JavaScript and Python client libraries wrap the same call.
For AI agents, the Apify MCP server exposes this actor as a tool. Point Claude, Cursor, or any MCP-compatible client at the MCP URL with openclawai/google-maps-scraper in the tools list, and the agent can read the input schema, run a query, and consume the dataset without custom glue code.
The input is small enough for an agent to construct reliably. query is the only required field, while maxResults (default 20, maximum 500), concurrency, scrapeReviews, and proxyConfiguration are optional. Residential proxies are prefilled in the default input because Google's bot detection is aggressive.
- REST: one POST to run-sync-get-dataset-items returns the full dataset
- MCP: https://mcp.apify.com/?tools=fetch-actor-details,openclawai/google-maps-scraper
- Only query is required; maxResults defaults to 20 and caps at 500
- concurrency defaults to 5 and the input caps it at 10, where rate limits start
- Residential proxy configuration is prefilled by default
| Field | Type | Example | Source / when populated |
|---|---|---|---|
| title | string | Joe's Coffee | README field table |
| category | string | Coffee shop | README field table |
| address | string | 123 Main St, New York, NY 10001 | README field table |
| phone | string | +1 (212) 555-0100 | When listed on Maps |
| website | string | https://joescoffee.com | When listed on Maps |
| review_rating | number (1.0 to 5.0) | 4.5 | When the place has reviews |
| review_count | number | 843 | When the place has reviews |
| status | string | Open / Closed / Temporarily closed | README field table |
| open_hours | object keyed by weekday | monday: 7:00 AM to 8:00 PM | When hours are published |
| latitude / longitude | number | 40.7128 / -74.006 | README field table |
| images | array of URLs | Up to 5 photo URLs | When photos exist |
| reviews | array of up to 10 objects | reviewer, rating, date, text | Only when scrapeReviews is true |
How to do it
- 1.Open https://apify.com/openclawai/google-maps-scraper and sign in to Apify, or add the actor to your agent with https://mcp.apify.com/?tools=fetch-actor-details,openclawai/google-maps-scraper.
- 2.Set query to a specific search such as dentists in London, keep maxResults at or below about 120 per query, and turn on scrapeReviews if you need review text.
- 3.Run from the console, the REST API, the CLI, or an agent tool call; places are written to the dataset as each one completes.
- 4.Export JSON or CSV, deduplicate on the cid or link field when merging several neighborhood or category queries, and schedule the run if you need recurring snapshots.
Questions, answered
Does Google Maps have an official API, and why not use it directly?
Yes. The Google Places API is the official route, but it needs a Google Cloud billing account and is priced per request by SKU. Google's pricing page (updated 25 August 2026) lists Text Search Pro at $32 per 1,000 requests and Place Details Pro at $17 per 1,000 after 5,000 free monthly calls each. Getting contact data for 1,000 places means a search call plus a details call per place. Datapika returns the same 1,000 records for $3.00 with no key.
How many Google Maps results can I scrape in one run?
Around 120 places per search query, because that is roughly how many results Google Maps renders for any single search. The maxResults input accepts up to 500, but a broad query will still stop near 120. To collect thousands of places, run one query per neighborhood, postcode, or sub-category and merge the datasets, dropping duplicates on the cid or link field. Ten focused queries can approach 1,000 unique places.
Can I scrape Google Maps reviews with this scraper API?
Yes, by setting scrapeReviews to true. Each place then includes an array of up to 10 reviews with reviewer name, star rating, date, and full review text, nested inside the place record. It adds about 3 seconds per place and there is no extra per-review charge in the actor's billing. It is a top-10 sample, not the complete review history, so use review_count for the total volume.
Do I need proxies to scrape Google Maps?
For anything beyond a small test, yes. Google Maps uses aggressive bot detection, and the actor's README recommends Apify residential proxies at scale. The default input already includes a residential proxy configuration, so you do not have to set anything up, and country-specific proxy sessions can be used to get localized results. Keep concurrency at the default of 5; the input caps it at 10, the point where the actor's notes say rate limiting starts.
What are the limitations of the Datapika Google Maps scraper?
Three main ones. Each query tops out at roughly 120 places, so wide coverage requires many narrow queries. Reviews are capped at the top 10 per place. The output covers business-level data (name, address, phone, website, rating, hours, coordinates, images) but does not include email addresses or reviewer profile details, so an email-enrichment step is needed for outreach lists. Fields like open_hours or price_range are empty when the listing itself lacks them.