Google Maps Scraper: places, phone, website, hours, no browser
Pricing
from $0.26 / 1,000 place listeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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 chicagoand 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;
maxPlacesPerQueryup 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;featureIdis the id in Maps URLs.googleMapsUrlopens 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
| Field | Type | Required or default | What it does |
|---|---|---|---|
queries | list of text | required | One Google Maps search per row, with the area in the query: "restaurants amsterdam", "dentists lisbon", "plumbers chicago". Up to 200. |
maxPlacesPerQuery | number | 20 | Cost ceiling per query. Google returns 20 places per page; this actor pages on until it has this many or Google has no more. |
language | text | en | Two-letter language code for names, categories and opening hours. |
Input example
{"queries": ["restaurants amsterdam","dentists lisbon","plumbers chicago"],"maxPlacesPerQuery": 20,"language": "en"}
Output example
| Field | Type | What it holds | Example |
|---|---|---|---|
query | text | The search term this row was found with, so rows from several inputs can be told apart. | dentists lisbon |
position | number | The place in Google's own order for that query, counting from 1 across pages. | 1 |
name | text | The business name as Google Maps shows it. | CDL - Dental Clinic Lisbon |
category | text | Google's main category for the place, for example Dental clinic or Plumber. | Dental clinic |
rating | number | The average star rating, 1 to 5. | 4.8 |
reviewCount | number | How many reviews that average rests on. | 929 |
address | text | The full address as Google prints it. | R. Ferreira da Silva 9B, 1900-228 Lisboa, Portugal |
phone | text | The phone number as the business publishes it on its listing, in local format. | +351 21 354 0059 |
website | text | The website link the business publishes on its listing. | https://dentistalisboa.com/ |
categories | list | ||
street | text | ||
city | text | ||
postalCode | text | ||
countryCode | text | ||
phoneInternational | text | ||
domain | text | ||
latitude | number | Latitude of the place marker. | 38.7355432 |
longitude | number | Longitude of the place marker. | -9.1335602 |
openingHours | list | ||
timezone | text | ||
placeId | text | Google's Place ID (ChIJ...), the key for the Places API and for joining data across runs. | ChIJPy04-ZkzGQ0RvdLuGmOMygg |
featureId | text | Google's internal feature id (0x...:0x...) as used in Maps URLs. | 0xd193399f9382d3f:0x8ca8c631aeed2bd |
knowledgeGraphId | text | ||
googleMapsUrl | text | A Google Maps link that opens this exact place. | https://www.google.com/maps/place/?q=place_id:ChIJPy04-Zk... |
thumbnailUrl | text |
{"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).
Related actors from steadydata
- google-local: who ranks in Google's local pack for the same search
- website-tech-stack: what their websites run on
- google-ads-transparency: what those businesses are advertising
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 lisbonquery 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.