Google Maps Search Scraper
Pricing
from $0.60 / 1,000 result chargeds
Google Maps Search Scraper
Get place search results from Google Maps. Talks directly to Google Maps' internal mobile API, no login needed. Split from the mature, published google-maps-all-in-one-api for a focused, single-purpose workflow.
What does Google Maps Search Scraper do?
Google Maps Search Scraper searches Google Maps for places near a location, and/or gets search-as-you-type autocomplete suggestions — pass in an array of search queries and/or an array of suggestion queries, and every result item is pushed to the dataset as its own row, tagged with which query it came from.
Why use Google Maps Search Scraper?
It talks directly to the same internal gRPC API the official Google Maps Android app uses (mobilemaps-pa-gz.googleapis.com), reverse-engineered by live capture against a real device — real protobuf request/response schemas, real headers, no API key of your own needed. No account, no browser automation, no scraping setup.
This is the search-and-autocomplete slice of Google Maps All-in-One API, split out as its own focused, batch-run Actor (input in, dataset out) instead of that Actor's always-on Standby REST API.
- Real place data — name, coordinates, address, rating, review count, phone, website, hours, category, and more, straight from Google's servers
- Autocomplete — the same search-as-you-type predictions the app shows while typing, with resolved place IDs and coordinates where available
- Batch-friendly — run many searches and/or suggestion lookups in a single Actor run
- Use cases: local business lead generation, market/competitor research, place-data enrichment, address/POI autocomplete for your own app
How it connects to the parent
This Actor ports the search() and suggest() logic (and the shared gRPC/protobuf plumbing) verbatim from Google Maps All-in-One API, which exposes those two endpoints plus place detail, reviews, directions, live traffic, reverse geocoding, photos, shareable links, EV reference data, and a business category catalog as an always-on REST API. If you need those other endpoints, or prefer calling a REST API on demand instead of running a batch Actor, use the parent.
Input
At least one of searches or suggestions must be a non-empty array.
searches[]
| Field | Type | Required | Description |
|---|---|---|---|
query | string | yes | Search text, e.g. coffee, pizza restaurant. |
lat | number | yes | Latitude to search near. |
lng | number | yes | Longitude to search near. |
maxResults | integer | no | Max results to return. Default 20. |
radiusKm | number | no | Search radius in kilometers. Default 50. |
language | string | no | BCP-47 language code, e.g. en-US. Default en-US. |
openNow | boolean | no | Only places currently open (applied client-side, see Known limitations). |
minRating | number | no | Only places with rating >= this value (applied client-side). |
category | string | no | Case-insensitive substring match against place categories, e.g. coffee (client-side). |
suggestions[]
| Field | Type | Required | Description |
|---|---|---|---|
query | string | yes | Partial text as the user would type it, e.g. White Hous. |
lat | number | no | Biases suggestions toward this location. Default 0. |
lng | number | no | Biases suggestions toward this location. Default 0. |
radiusKm | number | no | Declared for parity with the upstream API; not currently wired into the request (mirrors the parent Actor). |
language | string | no | BCP-47 language code, e.g. en-US. Default en-US. |
Example:
{"searches": [{ "query": "coffee", "lat": 38.8977, "lng": -77.0365, "maxResults": 5 }],"suggestions": [{ "query": "White House", "lat": 38.9, "lng": -77.03 }]}
Output
One dataset row per result item, tagged with queryType and the originating query.
Search result row:
{"queryType": "search","query": "coffee","lat": 38.8977,"lng": -77.0365,"placeId": "0x89b7b7bcdecbb1df:0x715969d86d0b76bf","name": "Compass Coffee","fullAddress": "1535 7th St NW, Washington, DC 20001, United States","rating": 4.6,"reviewCount": 812,"categories": ["Coffee shop"]}
Suggestion row:
{"queryType": "suggestion","query": "White House","fullText": "White House, Pennsylvania Avenue Northwest, Washington, DC, USA","primaryText": "White House","placeId": "0x89b7b7bcdecbb1df:0x715969d86d0b76bf","lat": 38.8976763,"lng": -77.0365298}
Known limitations
searchesresults can be biased toward the US (Ashburn/Sterling, VA) regardless of thelat/lngyou pass. Confirmed on the parent Actor via a live A/B test: the real Google Maps Android app, run from a phone physically in Jakarta, correctly returns Jakarta-area results for the same query — but the identical request sent from Apify's infrastructure returns US results instead. This reproduces across independently-built actors and execution models, so it isn't a bug in the request-building code — Google's backend appears to weight the caller's IP geolocation over the request's explicit coordinates for unauthenticated requests, and Apify's compute runs in AWSus-east-1(Ashburn, VA).openNow/minRating/categoryfilters onsearchesare applied client-side, not passed through to Google's servers — there's no server-side filter parameter for these. Filtered requests fetch more raw results under the hood so filtering still returns close tomaxResults, but a very narrow filter on a sparse area can come back with fewer results than requested.- Place detail, reviews, directions, live traffic, reverse geocoding, photos, shareable links, EV reference data, and the business category catalog are not exposed here — use Google Maps All-in-One API for those.
Pricing
Pay per event, via the result event — charged once per place result or suggestion pushed to the dataset, starting at $0.001 (FREE tier). See the Actor's Pricing tab for current rates.