Google Maps Store Scraper
Pricing
Pay per event
Google Maps Store Scraper
Google Maps directory at scale — query any business category in any city in 46 languages and pull up to 1,000,000 places per run with name, address, phone, website, rating, review count, opening hours, plus configurable depth of customer reviews and gallery photos for each profile.
Pricing
Pay per event
Rating
5.0
(2)
Developer
AgentX
Maintained by CommunityActor stats
2
Bookmarked
45
Total users
4
Monthly active users
5 days ago
Last modified
Categories
Share
Google Maps Store Scraper searches Google Maps by a keyword and resolved location, then returns structured business records. Fields come from the listing and related source pages; email addresses and social links are website-derived candidates, not independently validated contacts.
Use it when you need reproducible local-market research without manually opening one map card at a time. Choose one of 46 interface languages, set a hard result ceiling, and optionally request review and photo samples for each matched place.
- One Dataset item per unique business that the run successfully hydrates
- 36 stable top-level fields covering identity, location, contact, operations, reputation, reviews, photos, and prices
- Optional
reviewsandphotosceilings, including zero-cost skip settings for those two event types - Pay-per-event billing aligned with actual Store, Review, Photo, Actor Start, and Actor Usage events
Run one Chicago coffee-shop result or call agentx/google-maps-store-scraper through the Apify API or MCP. Source pages change, fields can be null, and requested reviews or photos may be unavailable even when the run succeeds.
Why Choose This API
Google Maps contains useful local-business signals, but the visible mix differs by category, market, language, and profile completeness. This Actor gives those signals a consistent record shape. A restaurant can expose a menu, price range, popular times, and photos; a professional-services profile may expose only a phone, website, address, and rating. Both still use the same 36 top-level keys, so downstream tables do not need a different schema for every category.
The search starts from your exact keyword and location. The location is geocoded, locale hints are applied, candidates are deduplicated, and processing stops when the requested maximum is reached. A maximum is a ceiling rather than a promise: sparse searches, unavailable pages, duplicate results, and transient source responses can all reduce the final Dataset count.
Contact enrichment is deliberately described as candidate discovery. The listing phone and website are source-displayed values. The Actor can inspect the linked website for email strings and social-profile URLs, but it does not prove that an address is current, belongs to the intended person, accepts outreach, or is suitable for a particular legal purpose. Validate important contact data before use.
The July 23, 2026 deployment regression requested one coffee shop in Chicago with one review and one photo. It returned Caffe Umbria with one photo and 36 top-level fields, while reviews, rating_counts, and review_tags were empty and review_count was null. That behavior is why this documentation uses “up to” and “when available” for optional source data.
Quick Start Guide
Open the Actor input page and provide four required values:
- Enter a
keyword, such ascoffee shop,dentist, or a business name. - Enter a resolvable
location, such asChicago, IL. - Select a
languageand setmax_resultsto a practical ceiling. - Leave
reviewsandphotosat0for a faster listing-only run, or set small per-business ceilings when those samples are necessary.
Start with one result. Confirm that the category, location, and optional fields fit your use case, then increase the ceiling. Large theoretical input limits should not be treated as a recommended batch size; runtime, source availability, proxy use, storage, and event charges grow with the requested work.
Example input:
{"keyword": "coffee shop","location": "Chicago, IL","language": "English","max_results": 1,"reviews": 1,"photos": 1}
A successful run can still return fewer records or empty optional arrays. Check the run status, Dataset item count, and the fields required by your workflow before treating the result as complete.
Input Parameters
| Field | Type | Required | Accepted values and behavior |
|---|---|---|---|
keyword | string | Yes | Non-empty business name, category, or search phrase |
location | string | Yes | Non-empty city, region, or country that can be geocoded |
language | string | Yes | One of the 46 schema enum labels; converted to a Maps locale code |
max_results | integer | Yes | 1 to 1,000,000; maximum unique Dataset records, not a guaranteed count |
reviews | integer | No | 0 to 1,000,000; maximum review records requested per business; default 0 |
photos | integer | No | 0 to 1,000,000; maximum photo URLs requested per business; default 0 |
Supported language labels are Afrikaans, Arabic, Armenian, Belarusian, Bulgarian, Catalan, Chinese Simplified, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Estonian, Filipino, Finnish, French, German, Greek, Hebrew, Hindi, Hungarian, Icelandic, Indonesian, Italian, Japanese, Korean, Latvian, Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swahili, Swedish, Thai, Turkish, Ukrainian, and Vietnamese. The selection controls interface and result locale hints; individual business text can remain in its source language.
reviews and photos are per-business ceilings. For example, ten stores with photos: 2 can generate up to twenty Photo events, but fewer are charged if fewer photos are returned. A positive review ceiling does not guarantee that review records will be exposed.
Output Data Schema
Each Dataset item uses these 36 top-level fields:
| Group | Fields | Interpretation |
|---|---|---|
| Provenance | processor, processed_at, url | Actor URL, processing timestamp, and collected Maps URL |
| Identity | place_id, name, thumbnail, category | Source identifiers and display attributes; values may be null |
| Address | address, area, located_in, plus_code | Address components exposed for the place |
| Geography | coordinates, city, county, state, country | Parsed source/location fields; country can be a code or label |
| Search context | place_rank, place_importance | Candidate sequence position and optional location-resolution value; not a guaranteed Google rank |
| Contact | phone, website, menu_url, emails, social_media | Listing values plus candidate links found on collected pages |
| Operations | opening_hours, popular_times, amenities, about, related_links | Source-dependent schedule and place attributes |
| Reputation | price_range, rating, rating_counts, review_count, review_tags | Optional source metrics; null or empty values are valid |
| Samples | reviews, photos, prices | Requested review/photo samples and source-exposed price data |
The social_media object keeps arrays for LinkedIn, X/Twitter, Instagram, Facebook, YouTube, TikTok, Pinterest, Discord, Snapchat, Threads, Telegram, Reddit, and WhatsApp candidates. Empty arrays mean no matching links were collected; they do not prove that the business has no account.
Representative one-item output from the deployment scenario, with long image URLs and nested arrays abbreviated:
{"processor": "https://apify.com/agentx/google-maps-store-scraper?fpr=aiagentapi","processed_at": "2026-07-23T17:48:15+00:00","url": "https://www.google.com/maps?cid=2015983089223394624&hl=en&gl=us","place_id": "0x880e2cb109470fb1:0x1bfa35f0425ae540","name": "Caffe Umbria","thumbnail": "https://lh3.googleusercontent.com/example","category": "Coffee shop","address": "346 N Clark St Unit 4709, Chicago, IL 60654","area": "Near North Side","located_in": null,"plus_code": "V9Q9+GG Chicago, Illinois","coordinates": {"lat": 41.8887579, "lng": -87.6312297},"city": "Chicago","county": null,"state": "Illinois","country": "US","place_rank": 1,"place_importance": null,"phone": "(312) 955-0288","website": "http://www.caffeumbria.com/","menu_url": null,"emails": [],"social_media": {"linkedIns": [], "twitters": [], "instagrams": [], "facebooks": []},"opening_hours": [{"name": "Thursday", "hours": ["7 AM–5 PM"]}],"popular_times": {},"amenities": "Wheelchair accessible entrance; Wheelchair accessible seating; Wheelchair accessible parking lot","about": [{"description": "Chic coffeehouse featuring Italian-style drinks brewed from house-brand beans, plus baked goods.", "value": ["Italian-style coffee shop with pastries"]}],"related_links": [],"price_range": null,"rating": 4.6,"rating_counts": {},"review_count": null,"review_tags": [],"reviews": [],"photos": ["https://lh3.googleusercontent.com/example"],"prices": []}
The Dataset schema intentionally permits nullable and empty optional values. Preserve that distinction rather than converting an empty review array into “no customer reviews exist.”
Integration Examples
The Actor ID is agentx/google-maps-store-scraper. Replace token placeholders with secrets from your own environment and never commit them to source control.
REST request:
$curl -X POST "https://api.apify.com/v2/acts/agentx~google-maps-store-scraper/runs?token=$APIFY_TOKEN&waitForFinish=180" -H "Content-Type: application/json" -d '{"keyword":"coffee shop","location":"Chicago, IL","language":"English","max_results":1,"reviews":1,"photos":1}'
Python client:
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("agentx/google-maps-store-scraper").call(run_input={"keyword": "coffee shop","location": "Chicago, IL","language": "English","max_results": 1,"reviews": 1,"photos": 1,})items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
MCP arguments:
{"actor": "agentx/google-maps-store-scraper","input": {"keyword": "coffee shop","location": "Chicago, IL","language": "English","max_results": 1,"reviews": 1,"photos": 1},"callOptions": {"build": "latest", "memory": 256, "timeout": 180},"waitSecs": 45}
When an MCP call returns a Dataset ID, fetch the items separately and inspect the total count. A terminal SUCCEEDED status confirms process completion, not that every requested optional field was populated.
Pricing & Cost Calculator
This Actor uses pay-per-event pricing. Your Apify plan determines the active tier.
| Event | FREE | BRONZE | SILVER | GOLD / PLATINUM / DIAMOND |
|---|---|---|---|---|
| Store | $0.00410 | $0.00390 | $0.00380 | $0.00370 |
| Review | $0.00021 | $0.00019 | $0.00018 | $0.00017 |
| Photo | $0.00021 | $0.00019 | $0.00018 | $0.00017 |
Actor Start is $0.00005 per charged start event, and Actor Usage is $0.00001 per usage event. At BRONZE rates, one returned store with one returned review and one returned photo contributes $0.00428 in Store/Review/Photo events, plus Start and usage charges. If the review is requested but not returned, no Review event is charged for that missing record.
For predictable tests, use max_results: 1 and small optional ceilings. For production estimates, calculate the worst case as stores × Store price + returned reviews × Review price + returned photos × Photo price, then add Start and runtime-related usage. Actual totals depend on returned data and execution resources.
Use Cases & Applications
Local-market research teams can compare categories, addresses, ratings, hours, and profile attributes across a defined geography. Sales operations can use listing phones and websites as discovery inputs, then validate candidates before adding them to a CRM. Location planners can map coordinates and categories to inspect coverage, but should not interpret the candidate sequence as a stable search-ranking measurement.
Reputation workflows can collect rating and review signals when exposed. Because review counts, star distributions, tags, and individual reviews can be absent independently, analytics should track nulls and collection timestamps. A current Dataset is a source snapshot, not a permanent business record.
Directory builders can combine multiple narrowly scoped searches and deduplicate with place_id or the Maps URL. Keep the original processor, processed_at, and url fields so records remain traceable. If you need website or social enrichment, treat discovered addresses and URLs as candidates requiring validation and consent-aware outreach controls.
FAQ
Does a positive reviews value guarantee review text?
No. It is a maximum request. The July 23 regression requested one review but returned an empty array. Source availability, page shape, and profile data determine what is collected.
Are emails and social profiles verified?
No. They are candidate strings and links found on the business website or collected pages. Validate ownership, freshness, deliverability, and lawful use independently.
Is place_rank an official Google rank?
No. It is the one-based position in the candidate sequence collected for that run. Grid searches, locale, source changes, deduplication, and query context can affect it.
Why can review_count be null when rating is present?
Those values can come from different source structures. The Actor preserves missing values instead of inventing a count.
Can I request one million results?
The schema accepts a ceiling up to 1,000,000, but that is not a performance or availability guarantee. Begin with a small test and scale only after measuring runtime, result density, storage, and event costs.
What should I use for deduplication?
Prefer place_id; fall back to url when necessary. Deduplicate again when combining runs from overlapping locations or keywords.
Trust & Certifications
Trust comes from inspectable behavior rather than badges. Inputs are bounded by schema, every output record carries a processor URL and timestamp, optional values remain nullable, and billing events correspond to actual Store, Review, and Photo pushes. The documented Chicago scenario was checked through the public MCP path and its Dataset was read back independently.
The Actor does not certify businesses, contacts, accessibility, prices, opening hours, or review accuracy. Google notes that Business Profile information can be edited and updated, and Maps content may differ from actual conditions. Recheck high-impact facts at the source.
Legal & Compliance
Use the Actor only for lawful purposes and review the current Google Terms of Service, Google Maps Additional Terms, source-content rights, privacy rules, and outreach laws that apply to your location and use case. Public visibility does not automatically grant unrestricted reuse rights.
Collect only fields needed for a defined purpose. Avoid sensitive profiling, respect opt-outs, secure exported data, set retention limits, and provide appropriate notice or consent where required. Do not represent candidate contact details as verified or use a successful extraction as evidence that a business endorses your activity.
Google Business Profile content can include owner- and user-contributed material. Photos, descriptions, and reviews may carry third-party rights. Keep provenance, avoid republishing more content than necessary, and obtain legal advice for regulated or high-risk deployments.
Related Tools
Related market and listing research:
Optional enrichment workflows:
Each Actor has its own input, output, pricing, and source-availability constraints. Join records only with stable keys you have validated.
Support & Community
For a reproducible support request, include the Actor name, run ID, Dataset ID, UTC time, non-secret input, expected item count, actual item count, and the specific field or source behavior at issue. Never post API tokens, proxy credentials, or personal data in public channels.
Open the Actor, review Google Maps Additional Terms, or contact AiAgentApi support on Telegram.
Last updated: July 23, 2026.