Google Maps Scraper
Pricing
from $3.00 / 1,000 results
Google Maps Scraper
Extract business data from Google Maps including ratings, reviews, contact info, prices, coordinates, and images. Fast scraper with automatic pagination for any location or search query.
Pricing
from $3.00 / 1,000 results
Rating
5.0
(3)
Developer
Crawler Bros
Maintained by CommunityActor stats
3
Bookmarked
271
Total users
4
Monthly active users
a day ago
Last modified
Categories
Share
Google Maps Business Scraper
Find real business records from public Google Maps pages. Use a text search to discover places, or provide specific Google Maps place URLs for direct extraction. The actor runs cookielessly in a fresh browser context and streams each record to the dataset as soon as it is verified.
What this actor does
- Searches Google Maps for a query, optionally combined with a location.
- Scrapes one or more public place URLs directly.
- Extracts visible business details such as name, category, address, phone, website, rating, review count, hours, coordinates, place ID, and photos when Google exposes them.
- Deduplicates records using an observed place ID or canonical Maps URL.
- Retries transient page failures with a bounded optional proxy fallback.
- Snapshots public result-card fields before detail navigation; if a detail page is slow or unavailable, emits that observed card as a conservative fallback instead of losing the result or inventing detail-only fields.
- Omits unavailable fields instead of returning null placeholders, guessed values, or fabricated businesses.
Output per record
Each business row normally includes:
| Field | Meaning |
|---|---|
recordType | business |
searchTerm | The search that found this business, so batch runs stay traceable |
name | Business name shown by Google Maps |
categoryName | Visible category information, when available |
address | Public address |
phone | Public phone number, when shown |
website | Public website, when shown |
totalScore | Visible rating, when rated |
reviewsCount | Visible review count |
priceLevel | Visible price information, when shown |
plusCode | Public Plus Code, when shown |
location | Observed latitude and longitude |
latitude / longitude | The same observed coordinates as plain columns, for spreadsheets and CRM imports |
placeId | Canonical Google Place ID (the ChIJ... token), when Google exposes one |
featureId | Legacy public Google Maps feature ID (the 0x...:0x... token), when Google exposes one. It is emitted separately and is never relabelled as a placeId |
kgmid | Observed Knowledge Graph identifier (the /g/... token in the canonical URL) |
locatedIn | Parent place when Google shows "Located in:" — useful for shops inside malls, stations, and buildings |
placeAttributes | Google's own published attribute chips, exactly as shown, e.g. LGBTQ+ friendly, Check-in time: 3:00 PM, Check-out time: 12:00 PM |
hasStreetView / streetViewCount | Set when Google exposes a Street View control for the place |
fuelPrices | Fuel grades and their published prices for a gas station, e.g. [{"grade": "Regular", "price": "$4.79"}]. Only a grade with a directly observed price is emitted; stale marks a price Google flags as over 24 hours old. |
hotelStars / hotelStarRating | Star class as Google labels it, plus the numeric value |
checkInTime / checkOutTime | Published check-in and check-out times |
priceOfferAmount / priceOfferCurrency | The nightly price Google currently shows, and its currency |
priceOfferDateRange | The dates that price applies to |
priceOfferFreeCancellation | Directly observed, localized free-cancellation note from the target hotel's booking offer; filter labels such as "Free cancellation only" are not emitted |
hotelAmenities | Named amenities with whether Google marks each one available, e.g. [{"name": "Pool", "available": true}]; localized badge text is preserved exactly as Google displays it, including explicit unavailable entries |
description | Editorial description visible on the place page |
hoursStatus / hours | Visible business hours, when available |
isOpenNow | Live open/closed state Google shows for the place, when available |
ratingHistogram | Visible rating distribution, when available |
serviceOptions | Visible service-option labels, such as dine-in, takeout, or delivery |
amenities | Visible header amenity labels; localized text and Google's availability wording are preserved exactly, and the field is omitted when that source surface is unavailable |
menuLink | Public menu link, when shown |
bookingLinks | Public booking, order, or reservation links, when shown |
photosSample | Public image URLs visible on the place page |
photoCount | Number of photos Google reports for the place, when available |
popularTimesSummary | Published popular-times text, when Google exposes it |
claimed | Set to false only when Google itself shows a "Claim this business" control |
permanentlyClosed / temporarilyClosed | Set to true only when Google itself marks the place permanently or temporarily closed |
googleMapsUrl | Canonical or observed Maps URL |
sourceUrl | URL used as source context |
scrapedAt | UTC scrape timestamp |
Fields are conditional. A business without a website, phone, rating, hours, or photos simply omits that field.
Input
| Field | Type | Description |
|---|---|---|
mode | enum | search (default), placeUrls, or placeIds |
searchQuery | string | Search terms such as coffee shops in Brooklyn; used in search mode |
location | string | Optional location appended to the query, such as London, UK |
placeUrls | list of strings or URL objects | Full public Google Maps place URLs; required in placeUrls mode. Common copied quotes, tracking parameters, country domains, and short links are normalized. |
placeIds | list of strings | Canonical Google Place IDs beginning with ChIJ; required in placeIds mode and resolved through Google's public URL API. Feature IDs/CIDs are not accepted as Place IDs. |
maxResults | integer, 1–100000 | Requested ceiling per search. Records are emitted until the public feed ends, the ceiling for that search is reached, or the bounded runtime deadline expires. With a batch, every search gets its own allowance, so one busy term cannot starve the others. |
searchTerms | list of strings | Run several search terms in one go, for example ["coffee shops", "dentists"]. Each term is searched in every location you provide. |
locations | list of strings | Run the search across several places in one go, for example ["New York, NY", "Austin, TX"]. |
minRating | number, 1–5 | Keep only businesses rated at or above this value. A business with no published rating does not qualify, so it is skipped. |
maxRating | number, 1–5 | Keep only businesses rated at or below this value. |
minReviews | integer | Keep only businesses with at least this many reviews. |
maxReviews | integer | Keep only businesses with at most this many reviews. |
openNow | boolean | Keep only businesses Google currently shows as open. |
hasWebsite | boolean | Keep only businesses that publish a website on their listing. |
hasPhone | boolean | Keep only businesses that publish a phone number on their listing. |
nameFilter | string | Keep only businesses whose name contains this text. |
excludeCategories | list of strings | Skip businesses whose category contains any of these words. |
includeClosed | boolean | When off, permanently closed businesses are skipped. On by default. |
language | enum | Maps interface language; defaults to English |
proxyConfiguration | object | Optional proxy override. By default the actor starts with Apify Residential (US); direct access is only a bounded fallback if the Residential route cannot be set up or does not return a usable page. |
Examples
Example: search for local businesses
{"mode": "search","searchQuery": "coffee shops","location": "Brooklyn, NY","maxResults": 20,"language": "en"}
Example: many search terms across several cities, filtered
{"mode": "search","searchTerms": ["coffee shops", "bakeries"],"locations": ["Austin, TX", "Dallas, TX"],"minRating": 4.0,"minReviews": 25,"hasWebsite": true,"maxResults": 50}
This searches all four term-and-city combinations in one run, keeps only well-reviewed businesses that publish a website, and drops anything that does not qualify.
Example: search internationally
{"mode": "search","searchQuery": "寿司","location": "東京 日本","maxResults": 10,"language": "ja"}
Example: scrape specific place URLs
{"mode": "placeUrls","placeUrls": ["https://www.google.com/maps/place/GRIND+THE+NYC+COFFEE+SHOP+%26+BAGEL+HOUSE/@40.7590839,-73.9918101,17z/data=!3m1!4m6!3m5!1s0x89c259125a931087:0x3d471d4575240620!8m2!3d40.7590839!4d-73.9918101!16s%2Fg%2F11kgnrjx7t"],"maxResults": 1}
Example: scrape canonical Place IDs
{"mode": "placeIds","placeIds": ["ChIJabtoT7hlwokRLECK0SW3_8I"],"maxResults": 1}
Use cases
- Local market and competitor research.
- Business directory and location-data projects.
- Prospecting by category and geography.
- Store or branch discovery from a controlled list of place URLs.
- Enriching a dataset with public ratings, hours, websites, and coordinates.
Cookieless and high-volume behavior
No Google login, cookies, browser profile, or authenticated session is required. The actor starts with direct public access and uses bounded retries; a blocked or unavailable page is not converted into a fake empty business. If Google serves its intermittent limited-view shell while preserving the target's contact anchors, the actor tries up to two fresh anonymous browser contexts for both direct place URLs and search-detail hydration. A complete render wins without merging fields across contexts; if every attempt remains degraded, the richest single observed row is retained with the upstream limited-view condition.
Search mode snapshots each public result card before opening detail pages. A successfully hydrated detail record is preferred; when the detail budget is exhausted or navigation fails, the actor may emit a card-level record containing only fields visibly present on that card (for example name, rating, review count, category, price, description, address, and the observed Maps URL). Detail-only fields such as phone, website, Place ID, coordinates, hours, photos, and service options are omitted from that fallback row unless they were obtained from the place page. This keeps result coverage and field provenance explicit.
Records are pushed progressively, so memory does not grow with the complete result set. Direct URL mode accepts large batches up to the schema limit. A single text search is still limited by the public result feed Google exposes; use the Google Maps Area Scanner for systematic geographic coverage beyond one search window.
FAQ
Are all fields always present? No. Google publishes different fields for different businesses and regions. Unavailable values are omitted.
Does the actor invent ratings, review counts, or identifiers? No. Values are emitted only when observed on the public page or canonical URL.
Can I scrape more than 120 search results? You can request up to 100,000. Google commonly exposes around 120 or fewer cards in one public feed; the actor forwards the requested ceiling and follows the feed until source exhaustion or its bounded runtime deadline. For systematic geographic coverage, use the Area Scanner or provide a large placeUrls list in direct mode.
What happens with duplicate URLs? Records are deduplicated using an observed place ID or canonical URL; a name-and-address fallback is used only when no stable identifier is exposed.
What happens if Google limits the page? The actor keeps already-emitted records and reports an honest terminal status. It never pads the dataset to reach maxResults.
Related Google Maps actors
| Actor | Use it for |
|---|---|
| Google Maps Reviews Scraper | Reviews, reviewer details, photos, and owner responses |
| Google Maps Photos Scraper | Place photo URLs and visible photo metadata |
| Google Maps Business Hours Scraper | Regular and special business hours |
| Google Maps Popular Times Scraper | Directly published popular-times values |
| Google Maps Email Extractor | Public website email and social-link enrichment |
| Google Maps Area Scanner | Bounding-box, circle, and polygon coverage |
| Google Maps Leads Scraper | Search plus optional website contact enrichment |
| Google Maps MCP Server | Search and review tools for AI assistants |
| Google Maps Directions Scraper | Public route and travel-mode information |
| Google Maps Geocoding Scraper | Address and coordinate lookup |
| Google Maps Similar Places Scraper | Related-place discovery |
| Google Maps Menu Scraper | Public menu items and prices |
| Google Maps Nearby Scraper | Places near a coordinate |
| Google Maps Place List Scraper | Curated lists and list/search URLs |
| Google Maps Timezone Scraper | Timezone data for coordinates |
Use Google Maps data responsibly and follow applicable terms and laws.