How to Scrape Google Maps
Type a search query, click Run, and in about ten seconds you have a structured dataset with 30-plus fields per business: name, category, full address, phone, website, rating, review count, opening hours, GPS coordinates, price range, and more. No code, no browser automation, no proxy setup. The NanoScrape Google Maps Scraper handles everything on Apify's infrastructure.
In this tutorial
What you get
Every place the scraper returns comes with 30-plus structured fields. Here is an abbreviated example output (the actor's own documented example, showing the shape of a real result):
{
"title": "Example Bistro",
"category": "French restaurant",
"address": "1 Example Street, 75000 Paris, France",
"complete_address": {
"street": "1 Example Street",
"city": "Paris",
"postal_code": "75000",
"country": "France"
},
"phone": "+33 1 00 00 00 00",
"website": "https://www.example.com/",
"review_rating": 4.5,
"review_count": 1823,
"status": "OPERATIONAL",
"price_range": "$$",
"open_hours": {
"Monday": ["12:00-14:30", "19:00-22:30"],
"Friday": ["12:00-14:30", "19:00-23:00"]
},
"latitude": 48.8571,
"longitude": 2.3007,
"cid": "12345678901234567",
"scraped_at": "2026-07-24T10:00:00.000Z"
}Beyond the basics, you can opt in to reviews, popular-times histograms, email addresses, social profiles (Facebook, Instagram, LinkedIn, Twitter/X, TikTok, YouTube), SSL inspection, WHOIS data, tech stack detection, and AI-powered contact extraction. Every enrichment is billed separately only when you enable it.
includeReviews: true).Create your free Apify account
- Go to the Google Maps Scraper page on Apify.
- Click Try for free. Sign up with Google or email. It takes about a minute.
- You land in Apify Console with the actor's Input tab open and $5 of free credit ready to use.
Set your search query
The scraper's Input tab has two ways to define what to search. The simplest is searchStrings: an array of plain text queries, each one sent directly to Google Maps.
{
"searchStrings": [
"coffee shops in Berlin",
"dentists in New York",
"law firms in London"
],
"maxResultsPerQuery": 20
}A few tips that make a real difference:
- Include the location in the query string. Google Maps uses the whole string to rank results. "coffee shops Berlin" returns better results than "coffee shops" with a separate city filter.
maxResultsPerQuerygoes up to 120, which is Google Maps' page limit for a single query. For wider coverage, run multiple targeted queries instead.- For non-English regions, set
"language": "de"(orfr,es,ja, etc.) to get localized business names and category labels. - If you want to pass your own reference ID alongside each query (for joining results back to your CRM), switch to the
queriesarray instead ofsearchStringsand add acompany_idfield per query.
queries array instead. Pass a company_id per query and the scraper copies it into every result row, making it easy to join back to your source data without matching on name or address.Run the scraper
Click Save and Run at the bottom of the Input tab. You land on the run detail page. The Log tab streams progress in real time, and the Dataset tab populates as each query finishes.
Speed depends on the number of queries and maxResultsPerQuery. A typical run of 3 queries at 20 results each finishes in 10 to 20 seconds. A run of 10 queries at 100 results each takes about two minutes.
If a run finishes but the dataset looks empty, click the Dataset tab and check that the view is not filtered. You can also open the Log tab and look for error lines. The most common causes are a search query that returns zero results (the location is misspelled or too specific) or a temporary proxy issue (re-running once usually clears it).
Export your data
Open the Dataset tab on the run detail page. Click Export at the top right. You can download as:
- JSON for use in code or APIs
- CSV for Excel, Google Sheets, or LibreOffice
- Excel (.xlsx) ready to open without any import steps
- JSON-L (one JSON object per line) for streaming or Spark pipelines
If you want to pull results into an automation tool like n8n, Make, or Zapier instead of downloading a file, skip to the API section below. Every dataset is also accessible by its URL from any Apify run, so you can poll it or pipe it directly into a downstream step.
Add emails, reviews, and more
The base scrape returns the 30-plus fields you saw above. These optional add-ons stack on top, each enabled by a single flag in the Input JSON.
Featured reviews
Set "includeReviews": true and each place gets a user_reviews array with author name, star rating, publication date, and review text. Sort options: most_relevant, newest, highest_rating, lowest_rating. To filter by date, add "reviewsNewerThan": "2026-01-01" and the scraper stops pulling once it passes that cutoff.
includeReviews and scrape 500 places at 10 reviews each, that is 5,000 reviews, billed at $0.30 extra on top of the base place charge.Popular times histogram
Set "includePopularTimes": true and each result gets a popular_times object with visitor-traffic scores (0 to 100) broken down by weekday and hour. Adds about 1.5 seconds per place. Included in the base $1 per 1,000 place price.
"popular_times": {
"Monday": { "9": 38, "10": 52, "11": 70, "12": 81, "13": 79 },
"Saturday": { "10": 60, "11": 88, "12": 95, "13": 90 }
}Email addresses and social profiles
Set "enableEmailExtraction": true and the scraper visits every business website it found and pulls out email addresses, phone numbers, and social profile URLs (LinkedIn, Facebook, Instagram, Twitter/X, TikTok, YouTube) using a regex extractor. No LLM key needed.
AI-powered contact extraction
Set "enableContactExtraction": true and provide a geminiApiKey (free tier available at Google AI Studio). The scraper visits each business website and extracts structured contacts: name, position, email, phone, department. Results merge into the same dataset row as the Maps data.
{
"searchStrings": ["IT companies in Munich"],
"maxResultsPerQuery": 20,
"enableContactExtraction": true,
"enableEmailExtraction": true,
"geminiApiKey": "your-gemini-api-key",
"waitForAddOns": true
}waitForAddOns: true (the default). You get one clean dataset with everything in it, no join step needed. If you set waitForAddOns: false, add-ons run in the background and write to separate datasets that you join yourself.Automate with the API
Every actor on Apify can be called from your code or an automation platform. The simplest path is a synchronous HTTP call: POST your input JSON and the API blocks until the run completes, then returns the dataset.
curl -s -X POST \
"https://api.apify.com/v2/acts/santamaria-automations~google-maps-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchStrings": ["plumbers in Chicago"],
"maxResultsPerQuery": 50
}'The response is a JSON array of place objects, ready to pipe into your database, spreadsheet, or downstream API. Get your personal API token from Apify Console › Settings › Integrations.
For long-running jobs (thousands of places, many queries), use the async variant instead: POST to start a run, get back a runId, then poll /v2/actor-runs/{runId}/dataset/items until the run status is SUCCEEDED. The actor README has code examples in JavaScript, Python, and cURL.
Use via n8n, Make, or Zapier
If you prefer a no-code automation platform, all three support Apify natively. For n8n specifically, there is a step-by-step tutorial that walks you through connecting the scraper to a Google Sheet: How to Scrape Google Maps with n8n.
Connect to an AI agent via MCP
The scraper also ships an MCP server. Paste this URL into your MCP client (Claude Desktop, Cursor, VS Code, or any LangChain / LlamaIndex agent):
https://mcp.apify.com?tools=santamaria-automations/google-maps-scraper
Once connected, you can prompt the agent directly: "Find pediatric dentists in Zurich and put them in a table." The agent discovers the input schema automatically and runs the actor on your behalf.
What it costs
- Base places: $1.00 per 1,000 places on the Free plan. Down to $0.75 per 1,000 on Business Gold. Every place comes with 30-plus fields including popular times, GPS, category, hours, price range, and all other base data.
- Reviews: $0.30 per 1,000 reviews, billed separately only when you set
includeReviews: true. Not included in the base place price. - Contact and social enrichment add-ons: each has its own per-result rate, shown on the individual add-on actor pages. All are opt-in and skip cleanly for places with no website, no phone, or no social URL.
- Apify platform: the free tier gives you $5 of credit every month, enough for around 5,000 place results. You only pay if you go over.
A practical estimate: scraping 500 places across ten queries takes about 2 minutes and costs $0.50. Adding reviews at 10 per place adds another $0.15. Contact extraction via the AI add-on adds a small per-place cost on top, depending on which LLM provider you use (Gemini's free tier handles most jobs without a paid plan).
Common use cases
Lead generation
Search for businesses in a specific category and city, add email extraction, and export to your CRM or cold-email tool. Filter by review_count, review_rating, or status: OPERATIONAL to focus on active businesses.
Market research
Map every competitor in a region. The local_rank field (automatic when two or more places share the same category and city) shows each place's position in its cohort by review count, plus how many reviews separate it from position 3.
SEO and reputation monitoring
Pull reviews on a schedule with reviewsNewerThan set to last week's date. If the review_intel_math block (automatic when includeReviews is on) shows rating_trend: "declining", flag the account for review.
Data enrichment for existing lists
Use the queries array instead of searchStrings. Pass your internal company_id alongside each query. The scraper copies it into every result row, making it trivial to join the enriched data back to your source list without matching on name or address.
FAQ
Do I need to write any code to scrape Google Maps?
No. The Apify Console gives you a form-based input editor. Type your search queries, click Save and Run, and download the results. Code is only needed if you want to call the actor from an automation pipeline or your own application.
How many results can I get per query?
Up to 120 per single query, which is Google Maps' page limit for one search. For wider coverage, split your search by neighborhood, sub-category, or city district and run each as a separate search string. For example, instead of "restaurants in London", try "restaurants in Shoreditch", "restaurants in Camden", and "restaurants in Notting Hill".
Are reviews included in the base price?
No. Reviews are billed separately at $0.30 per 1,000 reviews, only when you explicitly set includeReviews: true. Everything else, including popular times, GPS coordinates, opening hours, photo URLs, price range, and category data, is included in the base $1 per 1,000 places.
Can I scrape businesses worldwide or only in the US?
The scraper works on any country and language Google Maps covers. Include the country or city in your search string and set the language parameter to the appropriate ISO 639-1 code (de for German, fr for French, ja for Japanese, etc.) to get localized results.
How fresh is the data?
Every scrape hits the live Google Maps API at run time. There is no cached data or stored snapshot. Whatever Google shows at the moment you run the actor is what you get.
Can I get email addresses along with the Google Maps data?
Yes. Enable enableEmailExtraction: true for a regex-based extractor that pulls emails, phone numbers, and social profile URLs from each business's website, with no API key required. For structured contacts (name, position, email), also enable enableContactExtraction: true and provide a Gemini or Groq API key. Results merge into the same dataset row as the Maps data.
Is scraping Google Maps legal?
Scraping publicly visible data from websites is generally allowed in most jurisdictions under the Computer Fraud and Abuse Act (US) and similar laws. The hiQ Labs v. LinkedIn ruling confirmed that scraping public web data is not unauthorized access. That said, GDPR and local privacy laws apply to any personal data you collect and store. Consult legal counsel for your specific situation.
Can I skip places I have already scraped on repeat runs?
Yes. Every Google Maps place has a stable cid field that does not change even if the business renames or moves. Pass an array of CIDs in excludeCids and the scraper skips them. A common pattern in automated workflows: read the CID column from your previous export, pass the array back in, and only new places land in the output.
Related resources
- Google Maps Scraper on Apify: full documentation, all input parameters, and the complete field reference.
- Scrape Google Maps with n8n: step-by-step guide for sending results straight into a Google Sheet using a free n8n workflow template.
- Google Maps Reviews Scraper: focused guide on extracting and filtering customer reviews from Google Maps.