Google Maps Scraper: places, phone, website, hours, no browser avatar

Google Maps Scraper: places, phone, website, hours, no browser

Pricing

from $0.26 / 1,000 place listeds

Go to Apify Store
Google Maps Scraper: places, phone, website, hours, no browser

Google Maps Scraper: places, phone, website, hours, no browser

Google Maps places by search query, without a browser: name, category, rating, review count, address, phone, website, coordinates, opening hours and place ID, in Google's own order, up to 100 places per query. No reviews, no reviewer data, no emails. Pay per place.

Pricing

from $0.26 / 1,000 place listeds

Rating

0.0

(0)

Developer

Steadydata Team

Steadydata Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Google Maps places for up to 200 search queries per run, up to 100 places per query: name, category, rating, review count, address, phone, website, coordinates, opening hours, time zone and the Google Place ID, in Google's own order. You only pay for places that are actually delivered. No reviews, no reviewer data, no e-mail addresses.

Why this scraper

  • No browser. Most Google Maps scrapers drive a headless browser through the map, which is slow and is what you pay for. This actor reads the same place list the Maps web app loads, as data. Measured on 22-10-2026: 3 queries, 120 places, 14.8 seconds, $0.0027 of platform usage for the whole run.
  • One flat table for a list of queries. Paste restaurants amsterdam, dentists lisbon, plumbers chicago and get every place with its query and position, ready for a spreadsheet, a CRM import or a map.
  • Pages on until your ceiling. Google serves 20 places at a time; maxPlacesPerQuery up to 100 keeps paging, with duplicates removed across pages.
  • Both Google ids come with it. placeId (ChIJ...) is the key for the Places API and for joining runs over time; featureId is the id in Maps URLs. googleMapsUrl opens the exact place.
  • Only delivered places are charged. A query that Google cannot place comes back as an error record at no cost.

Who this is for

Market research and sales operations: which businesses exist for a trade in an area, how they are rated, where they are, how to reach them through the contact details they publish themselves. Site selection, franchise and competitor analysis, local SEO audits, enriching a company list with address, coordinates and opening hours, and tracking an area over time by running the same query list on a schedule.

Who this is not for

Read this before you buy. This actor returns what a business publishes on its own Maps listing and stops there. It does not return reviews, reviewer names, e-mail addresses, owner names or social profiles, and it will not. For reviews, use a dedicated Google Maps reviews scraper.

Results are Google's search answer for the query, ordered by Google, with at most 100 per query. For a complete inventory of a city, split the search by neighbourhood or by trade, exactly as you would on Google Maps itself. Fields a business leaves empty on its listing stay empty here: on 120 measured places, 2 had no phone, 4 no website, 6 no street address.

Input fields

FieldTypeRequired or defaultWhat it does
querieslist of textrequiredOne Google Maps search per row, with the area in the query: "restaurants amsterdam", "dentists lisbon", "plumbers chicago". Up to 200.
maxPlacesPerQuerynumber20Cost ceiling per query. Google returns 20 places per page; this actor pages on until it has this many or Google has no more.
languagetextenTwo-letter language code for names, categories and opening hours.

Input example

{
"queries": [
"restaurants amsterdam",
"dentists lisbon",
"plumbers chicago"
],
"maxPlacesPerQuery": 20,
"language": "en"
}

Output example

FieldTypeWhat it holdsExample
querytextThe search term this row was found with, so rows from several inputs can be told apart.dentists lisbon
positionnumberThe place in Google's own order for that query, counting from 1 across pages.1
nametextThe business name as Google Maps shows it.CDL - Dental Clinic Lisbon
categorytextGoogle's main category for the place, for example Dental clinic or Plumber.Dental clinic
ratingnumberThe average star rating, 1 to 5.4.8
reviewCountnumberHow many reviews that average rests on.929
addresstextThe full address as Google prints it.R. Ferreira da Silva 9B, 1900-228 Lisboa, Portugal
phonetextThe phone number as the business publishes it on its listing, in local format.+351 21 354 0059
websitetextThe website link the business publishes on its listing.https://dentistalisboa.com/
categorieslist
streettext
citytext
postalCodetext
countryCodetext
phoneInternationaltext
domaintext
latitudenumberLatitude of the place marker.38.7355432
longitudenumberLongitude of the place marker.-9.1335602
openingHourslist
timezonetext
placeIdtextGoogle's Place ID (ChIJ...), the key for the Places API and for joining data across runs.ChIJPy04-ZkzGQ0RvdLuGmOMygg
featureIdtextGoogle's internal feature id (0x...:0x...) as used in Maps URLs.0xd193399f9382d3f:0x8ca8c631aeed2bd
knowledgeGraphIdtext
googleMapsUrltextA Google Maps link that opens this exact place.https://www.google.com/maps/place/?q=place_id:ChIJPy04-Zk...
thumbnailUrltext
{
"query": "restaurants amsterdam",
"position": 1,
"name": "The Pantry",
"category": "Dutch restaurant",
"categories": ["Dutch restaurant", "Country food restaurant", "Diner", "Family restaurant", "Lunch restaurant", "Meat dish restaurant", "Restaurant"],
"rating": 4.7,
"reviewCount": 9955,
"address": "Leidsekruisstraat 21, 1017 RE Amsterdam, Netherlands",
"street": "Leidsekruisstraat 21",
"city": "Amsterdam",
"postalCode": "1017 RE",
"countryCode": "NL",
"phone": "+31 20 620 0922",
"phoneInternational": "+31206200922",
"website": "https://www.thepantry.nl/?redirect=yes",
"domain": "thepantry.nl",
"latitude": 52.3634845,
"longitude": 4.8849427,
"openingHours": ["Thursday: 10:30 AM–10:30 PM", "Friday: 10:30 AM–10:30 PM", "Saturday: 10:30 AM–10:30 PM", "Sunday: 10:30 AM–10:30 PM", "Monday: 10:30 AM–10:30 PM", "Tuesday: 10:30 AM–10:30 PM", "Wednesday: 10:30 AM–10:30 PM"],
"timezone": "Europe/Amsterdam",
"placeId": "ChIJG9c0F-kJxkcR0Yd6ANByMLE",
"featureId": "0x47c609e91734d71b:0xb13072d0007a87d1",
"knowledgeGraphId": "/g/1tfxfwsp",
"googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJG9c0F-kJxkcR0Yd6ANByMLE",
"thumbnailUrl": "https://lh3.googleusercontent.com/-bEtNMVlx2yM/AAAAAAAAAAI/AAAAAAAAAAA/lhEOx3mNa_s/s44-p-k-no-ns-nd/photo.jpg",
"status": "ok"
}

A query that cannot be delivered produces an error record instead, and is not charged:

{
"input": "zzzzqqqq nowhere",
"status": "error",
"errorCode": "NO_RESULTS",
"error": "Google Maps lists no places for 'zzzzqqqq nowhere'"
}

Error codes: INVALID_QUERY (empty or non-text input), NO_RESULTS (Google lists nothing for the query), BLOCKED (Google refused every attempt; retried on fresh exits first), FETCH_FAILED (an unexpected answer from Google).

Pricing

Pay per event: one place-listed event per delivered place. No charge for inputs that fail, no separate platform-usage surcharge. The price per 1,000 places is on the Pricing tab and drops with your Apify plan.

FAQ

How is this different from a Google Maps scraper that uses a browser? It reads the place list that the Maps web app itself loads, as data, instead of rendering the map. Same places, same order, a fraction of the time and cost: 120 places in 14.8 seconds on the first measured run. It does not open place pages one by one.

Does it return reviews, e-mails or owner names? No, and it will not. Reviews and reviewer identities are personal data; e-mail addresses turn a listing into a lead record. This actor returns the business information a company publishes on its own listing: name, category, rating, address, phone, website, hours.

How do I search a whole city? Google answers each query with up to 100 places. Split by neighbourhood (

dentists alvalade lisbon
) or by trade, and run all queries in one list. Duplicates across queries keep their own query value, so you can deduplicate on placeId afterwards.

Why are some fields empty? Because the business left them empty on Google Maps. On 120 measured places, 2 had no phone, 4 no website and 6 no street address. An empty field is what Google shows, not a parsing gap.

Which country's results do I get? The area in the query decides: plumbers chicago returns Chicago. language only changes the language of categories and opening hours.

Is personal data collected? No. Business listings only, with the contact details the business publishes itself. No reviews, no reviewer names, no e-mail addresses, no owner names.

Can I join this with the Google Places API? Yes: placeId is the official Place ID, so you can fetch Places API details for any row, and match rows across runs.

What happens when the source changes? Sources change from time to time; that is the nature of this work. The actor is monitored daily and fixed fast, and while it is broken you are not charged, because only delivered results cost anything.

Can I call it from my own code, like an API? Yes. Every run is available through the Apify API: start it with one HTTP request, then read the results as JSON, CSV or Excel from the dataset endpoint, or use the official Python and JavaScript clients. The input is the same JSON as in the input example above, so a scheduled script, a Make or Zapier step or an AI agent can call it without any changes.