Google Maps Scraper | Places & Contacts
Pricing
from $0.45 / 1,000 place results
Google Maps Scraper | Places & Contacts
Search Google Maps or resolve place IDs and URLs. Export business details, ratings and hours, with optional reviews and website contacts; coverage limits documented.
Pricing
from $0.45 / 1,000 place results
Rating
0.0
(0)
Developer
Eli J
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
What you can export
Use this Google Maps scraper to research businesses and places. Search by area or resolve public Place IDs and Maps URLs to export business identities, locations, available ratings, opening hours and source links.
Optionally include individual reviews or contacts published on the business website. Live ranked results are an observation rather than an exhaustive business census; enrichment and billing units are explained below.
Try the example input
Paste this input into the Actor:
{"searchStringsArray": ["coffee"],"locationQuery": "Austin, Texas, USA","maxCrawledPlacesPerSearch": 5}
The form example requests up to five coffee places in Austin. Omitting all searches, IDs and URLs requests no work and exits successfully with guidance. An explicit zero place cap or empty languages list also requests no work. Form prefill values are examples, not API defaults.
Search by place, area or language
Direct Place IDs and Maps URLs:
{"placeIds": ["ChIJb5gBC-u0RIYRHkntaUcdJGs"],"startUrls": [{"url": "https://www.google.com/maps?cid=7720327853776914718"}]}
Search several areas in several interface languages:
{"searchStringsArray": ["pharmacy"],"locationQueries": ["London, UK", "Paris, France"],"languages": ["en", "fr"],"maxCrawledPlacesPerSearch": 10}
Use a GeoJSON area, with longitude before latitude:
{"searchStringsArray": ["coffee"],"customGeolocation": {"type": "Point", "coordinates": [-97.75, 30.25], "radiusKm": 2},"maxCrawledPlacesPerSearch": 10}
Point, MultiPoint, Polygon, MultiPolygon, LineString, MultiLineString, Feature and FeatureCollection inputs are accepted. Polygon holes are excluded. Lines use a radius corridor. Point/line radius defaults to 8 km. Radius distances use a local equirectangular approximation; polygons use their coordinate boundaries. Polar and date-line geometry requires care because this is not a global geodesic search engine.
Use countryCode with state, county, city or postalCode for structured areas. Postal codes are used with a country and without a city. Nonempty locationQuery takes priority over locationQueries, GeoJSON and structured locations. URLs take priority over search terms; explicitly supplied Place IDs still run. Terms beginning with place_id: resolve directly.
Reviews and website contacts
{"placeIds": ["ChIJb5gBC-u0RIYRHkntaUcdJGs"],"maxReviews": 20,"reviewsSort": "newest","scrapeReviewsPersonalData": false,"scrapeContacts": true}
Reviews are nested in the place row. The cap applies per place; 99999 or more requests paging until the available terminal page. Sort by newest, relevance or rating. An ISO or relative start date forces newest sorting; text filtering checks the full original review text. Google's returned absolute timestamp may reflect an edit, and relative owner-response dates are retained without inventing an absolute date. A paging contradiction is reported in ERRORS and the place row contains no incomplete review set.
Website contacts come from the homepage and up to five same-site contact, about or legal links. The Actor stops ordinary contact-page traversal after finding an email while still reading linked Impressum pages. It extracts published email addresses, telephone links and social profile URLs; it does not crawl social profiles, verify email deliverability or obtain employee leads. An unreadable enrichment is reported in ERRORS while the valid place remains available.
Input
| Field | Type | Default | Meaning |
|---|---|---|---|
searchStringsArray | array | omitted | Search terms or place_id: identifiers. Required for search work; omitted terms can use categoryFilterWords. startUrls takes priority. |
locationQuery | string | omitted | Free-text area. Takes priority over structured location and GeoJSON. |
locationQueries | array | omitted | Search every term in each area. A nonempty locationQuery overrides this list. |
placeIds | array | omitted | Resolve public Google Place IDs independently of searches. |
startUrls | array | omitted | Place, CID, share/short-link or search URLs. URL work takes priority over search terms. |
customGeolocation | object | omitted | Point, MultiPoint, Polygon (with holes), MultiPolygon, LineString, MultiLineString, Feature or FeatureCollection. Coordinates are longitude then latitude. Point/line radiusKm defaults to 8 km. Free-text location overrides this. |
radiusKm | number | omitted | Radius for Point and line corridor inputs without their own radiusKm. |
countryCode | string | omitted | Two-letter country code for structured location and the Google interface region. |
state | string | omitted | Structured area; used when free-text/GeoJSON locations are absent. |
county | string | omitted | Structured county; verified against Google's returned area labels when available. |
city | string | omitted | Structured city. Do not combine with postalCode. |
postalCode | string | omitted | Structured postal area. Use with countryCode and without city. |
language | string | "en" | Google interface language; languages overrides this when supplied. |
languages | array | omitted | Read every supplied language; an explicit empty list requests no work. Additional languages discover new places, keeping one row per Place ID across the whole run. |
maxCrawledPlacesPerSearch | integer | omitted | Delivered place cap per source and language. Omitted means unlimited; explicit zero means no work. |
categoryFilterWords | array | omitted | OR across entries; all words in each entry must match a returned category. Supplies search terms if searchStringsArray is omitted. |
searchMatching | string | "all" | Keep all returned names, names including the term, or exact names. |
placeMinimumStars | string | "" | Minimum Google rating. Empty disables the filter. |
website | string | "allPlaces" | Filter by presence of a business website. |
skipClosedPlaces | boolean | false | Skip places carrying a recognized permanent or temporary closure marker. |
geoStrictMatch | boolean | true | Filter explicit geometry and structured areas using returned coordinates/address labels. |
keepUnverifiedLocations | boolean | false | When geographic verification is requested, retain records lacking the required coordinates or area labels. |
skipPlacesNotMatchingSearch | boolean | false | Require each search word in the returned name/categories; this is lexical matching, not an AI relevance classifier. |
scrapePlaceDetailPage | boolean | true | Read the place's identity-confirmed detail response for hours, attributes and public business information. |
extractPlaceDetails | boolean | omitted | Alias used only when scrapePlaceDetailPage is omitted. |
maxReviews | integer | 0 | Zero disables reviews; 99999 or more requests paging to the available terminal page. Reviews are separately billed artifacts. |
maxReviewsPerPlace | integer | omitted | Alias used only when maxReviews is omitted. |
reviewsSort | string | "newest" | Google review sort; reviewsStartDate forces newest. |
reviewsStartDate | string | omitted | ISO date/time or relative value such as 3 days. Relative months are 30 days and years 365 days. |
reviewsFilterString | string | omitted | Case-insensitive substring in full original review text. May require scanning additional pages. |
reviewsOrigin | string | "all" | Include all origins returned by Google, or only Google-origin records. |
scrapeReviewsPersonalData | boolean | true | Disable to remove reviewer names, IDs, URLs, photos, profile counts and the review URL; the review ID and text remain. |
personalData | boolean | omitted | Alias used only when scrapeReviewsPersonalData is omitted. |
scrapeContacts | boolean | false | Read the business website and up to five linked contact/about/legal pages. Published contacts only; separate contact event. |
extractContactsFromWebsite | boolean | omitted | Contact-extractor alias used only when scrapeContacts is omitted. |
scrapeTableReservationProvider | boolean | true | Include public reservation links already returned in details; no reservation action is invoked. |
scrapeOrderOnline | boolean | true | Include public Google food-order links returned in details; no order action is invoked. |
scrapeDirectories | boolean | false | Resolve the returned businesses inside malls/directories; source-dependent and potentially many additional requests. |
maxRunSeconds | integer | 0 | Stop source work when this budget expires; zero disables the budget. Unfinished work is recorded in ERRORS. |
maxRetriesPerRequest | integer | 3 | Total attempts, including the first. Retry transport failures, 403/408/429/5xx and unreadable answers using fresh sessions. |
proxyConfiguration | object | {"useApifyProxy":true} | Apify datacenter first. Explicit useApifyProxy:false uses direct egress. Residential groups are used only when explicitly configured. |
Output
This illustrative place row shows the main fields; source-dependent values can be null or empty:
{"recordType": "place","title": "Example Coffee","placeId": "ChIJ-example","fid": "0x1:0x2","cid": "2","categoryName": "Coffee shop","categories": ["Coffee shop"],"address": "12 Example Street, Austin, TX","website": "https://example.com/","location": {"lat": 30.25, "lng": -97.75},"totalScore": 4.5,"reviewsCount": 25,"openingHours": [{"day": "Tuesday", "hours": "8 AM–5 PM"}],"additionalInfo": {},"imageUrl": null,"reviews": [],"reviewsScrapedCount": 0,"searchString": "coffee","rank": 1,"language": "en","sourceUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ-example","scrapedAt": "2026-10-06T17:00:00Z"}
The dataset contains identity (title, placeId, fid, cid, kgmid), names/descriptions, category labels, formatted and structured addresses, phone/website, coordinates, timezone and plus code. Ratings/counts and returned review tags/distributions are preserved. Detail reads add hours as returned by Google (may be partial), today's hours, current-status text, grouped true/false attributes, owner name, primary image/count, parent-place links, owner posts, reservation/order/booking links, hotel dates/description/stars/offers and related hotels. Directory mode resolves child businesses returned inside a directory.
reviews includes identifiers, full original text, available translations, stars, origin, source timestamps, available author metadata, owner-response text and returned review-image URLs. Disabling reviewer personal data sets the personal fields and review URL to null; it retains review text and review ID. Unavailable detailed-rating/context fields remain empty. reviewsScrapedCount counts delivered nested reviews.
Each review chunk contains at most 5,000 reviews and stays under 4,000,000 serialized JSON bytes. The first row has recordType: "place" and isReviewsContinuation: false. Further rows have recordType: "reviewContinuation", placeId, isReviewsContinuation: true, reviews, reviewsScrapedCount, and one-based reviewChunkIndex / reviewChunkCount. Join chunks by placeId and chunk index. A maximum-cost stop can leave fewer chunks than reviewChunkCount; inspect that metadata and ERRORS before treating the set as complete. Filter recordType to place when counting businesses.
With contacts enabled, emails, phones, additionalPhones, whatsapps, instagrams, facebooks, linkedIns, youtubes, tiktoks, twitters, pinterests, tripadvisors, yelps and foursquares contain published contacts or profile links. An available Impressum carries company/people/contact/VAT/registration text; address extraction is not provided.
A startUrls object can carry userData, for example {"url":"https://www.google.com/maps?cid=7720327853776914718","userData":{"crmId":"A-1042"}}. The first delivered base place retains it unchanged as inputUserData; a later duplicate source does not replace the first source's metadata.
rank is the one-based position encountered within a source. searchString, searchPageUrl, searchPageLoadedUrl, language, canonical url/sourceUrl and UTC scrapedAt retain request context. isAdvertisement is null because an advertisement marker is not decoded. Counts are artifact counts, coordinates are decimal degrees, scores are Google stars, and prices stay provider text.
Coverage and limits
Searches use live Google ranked results. Paging, overlapping-area subdivision and deduplication can reach beyond a single ranked viewport; they do not establish an exhaustive business census. The Actor reports discovery interruptions in ERRORS. Dense searches may make many requests unless a place or time cap is supplied.
Place, CID, share-link and search URLs are supported when their redirect or URL exposes a place identity or query. Saved/custom place-list URLs are not currently resolved. Only public anonymous data is read. Full photo galleries, image categories, popular-times, fuel prices, EV connectors and Q&A are not provided. Some other source-dependent values, such as claim indicators, next-opening time, category IDs, customer updates and web-result structures, remain unavailable. Do not interpret null values as a claim that the business lacks that feature. A primary image URL is not a full gallery.
Google can omit ratings, hours, attributes, contacts or reviews for a place or language. Geographic verification rejects unverifiable records unless explicitly allowed. English open/closure labels are recognized; localized closure markers may remain unknown. Reviews are fetched from Google's Search-side review route; this is not a promise that every review shown in every Google product is accessible.
Billing and spending limits
The base artifact is one delivered base place row. Review continuation rows do not receive another base-place charge. Requested review artifacts are charged per delivered nested review; successfully read website enrichment is a separate contact artifact. At publication, the Actor Start event is USD 0.00005 per GB of run memory. Final prices are set on the Actor's pricing page.
The base event is apify-default-dataset-item. Custom review and contact events can use flat or platform tier prices when the run resolves their numeric price. See the current Pricing tab for the configured event prices.
The Actor inspects every charge result and stops source work when the maximum-cost limit binds. Nested enrichment is stored with its place before its event is charged; a binding add-on may therefore leave delivered but uncharged enrichment. Errors are never dataset rows and are never billed as result artifacts. If all supplied source attempts fail, the run fails with guidance; recognized no-data searches and filtered-empty results exit successfully.
Apify datacenter proxy is the default. Retryable transport failures, 403/408/429/5xx and unreadable responses use a fresh cookie-free session. Explicit direct or residential proxy configurations are honored; there is no automatic residential fallback.
API example
Send a POST to https://api.apify.com/v2/acts/OWNER~google-maps-place-atlas/runs?token=YOUR_TOKEN with the JSON body under "Try the example input", then read the run's default dataset. Use the returned key-value store's ERRORS record for handled input/source failures. Keep the API token private.
Support
Include the run ID, input mode and the ERRORS reason when reporting a problem through the Actor's Issues tab.