Scrape Google Maps Business Listings as JSON With the Google Local Plugin
Google Maps is one of the richest sources of local business data on the web: names, ratings, review counts, categories, addresses, opening hours, and price levels for almost every business in every city. The problem is getting that data out in a usable form. The official Places API is metered, quota-limited, and does not expose everything you see on the map. Scraping the map yourself means fighting a heavy JavaScript app, rotating IPs, and writing brittle selectors that break on the next layout change.
The new Google Local plugin removes that whole layer. You send a search keyword, and you get structured JSON business listings back. This post explains what the plugin returns, how to call it, and how to build something useful with it.
What the Google Local Plugin Does
The Google Local plugin takes a plain search phrase - the same kind you would type into Google Maps, like coffee shops in chicago or dentists in berlin - and returns the local business results as a JSON array. You do not need a Google Places API key, and you do not parse any HTML.
For each business in the results, you get fields like:
position- rank in the local resultsname- business namerating- average star ratingreviews- number of reviewsprice- price level (where Google shows one)category- business type, such as “Coffee shop”address- street addresshours- opening hours textreview_snippet- a short quote from a top review
A single call returns up to roughly 20 businesses for the keyword, which matches what Google surfaces in a local pack for a given search.
The Request
The endpoint is a single POST call. The only required parameter is keyword. A few optional parameters let you control location and language:
keyword(required) - the search phrase, for examplecoffee shops in chicagoproxy_country- the exit-IP country as an ISO-2 code (US,GB,DE)gl- the Google country of search, lowercase ISO-2 (us,de,fr)hl- the Google interface language, defaults toen
Here is the simplest possible call with curl:
curl -X POST "https://api.scrapeunblocker.com/maps/google-local?keyword=coffee%20shops%20in%20chicago&proxy_country=US&gl=us" \
-H "x-scrapeunblocker-key: YOUR_API_KEY"
The proxy_country and gl parameters matter more than they look. Local results are personalized by location, so a search for “plumbers near me” run from a US IP with gl=us returns very different businesses than the same search run from a German IP. If you are mapping a specific city or country, set both explicitly instead of relying on defaults.
The Response
The response is a single JSON object. The top level tells you what was searched and how many listings came back, and the results array holds the businesses:
{
"keyword": "coffee shops in chicago",
"proxyCountry": "US",
"resultsCollected": 18,
"results": [
{
"position": 1,
"name": "Example Coffee Roasters",
"rating": 4.7,
"reviews": 1284,
"price": "$$",
"category": "Coffee shop",
"address": "123 W Example St, Chicago, IL",
"hours": "Open - Closes 8 PM",
"review_snippet": "Great espresso and friendly staff."
}
]
}
Because the shape is stable, you can map it straight into a database row, a spreadsheet, or a dataframe without any HTML cleanup.
Calling It From Python
You do not need the SDK to use the plugin - any HTTP client works. Here is a small example with requests that runs a search and prints a clean table:
import requests
API_KEY = "YOUR_API_KEY"
URL = "https://api.scrapeunblocker.com/maps/google-local"
params = {
"keyword": "coffee shops in chicago",
"proxy_country": "US",
"gl": "us",
}
resp = requests.post(URL, params=params, headers={"x-scrapeunblocker-key": API_KEY})
resp.raise_for_status()
data = resp.json()
for biz in data["results"]:
print(f"{biz['position']:>2}. {biz['name']:<30} "
f"{biz.get('rating', '-')}* ({biz.get('reviews', 0)} reviews) "
f"- {biz.get('category', '')}")
If you prefer the official tooling, ScrapeUnblocker ships SDKs for Python, Node.js, Ruby, and PHP, and the plugin is available through the dashboard and API reference as well. The Python package installs with pip install scrapeunblocker and reads your key from the SCRAPEUNBLOCKER_KEY environment variable, so you can skip passing the header by hand.
Collecting a Whole Category Across Cities
The plugin is most useful when you loop it. Say you want a dataset of coffee shops across several US cities. You run one search per city and collect the rows:
import csv
import requests
API_KEY = "YOUR_API_KEY"
URL = "https://api.scrapeunblocker.com/maps/google-local"
cities = ["chicago", "seattle", "austin", "denver"]
rows = []
for city in cities:
params = {"keyword": f"coffee shops in {city}", "proxy_country": "US", "gl": "us"}
r = requests.post(URL, params=params, headers={"x-scrapeunblocker-key": API_KEY})
r.raise_for_status()
for biz in r.json()["results"]:
rows.append({"city": city, **biz})
with open("coffee_shops.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["city", "position", "name", "rating",
"reviews", "price", "category", "address"])
writer.writeheader()
for row in rows:
writer.writerow({k: row.get(k, "") for k in writer.fieldnames})
That gives you a single CSV with businesses from every city, ready for analysis. The same pattern works for any category - restaurants, gyms, law firms, hardware stores - and any set of locations.
What You Can Build With It
Local business data has a lot of practical uses:
- Lead generation. Pull every business in a category and city, then enrich with a website or email lookup. The
category,address, andnamefields are usually enough to seed an outreach list. - Competitor and market monitoring. Track rating and review counts for a set of businesses over time to see who is gaining traction in a market.
- Local SEO research. See who ranks in the local pack for a keyword in a given city, and how their ratings compare to yours.
- Market mapping. Count how many businesses of a type exist across regions to spot underserved areas.
Because each result includes rating and reviews, you can sort a market by popularity or filter out businesses below a review threshold in one line of code.
Practical Tips
A few things worth keeping in mind:
- Be specific with keywords. “Coffee” returns noise; “specialty coffee shops in chicago” returns a tight, relevant list. The keyword is the whole query, so treat it the way you would treat a real Google Maps search.
- Set location deliberately. Use
proxy_countryandgltogether when you care about which region’s results you get. Leaving them at defaults is fine for quick tests but not for reproducible datasets. - Handle missing fields. Not every listing has a
priceorhoursvalue, so use.get()with a default rather than indexing directly. - Respect the data. Business listing data is public, but how you store and use it still falls under privacy and platform rules. Keep your use cases legitimate - market research, lead generation, analytics - and follow applicable law.
FAQ
Do I need a Google Places API key? No. The plugin returns Google Maps listing data directly as JSON, with no Google API key and no per-request Google quota to manage.
How many results does one call return? Up to about 20 businesses per keyword, which matches the size of a typical local results set on Google.
Can I get results for a specific country or language?
Yes. Use proxy_country for the exit IP, gl for the Google country of search, and hl for the interface language. Set them explicitly for consistent, location-accurate results.
What if I need to parse a page Google Local does not cover? For arbitrary pages, use the standard scraping endpoint to fetch and parse content, and reserve the Google Local plugin for map-style business searches.
Wrapping Up
The Google Local plugin turns a messy scraping job - a JavaScript-heavy map, personalized results, and shifting HTML - into a single API call that returns clean JSON. You send a keyword, optionally pin the location, and get back structured business listings you can drop straight into a database or spreadsheet.
If you want to try it, the plugin is live in the ScrapeUnblocker dashboard and documented alongside the other plugins in the developer docs. Point it at a category and a city, and see what the local pack looks like as data.
Try ScrapeUnblocker free
95%+ success rate · from 0.55€ per 1,000 calls · 500 free requests on signup.