Google Maps Business Scraper | $1 per 1,000
Pricing
$1.00 / 1,000 unique business results
Google Maps Business Scraper | $1 per 1,000
Scrape unique Google Maps business listings by city, region, or country. Export names, addresses, phones, websites, ratings, review counts, opening hours, photos, and coordinates. Fast, API-ready, and priced at $1 per 1,000 successful results.
Pricing
$1.00 / 1,000 unique business results
Rating
0.0
(0)
Developer
DataScraperES
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
8 hours ago
Last modified
Categories
Share
Find unique Google Maps businesses by search term and geographic location. Enter one or more cities, regions, or countries and receive one structured Dataset item per unique business, including contact details, ratings, categories, photos, opening hours, and coordinates when available.
The Actor requires no Google API key or Google account. Results can be exported directly from Apify or used in automated lead-generation, local SEO, and market-research workflows.
What this Actor does
The Actor searches each query in every requested location, divides the target area into geographic sectors, and filters businesses that fall outside the resolved area. Results are deduplicated across locations, queries, and sectors by Google Place ID, so the same listing is saved and charged only once per run.
Each accepted result can include the business name, address, city, region, postal code, country, phone, website, rating, review count, categories, description, photos, opening hours, latitude, longitude, Google Maps URL, and discovery context.
Use cases
- Build prospect lists for sales, outreach, or CRM enrichment.
- Discover businesses by category across a city, region, or country.
- Compare competitors, branch coverage, ratings, and local market density.
- Collect business websites and public phone numbers for further research.
- Create business directories or location datasets for GIS and reporting.
- Monitor how a local market changes through scheduled Dataset exports.
How to use
- Open the Actor in Apify Console.
- Add at least one location and one business search query.
- Select the language and matching country code.
- Set
maxResultsto the maximum number of unique businesses you want. - Click Start and open the Dataset when the run finishes.
For a first run, use one city, one common category, and a small result limit.
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
locations | string[] | Yes | — | Cities, regions, or countries to search. Every location is combined with every query. |
queries | string[] | Yes | — | Business categories or search terms, such as restaurants, dentists, or hotels. |
language | string | Yes | es | Language used for returned labels and localized Google Maps data. Select from the supported input options. |
countryCode | string | Yes | ES | Country used to disambiguate and constrain all locations in the run. Select from the supported input options. |
maxResults | integer | No | 1000 | Global maximum number of unique Dataset items. Use 0 for no result limit. |
Repeated identical queries are normalized and processed once. maxResults applies to the complete run, not separately to each location or query. Because one country code applies to all locations, use separate runs for locations in different countries.
This is the exact input used for the real output example below:
{"locations": ["Madrid"],"queries": ["restaurants"],"language": "es","countryCode": "ES","maxResults": 1}
Output
Every accepted unique business is stored as one item in the default Dataset. You can inspect results as a table or export them as JSON, JSONL, CSV, Excel, XML, and other formats supported by Apify.
This is the complete Dataset item from a real successful run:
{"name": "HUNDRED","placeId": "ChIJE6tFsFOFQQ0Rz192-I_0ZVg","googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJE6tFsFOFQQ0Rz192-I_0ZVg","address": "Av. de la Victoria, 144","city": "Madrid","region": "Madrid","postalCode": "28023","countryCode": "ES","phone": "919 99 27 18","website": "https://hundredburgers.com/","avgRating": 4.7,"totalReviews": null,"priceRange": null,"tags": ["Hamburguesería"],"description": "","businessPhoto": "https://lh5.googleusercontent.com/-OcG2rarGJEA/AAAAAAAAAAI/AAAAAAAAAAA/cHwLHBZ1d5c/s800-p-k-no-ns-nd/photo.jpg","photoUrls": ["https://lh5.googleusercontent.com/-OcG2rarGJEA/AAAAAAAAAAI/AAAAAAAAAAA/cHwLHBZ1d5c/s800-p-k-no-ns-nd/photo.jpg"],"hours": [{"day": "lunes","hours": "13:00–23:00","open24Hour": 13,"close24Hour": 23}],"lat": 40.474943499999995,"long": -3.8360741,"discoveryQuery": "restaurants","searchLocation": "Madrid","searchCoordinates": "40.47427870242575,-3.833157095871826","scrapeTimestamp": "2026-08-24T09:39:47.009951+00:00"}
name and placeId are required for accepted results. Other fields depend on what Google Maps exposes for that listing and can be null, an empty string, or an empty array. lat and long identify the business; searchCoordinates identifies the search sector that discovered it. Use placeId as the stable key when merging or comparing Datasets.
Complete field reference and observed presence
The following Observed presence values come from 10,000 row observations for one repeated category-and-city validation sample. They describe that sample only and are not guaranteed fill rates for other queries, locations, or future runs.
| Field | Observed presence | Meaning |
|---|---|---|
name | 100% | Business name shown on Google Maps. |
placeId | 100% | Unique Google Place ID and deduplication key. |
googleMapsUrl | 100% | Direct Google Maps listing URL. |
address | 100% | Most complete returned street address. |
city | 100% | City, municipality, or locality. |
region | 100% | Region, state, or province. |
postalCode | 99.70% | Postal or ZIP code. |
countryCode | 100% | Two-letter country code. |
phone | 97.75% | Public phone number as displayed. |
website | 84.57% | Public website associated with the listing. |
avgRating | 97.83% | Average rating when exposed. |
totalReviews | 2.72% | Review-count value when exposed in the listing payload. |
priceRange | 0% | Price-level text when exposed. |
tags | 100% | Localized business categories. |
description | 0% | Business description when exposed. |
businessPhoto | 91.19% | Main business photo URL. |
photoUrls | 91.19% | Unique returned photo URLs. |
hours | 94.37% | Available opening-hours entries. |
lat | 100% | Business latitude. |
long | 100% | Business longitude. |
discoveryQuery | 100% | First query that discovered the unique business. |
searchLocation | 100% | Input location being processed when discovered. |
searchCoordinates | 100% | Coordinates of the search sector that found it. |
scrapeTimestamp | 100% | ISO 8601 collection timestamp. |
Missing-value conventions
Missing text can be null or an empty string, missing arrays such as photoUrls and hours are normally empty arrays, and missing numbers are normally null. Numeric zero is a valid value and should not automatically be treated as missing.
Opening-hours object
Each object in hours can contain day, the localized day label; hours, the human-readable interval; and open24Hour and close24Hour, the available hour components in 24-hour format. Use the hours string when minutes or split intervals matter.
Pricing
The Actor uses pay-per-event pricing. The verified price is $0.001 per business-result event, equal to $1.00 per 1,000 results successfully written to the Dataset.
Duplicate Place IDs, out-of-area businesses, failed requests, empty responses, and candidates that are not written to the Dataset do not create a business-result charge. There is no Actor-start fee. Use maxResults and Apify's maximum-cost setting to control spending on large runs.
API and integrations
Run the Actor from Apify Console, the REST API, Apify clients, CLI, Tasks, Schedules, or webhooks. The Actor identifier is:
datascraperes/actor-google-maps
For synchronous API calls, use the run endpoint that returns Dataset items. For larger searches, start the run asynchronously and retrieve the default Dataset after it reaches a terminal status. Scheduled runs create separate Datasets by default; use placeId when comparing results over time.
Related Actors
| Actor | Best for |
|---|---|
| Website Technology Lookup – CMS, Hosting & Tech Stack Data | Enriching websites found in Google Maps with published CMS, hosting, and technology-stack data. |
| Similarweb Website Traffic & SEO Analytics Scraper | Adding estimated traffic, rankings, and audience context to discovered business domains. |
| Google Search SERP Scraper - SERP Results | Expanding local lead research with organic Google results for the same markets and keywords. |
Limits and data quality
- Google Maps results are dynamic and can change with query wording, language, location, availability, and source updates.
- A city name searches that city; selecting
countryCodedoes not turn a city search into a country search. - For the widest coverage and highest potential number of results, use the country name itself, for example
{"locations": ["Spain"]}. - Country and large-region searches create larger geographic plans and can require longer run time. Start with a capped test before using
maxResults: 0. maxResultsremains the global output and billing limit across every location and query.- Exact Place ID duplicates are removed across the complete run. Separate physical branches normally have different Place IDs and remain separate results.
- Businesses without valid identity or coordinates inside the resolved target area are not accepted.
- Optional contact, rating, description, photo, price, review, and opening-hours fields may be unavailable.
- Opening-hours arrays contain the entries exposed by the listing payload and are not guaranteed to contain all seven days.
- Temporary request failures are retried. Persistent source or location failures can reduce coverage or cause the run to fail rather than produce misleading data.
- The Actor returns rating totals when exposed, but it does not collect individual review text or reviewer profiles.
- The Actor returns public website and phone fields but does not extract email addresses or social profiles from those websites.
Frequently asked questions
Do I need a Google Maps or Google Places API key?
No. The Actor does not require a Google API key, Google Cloud project, Google account, or OAuth setup.
Are duplicate businesses charged more than once?
No. Results are deduplicated by Place ID across all queries, sectors, and locations in the run. A unique business creates a charge only when it is successfully written to the Dataset.
Can I search several countries in one run?
The public input has one shared countryCode. Use separate runs when locations belong to different countries.
Why did the run return fewer businesses than expected?
The run may have reached maxResults or the maximum-cost setting, exhausted the businesses available for the selected query, filtered listings outside the target boundary, or encountered unavailable source sectors. Try related queries, confirm the country and location, and allow more run time for large areas.
Why are some fields empty?
Google Maps does not expose every field for every business. The Actor preserves missing values as null, empty strings, or empty arrays instead of inventing or predicting data.
Does the Actor return individual Google reviews?
No. It can return avgRating and totalReviews when available, but not individual review text or reviewer information.
Responsible use
Use this Actor only for lawful purposes and in accordance with applicable laws, privacy obligations, database rights, and the terms governing the source data. Business listings can contain personal data in some jurisdictions. You are responsible for determining a valid basis for collecting, storing, combining, and using the output.
Avoid excessive collection, protect exported Datasets, retain data only as long as necessary, and honor applicable deletion or opt-out requests.
Support
If a run does not behave as expected, open an issue in the Actor's Issues tab. Include the run ID, a sanitized reproducible input, the expected result, and the observed result. Do not post API tokens, credentials, or confidential information.
Scrape data from Google Maps guide, API examples and sample Dataset