Google Maps Store Scraper avatar

Google Maps Store Scraper

Pricing

from $2.63 / 1,000 results

Go to Apify Store
Google Maps Store Scraper

Google Maps Store Scraper

Google Maps scraper by category: search any keyword and location and get every matching business as a 25-field row — name, Google categories, full address, coordinates, rating, phone, website, opening hours, amenities and highlights, in any of 40 languages.

Pricing

from $2.63 / 1,000 results

Rating

5.0

(2)

Developer

AgentX

AgentX

Maintained by Community

Actor stats

2

Bookmarked

46

Total users

0

Monthly active users

7 days ago

Last modified

Share

Google Maps Store Scraper is a Google Maps scraper by category that takes a keyword and location and returns matching businesses as 43-field rows with Google categories, addresses, coordinates, review and photo counts, contacts, hours, hotel details, attributes, and departments. One row per business, with labels available in 40 languages for lead lists, territory analysis, competitor mapping, and local-SEO research.

Apify Users Apify Runs $0.0035 per business No result cap API + MCP ready

  • A keyword can express the category. hardware store, dentist, ramen — each row carries the categories Google assigns to the result.
  • 43 fields per business, including Google identifiers, structured address parts, entrance coordinates, review and photo counts, hotel details, international phone, hours, attributes, and departments.
  • No result cap. Ask for more than the area holds and you get everything it has; a grid of map viewports widens automatically with the request.
  • 40 languages control Google's source-interface labels for categories, hours, and attributes; the selected locale may also change the returned result set.

The smallest useful run is one business: one Actor Start plus one result, $0.0135 on the free tier. Billing is per business row.


Why Choose Google Maps Store Scraper

One keyword, the whole area A location is geocoded to a centre point and then swept as a grid of map viewports. One viewport is exhausted after roughly 112-139 distinct places, so covering a city means more viewports rather than asking one for more — which the Actor does for you, sized to the count you requested.

Categories as Google files them, not as you guessed them Every row carries category (the primary one) and categories (all of them). Searching coffee returns places Google itself classifies as Coffee shop, Espresso bar and Cafe, so the classification comes back with the data instead of being something you have to infer from the name.

Two identifiers, two identity spaces place_id names the map listing, while data_id and entity_id preserve the other identifier namespaces Google returns. Keep them separate rather than treating one as an alias for another.

Structured opening hours, not a rendered string opening_hours preserves every day row Google includes in the search response, each with its own ranges. Most listings expose the current day there; some expose more.

Attributes Google shows under About attributes groups Google's accessibility, service, payment, and amenity labels; highlights carries listing badges, and departments identifies linked in-store services when present.


Quick Start Guide

Step 1: Configure your request

Open the Actor input and enter the keyword, the location, the language and how many businesses you want. All four are required and all four are prefilled with a working example.

Step 2: Run the Actor

Click Start. The location is geocoded first, then the grid is swept; a small request finishes in a few seconds.

Step 3: Collect the results

Open the default Dataset, or call the Dataset API from your pipeline. Each run produces one row per business found.


Input Parameters

The Actor takes four inputs, all required: what to search for, where to search, which language to label the results in, and how many rows to return.

ParameterTypeRequiredDescriptionExample
max_resultsintegerYesHow many businesses to save. No ceiling — a request larger than the area holds returns everything available.1
keywordstringYesWhat to look for, sent to Google Maps exactly as typed. A category works as well as a name."hardware store"
locationstringYesCity, region or country to search around. Geocoded to a centre point, then swept as a grid of viewports."Columbus, Ohio"
languagestringYesOne of 40 source-interface languages. Changes category, hour, and attribute labels and may also change the returned result set."English"
{
"max_results": 1,
"keyword": "hardware store",
"location": "Columbus, Ohio",
"language": "English"
}

How coverage scales

RequestedViewport gridDistinct places available
up to ~371 × 1~112-139
up to ~1492 × 2~448
more3 × 3~1,008

Measured across three cities at page size 100: San Francisco 139 distinct places per viewport, London 112, Paris 115. A thin category in a small market legitimately returns fewer.


Output Data Schema

One Dataset row represents one Google Maps business listing with 43 fields.

Identity and location

FieldTypeDescription
platformstringSource label: Google Maps.
place_idstringGoogle's place identifier for this listing, often in ChIJ… form.
data_idstringGoogle's internal hexadecimal listing identifier.
entity_idstringEntity identifier Google returns for the business.
namestringBusiness name as Google lists it.
local_namestringLocal-script business name when Google supplies one.
name_languagestringLanguage code for the displayed business name.
local_languagestringLanguage code for local_name, when present.
display_languagestringResponse label language reported by Google.

Address and coordinates

FieldTypeDescription
addressstringFull address as Google renders it.
streetstringStreet-address component.
areastringNeighbourhood or district, where Google supplies one.
citystringCity component.
localitystringLocality label returned for the address.
regionstringState, province, or region.
postal_codestringPostal or ZIP code.
countrystringCountry code returned by Google.
latitudenumberLatitude of the listing.
longitudenumberLongitude of the listing.
entrance_latitudenumberEntrance latitude when Google publishes a separate point.
entrance_longitudenumberEntrance longitude when Google publishes a separate point.
timezonestringIANA timezone of the place.

Classification and contact

FieldTypeDescription
categorystringPrimary Google category, in the requested language.
categoriesarrayEvery category Google files this place under.
ratingnumberGoogle rating out of 5, where the listing has one.
review_countintegerNumber of Google reviews reported for the listing, when present.
photo_countintegerNumber of listing photos Google reports, when present.
hotel_classintegerGoogle's one-to-five-star hotel class when the listing is lodging.
hotel_amenitiesarrayHotel amenity labels when the listing is a hotel.
phonestringListed phone number.
phone_intlstringInternational-format phone number when available.
websitestringListed website.
thumbnailstringListing photo Google shows in results.
descriptionstringGoogle's own editorial summary, where it publishes one.
business_descriptionstringBusiness-provided description when Google publishes one.

Hours and attributes

FieldTypeDescription
opening_hoursarrayDay rows and time ranges included in this search response.
service_hoursarrayService-specific day rows and ranges when Google supplies them.
open_statusstringGoogle's current open/closed status label.
attributesarrayGrouped accessibility, service, payment, and amenity labels.
highlightsarrayBadges Google surfaces beside the listing.
departmentsarrayLinked departments or in-store services with names and data ids.

Provenance

FieldTypeDescription
processorstringURL of the Actor that produced the row.
processed_atstringISO 8601 timestamp recorded when the row was formatted.

An abbreviated example row — arrays are truncated here:

{
"place_id": "ChIJhf1-6w6POIgRp8g4VTRXfww",
"data_id": "0x88388f0eeb7efd85:0xc7f57345538c8a7",
"entity_id": "/g/1tds7c26",
"name": "J J Hammond Co",
"name_language": "en",
"category": "Construction equipment supplier",
"categories": ["Construction equipment supplier", "Hardware store", "Industrial equipment supplier"],
"address": "1037 McKinley Ave, Columbus, OH 43222",
"city": "Columbus",
"region": "Ohio",
"postal_code": "43222",
"country": "US",
"latitude": 39.9629306,
"longitude": -83.0291579,
"rating": 4.9,
"review_count": 12,
"photo_count": 1,
"hotel_class": null,
"hotel_amenities": [],
"phone_intl": "+1 614-228-8448",
"opening_hours": [{ "day": "Tuesday", "hours": ["6:30 AM–5 PM"] }],
"service_hours": [],
"open_status": "Open · Closes 5 PM",
"attributes": [{ "group": "Accessibility", "values": ["Wheelchair accessible entrance"] }],
"departments": [],
"platform": "Google Maps",
"processed_at": "2026-08-11T17:25:50+00:00"
}

Values Google does not supply stay empty rather than being filled in. A listing too sparse to be useful is skipped rather than saved, so a paid row always carries something you can act on.

Export formats

  • JSON — the complete record with every field.
  • CSV — spreadsheet-compatible; array fields such as categories, opening_hours, attributes, and departments need expansion after export.
  • API — the Apify client SDKs and the Dataset REST API.

Integration Examples

The HTTP, Python, JavaScript, Make.com, n8n, and MCP examples all call agentx/google-maps-store-scraper with the same hardware-store scenario.

Actor ID

3x62a9tU8KybTckaD

Also addressable by name as agentx/google-maps-store-scraper — both forms work in the API, the SDKs, Make.com, and n8n.

HTTP

curl -X POST "https://api.apify.com/v2/acts/agentx~google-maps-store-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"max_results": 1,
"keyword": "hardware store",
"location": "Columbus, Ohio",
"language": "English"
}'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("agentx/google-maps-store-scraper").call(run_input={
"max_results": 1,
"keyword": "hardware store",
"location": "Columbus, Ohio",
"language": "English",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["rating"], item["phone"])

JavaScript

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("agentx/google-maps-store-scraper").call({
max_results: 1,
keyword: "hardware store",
location: "Columbus, Ohio",
language: "English",
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => console.log(item.name, item.rating));

Make.com

  1. Add the module Run an Actor.
  2. Turn Map on, to the right of the Actor field.
  3. Paste the Actor ID 3x62a9tU8KybTckaD into the Actor field.
  4. Click ⟳ Refresh to the left of Map.
  5. Edit Input JSON with keyword, location, language, and max_results.
  6. Set Run synchronously to Yes.
  7. Add Get Dataset Items and select defaultDatasetId.

n8n

  1. Add Run an Actor and get dataset from the Apify node.
  2. Set ActorBy ID and paste 3x62a9tU8KybTckaD.
  3. Edit Input JSON with keyword, location, language, and max_results.

MCP

{
"mcpServers": {
"apify": {
"command": "npx",
"args": [
"-y",
"@apify/actors-mcp-server",
"--actors",
"agentx/google-maps-store-scraper"
],
"env": { "APIFY_TOKEN": "YOUR_TOKEN" }
}
}
}

Pricing

One business row costs $0.00350 on the free tier, plus a $0.01000 Actor Start per run — so the smallest useful run is $0.0135.

EventBilling unitFREEBRONZESILVERGOLD / PLATINUM / DIAMOND
ResultOne business row$0.00350$0.00315$0.00280$0.00263
Actor StartOne per GB of memory, minimum one$0.01000$0.01000$0.01000$0.01000

The Actor runs at 256 MB, so every run bills exactly one Actor Start.

  • One business: $0.01 + $0.0035 = $0.0135
  • 500 businesses: $0.01 + 500 × $0.0035 = $1.76

A listing too sparse to publish is skipped and not billed, so the row count you pay for is the row count you can use.

Prices can change; the pricing page is authoritative.


Use Cases

Territory lead lists Run one trade across the cities you sell into and keep phone, website and address. The rows that carry a phone but no website are usually the best outbound targets.

Competitor mapping Search your own category in a market and read rating against categories — the places Google files the same way you are filed are the ones competing for the same searches.

Listing identity reconciliation Dedupe map listings on place_id, while retaining data_id and entity_id for source-specific joins that need those namespaces.

Local SEO audits categories, opening_hours, attributes, and highlights reflect what Google shows searchers. A listing missing hours or attributes that nearby results carry is a concrete fix.

Coverage and white-space analysis Sweep a category across a region and plot latitude/longitude. Empty grid cells with population are the openings.

Enrichment keys for other datasets place_id, data_id, and entity_id preserve Google's identifiers so downstream datasets can retain the same source references.


Alternatives

Reading Google Maps by hand. Fine for a handful of lookups and free. It stops working at the point where you need the same search repeated across markets, on a schedule, or feeding something downstream.

Google's own Places API. Sanctioned and the right choice when you need Google's contractual guarantees. Its official usage and billing documentation describes request-based pricing and quotas. This Actor returns public listing rows with no Google API key to manage.

Broader local-data platforms. Suites bundle Maps-like data with enrichment, email discovery and CRM export, billed by seat or subscription. Choose one if you need the whole pipeline; choose this if you need the rows in a Dataset at a per-row price.

Choose something else if you need review text or photo galleries (this path returns neither — see Limits), if you need business email addresses, or if you need Google's contractual data guarantees.


Limits and Troubleshooting

  • No review text and no photo gallery. Rows carry rating, review_count, photo_count, and may carry a thumbnail, but they do not include review bodies or gallery items. Choose a review-specific product when those are required.
  • A location returns fewer businesses than requested. One viewport is exhausted at roughly 112-139 distinct places, and the grid widens to 3 × 3 at most. A thin category in a small market simply has fewer.
  • The location could not be found. The location string is geocoded before any search. Use a city and a region — Columbus, Ohio rather than Columbus — when the name is ambiguous.
  • rating is null. Google publishes no rating for listings with too little feedback. The listing is still real; the field is honestly empty rather than zero.
  • Two runs return the businesses in a different order. Google orders by its own relevance for the viewport, which shifts. Dedupe on place_id, not on position.
  • Labels came back in the wrong language. language changes the labels Google renders, not the source data. A business name stays as its owner wrote it.

Report a problem through Issues with the run ID and the exact input.


Trust and Reliability

  • Runs on Apify cloud infrastructure with managed execution, storage, scheduling and run history.
  • Pay per business row, not per seat and not per month, with sparse listings skipped rather than billed.
  • A documented Dataset contract — all 43 Dataset fields are declared in the Actor's dataset schema and visible in the Store's output preview.
  • Source values only — no locally computed score, tier or summary is written into a row where it would look like one of Google's own figures.

Data rights and usage. Google Maps Store Scraper collects publicly accessible business listing data. You are responsible for ensuring your use of exported data complies with applicable law, contractual obligations, and your own data-governance policy.

Privacy. The Actor collects business listings, not personal profiles. Where a listing is a sole trader whose business contact is also personal contact data, GDPR and CCPA obligations apply to your use of it.

Platform terms. Review Google's terms and the Apify platform terms before using collected data in production systems.


Frequently Asked Questions

How to scrape Google Maps business data by category?

Put the category in keyword — Google Maps treats hardware store or dentist as a category search, and each returned row carries the categories Google itself files that place under, in category and categories. There is no separate category picker; the keyword is the category.

Can I do a bulk Google Maps business listings export?

Yes. max_results has no ceiling: set it above what the area holds and the run returns everything available, sweeping a wider grid of viewports as needed. Export the Dataset as CSV or JSON, or page it through the Dataset API.

Does it return reviews or photos?

Rows include rating, review_count, and photo_count when Google publishes them, and may include a thumbnail. They do not include review bodies or photo-gallery items.

How many businesses can one location return?

Measured across three cities: 139 distinct places in San Francisco, 112 in London, 115 in Paris per map viewport. The grid widens to 3 × 3 for larger requests, so roughly 1,000 is the practical ceiling for one location, and a sparse category returns fewer.

Is there a free Google Maps API?

Not an unrestricted one. Google's official Places API uses Google credentials, request-based pricing, and usage quotas. This Actor bills per returned row with no Google API key to manage — the smallest run costs $0.0135.

What is the difference between place_id and entity_id?

place_id identifies the map listing; entity_id is a separate entity identifier Google returns. Use place_id for listing-level dedupe and retain entity_id only where a downstream source expects that namespace.

Can I schedule runs to monitor a market over time?

Yes. Use Apify Schedules with the same input, and dedupe on place_id across runs. Comparing successive runs surfaces openings, closures and rating movement in a category.

Why is a business missing from the results?

Google suppresses listings below a relevance threshold for the viewport, and the Actor skips records too sparse to be useful. Widen the location, raise max_results, or try the category term Google itself uses for that trade.


AgentX publishes 77 Actors — the three closest to this one first, then the full catalog by category.

Closest to this Actor:

Business and Market Intelligence

Jobs and Hiring

Social Media

Video, Transcripts and Downloads

E-Commerce and Retail

Classifieds and Automotive

Real Estate


Support and Community

Ask about fields, coverage, or billing in the AgentX community on Telegram; for a reproducible bug, open an Issue with the run ID and the exact input.

AgentX is an Arcyton brand — arcyton.com.

Last Updated: August 15, 2026