Google Maps Scraper: Places, Phones & Reviews, No Browser
Pricing
from $1.00 / 1,000 place scrapeds
Google Maps Scraper: Places, Phones & Reviews, No Browser
Extract Google Maps places with phone, website, rating, reviews, opening hours, popular times, images and place ID. Plain HTTP, no browser, $1.00 per 1,000 places. Accepts compass/crawler-google-places input unchanged.
Pricing
from $1.00 / 1,000 place scrapeds
Rating
0.0
(0)
Developer
subimpact
Maintained by CommunityActor stats
0
Bookmarked
10
Total users
4
Monthly active users
14 days ago
Last modified
Categories
Features
Share
Extract Google Maps business data: name, address, coordinates, phone, website, rating, review counts and distribution, opening hours, popular times, images, price bracket, menu, reservation links, plus code, CID and place ID. Optional reviews per place, plus an optional add-on that crawls each place website for company emails, phone numbers and social profiles.
Built on Google Maps' own internal JSON endpoints over plain HTTP. No Playwright and no headless Chrome, so the compute you pay for is small and the price is $1.00 per 1,000 places.
Switching from compass/crawler-google-places
Keep your existing input and change only the actor ID:
// before: client.actor('compass/crawler-google-places').call(input)const run = await client.actor('subimpact/google-maps-scraper-plainhttp').call(input);
Compass input keys are accepted (unsupported extras are ignored and logged once), and rows carry
the compass field names title, phone, phoneUnformatted, website, placeId, kgmid, fid,
totalScore, reviewsCount, searchString next to our own. Cost for 10,000 places at Free-plan
list prices: $10 here vs $40 on compass/crawler-google-places (place-scraped only, before
platform usage). Full details in Compass input compatibility.
Input
| Field | Type | Description |
|---|---|---|
| searchStringsArray | list | Search terms. Each term = one search. Terms may be a business name + full address (compass-style exact lookup) |
| lat / lng | string | Optional center coordinates. Empty = Google resolves the location from each search string (no New York bias) |
| zoom | string | Viewport zoom (default 13.1) |
| maxCrawledPlacesPerSearch | int | Max places per search term (max 200). A run with N terms returns up to N × this; 1 = the single best match per string |
| maxReviews | int | Reviews per place (each charged as review-scraped) |
| scrapePlaceDetailPage | bool | Full detail payload per place (default on) |
| placeIds | list | Direct scrape by ChIJ place ID |
| startUrls | list | Direct scrape by place URL |
| language | select | Output language |
| proxyConfiguration | object | Optional proxy |
| scrapeContacts | bool | Add-on: crawl each place website for emails, phones and social profiles (default off, $0.001 per place with contacts) |
| maxContactPagesPerPlace | int | Pages to scan per website when the add-on is on (default 3, max 10) |
Compass input compatibility
Inputs written for compass/crawler-google-places run unchanged: extra compass keys
(website, skipClosedPlaces, maxImages, scrapeSocialMediaProfiles, reviewsSort, ...)
are accepted and ignored (logged once), maxCrawledPlacesPerSearch is per search string, and
each row keeps the exact searchString it came from. scrapeContacts is now supported and
produced the same compass field names (emails, phones, facebooks, instagrams,
linkedIns, twitters, youtubes, tiktoks, pinterests). Output rows also carry the
compass aliases phoneUnformatted, kgmid, fid, description, subTitle next to our own
fields.
Search strings that are business names plus full addresses are resolved by Google itself (no coordinates needed). When Google answers with a single place instead of a result list, that place is returned as the row for the string.
Output
Dataset records mirror the classic Google Maps scraper shape:
title, categoryName, categories, address (+street/city/postalCode/state/countryCode), location, phone, website, plusCode, totalScore, reviewsCount, reviewsDistribution, price, openingHours, popularTimesHistogram, additionalInfo, imageUrls, menu, tableReservationLinks, orderOnlineLinks, owner, permanentlyClosed/temporarilyClosed, cid/dataId/placeId, reviews, reviewsStatus (omitted-reviews flag), searchString, rank, scrapedAt
Company contacts add-on
Launch offer: the contacts add-on is free until 13 November 2026. From then it is billed at $1.00 per 1,000 places where contacts were found.
Turn on scrapeContacts and each place row is enriched from the place's own website: the
homepage, then up to maxContactPagesPerPlace - 1 best-scored contact or about pages (falling
back to /contact, /contact-us, /about, /about-us, /kontakt, /impressum). Emails come
from mailto links, visible text, Cloudflare-obfuscated addresses and JSON-LD organisation
records, junk and placeholder addresses are removed. Phones come from tel: links, text and
JSON-LD, with date and number false positives filtered out. Social links are canonicalised and
share/intent links dropped. robots.txt is obeyed, responses are capped at 3 MB and only
text/html is read. Business websites are fetched directly (no proxy, desktop Chrome user agent)
with a 15 s timeout per request and up to 2 retries on network errors, 5xx and 429.
Example input:
{"searchStringsArray": ["coffee shop kuala lumpur"],"maxCrawledPlacesPerSearch": 5,"scrapeContacts": true}
Example row (values from the repository test fixture contact-obfuscated.html, which stands in
for a real cafe site; the place fields come from Google Maps):
{"title": "Northwind Traders","website": "https://northwind-traders.com/","phone": "+1 415 555 0100","emails": ["hello@northwind-traders.com", "sales@northwind-traders.com", "jobs@northwind-traders.com"],"phones": ["+14155550123", "60123456789", "+442079460958"],"facebooks": ["https://facebook.com/northwindtraders"],"instagrams": ["https://instagram.com/northwindtraders"],"linkedIns": ["https://linkedin.com/company/northwind-traders", "https://linkedin.com/in/jane-doe"],"twitters": ["https://x.com/northwind"],"contactsStatus": "success","contactPagesScanned": 2,"contactsError": null}
contactsStatus is success, no-contacts, no-website, website-is-social (the listed website is a social profile: it is copied into its social field, not crawled and not charged), robots-disallowed, blocked or
error; contactsError carries the reason when the site could not be scanned. A contacts
failure never removes or delays the place row itself.
Responsible use: contact data can be personal data. You need a legal basis to collect and use it (for example GDPR in the EU or PDPA in Malaysia), and you are responsible for how you store, use and share it.
Pricing (pay per event)
| Event | Price | Notes |
|---|---|---|
| place-scraped | $0.001 ($1.00 per 1,000 places) | per place record |
| contact-details-scraped | $0.001 ($1.00 per 1,000 places) | add-on, charged once per place and only when an email, website phone or social link was found, after the row is delivered; free until 13 November 2026 |
| review-scraped | $0.0005 ($0.50 per 1,000 reviews) | per review (only when maxReviews > 0) |
| actor-start | $0.00005 | once per run |
Platform compute is paid by the user (isPPEPlatformUsagePaidByUser), same as the original. No browser in the container → compute per 1k places is ~10× lower than browser-based scrapers.
How this compares
The actor talks to Google Maps' own internal JSON RPC endpoints over plain HTTP, with no Playwright and no headless Chrome in the container, so the compute you pay for is much smaller than with a browser-based scraper.
For places plus company contacts: compass/crawler-google-places is $4.00 per 1,000 places plus $2.00 per 1,000 for the contacts add-on ($6.00 total), lukaskrivka/google-maps-with-contact-details is $5.00 plus $2.50 ($7.50 total), and this actor is $1.00 plus $1.00 ($2.00 total), with contacts charged only when something is found. compass/google-maps-extractor lists $5.00 per 1,000 places without the contacts add-on. Two smaller actors list a lower per-item price: scraperlink/google-maps-scraper ($0.50) and vortex_data/google-maps ($1.00 for a basic place, $1.50 with contact details). Compare field coverage against those listings before choosing on price alone.
| Actor | Price per 1,000 places | Contacts add-on | Platform usage |
|---|---|---|---|
| subimpact/google-maps-scraper-plainhttp | $1.00 | $1.00 (only when found) | paid by you |
| compass/crawler-google-places | $4.00 | $2.00 | see listing |
| lukaskrivka/google-maps-with-contact-details | $5.00 | $2.50 | see listing |
| compass/google-maps-extractor | $5.00 | not listed | see listing |
| scraperlink/google-maps-scraper | $0.50 | not listed | see listing |
Prices are Apify Store list prices on the Free plan, checked 29 October 2026. Competitor prices can change; check their listings.
Data source
Google Maps' own website RPC (maps.google.com/search, preview/place, rpc/listugcposts),
the same payload stream a browser session receives, fetched over plain HTTP with consent
cookies. Position-based parsers are ported from the MIT-licensed
gosom/google-maps-scraper and adapted to the current wire format (Sep 2026).