Google Maps Store Scraper
Pricing
from $2.63 / 1,000 results
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
Maintained by CommunityActor stats
2
Bookmarked
46
Total users
0
Monthly active users
7 days ago
Last modified
Categories
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.
- 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.
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
max_results | integer | Yes | How many businesses to save. No ceiling — a request larger than the area holds returns everything available. | 1 |
keyword | string | Yes | What to look for, sent to Google Maps exactly as typed. A category works as well as a name. | "hardware store" |
location | string | Yes | City, region or country to search around. Geocoded to a centre point, then swept as a grid of viewports. | "Columbus, Ohio" |
language | string | Yes | One 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
| Requested | Viewport grid | Distinct places available |
|---|---|---|
| up to ~37 | 1 × 1 | ~112-139 |
| up to ~149 | 2 × 2 | ~448 |
| more | 3 × 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
| Field | Type | Description |
|---|---|---|
platform | string | Source label: Google Maps. |
place_id | string | Google's place identifier for this listing, often in ChIJ… form. |
data_id | string | Google's internal hexadecimal listing identifier. |
entity_id | string | Entity identifier Google returns for the business. |
name | string | Business name as Google lists it. |
local_name | string | Local-script business name when Google supplies one. |
name_language | string | Language code for the displayed business name. |
local_language | string | Language code for local_name, when present. |
display_language | string | Response label language reported by Google. |
Address and coordinates
| Field | Type | Description |
|---|---|---|
address | string | Full address as Google renders it. |
street | string | Street-address component. |
area | string | Neighbourhood or district, where Google supplies one. |
city | string | City component. |
locality | string | Locality label returned for the address. |
region | string | State, province, or region. |
postal_code | string | Postal or ZIP code. |
country | string | Country code returned by Google. |
latitude | number | Latitude of the listing. |
longitude | number | Longitude of the listing. |
entrance_latitude | number | Entrance latitude when Google publishes a separate point. |
entrance_longitude | number | Entrance longitude when Google publishes a separate point. |
timezone | string | IANA timezone of the place. |
Classification and contact
| Field | Type | Description |
|---|---|---|
category | string | Primary Google category, in the requested language. |
categories | array | Every category Google files this place under. |
rating | number | Google rating out of 5, where the listing has one. |
review_count | integer | Number of Google reviews reported for the listing, when present. |
photo_count | integer | Number of listing photos Google reports, when present. |
hotel_class | integer | Google's one-to-five-star hotel class when the listing is lodging. |
hotel_amenities | array | Hotel amenity labels when the listing is a hotel. |
phone | string | Listed phone number. |
phone_intl | string | International-format phone number when available. |
website | string | Listed website. |
thumbnail | string | Listing photo Google shows in results. |
description | string | Google's own editorial summary, where it publishes one. |
business_description | string | Business-provided description when Google publishes one. |
Hours and attributes
| Field | Type | Description |
|---|---|---|
opening_hours | array | Day rows and time ranges included in this search response. |
service_hours | array | Service-specific day rows and ranges when Google supplies them. |
open_status | string | Google's current open/closed status label. |
attributes | array | Grouped accessibility, service, payment, and amenity labels. |
highlights | array | Badges Google surfaces beside the listing. |
departments | array | Linked departments or in-store services with names and data ids. |
Provenance
| Field | Type | Description |
|---|---|---|
processor | string | URL of the Actor that produced the row. |
processed_at | string | ISO 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, anddepartmentsneed 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 ApifyClientclient = 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
- Add the module Run an Actor.
- Turn Map on, to the right of the Actor field.
- Paste the Actor ID
3x62a9tU8KybTckaDinto the Actor field. - Click ⟳ Refresh to the left of Map.
- Edit Input JSON with
keyword,location,language, andmax_results. - Set Run synchronously to Yes.
- Add Get Dataset Items and select defaultDatasetId.
n8n
- Add Run an Actor and get dataset from the Apify node.
- Set Actor → By ID and paste
3x62a9tU8KybTckaD. - Edit Input JSON with
keyword,location,language, andmax_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.
| Event | Billing unit | FREE | BRONZE | SILVER | GOLD / PLATINUM / DIAMOND |
|---|---|---|---|---|---|
| Result | One business row | $0.00350 | $0.00315 | $0.00280 | $0.00263 |
| Actor Start | One 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 athumbnail, 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, Ohiorather thanColumbus— when the name is ambiguous. ratingis 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.
languagechanges 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.
Legal and Compliance
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.
Related AgentX Actors
AgentX publishes 77 Actors — the three closest to this one first, then the full catalog by category.
Closest to this Actor:
- Google Trends Scraper — what a market is searching for, before you go looking for who serves it.
- Google Keyword Trends — compares up to five terms on one scale, to pick which category to sweep.
- LinkedIn Company Lookup — turns a business name from a listing into its company record.
Business and Market Intelligence
- Google Keyword Trends — Google Trends keyword interest, compared five at a time
- Google Trends Scraper — Google Trends trending searches
- LinkedIn Company Lookup — LinkedIn company records
- LinkedIn Profile Lookup — LinkedIn profile records
- Weather Forecast API — forecast and historical weather data
Jobs and Hiring
- All Jobs Scraper — multi-platform job listings
- Bayt Jobs Scraper — Bayt job listings
- Glassdoor Jobs Scraper — Glassdoor job listings
- Indeed Jobs Scraper — Indeed job listings
- JobStreet Company Profile — JobStreet employer records
- Jooble Jobs Scraper — Jooble job listings
- LinkedIn Jobs Scraper — LinkedIn job listings
- Naukri Jobs Scraper — Naukri job listings
- Talent Jobs Scraper — Talent.com job listings
- ZipRecruiter Jobs Scraper — ZipRecruiter job listings
Social Media
- Instagram Creator Scraper — Instagram creator profiles
- Instagram Reels Scraper — Instagram Reels metadata
- Instagram Trending Scraper — Instagram trending content
- Medium Scraper — Medium articles
- Medium Profile Scraper — Medium author profiles
- Reddit Profile Scraper — Reddit user profiles
- Reddit Viral Scraper — Reddit viral posts
- SubReddit Info Scraper — subreddit metadata
- Subreddit Members Scraper — subreddit member lists
- Subreddit Posts Scraper — subreddit post feeds
- Telegram Chat Scraper — Telegram chat messages
- Telegram Info Scraper — Telegram channel metadata
- Telegram Member Adder — Telegram group membership management
- Telegram Member Scraper — Telegram group members
- Telegram Private Group Scraper — private Telegram group data
- TikTok Creator API — TikTok creator profiles
- TikTok User Lookup — TikTok account records
- X Twitter Community API — X community data
- X Twitter Profile Lookup — X profile records
- YouTube Creator Email Scraper — YouTube creator contact data
Video, Transcripts and Downloads
- All Video Scraper — multi-platform video metadata
- Video Transcript — multi-platform transcripts
- Video Captions Downloader — caption files
- Video to Social Post — video repurposed into social copy
- YouTube Transcript — YouTube transcripts
- TikTok Transcript — TikTok transcripts
- X Twitter Transcript — X video transcripts
- Facebook Transcript — Facebook video transcripts
- Bilibili Transcript — Bilibili transcripts
- Dailymotion Transcript — Dailymotion transcripts
- Rutube Transcript — Rutube transcripts
- Loom Transcript — Loom transcripts
- Wistia Transcript — Wistia transcripts
- Instagram Reels Downloader — Reels downloads
- Kick Clip Downloader — Kick clip downloads
- Linkedin Video Downloader — LinkedIn video downloads
- Pinterest Video Downloader — Pinterest video downloads
- Reddit Video Downloader — Reddit video downloads
- Snapchat Video Downloader — Snapchat video downloads
- TED Talk Downloader — TED talk downloads
- TikTok Live Downloader — TikTok live downloads
- Twitch VOD Downloader — Twitch VOD downloads
- Zoom Recording Downloader — Zoom recording downloads
E-Commerce and Retail
- All Shopping Scraper — multi-platform product data
- AliExpress Product Scraper — AliExpress products
- Amazon Storefront Scraper — Amazon Brand Store pages
- Bol Product Scraper — Bol.com products
- eBay Seller Leads API — eBay seller records
- Hepsiburada Product Scraper — Hepsiburada products
- Kakaku Product Scraper — Kakaku.com products
- Rakuten Product Scraper — Rakuten products
Classifieds and Automotive
- All Vehicle Scraper — multi-platform vehicle listings
- AutoTrader Vehicle Search — AutoTrader US listings
- AutoTrader UK Vehicle Search — AutoTrader UK listings
Real Estate
- All Property Scraper — multi-platform property listings
- Homes Property Scraper — Homes.com listings
- MagicBricks Property Scraper — MagicBricks listings
- NoBroker Property Scraper — NoBroker listings
- Property24 Property Scraper — Property24 listings
- Realtor Property Scraper — Realtor.com listings
- Zillow Property Scraper — Zillow listings
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