Google Maps is the most complete directory of local businesses there is, but it's built for finding one coffee shop, not for exporting five hundred of them. Sales teams building lead lists, agencies auditing local SEO, analysts mapping competitors and founders sizing a market all need the same thing: every result of a Maps search as a row in a spreadsheet. This guide shows how to get exactly that in seconds, for $2 per 1,000 places.
What you get
Search for a term in a location — dentist in Austin, TX, restoran in Kadıköy, İstanbul — and every place in the results becomes one row. A real row from a recorded run:
{
"placeId": "ChIJdd_7e2q5yhQRgTF4--acUDI",
"cid": "15480742402556248168",
"featureId": "0x14cab96a7bfbdf75:0x32509ce6fb783181",
"name": "Işıl Garden Rooftop Restaurant & Turkish Cuisine",
"categories": [
"Restoran",
"Kahvaltı restoranı",
"Kafe"
],
"primaryCategory": "Restoran",
"address": "Şehsuvar Bey, Işıl Sk. No:2, 34126 Fatih/İstanbul",
"street": "Şehsuvar Bey",
"neighborhood": "Şehsuvar Bey",
"city": "Fatih",
"postalCode": "34126",
"countryCode": "TR",
"phone": "0532 596 60 63",
"phoneInternational": "05325966063",
"website": "https://isilgardenrooftoprestaurant.com/",
"rating": 4.9,
"reviewsCount": 437,
"latitude": 41.0031903,
"longitude": 28.968490499999998,
"timeZone": "Europe/Istanbul",
"hoursToday": {
"day": "Pazartesi",
"hours": "08:00–01:30"
},
"openStatus": "Açık · Kapanış saati: 01:30",
"permanentlyClosed": false,
"temporarilyClosed": false,
"thumbnail": "https://lh6.googleusercontent.com/-HJlHh3qgJqY/AAAAAAAAAAI/AAAAAAAAAAA/zftY-aObXHI/s44-p-k-no-ns-nd/photo.jpg",
"kgmid": "/g/11jskwrgrb",
"googleMapsUrl": "https://www.google.com/maps?cid=15480742402556248168",
"searchQuery": "restoran",
"searchLocation": "Kad�k�y, �stanbul",
"rank": 15,
"scrapedAt": "2026-09-28T10:25:26.728Z"
}| Field | Meaning |
|---|---|
name, primaryCategory, categories |
Business name and its Google categories |
address, street, neighborhood, city, postalCode, countryCode |
Full address and its parts |
phone, phoneInternational |
Local and E.164 phone number, when the business lists one |
website |
The business's own site |
rating, reviewsCount |
Star rating and number of Google reviews |
latitude, longitude, timeZone |
Location |
hoursToday, openStatus |
Today's opening hours and the live status line ("Closed · Opens 8 AM") |
permanentlyClosed, temporarilyClosed |
Closure flags |
placeId, cid, kgmid, googleMapsUrl |
Google identifiers and a direct Maps link |
searchQuery, searchLocation, rank |
Which search found the place and its position in the results |
Step-by-step
- Open the tool and type one or more Search queries, separated by semicolons:
dentist; orthodontist. - Enter a Location — a city, district, region or country.
- Set Max places per search. Google itself stops at about 120 results per search, so 120 is the ceiling.
- Optional: set Language and Country for local results, a Minimum rating such as
4.0, or Skip closed places. You can also search around Coordinates with a radius, or paste Google Maps search URLs into Start URLs. - Click Start. A 120-place search finishes in a few seconds; export the results as JSON, CSV or Excel.
Run Google Maps Scraper on Apify →
Call it from code
import json
import os
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("webdatatools/google-maps-scraper").call(run_input=json.loads("{\n "searchQueries": "dentist",\n "location": "Austin, TX",\n "maxPlacesPerSearch": 20\n}"))
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('webdatatools/google-maps-scraper').call({
"searchQueries": "dentist",
"location": "Austin, TX",
"maxPlacesPerSearch": 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
curl -X POST "https://api.apify.com/v2/acts/webdatatools~google-maps-scraper/run-sync-get-dataset-items"
-H "Authorization: Bearer $APIFY_TOKEN"
-H "Content-Type: application/json"
-d '{"searchQueries":"dentist","location":"Austin, TX","maxPlacesPerSearch":20}'Covering a whole city or country
Because Google returns roughly 120 places per search, a single search for "restaurant" in "London" only scratches the surface. Split the area instead: run one search per borough, district or postcode, or list several locations across runs. Every row carries searchQuery, searchLocation and placeId, so merging the results and dropping duplicates (the same place found by two neighbouring searches) is one line in a spreadsheet or a script.
Recipes
Local lead list with e-mail addresses
Google Maps gives you the website but not the e-mail. Run the Maps search, then pass its dataset to Email Extractor — Website Contact & Social Finder with inputDatasetId set to the Maps run's dataset ID and inputField set to website. It visits each business site and returns e-mails, phone numbers and social profiles you can join back on the website.
Competitor and market map
Search a category across the cities you care about with a minimum rating, and plot latitude/longitude on a map. rating and reviewsCount show who dominates each area; places with many reviews but a low rating are often the easiest to win customers from.
Keeping a place database fresh
Schedule the same searches weekly. permanentlyClosed and temporarilyClosed flag businesses that shut down, and new placeId values show new openings — useful for directories, delivery platforms and field-sales territories.
How much does it cost?
| Apify plan | Per place | Per 1,000 |
|---|---|---|
| Free plan | $0.002 | $2 |
| Starter | $0.0016 | $1.60 |
| Scale | $0.0014 | $1.40 |
| Business | $0.0012 | $1.20 |
| Enterprise | $0.0012 | $1.20 |
| Enterprise+ | $0.0012 | $1.20 |
Primary event rates from a catalog snapshot; this is not the total price of a run. Additional charge events and Actor Start fees may apply; start fees can scale with memory. Check the Actor's Pricing tab on Apify for all events, conditions and current plan-specific rates, and set a maximum run budget before starting.
Searches that fail are recorded in the run's ERRORS record and cost nothing. Set Maximum cost per run in Apify to cap what any single run can spend.
How it compares
| Approach | Good at | Watch out for |
|---|---|---|
| This tool | Fast, low-cost lead lists and place databases; any country and language; no browser, so runs finish in seconds | Only what the search results carry: today's hours, not the full week; review count, not review text; no photos or Q&A |
| Browser-based Maps scrapers that open each place page | Full weekly hours, review texts, photos | Slower and more expensive per place |
| Google Places API | Official, documented access | Requires a Google Cloud billing account and API key; usage-based pricing and terms on storing results |
| Copying results by hand | A handful of places | Doesn't scale past one screen of results |
FAQ
Why do I get at most about 120 places per search?
That's Google's own limit — Maps stops returning results after roughly 120 per search. Split large areas into several smaller locations to collect more.
Does it extract reviews or the full opening hours?
No. Search results carry today's hours and the review count only. The tool stays fast and cheap by not opening every place page. Use a dedicated reviews tool if you need review text.
Why are phone or website empty for some places?
Not every business lists them on Google Maps. The fields are null when Google has nothing to show.
Does it work outside the US?
Yes. Set the location to any city or region, and use Language and Country to get local names and results, for example tr and tr for Turkey.
Is it legal to scrape Google Maps?
The tool collects publicly visible business listings without logging in. How you use the data is your responsibility — especially privacy and anti-spam rules if you contact businesses.
Can I switch from another Google Maps scraper without changing my code?
Often yes. Besides its own input names, the tool accepts searchStringsArray, locationQuery, query and keyword, which many existing workflows and AI agents already use.