
Quick answer: Scraping Google Maps directly violates Google's Terms of Service, and Google actively fights it with some of the best anti-bot infrastructure on the planet. For most projects, the official Google Places API is the right answer: it gives you names, addresses, phone numbers, ratings, and reviews legally and reliably. Where a fetch API like link.sc genuinely helps is the step after discovery, enriching those listings from the businesses' own public websites.
I get asked about this constantly, so let me walk through what people actually want, what the rules say, and the workflow I'd use in 2026.
What People Actually Want From a "Google Maps Scraper"
When someone searches for a Google Maps scraper, they almost always want business listing data at scale:
| Field | Typical use |
|---|---|
| Business name | Lead lists, directories |
| Address | Territory mapping, local SEO |
| Phone number | Sales outreach |
| Website URL | Enrichment, email discovery |
| Rating and review count | Competitive analysis |
| Category | Segmentation |
| Opening hours | Directory products |
| Review text | Sentiment analysis |
None of this is exotic. It's the same dataset behind every lead-gen tool and local SEO platform you've ever seen a demo of. The question isn't whether the data is useful. It's how you get it without building your business on sand.
The ToS Reality Nobody Wants to Hear
Google's terms prohibit scraping Google Maps. This isn't a gray area the way scraping a random public webpage can be (I've written about that nuance in is web scraping legal). Maps content is explicitly covered by the Google Maps Platform Terms, which forbid extracting, caching, or redistributing the content outside the licensed APIs.
Beyond the legal text, there's the practical side. Maps is a JavaScript-heavy application with aggressive bot detection, rotating markup, and rate limiting tied to some of the most sophisticated fingerprinting Google runs anywhere. Scrapers targeting it break constantly. If your product depends on a Maps scraper, you've signed up for a permanent arms race against a company with effectively unlimited engineering budget.
So my honest position: I would not scrape Google Maps, and link.sc is not the tool for that job. We built a fetch API, not a ToS-evasion service. The good news is that the compliant path covers most real use cases.
The Compliant Path: Google Places API
The Places API is Google's sanctioned way to get this exact data. You get structured JSON with place names, addresses, phone numbers, ratings, review snippets, and opening hours, with clear licensing terms. Check Google's current pricing page for costs and free usage tiers, since they change periodically and I'm not going to quote numbers that will go stale.
import requests
resp = requests.post(
"https://places.googleapis.com/v1/places:searchText",
headers={
"X-Goog-Api-Key": "YOUR_GOOGLE_KEY",
"X-Goog-FieldMask": "places.displayName,places.formattedAddress,"
"places.nationalPhoneNumber,places.rating,"
"places.websiteUri",
},
json={"textQuery": "coffee shops in Portland OR"},
)
for place in resp.json().get("places", []):
print(place["displayName"]["text"], place.get("websiteUri"))
The main constraints to know: results per query are capped, review text is limited to a handful of recent reviews, and the terms restrict long-term caching of most fields. If you need every review a business has ever received, the API won't give you that, and neither will anything else that's above board.
Where a Fetch API Actually Fits: Enrichment
Here's the part of the pipeline where I do have a dog in the fight. The Places API gives you a websiteUri for most businesses. The business's own public website is where the genuinely valuable enrichment lives: services, team pages, pricing, email addresses they've chosen to publish, social links.
That's a normal, legitimate fetch job. Point link.sc at each website and get clean markdown or structured JSON back, without maintaining your own headless browser fleet:
import requests
def enrich(website_url: str) -> dict:
r = requests.post(
"https://link.sc/v1/fetch",
headers={"Authorization": "Bearer lsc_your_key"},
json={
"url": website_url,
"format": "json",
"schema": {
"services": "list of services offered",
"emails": "contact email addresses on the page",
"social_links": "social media profile URLs",
},
},
)
return r.json()
Discovery through the licensed API, enrichment from the open web. That split keeps you compliant and gets you richer data than Maps holds anyway. The extraction pattern is the same one I covered in extract structured JSON from any webpage.
Deduplicating Business Listings
Whatever your source, you'll hit duplicates: the same business under "Joe's Pizza" and "Joes Pizza LLC" at slightly different address strings. Places API results include a stable place ID, which solves this within Google's data. Across sources, normalize before you match:
- Lowercase names, strip punctuation and legal suffixes (LLC, Inc, Ltd).
- Normalize addresses with a geocoder or a library like libpostal rather than string comparison.
- Match on phone number first when present; it's the highest-precision signal.
- Fall back to name similarity plus geographic distance (same name within 100 meters is almost always the same place).
import re
def normalize_name(name: str) -> str:
name = name.lower()
name = re.sub(r"\b(llc|inc|ltd|co)\b\.?", "", name)
return re.sub(r"[^a-z0-9 ]", "", name).strip()
Budget real time for this. Dedupe is boring and it is also the difference between a dataset people trust and one they don't.
Ethics and Compliance, Stated Plainly
A few rules I'd treat as non-negotiable:
- Don't scrape Google Maps. Use the Places API and follow its caching and attribution terms.
- When enriching from business websites, respect robots.txt, keep request rates polite, and only collect data that's publicly published.
- Business contact details published for customers are not blanket consent for bulk cold outreach. Know your local rules (CAN-SPAM, GDPR, PECR) before emailing anyone.
- Don't republish review text you don't have rights to.
I've put a longer checklist in ethical web scraping compliance best practices if you want the full treatment.
The Bottom Line
The phrase "Google Maps scraper" describes a product category that mostly shouldn't exist. Use the Places API for discovery, accept its limits, and put your engineering effort into enrichment from the open web, where a single fetch call replaces a browser farm. You'll ship faster, sleep better, and never wake up to a cease and desist.
Need clean, structured data from business websites at scale? link.sc turns any public URL into markdown or JSON with one API call. Start free with 500 credits a month.