Scrape Google Maps search results in a real browser and get every place on the page: name, rating, reviews, category, address, hours and coordinates. A page that fails to load costs nothing.
1,000 free requests · Pay only on success · 195+ countries · Claude ready
Ready for your own searches? Get an API key or book a demo.
Tell us a little about your team and get:
Every Google Maps search stops at about 60 places, in the app and in the API. Cut the city into tiles instead: each tile is one more page at the same price, and the list keeps growing.
25 tile searches, one page each, cost
Gologin Web Unlockerabout $0.02
Google Places APIabout $0.80
The official API returns the fields Google picks for it. The Maps page carries more, and Web Unlocker returns the whole page.
| What you get | Google Places API | |
|---|---|---|
| 1,000 places with phone and website | About $1.10 | About $1.75 |
| Ratings split by stars, 5 to 1 | Yes | No, the average only |
| Review topics with counts | Yes | No |
| Online booking link | Yes | No, a yes or no flag |
| Keeping the results | No limits from us | Place IDs only |
Scraping more than Google Maps? Web Unlocker returns any page the same way, at the same price.
Google Maps ranks places by where the search comes from. Pick a country, a region or a city, and Web Unlocker loads the map from there.
Ready to search from your customers' city? Get your API key and free requests.
One request per search: send the Maps address, get the rendered page back, read the places. The demo above runs the same parser.
Fill in the form above. The key arrives by email within one business day.
google.com/maps/search/ plus your query, and the country, region or city to search from.
Each place is one card on the page, with the name, rating, reviews, address and hours in plain sight.
GOLOGIN_SCRAPING_API_KEY=your_key node maps-search.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst search = 'dentists in Miami';
const params = new URLSearchParams({
url: `https://www.google.com/maps/search/${encodeURIComponent(search)}?hl=en&ucbcb=1`,
render_js: 'true',
wait: '9000',
geo: 'us',
format: 'json',
});
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const { data } = await response.json();
const text = (value) => value?.replaceAll('&', '&').replaceAll(''', "'").replaceAll('"', '"');
const places = data.html
.split('role="article"')
.slice(1)
.map((card) => ({
name: text(card.match(/class="hfpxzc" aria-label="([^"]+)"/)?.[1]),
rating: card.match(/>([1-5]\.\d)</)?.[1],
reviews: card.match(/>\(([\d,]+)\)</)?.[1],
lat: card.match(/!3d(-?[\d.]+)/)?.[1],
lng: card.match(/!4d(-?[\d.]+)/)?.[1],
}));
console.table(places);pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python maps_search.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html as entities
import os
import re
from urllib.parse import quote
import requests
search = "dentists in Miami"
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={
"url": f"https://www.google.com/maps/search/{quote(search)}?hl=en&ucbcb=1",
"render_js": "true",
"wait": "9000",
"geo": "us",
"format": "json",
},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
html = response.json()["data"]["html"]
def find(pattern, card):
match = re.search(pattern, card)
return entities.unescape(match.group(1)) if match else None
for card in html.split('role="article"')[1:]:
print(
find(r'class="hfpxzc" aria-label="([^"]+)"', card),
find(r">([1-5]\.\d)<", card),
find(r">\(([\d,]+)\)<", card),
find(r"!3d(-?[\d.]+)", card),
find(r"!4d(-?[\d.]+)", card),
)GOLOGIN_SCRAPING_API_KEY=your_key node maps-tiles.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst query = 'dentists';
const center = { lat: 25.775, lng: -80.23 };
const step = 0.03;
const found = new Map();
async function tile(lat, lng) {
const params = new URLSearchParams({
url: `https://www.google.com/maps/search/${query}/@${lat},${lng},15z?hl=en&ucbcb=1`,
render_js: 'true',
wait: '9000',
geo: 'us',
format: 'json',
});
for (let attempt = 0; attempt < 3; attempt += 1) {
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
if (response.ok) return (await response.json()).data.html;
await new Promise((resolve) => setTimeout(resolve, 10000));
}
return '';
}
for (let row = -2; row <= 2; row += 1) {
for (let col = -2; col <= 2; col += 1) {
const html = await tile((center.lat + row * step).toFixed(4), (center.lng + col * step).toFixed(4));
for (const card of html.split('role="article"').slice(1)) {
const name = card.match(/class="hfpxzc" aria-label="([^"]+)"/)?.[1];
if (name) found.set(name, { name, lat: card.match(/!3d(-?[\d.]+)/)?.[1], lng: card.match(/!4d(-?[\d.]+)/)?.[1] });
}
console.log(`tile ${row},${col}: ${found.size} places so far`);
}
}
console.table([...found.values()]);Need to click, scroll or open the reviews tab first? Cloud Browser gives your code the whole browser.
A search page lists up to 7 places, and each place page adds the phone and the website. At one price per page, 1,000 places with contacts come to about $1.10.
A hard page costs
the same as an easy one.
A page that fails to load costs nothing. You pay for a rendered page, nothing else.
What 1,000 places with phone and website cost
Competitors' published prices
Web Unlocker on the Growth plan, $0.98 per 1,000 pages.
One account, one proxy network, one ecosystem. Pick the product the job needs.
Scraping other stores too? See the Amazon, eBay and Walmart scrapers.
Send the Google Maps search address to Web Unlocker. It opens the page in a real browser from the country you pick and returns the rendered HTML. Each place sits in its own card, so a short parser reads the name, rating, reviews, category, address, hours and coordinates. The code above does exactly that.
Send the Maps search address to Web Unlocker with the requests library and read the places from the HTML. The Python tab above is a complete script, 37 lines, tested on the live API.
Search results and place pages are public and load without a login. Web Unlocker loads them the way a visitor's browser does and returns the page. What you collect and how you use it is your call, so check it against the rules that apply to your project.
About 7 to 11 per page, and no single search goes past about 60: Google stops every list there, in the app and in the API. For a whole city, search the map tile by tile. 25 tiles over Miami returned 146 different dentists for about 2 cents. The Whole city tab in the code above does exactly that.
Yes. Open a place page from the search results: it carries the phone, the website, the plus code and a booking link when the place has one. That is one more request at the same price.
Google Maps shows the website of a place, not its email. The email sits on that website, and Web Unlocker opens it the same way: one more page at the same price.
Scrape the place page: it carries the review summary, how many ratings each star level got, the topics people mention with their counts, and the top reviews with the author, the stars, the date and the full text.
Web Unlocker returns the page, not a table, so nothing is cut before you see it. Turning it into a CSV takes a few lines of code, or one prompt: hand the page to Claude with the Gologin scraping skill and ask for a CSV.
Yes. Set a country, a region or a city, and the page loads from there. Results follow where the search comes from, so the same query in Miami and in Tokyo returns different places.
5 to 30 seconds in our tests: the map loads in a real browser before the page comes back.
Rendered HTML, Markdown, plain text and JSON with the page metadata.
Under $1 per 1,000 pages, and the same price for every page, so 1,000 places with phone and website come to about $1.10. A page that fails to load costs nothing. Plans start at $49 a month for 50,000 requests.
Yes, to start: Web Unlocker comes with 1,000 free requests, enough for about 1,000 search pages or 7,000 places. After that it is under $1 per 1,000 pages.
No. Web Unlocker picks the IP for you, in 195+ countries.
It depends on what you need. Apify and Outscraper sell ready tables per place. Web Unlocker returns the full Maps page from any city at one price per page, so you keep every field and parse it your way.
Tell us a little about your team and get: