Google Maps Scraper - Places, Reviews, GPS and Place ID avatar

Google Maps Scraper - Places, Reviews, GPS and Place ID

Pricing

from $0.26 / 1,000 places

Go to Apify Store
Google Maps Scraper - Places, Reviews, GPS and Place ID

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

Dami's Studio

Maintained by Community

Actor stats

1

Bookmarked

36

Total users

22

Monthly active users

2 days ago

Last modified

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.

InputGoogle Maps searches with the place in the text, or place links to read reviews from
OutputOne row per place, and one row per review when you ask for reviews
Ceiling500 places per search, 500 reviews per place
SpeedAbout 30 seconds for one search of 50 to 60 places. Ten searches of 5 places took 80 seconds
Account neededNone, 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 getField
Name and category, as the card prints themname, category
Street addressaddress
Star rating and number of reviewsrating, reviewCount
Coordinateslat, lng
Google's feature id and the numeric idplaceId, cid
The full place link, ready for a review runplaceUrl
Phone and website, on the rare cards that print themphone, website
The search that found the placesearchQuery
Per review: the reviewer, stars, text, relative date, owner reply and photosreviewerName, rating, text, relativeDate, ownerReply, photoUrls
A stable id per reviewreviewId

▶️ How to scrape Google Maps places

  1. Open Google Maps Scraper and click Try for free.
  2. Put your searches into Search queries, with the location in the text. Delete the example first.
  3. Set Max places per query. Start around 10 to see what the rows look like.
  4. For reviews, paste place links into Google Maps place URLs for reviews, or tick Include reviews for search results, then click Start.
  5. 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"
}
FieldDefaultWhat it is
searchQueriesnone, the box starts at coffee in BrooklynSearches with the place in the text, like dentists near Eiffel Tower.
searchQuerynoneOne search instead of a list. Read only when searchQueries is empty.
reviewUrlsnonePlace links to read reviews from. placeUrls is an alias for the same list.
placeUrlsnoneThe same as reviewUrls, merged with it.
maxItems60Places per search, up to 500.
maxReviewsPerPlace50Newest reviews per place, up to 500.
includeReviewsoffAfter a search, also collect the newest reviews of every place found, up to maxReviewsPerPlace each.
includeOwnerRepliesonInclude the owner's visible reply on a review row.
languageenThe language Google should answer in. Any code Google takes works.
countryCodenoneTwo-letter country, like GB or DE. Leave it empty unless you need one country's view of a search.
citynoneRuns 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.
countynoneThe 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.
notionConnectornoneOptional. Write each place into your Notion when the run finishes.
notionParentIdnoneOptional. The Notion data source to write into.
proxyConfigurationleave it aloneOptional. 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..."
}
FieldHow to read it
typeplace or review. Both kinds land in the same dataset.
placeIdGoogle's hex feature id, the 0x…:0x… form, not a ChIJ… place ID.
cidThe numeric id, taken from the second half of placeId. Both are always filled.
phone, websiteOnly when Google prints them on the card, which is rare.
reviewCountPresent 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.
placeUrlThe full link with its data= segment. Keep it whole: that segment is what a review run needs.
Review rowsplaceId, 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.
relativeDateGoogle's own wording, like 3 months ago or Edited 2 weeks ago. There is no exact date.
text on a reviewnull when the reviewer left stars and no words.
photoUrlsPhotos attached to the review, up to 10.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itCharged
A place or a reviewok: true and type of place or reviewyes
The sample row_sample: true and type: "sample"no
A diagnosticok: false and an errorCodeno

Filter on ok being true and _sample being absent, and you have your places and reviews.

CodeWhat it means
NO_RESULTSThat 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.
BLOCKEDThat search or place could not be read this run. Re-run it, or narrow the search.
NETWORKGoogle was unreachable or answered badly.
BAD_INPUTGoogle 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_LIMITThe 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:

  1. Search dentists in Austin, TX here and keep the placeUrl of the places you care about.
  2. Paste those links into Google Maps Reviews Scraper's placeUrls for up to 5,000 reviews a run, with exact dates.
  3. 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. phone and website come off the results card and Google prints them for very few businesses.
  • placeId is not the ChIJ… form. It is Google's hex feature id. cid is 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.gl link takes about a second. A link cut before its data= part can take half a minute, and when its name matches several places the actor does not guess: that link gets a free NO_RESULTS row.
  • 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 wantUse
Places from a search, with reviews optionalThis one
Every review for a place you can link or name, with exact datesGoogle Maps Reviews Scraper
The photos and videos on a placeGoogle Maps Place Photos Scraper
Only what changed in your own locations' reviews, on a scheduleGoogle Reviews Monitor
Places from Apple Maps, with phones and hoursApple Maps Scraper
Businesses in Russia and the CIS, from Yandex MapsYandex 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.

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.