Google Maps Places Scraper: Hours, Ratings, Websites
Pricing
from $1.00 / 1,000 places
Google Maps Places Scraper: Hours, Ratings, Websites
Businesses on Google Maps by search term and area: address, coordinates, rating, website, opening hours; $2.00 per 1,000 places. Area split into map cells past one result list, booking links, optional details, free coverage rows.
Pricing
from $1.00 / 1,000 places
Rating
0.0
(0)
Developer
Arcadium Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Give it a search term and an area (a city, district or postcode, a bounding box, a circle or a GeoJSON polygon) and it returns every business Google Maps shows there as one JSON row each: name, categories, full address and its parts, coordinates, star rating and review count, website, phone, opening hours for the next 7 days, open-now text and booking links. Or give it place links, place IDs or CIDs. $2.00 per 1,000 places; you pay only for rows you get.
Why this actor
- Past one result list. One Google Maps search stops at about 200 places. The area is split into map cells and every cell that is still full is split again, so a city returns all of its dentists, not the first page.
- Fast and light. Google's own data answers, no browser.
- Listings as Google shows them. Name, phone and website exactly as the business publishes them on its Google listing. No reviewer names or profiles, nothing behind a login; emails and phone numbers inside free-text descriptions are removed.
- Know what you got. One free
coveragerow per search: places delivered, map cells searched, cells that were still full at the smallest size, places filtered out, and why the search stopped. A freeerrorrow with acodefor every input that could not be read. - Paste your input. compass/crawler-google-places inputs run as they are for places:
searchStringsArray,locationQuery(orcity/state/county/postalCode/countryCode),maxCrawledPlacesPerSearch(missing = all places, as in compass),language,placeMinimumStars,categoryFilterWords,searchMatching,website,skipClosedPlaces,scrapePlaceDetailPage,customGeolocation(Polygon, MultiPolygon, FeatureCollection of polygons, Point withradiusKm),startUrlsandplaceIds(place links, place ids, search links). Reviews, images, contacts, leads, social profiles, table reservations, order-online, web results and directories are not part of this actor: those fields are ignored with a warning. Inputs of scraperlink/google-maps-scraper (query,location,num,hl,gl, coordinates) and vortex_data/google-maps (locationQueries,languages,extractPlaceDetails) also run; several locations use the first.
Built by Arcadium Data: public data, dated and agent-ready.
Use with AI agents
Agents can call it through the Apify MCP server (https://mcp.apify.com) as arcadium/google-maps-places; the input schema is read from the actor, the result is a dataset of JSON rows. Filter on rowType.
Input example, "all dentists in Austin, TX":
{ "searchTerms": ["dentist"], "location": "Austin, TX", "maxPlacesPerSearch": 0 }
"Coffee shops rated 4.5+ within 2 km of a point, with details":
{ "searchTerms": ["coffee shop"], "latitude": 52.52, "longitude": 13.405, "radiusKm": 2, "minRating": 4.5, "includeDetails": true }
Cost: 500 places at $2.00 per 1,000 is $1.00 (Gold plans $0.50); details add $0.50 per 1,000.
Links work too: a place link, place id or CID reads that place; a search link such as https://www.google.com/maps/search/dentist/@30.2672,-97.7431,14z searches "dentist" in the map area that link shows (the area a 1024 x 768 window shows at that zoom), cell by cell; a satellite or 3D link with <n>m instead of <n>z is read as a camera altitude of n metres (our assumption from how such links behave, not documented by Google); a place link without an id is looked up by its name near its coordinates. Links to other sites become free invalid_input error rows.
Output example (one place row, shortened):
{"rowType": "place","placeId": "ChIJCar0f49ZwokR6ozLV-dHNTE","cid": "3545819340560108778","name": "Katz's Delicatessen","personNamed": false,"category": "Deli","address": "205 E Houston St, New York, NY 10002","city": "New York","postalCode": "10002","latitude": 40.722233,"longitude": -73.987429,"rating": 4.5,"reviewCount": 56440,"website": "https://katzsdelicatessen.com/","phone": "(212) 254-2246","phoneE164": "+12122542246","openingHours": [{ "day": "Monday", "date": "2026-11-02", "hours": ["8 AM–11 PM"] }],"closed": false,"searchTerm": null,"scrapedAt": "2026-11-02T18:00:00.000Z"}
What you get
Place row (rowType: "place", charged as place):
| Field | What it holds |
|---|---|
placeId, cid, featureId, placeUrl | Google's ids of the place and its Maps link. placeId is stable: deduplicate on it between runs. |
name, personNamed | Business name as Google shows it; personNamed: true when the listing is named after a person (e.g. a sole practitioner's practice, "Bo Stanley, DDS"). |
category, categories, description | Main and all Google categories; Google's one-line summary. |
address, street, neighborhood, city, postalCode, state, countryCode | Full address and its parts. |
latitude, longitude, timeZone | Location. |
rating, reviewCount | Google stars and number of reviews. |
website, bookingLinks | Website the business lists; booking and ordering links (tracking removed). |
openingHours, openNowText, closed | Hours of the next 7 days ([{ day, date, hours }], holiday-aware), open-now text, closed flag. |
phone, phoneE164 | Business phone as published on the listing (on by default; switch includePhones off to leave them empty). |
details | With includeDetails (charged as place-details): plus code, long description, amenity and accessibility attributes, review topics with mention counts. null (and not charged) when the detail request failed. |
searchTerm, searchLocation, rank, scrapedAt | Which search found it, its position, when it was read. |
Coverage row (rowType: "coverage", free): delivered, duplicates (places an earlier search of the run already delivered), cellsSearched, cellsSplit, cellsSaturatedAtMin (cells still full at the smallest size: places there may be missing; lower minCellKm to go deeper), filteredOut, outsideArea, personNamed, detailsFailed, detailsSkipped (places delivered without a detail request while details were paused after 5 failures in a row; one retry after 25 places turns them back on), detailsCapped, pages and maxPages, areaSource (location, coordinates, link), stopReason (limit: max places reached; end: the area is exhausted; budget: the page budget or the run's max charge was reached; error), capSource (what cut the search: user for a limit you set or the run's max charge, default for a default page budget, site when Google's own result cap left places out).
Page budget. Filters run on the places Google returns, so a strict filter over a big area could read a whole city and keep almost nothing. Each search therefore stops after maxPagesPerSearch search pages (default 3 per 20 places asked for, at least 30; "all places" = 3,000 pages) and the run after maxPagesPerRun (default 5,000), with stopReason: "budget".
Error row (rowType: "error", free): input, code (invalid_input, not_found, no_match, blocked, unavailable), message. Retry blocked and unavailable later.
Listings are published by the businesses for customer contact. A sole trader's name and phone may still be personal data under GDPR; you are responsible for using them lawfully.
Reviews of the places are not part of this actor: pass the placeId values to our Google Maps Reviews Scraper.
Pricing
| Event | Free plan | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| Place (per 1,000) | $2.00 | $1.60 | $1.40 | $1.00 |
Place details (per 1,000, only with includeDetails) | $0.50 | $0.50 | $0.50 | $0.50 |
Coverage and error rows are free. Each run adds a $0.001 per GB start fee. Set a maximum charge on the run and the actor stops when it is reached.
Related actors
- Yelp Reviews Scraper: All Languages, Owner Replies
- Review Monitor: Negative Review Alerts and Rating Drift
Limitations
- Price level and popular times are not in the data Google serves without signing in; they are not delivered.
closeddoes not tell permanently and temporarily closed apart.- One location per run; several search terms share it. When both a location and coordinates are given, the coordinates are used (with a warning).
- Run time: each place with details is one more request (~0.5 s). A run reads at most 4,000 place details; places past that come without details (not charged for details, counted as
detailsCapped). The default run timeout is 1 hour: rows delivered before a timeout are kept and charged, but the coverage row of the search in progress is not written. For more than ~4,000 places with details, raise the timeout and split the run.