Google Maps Scraper — Business Leads & Places API | $0.60/1k
Pricing
from $0.48 / 1,000 places
Google Maps Scraper — Business Leads & Places API | $0.60/1k
Scrape Google Maps places by keyword + location or by URL, place ID or CID: name, category, address, lat/lng, phone, website, rating, review count, hours.
Pricing
from $0.48 / 1,000 places
Rating
0.0
(0)
Developer
Raffy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
What does Google Maps Scraper do?
Google Maps Scraper extracts business and place data from Google Maps and delivers it as clean JSON, CSV or Excel. Type what you are looking for ("dentist", "coffee shop", "hvac contractor") and where ("Austin, TX"), or paste Google Maps URLs, place IDs or CIDs, and get every place back with its name, categories, full address, coordinates, business phone, website, rating, review count, opening hours, closed status, plus code and Google IDs.
It works as a Google Maps API alternative and a cheap Google Places API substitute: no API key, no browser, no Google account. At $0.60 per 1,000 places it is one of the cheapest Google Maps scrapers on Apify.
Typical use cases:
- Local lead lists: every plumber, roofer or dental clinic in a city, with phone and website, ready for your CRM.
- Market research and site selection: how many competitors, how they are rated, where they cluster on the map.
- Data enrichment: turn a list of place IDs, CIDs or Maps links into structured, up-to-date business records.
- Monitoring: re-run a search weekly to spot new, closed or re-rated businesses.
It collects business data only. It does not collect reviews, reviewer names, owner names, photos or e-mail addresses, and it does not log in.
Why use this Google Maps scraper?
- Cheap and fast. Plain HTTP requests to Google Maps' own data feed (no headless browser), so 1,000 places take a few minutes (deep scans longer) and cost $0.60.
- Drop-in input. Field names match the popular
compass/crawler-google-placesinput (searchStringsArray,locationQuery,maxCrawledPlacesPerSearch,language,countryCode,skipClosedPlaces,deeperCityScrape,startUrls) and its main output columns (title,categoryName,totalScore,reviewsCount,placeId,cid,location...), so switching takes minutes. - Past the 120-place limit. Google lists about 120 places per search; the deeper scan splits a city into map tiles to find many more.
- No duplicates, honest rows. Places found by several searches are saved once. Every row has a
status(ok,not_found,error), and you pay only forokrows. - Runs anywhere Apify runs: schedules, API, webhooks, Google Sheets, Zapier, Make, and AI agents through the Apify MCP server.
What data can Google Maps Scraper extract?
| Field | Type | Description |
|---|---|---|
title | string | Business or place name |
categoryName | string | Main category, e.g. Dentist |
categories | array | All Google Maps categories |
address | string | Full address as Google shows it |
neighborhood | string | Neighborhood or district |
street | string | Street and house number |
city | string | City |
postalCode | string | Postal / ZIP code |
state | string | State, region or province |
countryCode | string | Two-letter country code, e.g. US |
location | object | Pin coordinates { "lat": ..., "lng": ... } |
plusCode | string | Plus code (Open Location Code), e.g. 862466XV+7J |
phone | string | The business phone as displayed |
phoneUnformatted | string | The business phone in E.164 form, e.g. +15127173147 |
website | string | The business website |
totalScore | number | Average Google rating, 1 to 5 |
reviewsCount | integer | Number of Google reviews (a count only) |
price | string | Price level or range, when Google serves one (often empty) |
hotelStars | string | Hotel class, e.g. 5-star hotel |
openingHours | array | Weekly hours [{ "day": "Monday", "hours": "8 AM–5 PM" }] |
permanentlyClosed | boolean | Google marks the place as permanently closed |
temporarilyClosed | boolean | Google marks the place as temporarily closed |
timezone | string | IANA time zone, e.g. America/Chicago |
placeId | string | Google place ID (ChIJ...), works with the Google Places API |
cid | string | Google Maps CID; https://www.google.com/maps?cid=<cid> opens the place |
fid | string | Google Maps feature ID (0x...:0x...) |
kgmid | string | Google Knowledge Graph ID, e.g. /g/11cn2mvqwc |
searchString | string | The search term (or input URL/ID) that found the place |
rank | integer | Position in that search's results (1 = first) |
searchPageUrl | string | Google Maps page of the search |
language | string | Language the data was read in |
url | string | Google Maps link of the place |
status | string | ok, not_found or error (see below) |
error | string | Reason when status is not ok |
scrapedAt | string | ISO 8601 time of extraction |
Optional fields are left out when Google does not publish them for a place (for example, many places have no website or phone).
Result status (tri-state output)
status | Meaning | Billed? |
|---|---|---|
ok | The place was found and extracted. | Yes |
not_found | Google Maps answered, but the search has no results, the place ID does not exist, or every result was already saved by an earlier search in the run. | No |
error | Google Maps could not be read after retries, or an input entry is not a Maps URL/ID. error says why. | No |
How to scrape Google Maps
- Open the Actor in Apify Console and click Try for free.
- Enter one or more Search terms (e.g.
dentist) and a Location (e.g.Austin, TX). Or paste Google Maps URLs or Place IDs or CIDs. - Set Maximum places (the Console starts you at 20 to see the output; leave it empty to get every place each search finds, up to 200 per search).
- For a big city, switch on Deeper scan of the whole area to go past Google's ~120 places per search.
- Click Start. The default input finishes in well under a minute.
- Open the Output tab or Export the dataset as JSON, CSV, Excel, XML or HTML.
To automate it, use the API tab (Node.js, Python, curl examples) or add a Schedule.
How much does it cost to scrape Google Maps?
This Actor uses pay-per-event pricing:
| Event | Price |
|---|---|
| Actor start | $0.005 per run (at the default 1 GB memory) |
Place (status: ok row) | $0.0006 per place |
Example: 1,000 places cost about $0.61 ($0.60 + one $0.005 start at the default 1 GB memory). 10,000 places cost about $6. Duplicates, not_found and error rows are never billed, and proxies are included. The free Apify plan's monthly credit covers several thousand places. You can cap spending with Maximum places and with the run's Max total charge option; the Actor stops fetching when either limit is reached.
Input
See the Input tab for the full schema. The main options:
| Field | Type | Default | Description |
|---|---|---|---|
searchStringsArray | array of strings | - | What to search for, e.g. ["dentist", "orthodontist"] |
locationQuery | string | - | Where, e.g. Austin, TX; each term is searched as "term in location" |
maxItems | integer | empty | Maximum places saved in the whole run. Empty: up to maxCrawledPlacesPerSearch per search, or 200 per search when that is empty too, plus one row per place ID/URL |
maxCrawledPlacesPerSearch | integer | empty | Maximum places per search term |
deeperCityScrape | boolean | false | Split the area into map tiles to find more than ~120 places per search |
startUrls | array of strings | one example search | Google Maps search URLs, place URLs, ?cid= links, maps.app.goo.gl links |
placeIds | array of strings | - | Place IDs (ChIJ...) or numeric CIDs |
language | string | en | Language of categories, hours and addresses (hl) |
countryCode | string | us | Country that biases the search (gl) |
skipClosedPlaces | boolean | false | Leave out permanently or temporarily closed places |
Example input:
{"searchStringsArray": ["dentist"],"locationQuery": "Austin, TX","maxItems": 500,"deeperCityScrape": true,"language": "en","countryCode": "us"}
Look up known places directly:
{"placeIds": ["ChIJb5gBC-u0RIYRHkntaUcdJGs", "7720327853776914718"],"startUrls": ["https://www.google.com/maps/place/Brandenburger+Tor/@52.5162746,13.3777041,17z"]}
Output
You can download the dataset in various formats such as JSON, HTML, CSV or Excel. Example rows from a real run (opening hours shortened):
[{"url": "https://www.google.com/maps/search/?api=1&query=Mozart%27s%20Coffee%20Roasters&query_place_id=ChIJTWZhRFW1RIYRrdGa7DPzT7w","status": "ok","scrapedAt": "2026-10-20T15:27:57.972Z","searchString": "coffee shop","rank": 1,"title": "Mozart's Coffee Roasters","categoryName": "Coffee shop","categories": ["Coffee shop", "Bakery", "Cafe", "Event venue", "Tourist attraction"],"address": "3825 Lake Austin Blvd, Austin, TX 78703","neighborhood": "Westfield","street": "3825 Lake Austin Blvd","city": "Austin","postalCode": "78703","state": "Texas","countryCode": "US","location": { "lat": 30.2954696, "lng": -97.7839512 },"plusCode": "862476W8+5C","phone": "(512) 477-2900","phoneUnformatted": "+15124772900","website": "https://mozartscoffee.com/","totalScore": 4.5,"reviewsCount": 10984,"openingHours": [{ "day": "Monday", "hours": "7 AM–12 AM" },{ "day": "Tuesday", "hours": "7 AM–12 AM" }],"permanentlyClosed": false,"temporarilyClosed": false,"timezone": "America/Chicago","placeId": "ChIJTWZhRFW1RIYRrdGa7DPzT7w","cid": "13569331606629044653","fid": "0x8644b5554461664d:0xbc4ff333ec9ad1ad","kgmid": "/m/020z4hc","searchPageUrl": "https://www.google.com/maps/search/coffee+shop+in+Austin%2C+TX?hl=en","language": "en"},{"url": "https://www.google.com/maps","status": "not_found","error": "7720327853776914718 was already returned earlier in this run.","scrapedAt": "2026-10-20T15:49:12.410Z"}]
Tips
- Put several search terms into one run instead of many single-term runs: you pay the start fee once and duplicates are removed across terms.
- Name the place in the search term itself ("pizza near Times Square") when a city-wide location is too broad, and leave Location empty.
- Set Country to the country you search in when a city name exists in several countries (Paris, TX vs Paris, France).
- For a whole metro area, turn on the deeper scan and raise Maximum places; you pay only for the places saved.
Limitations
- Google lists about 120 places for one search and one map view. Without the deeper scan, that is the most one search term returns.
- The deeper scan covers the area Google shows for the location (a city or region view); places just outside it are left out on purpose.
- Reviews, review texts, reviewer names, owner names, photos, popular times and e-mail addresses are not collected.
priceis often empty: Google's logged-out Maps feed serves price levels for few places.- Results reflect Google Maps at the time of the run. If Google changes its data format, rows come back as
error; please report it in the Issues tab.
FAQ
Is it legal to scrape Google Maps?
The Actor collects publicly visible business listings (names, addresses, business phones, websites, ratings). You are responsible for how you use the output: read the legal notice below and Google's terms, and check the rules that apply to you, for example on cold calling or e-mail marketing.
How is this different from the Google Places API?
There is no API key, no per-request Google billing and no field masks: one flat price per place, with address parts, hours, plus code and IDs in every row. The placeId it returns works with Google's own Places API if you need more.
Can I use this Actor from an AI agent or MCP client?
Yes. Inputs are plain strings, every row is self-describing (status + error), and results can be fetched via the dataset API or the Apify MCP server.
Why did I get fewer places than maxItems?
Google listed fewer places for the search (turn on the deeper scan for big cities), places were duplicates of earlier searches, skipClosedPlaces removed closed ones, or the run hit your Max total charge limit. The run log says which.
Does it return e-mails or social profiles?
No. It returns the business's own website and phone as Google shows them; it does not crawl websites for e-mails.
Legal and data-protection notice
This Actor extracts only business and place information that Google Maps shows publicly to any visitor; it does not extract reviews, reviewer or owner names, private e-mail addresses or other private user data, and it does not log in or get around access controls. However, your results could still contain personal data, for example when a business is listed under a person's name or uses a personal phone number as its business number. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with Google's terms of service and applicable law when using the extracted data.
This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google LLC. Google and Google Maps are trademarks of Google LLC. All trademarks belong to their respective owners.