How to scrape Google Maps without code, with Python or with an API (4 methods compared)
Four ways to get business data out of Google Maps, step by step: a no-code extension, Python and the Places API, a scraping API, and a lead tool, with costs.
- Published
- Updated
- Read time
- 12 min
- Category
- Guide
There are four practical ways to scrape Google Maps: a no-code browser extension, your own code (Python), a ready-made scraping API, or a lead tool that also finds and verifies emails. The extension is fastest for a few hundred rows. Code gives you control but you inherit blocking, the per-search result cap and maintenance. A scraping API removes the blocking problem. A lead tool such as Leadraft (which we make) is the shortest path if the goal is a list of local businesses you can email. Whichever method you use, one search stops at about 120 results, so covering a whole city means searching it in tiles.
Last checked: November 3, 2026. Prices and API limits below come from the linked vendor and Google pages on the dates in the Sources.
Before you start, two facts apply to every method. First, Google's terms prohibit scraping Google Maps, so read our honest legal guide before you run anything at scale. Second, Google Maps listings have no email field. Any method that ends with emails has to visit each business's website.
How do the four methods compare?#
Scroll horizontally if needed →
| 1. No-code extension | 2. Python (your code) | 3. Scraping API | 4. Lead tool | |
|---|---|---|---|---|
| Skill needed | None | Developer | Light coding or none | None |
| Setup time | Minutes | Days | An hour | Minutes |
| Results per search | About 120 (what you scroll) | 60 per query via Places API; about 120 via browser | Vendor handles paging; some tile for you | Tiles for you |
| Covers a whole city | Only by hand, area by area | If you build tiling | Some do, check | Yes, if it tiles |
| Emails | Rarely | Build it yourself | Usually an add-on | Usually included |
| Email verification | No | Build it or buy it | Add-on | Included in some |
| Blocking risk | Your browser and IP | High for browser code; none for the API | The vendor's problem | The vendor's problem |
| Maintenance | Vendor updates the extension | You fix it when Google changes | Vendor | Vendor |
| Typical cost | Free to about $39/month | API fees or proxies, plus your time | About $1.50 to $3 per 1,000 rows (as of Oct 2026) | Subscription |
Method 1: How do I scrape Google Maps without code?#
Use a browser extension or a hosted no-code tool: search in Google Maps, let the tool read the results panel, and export a CSV. It works for one-off lists of a few hundred businesses.
- Install an extension that reads Google Maps results. Generic table scrapers such as Instant Data Scraper work on the results list; Maps-specific extensions such as G Maps Extractor are built around listing fields.
- Search the way a customer would: "plumber in Tulsa, OK". Zoom the map to the area you care about first, since results follow the map view.
- Scroll the results panel to the end. Most extensions only capture what the panel loads. The list ends at around 120 results.
- Export to CSV, then open it in Excel or Google Sheets.
- Repeat for each neighborhood or ZIP code and each keyword variant ("plumbing contractor", "drain cleaning service"), then merge the files and remove duplicates. Our guide to exporting Google Maps to Excel and Sheets has the cleanup formulas.
Where it breaks: the work runs in your browser on your IP, so large runs get slow and can trigger Google's rate limits or CAPTCHAs. You get what's on the listing, so no emails unless the tool crawls websites. And covering a city means doing steps 2 to 5 dozens of times.
Method 2: How do I scrape Google Maps with Python?#
There are two routes. You can automate a real browser (Playwright or Selenium) to search Maps, scroll and parse each listing. Or you can call Google's official Places API, which returns structured JSON for a fee. The browser route is what most tutorials show. The API route is the one that keeps working.
The browser-automation route, and its problems#
The approach is simple to describe: open google.com/maps, type a query, scroll the results feed until it stops loading, open each listing, read the fields, save rows. In practice you take on three problems.
- Blocking. At volume, Google serves CAPTCHAs and blocks. Getting past that means rotating residential proxies, pacing requests and handling consent screens per country. Many scraping tutorials are published by proxy vendors for this reason.
- The result cap. Scrolling stops at about 120 results per search, so you also have to build tiling: split the area into a grid, search each cell at a tight zoom, subdivide dense cells, and dedupe by place ID.
- Maintenance. Google changes the page without notice. In February 2026, for example, signed-out users were briefly shown a "limited view" of Maps without most reviews and photos, which was reported and then reverted within about two weeks (9to5Google). A scraper tied to the page breaks every time something like that happens.
Browser scraping is also the method Google's terms most directly prohibit. The official API is the more stable route for code, with trade-offs covered below.
The Places API route (with a short example)#
The Places API (New) Text Search endpoint takes a query like "dentist in Tucson" and returns up to 20 places per page and up to 60 across pages (Google). You choose the fields with a field mask, and the fields you choose set the price.
- Create a Google Cloud project, enable Places API (New), turn on billing and create an API key.
- Decide on fields. Website, phone and rating are Enterprise-tier fields; name, address, location and types are Pro.
- Send the request, follow
nextPageTokenup to the 60-result limit, and dedupe on the placeid.
This is an illustrative sketch, not production code:
import requests
API_KEY = "YOUR_API_KEY"
URL = "https://places.googleapis.com/v1/places:searchText"
FIELDS = ",".join([
"places.id", "places.displayName", "places.formattedAddress",
"places.location", "places.primaryType",
"places.nationalPhoneNumber", "places.websiteUri", # Enterprise-tier fields
"places.rating", "places.userRatingCount",
"nextPageToken",
])
def text_search(query, rect=None):
"""Yield up to 60 places for one query (Google's per-query cap)."""
body = {"textQuery": query, "pageSize": 20}
if rect: # restrict to one tile: {"low": {...}, "high": {...}}
body["locationRestriction"] = {"rectangle": rect}
headers = {"X-Goog-Api-Key": API_KEY, "X-Goog-FieldMask": FIELDS}
while True:
data = requests.post(URL, json=body, headers=headers, timeout=30).json()
yield from data.get("places", [])
token = data.get("nextPageToken")
if not token:
break
body["pageToken"] = token # all other parameters must stay the same
seen = {}
for place in text_search("dentist in Tucson, AZ"):
seen[place["id"]] = place # dedupe on place ID
print(len(seen), "unique places")
To cover a city, you call text_search once per tile (a small rectangle) and per keyword variant, and merge into seen.
Where it breaks:
- Cost per request. Requesting website or phone bills Text Search at the Enterprise rate: $35 per 1,000 requests after 1,000 free each month, as of October 2026 (Google pricing). Each request returns at most 20 places, and sparse tiles return fewer. Our Places API cost breakdown works through 10,000 businesses.
- No emails. The API has no email field. You'd still need to crawl each website and verify what you find.
- Storage rules. The Maps Platform terms say you may not "copy and save business names, addresses, or user reviews" outside the services. Place IDs may be cached; latitude and longitude only for 30 days. That rules out using the API to build a lead database you keep.
Method 3: How do I scrape Google Maps with a scraping API?#
Use a hosted Google Maps data service: you send a query (or a list of queries and areas) to the vendor's API or web app, and it returns structured rows. The vendor handles proxies, blocking and page changes. Examples include Apify's Google Maps Scraper actor, Outscraper, SerpApi's Google Maps API and Bright Data.
- Create an account and pick the Google Maps product.
- Enter queries and locations. Some accept a polygon or coordinates and split the area for you; check whether yours does, or you'll get about 120 per query.
- Pick add-ons: contact details (emails and socials from websites), reviews, verification. Each is usually priced separately.
- Run, then download JSON, CSV or Excel, or pull the results over the API.
- Clean the output: dedupe on place ID, drop out-of-area and wrong-trade rows, and match emails to businesses.
As of October 2026, Apify's actor lists "from $1.50 / 1,000 scraped places" with add-ons on top, Outscraper charges $3 per 1,000 after the first 500 and $1 per 1,000 above 100,000, and Bright Data lists $1.50 per 1,000 records pay as you go. These services return raw rows at volume; deduping, filtering and email checking are left to you.
Where it breaks: billing is usually per row returned, so duplicates from overlapping searches and rows outside your area cost the same as good ones. Emails and verification are extras with their own pricing, and you're still responsible for how you use the data under Google's terms.
Method 4: How do I get Google Maps leads with a lead tool?#
Use a tool built for the end result, a list of businesses you can contact: you describe the trade and the area, it covers the area, filters the results, finds emails on each business's website and verifies them. This is the shortest path for agencies, cold-email operators and local sales teams.
- Describe the market: the trade ("dentist", plus variants like "cosmetic dentist" and "orthodontist") and the place (a city, county or ZIP, or a shape you draw).
- Choose the scope: only businesses inside the area, or inside plus a margin.
- Preview what's there before paying, if the tool allows it.
- Run. The tool tiles the area past the result cap, dedupes by place ID, finds emails and grades them.
- Export to CSV or Excel, or push straight to Instantly, Smartlead, lemlist or HubSpot.
Where it breaks: you get fewer raw fields than a developer-oriented scraper (often no review text or photos), and you depend on the vendor's coverage method. Check how they bill: per business, per row or per email.
Which method should I use?#
For a list of local businesses you'll email or call, use a lead tool, and Leadraft is built for exactly that job: it tiles the area past the result cap, keeps only businesses inside your area and trade, finds emails on each business's own website and checks every one against the mail server. You pay once per business, ever, and out-of-area results aren't charged. The free plan covers 500 businesses and 50 checked emails a month; Growth is $49 a month for 100,000 businesses and 5,000 checked emails.
Scroll horizontally if needed →
| Situation | What Leadraft does |
|---|---|
| Under 200 businesses, once | Free plan: 500 businesses and 50 checked emails a month, no card |
| A whole city, county or drawn territory | Searches it in tiles and dedupes by place ID, on every plan |
| A list you'll email or call | Emails from each business's website, graded Verified, Accept-all or Invalid, pushed to Instantly, Smartlead, lemlist or HubSpot |
| New businesses every month | A monitor re-runs the search and delivers only new businesses |
| An app feature that shows places live on a map | Not what Leadraft does |
| Full review text and photos for analysis | Not what Leadraft does |
Whatever method you use, the quality checks are the same: count unique businesses against one manual search, count rows outside your area, and look at how many emails are verified rather than just "found". Our Google Maps scraper guide has the full evaluation checklist, and why Maps stops at 120 results explains the tiling every method needs.
Why does my Google Maps scrape stop early or miss data? (troubleshooting)#
Most problems come from the same few limits. Find the symptom, then the fix.
Scroll horizontally if needed →
| Symptom | Likely cause | Fix |
|---|---|---|
| Stops at about 120 results | One Maps search only loads about 120 listings, whatever tool reads it | Split the area into tiles and search each; add keyword variants; dedupe by place ID (why) |
| Only 20 results | Only the first page loaded. The Places API returns 20 per page; the Maps panel loads more as you scroll | Follow nextPageToken (up to 60 per query), or scroll the panel to "You've reached the end of the list" |
| Stops at exactly 60 | The Places API Text Search cap: "a maximum of 60 results across all pages" | Smaller areas with locationRestriction, one query per tile |
| Results from outside your area | locationBias (or a loose map view) prefers an area but doesn't enforce it | Use locationRestriction in the API, and drop rows whose coordinates fall outside your boundary |
| Only 5 reviews per place from the API | Google's Place resource returns "a maximum of 5 reviews" (and 10 photos) | Treat API reviews as a sample; don't plan on full review text from the API |
| Phone or website missing | Field not in your field mask, or the business didn't list one | Add nationalPhoneNumber and websiteUri to the mask (Enterprise tier); otherwise the field is genuinely empty |
| No street address | Service-area businesses can hide their address on their profile | Keep them; use the city and coordinates Google provides for the area check |
| CAPTCHAs, blocks or empty pages | Browser automation at volume from one IP | Slow down, or move to the official API or a hosted service; residential proxies are what scraping vendors use |
| Fewer reviews and photos when signed out | Google has tested a "limited view" for signed-out users (February 2026) | Check results in a signed-in browser before you blame the scraper |
| No emails at all | Google Maps listings have no email field | Crawl each business's website, then verify the addresses |
| The same business twice | Overlapping tiles or keyword variants | Dedupe on place ID, not on name |
FAQ#
What is the easiest way to scrape Google Maps?#
A no-code browser extension or a hosted tool. You run a search, scroll the results and export a CSV. It works for small pulls, but it stops at about 120 results per search and gives you no emails unless the tool visits each website.
Can I scrape Google Maps with Python?#
Yes. You can drive a browser with Playwright or Selenium, or call the official Places API. Browser scraping breaks when Google changes the page and gets blocked at volume. The Places API is stable but costs money per request, caps Text Search at 60 results, has no email field and restricts storing the data.
How do I scrape more than 120 results from Google Maps?#
Split the area into smaller tiles and run the same search in each, add keyword variants for the trade, then merge and remove duplicates by place ID. Every method above needs this to cover a whole city.
Is it free to scrape Google Maps?#
Small amounts can be. Extensions have free tiers, the Places API gives a monthly free allowance per SKU, and many tools have free credits. At city scale you pay in money, proxies or time.
Why does my Google Maps scraper only return 20 results?#
Usually because only the first page loaded. The Places API returns 20 places per page and up to 60 across pages if you follow nextPageToken. In the Maps interface, the results panel loads more as you scroll, so a scraper that doesn't scroll to the end captures only the first batch.
Is scraping Google Maps allowed?#
Google's terms prohibit it, and the Maps Platform terms restrict how API data is stored. It is a contract issue first; whether it is unlawful depends on your country and the data. See our legal guide and get advice for your situation.
Sources#
- Google for Developers, Text Search (New) (20 per page, "a maximum of 60 results across all pages"; field-to-SKU mapping;
locationBiasvslocationRestriction), seen October 31, 2026. - Google for Developers, Google Maps Platform pricing (Text Search Enterprise $35 per 1,000, 1,000 free per month), last updated October 30, 2026.
- Google, Google Maps Platform Terms of Service §3.2.3, and Service Specific Terms (Places API caching), seen October 31, 2026.
- Apify, Google Places API limits (about 120 listings per Maps search), September 23, 2025.
- 9to5Google, Google Maps limited view for signed-out users, February 2026.
- Apify, Google Maps Scraper actor; Outscraper, Pricing; Bright Data, Google Maps scraper, all seen October 31, 2026.
- Google for Developers, Place resource reference ("A maximum of 5 reviews can be returned"; up to 10 photos), seen November 3, 2026.
Lead lists for the trades in this article
Keep reading
Guide
Lead generation with Claude: MCP setup, prompts and guardrails
Use Claude for lead generation: what web search can and can't do, exact MCP setup for Claude Code, Desktop and Cursor, prompts that work, and spending guardrails.
Read articleGuide
Clay and Google Maps: what Clay's Maps source does, where it stops, and how to import a full local list
What Clay's Google Maps source returns, its 1,000-result default and no-website gaps, why teams source outside Clay, and how to import a CSV or webhook feed.
Read articleGuide
Instant Data Scraper on Google Maps: how to use it, what it captures and its limits
How to use the free Instant Data Scraper extension on Google Maps, step by step: what it captures, why it stops near 120 results with no emails, and when to upgrade.
Read article