Google Maps Scraper - Places, Reviews, GPS & Place ID Finder avatar

Google Maps Scraper - Places, Reviews, GPS & Place ID Finder

Pricing

from $0.26 / 1,000 places

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

Google Maps Scraper - Places, Reviews, GPS & Place ID Finder

Google Maps scraper for 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

44

Total users

19

Monthly active users

21 hours ago

Last modified

Share

Google Maps scraper for the searches you would type into Google Maps, one row per place: name, category, address, phone, website, 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. Phone and website are what the business gave Google; a place that never listed a number has none. On four searches on 22 October 2026, 101 of 116 places had a phone and 112 a website; cafés were the patchiest, 27 phones on 41. There are no e-mail addresses.

InputGoogle Maps searches with the place in the text, copied search links, or place links to read reviews from
OutputOne row per place: phone, website, full address, categories, opening hours, Google's place ID. 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. From 31 October 2026, each search after the first that finds places adds $0.0025 on every plan

🔍 What Google Maps Scraper does

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; locations runs every search in each of several places.

Filters. Optional add-ons leave out places under a star rating, with or without a website, outside your categories, outside the area you named, or permanently closed.

Place links. Paste place links or ChIJ… place IDs and you get their place rows, with the same fields as a search row.

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, when the business has given them to Googlephone, website
The search that found the placesearchQuery
Google's place ID and knowledge-graph idgooglePlaceId, kgmid
Position in Google's listrank
Every category, and a code that reads the same in every languagecategories, categoryCode
The address in one line and in partsfullAddress, street, neighborhood, city, postalCode, state, countryCode
Plus code and time zoneplusCode, timeZone
Opening hours for the week, and whether it is open nowopeningHours, openStatus
Closed for good, ads, businesses with no street addresspermanentlyClosed, sponsored, serviceArea
Phone with the country code, and digits onlyphoneInternational, phoneDigits
Website domain and "Book online" linkswebsiteDomain, bookingLinks
Accessibility, Google's short description, price bandaccessibility, description, priceLevel
Photo count and the main photo's linkphotoCount, mainPhotoUrl
The Maps link searched, the language and when the row was readsearchUrl, language, scrapedAt
Ordering services, an optional add-onorderLinks
With place details, an optional add-on: the words reviewers repeat, places inside it, the owner's descriptionreviewTopics, placesInside, ownerDescription
The place link or ID a place row came fromplaceLink
With legal-notice details, an optional add-on for German, Austrian and Swiss websites: company name, the directors or owners named, VAT id, register number and courtlegalNotice
Per photo, when asked for: the link, its size and when it was postedphotoId, mediaType, photoUrl, width, height, uploadedAt
Per review: the reviewer, stars, text, relative date, owner reply and photosreviewerName, rating, text, relativeDate, ownerReply, photoUrls
Per review: the exact date, language, translation, reply date and linkpublishedAt, language, textTranslated, originalText, ownerReplyRelativeDate, reviewUrl
Per review, when asked for: the reviewer's profilereviewerUrl, reviewerPhotoUrl, reviewerReviewsCount, reviewerPhotosCount, isLocalGuide
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.

Searches, from 31 October 2026Search charge, the same on every plan
The first search in a run that finds placesnone
Each later search that finds at least one place$0.0025
A search that brings back no places, whatever the reasonnone
Place links and review linksnone, they are not searches

A review row counts the same as a place row. With Include reviews on, a 60-place search at the default of 50 reviews a place comes to 3,060 rows, so lower maxReviewsPerPlace if a few are 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, or search links copied from Google Maps, which run at the part of the map they show.
searchQuerynoneOne search instead of a list. Read only when searchQueries is empty, and that list starts prefilled, so clear it first.
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.
maxReviewsPerPlace50Reviews per place, up to 5,000.
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.
reviewsSortnewestnewest, mostRelevant, highest or lowest.
reviewsSincenoneOnly reviews newer than a date like 2026-09-01, or a span like 8 days. Newest order only. Needs a paid Apify plan.
reviewKeywordsnoneOptional add-on. Only reviews whose text, or Google's translation of it, holds one of these words. With rare words a place can stop early, with a free PARTIAL row. Needs a paid Apify plan.
includeReviewerDetailsoffAdds the reviewer's profile link, photo, counts and Local Guide flag.
skipReviewerNamesoffReview rows without the reviewer's name.
statenoneAdded to city and county, like TX.
postalCodenoneRuns every search in this postal code.
locationsnoneSeveral places, like Austin, TX and Denver, CO: every search runs in each. Up to 50 places and 200 searches. city and the fields above are then not used.
minRatinganyOptional add-on. 3, 3.5, 4 or 4.5 stars and up. Unrated places are left out too. Needs a paid Apify plan.
websiteFilterallPlacesOptional add-on. withWebsite or withoutWebsite. Needs a paid Apify plan.
categoryFilterWordsnoneOptional add-on. Keeps places whose categories hold one of these words. Needs a paid Apify plan.
nameMatchallOptional add-on. contains or exact: the name against your search without its place. Needs a paid Apify plan.
onlyInsideAreaoffOptional add-on. Leaves out places outside the city, county, state, postal code or location you named. Needs a paid Apify plan.
skipClosedoffOptional add-on. Leaves out places Google marks permanently closed. Needs a paid Apify plan.
includeOrderLinksoffOptional add-on. The ordering services Google lists for each place. Switches on once its price is live.
fieldsnoneKeep only these fields in each row, like name and phone.
placeLinksnoneOptional add-on. Place links, ?cid= links, short links or ChIJ… place IDs: one place row each. Needs a paid Apify plan.
includePlaceDetailsoffOptional add-on. Adds reviewTopics, placesInside and ownerDescription. Needs a paid Apify plan.
includeLegalNoticeoffOptional add-on. For a German, Austrian or Swiss website, the company details from its legal notice (Impressum), never an e-mail or phone. Needs a paid Apify plan.
maxPhotosPerPlace0Photo links per place, one photo row each, links only, up to 10. Google sends a handful with each place (3 or 4 seen), not the whole gallery. Needs a paid Apify plan.
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.

📤 What you get back

A real place row from a run on 25 October 2026, trimmed: the long link cut, two of the seven days shown, some fields left out:

{
"ok": true,
"type": "place",
"searchQuery": "coffee in Brooklyn",
"name": "Moka & Co",
"category": "Coffee shop",
"address": "725 Fulton St",
"rating": 4.7,
"reviewCount": 1524,
"phone": "(347) 689-2303",
"website": "https://mokanco.com/fort-greene/",
"lat": 40.6872946,
"lng": -73.9762997,
"placeId": "0x89c25bd0cf1340c9:0x2dff5312c14e5a81",
"cid": "3314459190785628801",
"placeUrl": "https://www.google.com/maps/place/Moka+%26+Co/data=!4m7!3m6!1s0x89c25bd0cf1340c9...",
"rank": 1,
"googlePlaceId": "ChIJyUATz9BbwokRgVpOwRJT_y0",
"kgmid": "/g/11wndpb1kr",
"categories": ["Coffee shop"],
"fullAddress": "725 Fulton St, Brooklyn, NY 11217",
"neighborhood": "Fort Greene",
"city": "Brooklyn",
"postalCode": "11217",
"state": "New York",
"countryCode": "US",
"plusCode": "87G8M2PF+WF",
"timeZone": "America/New_York",
"openStatus": "Open · Closes 11 PM",
"openingHours": [{ "day": "Saturday", "hours": "8 AM–11 PM" }, { "day": "Sunday", "hours": "8 AM–9 PM" }],
"phoneDigits": "+13476892303",
"websiteDomain": "mokanco.com",
"accessibility": ["Wheelchair accessible entrance", "Wheelchair accessible seating"],
"photoCount": 525,
"sponsored": false
}
FieldHow to read it
typeplace or review. Both kinds land in the same dataset.
placeIdGoogle's hex feature id, the 0x…:0x… form. The ChIJ… place ID other Google tools take is googlePlaceId.
cidThe numeric id, taken from the second half of placeId. Both are always filled.
phoneWritten the way the country writes it, without the country code: (512) 717-3147 in Austin, 030 2833530 in Berlin. null when the business gave Google no number.
websiteThe link the business gave Google, tracking tags included. null when there is none.
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. The exact time is publishedAt.
openingHoursThe week as Google lists it, starting today, as { day, hours }. null when the business gave no hours. openStatus is the line Google shows at the minute of the run, like Open · Closes 11 PM.
rankThe place's position in Google's list for that search. Google ranks from where the map sits, so it moves between runs.
permanentlyClosedtrue when Google marks the place closed for good.
sponsoredtrue on an ad card. Ads are kept and charged like any other place unless you filter them out yourself.
serviceAreatrue for a business with no street address, like a mobile plumber; its coordinates are only roughly where it works.
priceLevelThe price band the card prints, like $10–20 or 20–30 €. Most places have none.
plusCodeThe global plus code, worked out from the coordinates. Google Maps shows a shorter local form with the town.
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
A photo linkok: true and type: "photo"yes
The sample row_sample: true and type: "sample"no
A diagnosticok: false and an errorCodeno

Filter on ok being true and _sample being absent to keep only real rows.

CodeWhat it means
NO_RESULTSThat search returned nothing usable, went straight to one business outside the place you named, or no place matched your filters. It also covers a place page that would not load, so a re-run is worth one try.
NOT_SERVEDThis request was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here.
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, county, state, postalCode and locations, 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; with locations, that place is skipped. Also an option the run cannot use, like a date it cannot read, before anything is searched.
ORDER_LINKS_NOT_YETOrder online links are not switched on yet, so nothing was searched or charged. Run it without them, or once their price shows on the Pricing tab.
OPTION_UNAVAILABLEAn add-on could not run this time, so the run stopped before searching and nothing was charged. Run it again without it.
PARTIALA filter or add-on stopped early: few reviews held your words, few places matched your filters, or an add-on ran out of room on this run. The rows before it are complete, and only they were charged.
OPTION_OFFA filter or add-on that needs a paid Apify plan did not run. Nothing was read or charged for it, and the rest of the run went ahead.
CHARGE_LIMITThe run's maximum cost was too low to cover a single row, so it stopped before starting.
TIME_LIMITThe run got close to its time limit and stopped on its own. The places and reviews delivered before that are complete and charged. Give the run more time, or ask for fewer results, to get the rest. If nothing had come back yet, the run still ends as succeeded, with an amber status message.
UNEXPECTED_ERRORThe run stopped early on an unexpected error. The results before this row are kept.

A diagnostic row never fails the run, TIME_LIMIT included: a run the time limit stopped before anything came back still ends as succeeded, with an amber status message. Without city or county, one bad search never stops the others.

💡 What people use it for

  • Building a list of local businesses, phones and websites included, 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:

  1. Search dentists in Austin, TX here and keep the placeUrl of the places you care about.
  2. Put your own branches into Google Reviews Monitor's locations, and each later run reports only what changed.

🚧 What it does not do

  • No e-mail addresses. Contact Details Scraper reads them off the websites this one returns.
  • Ads are not removed. A sponsored place comes through like any other, marked sponsored: true.
  • 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 link cut before its data= part can take half a minute, and when its name matches several places it 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, unless you tick onlyInsideArea.
  • Rows are a snapshot. Ratings and review counts move, and a place can close.
  • It is not an official Google tool. Dami's Studio is independent and is not affiliated with or endorsed by Google, or by any other company named on this page.

🧭 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
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 or website empty on some rows?

The business gave Google none. Cafés and small shops skip the phone more often than dentists or plumbers.

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?

The API tab has code for Python, JavaScript and the CLI. MCP clients like Claude and ChatGPT use https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-maps-scraper; coding assistants can load our skill file. All three bill 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. Cold calls and e-mails to businesses are regulated in many countries, so check the rules where you work. 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.