Google Maps Full Suite — Places, Reviews & Grid Search
Tauqeer Abbas · @nextgensda
Google Maps places, reviews and directions, with grid search past the 120-result cap.
About
Google Maps Full Suite — Places, Reviews, Distance, Grid Search & Lead Gen
One Actor for Google Maps lead generation and competitive intelligence: keyword search, grid search that goes past Google's ~120-result cap, nearby search, full place details, reviews with owner responses and A→B directions. It uses plain HTTP requests instead of a browser, so runs are fast and light.
What can it do?
| Mode | What you get |
|---|---|
| Search | Every place matching a query in an area: name, category, rating, phone, website, address, coordinates, opening hours, photos |
| Search + grid | Same as search, but the area is split into a grid so you get all matching businesses, not just the first ~120 |
| Nearby | Places matching a query around an anchor (e.g. cafe near Eiffel Tower), optionally expanded 1–2 levels outwards |
| Place details | Full record for a list of places (Maps URLs, place IDs or names): review count, full weekly hours, price level, plus code, reviews |
| Directions | Distance, duration, turn-by-turn steps and alternative routes for driving, walking or bicycling, plus a quick ETA for every mode |
Use cases
- Lead generation: every dentist, plumber or restaurant in a city, with phone and website
- Competitor research: ratings, review volume and review sentiment for every competitor in an area
- Reputation monitoring: newest or lowest-rated reviews, and whether the owner replied
- Logistics: distance and travel time between addresses
Why use this Actor?
- One Actor instead of four. Search, grid search, nearby, place details, reviews and directions share one input and one output format. There's no chaining of separate scrapers and no joining of mismatched outputs.
- Complete coverage. Grid search keeps going after Google stops at ~120 results, and deduplicates by place ID so each business appears once.
- Rich reviews. Reviews come with owner responses, Google's translations and structured dining attributes (food, service and atmosphere scores, price per person, wait time).
- Stable IDs for joining. Every place carries Google's place ID and knowledge-graph ID (
place_path,/g/…), and every review has its own ID. Runs can be merged, deduplicated and linked across days, cities and datasets. - Fast and light. Plain HTTP requests with browser-grade fingerprints and no browser, so 1 GB of memory is enough.
- One flat price. A monthly rental with a free trial: no per-result fees from the Actor.
AI and data use cases
The output is structured JSON with stable IDs, so it can go straight into AI pipelines:
- Nexus and entity-resolution data. Place IDs, knowledge-graph IDs, phone numbers, websites and addresses make good join keys. Use them to link Maps entities to your CRM, company registries or web data, and to build a clean table of real-world locations.
- Review intelligence with LLMs. Feed reviews (with Google's translations for multilingual markets) to an LLM for sentiment and aspect analysis, complaint mining, or summaries of what customers praise. Structured dining attributes and owner responses give labelled signals for free.
- RAG and AI agents. Embed place descriptions and reviews into a vector database so an assistant can answer "best-rated late-night dentist near downtown" with real, cited data. Agents can also call the Actor on demand through the API.
- Training and evaluation data. Ratings, review text and attributes make datasets for classifiers, local-business models and evaluation sets.
- Geospatial ML. Coordinates, categories, opening hours, review volume and travel times (directions mode) become features for site selection, delivery-zone planning and footfall or demand models.
- AI-powered lead generation. Collect every business in a territory with grid search, then let an LLM score and personalise outreach using the place's reviews and rating.
Grid search: getting more than 120 results
Google Maps stops returning results after about 120 per search, however large the map is. Zooming out doesn't help; only moving the map does. With Enable grid search the Actor:
- Splits the circle around your location into square cells (
gridCellSizeKm) - Searches each cell separately, spiralling outwards from the centre so dense downtown areas come first
- Overlaps the cells so nothing between them is missed
- Deduplicates by place ID across cells, and stops as soon as
maxResultsunique places are found
Example: dentist in Austin, TX, with 2 km cells over a 10 km radius and 25 cells, returned 211 unique dentists where a single search stops at ~120.
| Area type | Suggested gridCellSizeKm |
|---|---|
| Dense city centre (Manhattan, central London) | 1 |
| Suburban metro area | 2 |
| Rural / sparse | 10 |
⚠️ Grid search multiplies run time and proxy traffic. 100 cells × up to 120 results = up to 12,000 raw results before deduplication. Set
gridMaxCellsandmaxResultsdeliberately.
Reviews
With Include reviews, each place gets up to maxReviewsPerPlace reviews (up to 500), sorted by newest, mostRelevant, highestRating or lowestRating. Each review includes:
- rating, full text and Google's translation (with original language)
- exact publish date plus Google's relative date ("3 weeks ago"), and whether it was edited
- reviewer name, profile URL and ID, photo, review count, photo count, Local Guide status
- owner response and its date
- likes, review photos, review link
- structured dining attributes where the reviewer left them (price per person, food, service and atmosphere scores, wait time, parking, and so on)
Pricing
- $19/month rental, with a 7-day free trial. The Actor adds no per-result fees.
- Platform usage is billed by Bytewells from your credits, as for any Actor: compute ($0.15 per compute unit) and proxy traffic (residential $5.90 per GB). Proxy traffic is usually the larger part.
- For scale: a 5-place search used about $0.002 of platform usage. Reviews and grid search add requests, and so add proxy traffic, roughly in proportion.
Input examples
All dentists in Austin (grid)
{
"mode": "search",
"searchQuery": "dentist",
"location": "Austin, TX",
"enableGridSearch": true,
"gridCellSizeKm": 2,
"gridSearchRadiusKm": 10,
"gridMaxCells": 25,
"maxResults": 1000
}
Details and newest reviews for specific places
{
"mode": "placeDetails",
"places": [
"https://www.google.com/maps/place/...",
"0x8644b5b434046875:0x644e6eb422388b7a",
"Swish Dental Downtown Austin"
],
"includeReviews": true,
"maxReviewsPerPlace": 100,
"reviewsSort": "newest"
}
Walking directions
{ "mode": "directions", "origin": "Times Square, New York", "destination": "Central Park, New York", "travelMode": "walking" }
Output example (search)
{
"place_id": "0x8644b5b434046875:0x644e6eb422388b7a",
"name": "Swish Dental Downtown",
"category": "Dentist",
"categories": ["Dentist", "Cosmetic dentist", "Emergency dental service"],
"address": "201 W 5th St Ste 175, Austin, TX 78701, United States",
"coordinates": { "lat": 30.2674035, "lng": -97.7451433 },
"rating": 4.5,
"review_count": 983,
"phone": "+1 512-713-1099",
"website": "https://www.swishsmiles.com/location/downtown",
"opening_hours": { "schedule": { "monday": ["9 AM-6 PM"], "saturday": ["Closed"] }, "complete": true },
"maps_url": "https://www.google.com/maps/search/?api=1&query=Swish+Dental+Downtown&query_place_id=0x8644b5b434046875:0x644e6eb422388b7a",
"sourceQuery": "dentist",
"searchTaskLabel": "dentist | Austin, TX",
"gridCell": "30.26715,-97.74306"
}
gridCell and sourceQuery show which grid cell and query found each place.
Tips and limitations
- Use residential proxies (the default: the platform proxy with the
RESIDENTIALgroup). Google rate-limits by IP, and the Actor switches IP and browser fingerprint automatically when it's blocked. You can also choose Own proxies and enter your own proxy URLs. - Review count and full weekly hours come from Google's full place record. In search mode, turn on Scrape full details for each result to get them for every place (one extra request per place).
- People Also Search For isn't available on Bytewells: it needs a browser session that this platform's containers can't complete reliably. Leave Include People Also Search For off.
- Transit directions aren't available yet. Driving, walking and bicycling are.
- The Actor only collects publicly visible data. You're responsible for using it in line with applicable laws and Google's terms.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
Fields
modeWhat to scrape. search: keyword search (optionally grid-split). nearby: places matching a query around an anchor place. placeDetails: full details for a list of places. directions: route from A to B.
searchQueryUsed in search and nearby modes, e.g. dentist.
locationSearch area as text (Austin, TX) or lat,lng. Required for grid search.
maxResultsMaximum number of places to output (after deduplication and filters).
nearbyAnchorNearby mode: the place to search around, e.g. Eiffel Tower.
nearbyDepthNearby mode: 0 = around the anchor only. 1–2 = repeat the nearby search around every result (much wider coverage, more requests).
scrapePlaceDetailsSearch/nearby modes: fetch the full place record for every result (full weekly hours, review count). One extra request per place.
enableGridSearchSplit the area into a grid and search each cell separately. Results are deduplicated by place ID across cells. Multiplies run cost — see gridMaxCells.
gridCellSizeKmSmaller = more thorough but slower. ~1 km for dense city centres, 2 km for suburbs, 10 km for rural areas.
gridSearchRadiusKmRadius around the location to cover with the grid.
gridMaxCellsHard cap on cells searched. 100 cells × up to 120 hits = up to 12,000 raw results before deduplication.
placesPlace details mode: one per line — a Google Maps URL, a place ID (0x…:0x…) or a place name (Kababjees Do Darya Karachi).
placeIdAlternative to Places for a single place ID (0x…:0x…).
placeLatOptional coordinates for Place ID.
placeLngOptional coordinates for Place ID.
includeReviewsAttach reviews to each place (text, translation, rating, reviewer, photos, likes, dining attributes).
maxReviewsPerPlaceMaximum reviews to attach to each place (10 per request).
reviewsSortOrder in which reviews are collected.
includePeopleAlsoSearchAttach Google's 'People also search for' places (competitors / similar places). Starts a real Chrome once per run to open a Google Maps session that Google grants the full view (adds ~30 s–2 min to the run); the session is then reused for every place.
maxPeopleAlsoSearchMaximum 'People also search for' places per place.
resolvePeopleAlsoSearchGoogle embeds only short IDs (and details for the first few). Resolve every PAS place to its full place ID, address, phone and website (one extra request per PAS place).
originDirections mode: start address or place.
destinationDirections mode: destination address or place.
travelModeDirections mode: how to travel between origin and destination.
minRatingOnly output places rated at least this value.
requirePhoneOnly output places that list a phone number.
requireWebsiteOnly output places that list a website.
languageGoogle interface language code, e.g. en, de.
proxyConfigurationResidential proxies are strongly recommended — Google rate-limits by IP. Keep the platform proxy with the RESIDENTIAL group (works on Apify and Bytewells), or choose 'Own proxies' and enter your own proxy URLs.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is nextgensda/google-maps-full-suite (or nextgensda~google-maps-full-suite in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"mode": "search",
"searchQuery": "dentist",
"location": "Austin, TX",
"maxResults": 100,
"nearbyDepth": 0,
"scrapePlaceDetails": false,
"enableGridSearch": false,
"gridCellSizeKm": 2,
"gridSearchRadiusKm": 20,
"gridMaxCells": 100,
"includeReviews": false,
"maxReviewsPerPlace": 20,
"reviewsSort": "newest",
"includePeopleAlsoSearch": false,
"maxPeopleAlsoSearch": 10,
"resolvePeopleAlsoSearch": true,
"travelMode": "driving",
"requirePhone": false,
"requireWebsite": false,
"language": "en",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"debug": false
};
const run = await client.actor('nextgensda/google-maps-full-suite').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"mode": "search",
"searchQuery": "dentist",
"location": "Austin, TX",
"maxResults": 100,
"nearbyDepth": 0,
"scrapePlaceDetails": False,
"enableGridSearch": False,
"gridCellSizeKm": 2,
"gridSearchRadiusKm": 20,
"gridMaxCells": 100,
"includeReviews": False,
"maxReviewsPerPlace": 20,
"reviewsSort": "newest",
"includePeopleAlsoSearch": False,
"maxPeopleAlsoSearch": 10,
"resolvePeopleAlsoSearch": True,
"travelMode": "driving",
"requirePhone": False,
"requireWebsite": False,
"language": "en",
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"debug": False
}
run = client.actor("nextgensda/google-maps-full-suite").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/nextgensda~google-maps-full-suite/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"search","searchQuery":"dentist","location":"Austin, TX","maxResults":100,"nearbyDepth":0,"scrapePlaceDetails":false,"enableGridSearch":false,"gridCellSizeKm":2,"gridSearchRadiusKm":20,"gridMaxCells":100,"includeReviews":false,"maxReviewsPerPlace":20,"reviewsSort":"newest","includePeopleAlsoSearch":false,"maxPeopleAlsoSearch":10,"resolvePeopleAlsoSearch":true,"travelMode":"driving","requirePhone":false,"requireWebsite":false,"language":"en","proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]},"debug":false}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.