Google Maps Scraper - Places, Reviews, GPS and Place ID
Pricing
from $0.26 / 1,000 places
Google Maps Scraper - Places, Reviews, GPS and Place ID
Scrape Google Maps places from a search: name, category, address, star rating, review count, GPS coordinates and Google's place IDs, one row per place. Add place links for their newest reviews. A town Google can't find gets a free row, not places from elsewhere. $0.27 per 1,000 rows.
Pricing
from $0.26 / 1,000 places
Rating
5.0
(2)
Developer
Dami's Studio
Maintained by CommunityActor stats
1
Bookmarked
36
Total users
22
Monthly active users
2 days ago
Last modified
Categories
Share
Type the searches you would type into Google Maps and get one row per place: name, category, address, star rating, coordinates and Google's own identifiers. Hand it place links instead and it reads the newest reviews on each one.
The awkward bit first, because it decides whether this is the right tool for you. A search reads the
results card, and Google only prints a phone number or a website on that card for a handful of
businesses. Measured across 334 place rows from 17 recent runs: phone came back on none of them
and website on 9. If contact details are the whole point of your project, budget for opening each
place rather than expecting them from the search.
| Input | Google Maps searches with the place in the text, or place links to read reviews from |
| Output | One row per place, and one row per review when you ask for reviews |
| Ceiling | 500 places per search, 500 reviews per place |
| Speed | About 30 seconds for one search of 50 to 60 places. Ten searches of 5 places took 80 seconds |
| Account needed | None, and no Google API key |
| Price | $0.27 per 1,000 rows on the free plan, down to $0.264 on Business. The free plan's $5 a month covers about 18,000 |
🔍 What Google Maps Scraper does
Two jobs in one actor, and you can use either on its own.
Search. Give it searches with the location in the text, like coffee in Brooklyn, and it scrolls
the results feed until it reaches your limit or the feed runs dry. Fill in city or county and
every search runs there instead.
Reviews. Give it place links and it returns each place's newest reviews: who wrote it, the stars,
the text, Google's relative date, the owner's reply and any photos. Tick includeReviews and a
search collects reviews for every place it found.
It checks where Google searched. Ask Google Maps for a place it cannot find and it answers with
places from somewhere else, or with the whole state when only the town is wrong. So a misspelt town
gets a free BAD_INPUT row instead of a page of coffee shops two states away.
📋 What data you get from each Google Maps place
| What you get | Field |
|---|---|
| Name and category, as the card prints them | name, category |
| Street address | address |
| Star rating and number of reviews | rating, reviewCount |
| Coordinates | lat, lng |
| Google's feature id and the numeric id | placeId, cid |
| The full place link, ready for a review run | placeUrl |
| Phone and website, on the rare cards that print them | phone, website |
| The search that found the place | searchQuery |
| Per review: the reviewer, stars, text, relative date, owner reply and photos | reviewerName, rating, text, relativeDate, ownerReply, photoUrls |
| A stable id per review | reviewId |
▶️ How to scrape Google Maps places
- Open Google Maps Scraper and click Try for free.
- Put your searches into Search queries, with the location in the text. Delete the example first.
- Set Max places per query. Start around 10 to see what the rows look like.
- For reviews, paste place links into Google Maps place URLs for reviews, or tick Include reviews for search results, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Start it empty and you get one labelled sample row, not charged.
💰 How much does it cost to scrape Google Maps?
$0.27 per 1,000 rows. Paid plans: Starter $0.268, Scale $0.266, Business $0.264. On the free plan, the $5 Apify gives you each month covers about 18,000 rows.
A review row counts the same as a place row, so one place with 100 reviews is 101 rows, not one.
That adds up fast with Include reviews on: a 60-place search at the default of 50 reviews a place
can come to 3,060 rows. Lower maxReviewsPerPlace if a few reviews a place is enough.
Sample rows, diagnostic rows, a search that finds nothing, a place with no reviews and a search
refused as BAD_INPUT are all free.
📥 What you give it
{"searchQueries": ["coffee in Brooklyn", "bakeries in Williamsburg"],"maxItems": 60,"includeReviews": false,"language": "en"}
| Field | Default | What it is |
|---|---|---|
searchQueries | none, the box starts at coffee in Brooklyn | Searches with the place in the text, like dentists near Eiffel Tower. |
searchQuery | none | One search instead of a list. Read only when searchQueries is empty. |
reviewUrls | none | Place links to read reviews from. placeUrls is an alias for the same list. |
placeUrls | none | The same as reviewUrls, merged with it. |
maxItems | 60 | Places per search, up to 500. |
maxReviewsPerPlace | 50 | Newest reviews per place, up to 500. |
includeReviews | off | After a search, also collect the newest reviews of every place found, up to maxReviewsPerPlace each. |
includeOwnerReplies | on | Include the owner's visible reply on a review row. |
language | en | The language Google should answer in. Any code Google takes works. |
countryCode | none | Two-letter country, like GB or DE. Leave it empty unless you need one country's view of a search. |
city | none | Runs every search in this city, so coffee becomes coffee in Austin, TX. Add the state or country when the name is common, and leave the place out of the searches. |
county | none | The same for a county, like Travis County, TX. Works on its own or with city. A search that goes straight to one business is checked by its address, which never names a county, so fill in city too for those. |
notionConnector | none | Optional. Write each place into your Notion when the run finishes. |
notionParentId | none | Optional. The Notion data source to write into. |
proxyConfiguration | leave it alone | Optional. Your own servers, used exactly as given. |
searchQuery is only read when searchQueries is empty. The list arrives prefilled with
coffee in Brooklyn, so typing into the single box and leaving the list as it is gets you coffee in
Brooklyn. Clear the list, or put your search in it.
📤 What you get back
A real place row from a run on 3 October 2026, with the long link trimmed:
{"ok": true,"type": "place","searchQuery": "coffee in Brooklyn","name": "Qahwah House Coffee - Williamsburg Brooklyn","category": "Coffee shop","address": "162 Bedford Ave","rating": 4.7,"reviewCount": 2320,"phone": null,"website": null,"lat": 40.7185755,"lng": -73.9571869,"placeId": "0x89c25953721fc19d:0x185b29b3e7559d6e","cid": "1755042332447972718","placeUrl": "https://www.google.com/maps/place/Qahwah+House+Coffee+-+Williamsburg+Brooklyn/data=!4m7!3m6!1s0x89c2..."}
| Field | How to read it |
|---|---|
type | place or review. Both kinds land in the same dataset. |
placeId | Google's hex feature id, the 0x…:0x… form, not a ChIJ… place ID. |
cid | The numeric id, taken from the second half of placeId. Both are always filled. |
phone, website | Only when Google prints them on the card, which is rare. |
reviewCount | Present on about three rows in four. null when Google leaves the count off the card, which happened to this same place on another run that day. |
placeUrl | The full link with its data= segment. Keep it whole: that segment is what a review run needs. |
| Review rows | placeId, placeName, placeUrl, reviewId, reviewerName, rating, relativeDate, text, ownerReply, photoUrls. placeId and placeName are filled on reviews from a search and empty on reviews from a link. |
relativeDate | Google's own wording, like 3 months ago or Edited 2 weeks ago. There is no exact date. |
text on a review | null when the reviewer left stars and no words. |
photoUrls | Photos attached to the review, up to 10. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A place or a review | ok: true and type of place or review | yes |
| The sample row | _sample: true and type: "sample" | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok being true and _sample being absent, and you have your places and reviews.
| Code | What it means |
|---|---|
NO_RESULTS | That search returned nothing usable, or went straight to one business outside the place you named. It also covers a place page that would not load, so a re-run is worth one try. |
BLOCKED | That search or place could not be read this run. Re-run it, or narrow the search. |
NETWORK | Google was unreachable or answered badly. |
BAD_INPUT | Google Maps could not find the place you named, or found only the wider area around it, like the state beside a misspelt town. Checked in city, in county, after "in" or "near" in a search, and after "à", "en", "près de" or "cerca de" when the place starts with a capital letter. Nothing from that search was charged. With city or county, a first search that fails stops the run. |
CHARGE_LIMIT | The run's maximum cost was too low to cover a single row, so it stopped before starting. |
A diagnostic row never fails the run. Without city or county, one bad search never stops the
others.
💡 What people use it for
- Building a local lead list from a set of searches, then joining it to your own data on
placeId. - Mapping how many of a chain's branches sit in one city, with coordinates ready for a map.
- Pulling the newest reviews for a list of place links on a schedule.
- Comparing ratings and review counts across a category in one area before picking a site.
From a search to a watch on the places that matter, in three runs:
- Search
dentists in Austin, TXhere and keep theplaceUrlof the places you care about. - Paste those links into Google Maps Reviews Scraper's
placeUrlsfor up to 5,000 reviews a run, with exact dates. - Put your own branches into Google Reviews Monitor's
locations, and each later run reports only what changed.
🚧 What it does not do
- Contact details are rare on search rows.
phoneandwebsitecome off the results card and Google prints them for very few businesses. placeIdis not theChIJ…form. It is Google's hex feature id.cidis there too if your other tooling wants a number.- Review dates are relative strings, like
2 weeks ago, not exact dates. - Duplicates are removed inside one search, not across searches. A place matching two of your searches comes back as two rows, and both count.
- Short links and cut links are looked up first. A
maps.app.goo.gllink takes about a second. A link cut before itsdata=part can take half a minute, and when its name matches several places the actor does not guess: that link gets a freeNO_RESULTSrow. - 500 per search is the ceiling, not a promise. Long feeds stop producing new places before that on many searches. You pay for what arrives.
- The place check is about where Google searched, not each row. With the city right, a dentist Google files under Denver can still sit in a suburb next door.
- Rows are a snapshot. Ratings and review counts move, and a place can close.
🧭 Which Google Maps scraper do you need?
| If you want | Use |
|---|---|
| Places from a search, with reviews optional | This one |
| Every review for a place you can link or name, with exact dates | Google Maps Reviews Scraper |
| The photos and videos on a place | Google Maps Place Photos Scraper |
| Only what changed in your own locations' reviews, on a schedule | Google Reviews Monitor |
| Places from Apple Maps, with phones and hours | Apple Maps Scraper |
| Businesses in Russia and the CIS, from Yandex Maps | Yandex Maps Scraper |
❓ Questions people ask
Do I need a Google API key or a Google account?
No. Nothing to apply for, nothing to sign in to and no quota to watch.
Why are phone and website empty on most rows?
The search reads the results card, and Google prints them there for very few businesses. Collecting reviews does not add them.
Why do my results differ from what I see on Google Maps?
Google ranks a search from where the map sits. A search with no place in it follows the previous
search's town, so put the place in every search or fill city. To compare, search in a private
browser window: what a logged-out visitor sees there is what this actor reads.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-maps-scraper. Either way the
run happens on your Apify account at the same price.
Is scraping Google Maps legal?
These are public listings and public reviews. Reviews carry personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search or the place link and the run ID. The
errorCode on the diagnostic row usually names the problem on its own.