Google Maps Store Scraper avatar

Google Maps Store Scraper

Pricing

Pay per event

Go to Apify Store
Google Maps Store Scraper

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

AgentX

Maintained by Community

Actor stats

2

Bookmarked

45

Total users

4

Monthly active users

5 days ago

Last modified

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 reviews and photos ceilings, 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:

  1. Enter a keyword, such as coffee shop, dentist, or a business name.
  2. Enter a resolvable location, such as Chicago, IL.
  3. Select a language and set max_results to a practical ceiling.
  4. Leave reviews and photos at 0 for 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

FieldTypeRequiredAccepted values and behavior
keywordstringYesNon-empty business name, category, or search phrase
locationstringYesNon-empty city, region, or country that can be geocoded
languagestringYesOne of the 46 schema enum labels; converted to a Maps locale code
max_resultsintegerYes1 to 1,000,000; maximum unique Dataset records, not a guaranteed count
reviewsintegerNo0 to 1,000,000; maximum review records requested per business; default 0
photosintegerNo0 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:

GroupFieldsInterpretation
Provenanceprocessor, processed_at, urlActor URL, processing timestamp, and collected Maps URL
Identityplace_id, name, thumbnail, categorySource identifiers and display attributes; values may be null
Addressaddress, area, located_in, plus_codeAddress components exposed for the place
Geographycoordinates, city, county, state, countryParsed source/location fields; country can be a code or label
Search contextplace_rank, place_importanceCandidate sequence position and optional location-resolution value; not a guaranteed Google rank
Contactphone, website, menu_url, emails, social_mediaListing values plus candidate links found on collected pages
Operationsopening_hours, popular_times, amenities, about, related_linksSource-dependent schedule and place attributes
Reputationprice_range, rating, rating_counts, review_count, review_tagsOptional source metrics; null or empty values are valid
Samplesreviews, photos, pricesRequested 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 os
from apify_client import ApifyClient
client = 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.

EventFREEBRONZESILVERGOLD / 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.

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 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.