Google Maps Related Place & Competitor Finder
Find the related and 'people also search for' places Google Maps shows on a business, hotel, or landmark page. Get each related place's name, rating, review count, category, coordinates, and image, linked back to the place you searched.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Choose how to enter the source places. |
placeUrls | array | optional | Google Maps place URLs, canonical ChIJ Place IDs, or legacy 0x…:0x… feature IDs. Mixed values are allowed (mode=byPlace). |
searchQueries | array | optional | Business, hotel, or landmark names to resolve and analyze (mode=byQuery). |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Choose how to enter the source places. |
placeUrls | array | optional | Google Maps place URLs, canonical ChIJ Place IDs, or legacy 0x…:0x… feature IDs. Mixed values are allowed (mode=byPlace). |
searchQueries | array | optional | Business, hotel, or landmark names to resolve and analyze (mode=byQuery). |
location | string | optional | City or area appended to every place name (mode=byQuery). |
maxItems | integer | optional | Maximum number of similar places to return across all sources. |
similaritySource | string | optional | Auto uses Google's related carousel and falls back to same-category nearby places when the carousel has fewer than Min similar. Carousel never uses the fallback. Same category skips the carousel. |
minSimilar | integer | optional | In auto mode, use the same-category fallback when the carousel has fewer usable rows than this number and cannot already fill Max results. |
categoryOverride | string | optional | Use this category for the same-category fallback instead of the source place's own category. |
minRating | number | optional | Drop related places rated below this value. Places without a published rating are dropped when this is above zero. |
minReviews | integer | optional | Drop related places with fewer than this many reviews. |
maxDistanceKm | number | optional | Keep only related places within this straight-line distance from the source. Requires published coordinates. |
categoryFilter | string | optional | Keep only places whose category list contains this text (case-insensitive). |
sortBy | string | optional | Order of the returned rows. Recommended keeps Google's carousel and search order. |
deduplicate | boolean | optional | Keep one row per place, using the canonical Place ID, then the feature ID, then name and coordinates. |
includeDetails | boolean | optional | Look up each returned place's own page for its canonical Place ID, address, website, phone, categories, plus code, photo count, and image. Adds one request per row and slows dense runs. |
includeMedia | boolean | optional | Include the image URL when Google publishes one. |
language | string | optional | Google Maps interface language. Affects names, categories, and the fallback category query. |
Download the published input schema
View complete JSON
{
"description": "Find related places Google Maps shows for a business, or discover same-category competitors near it.",
"properties": {
"categoryFilter": {
"description": "Keep only places whose category list contains this text (case-insensitive).",
"editor": "textfield",
"example": "Hotel",
"title": "Category contains",
"type": "string"
},
"categoryOverride": {
"description": "Use this category for the same-category fallback instead of the source place's own category.",
"editor": "textfield",
"example": "Pizza restaurant",
"title": "Category override",
"type": "string"
},
"deduplicate": {
"default": true,
"description": "Keep one row per place, using the canonical Place ID, then the feature ID, then name and coordinates.",
"prefill": true,
"title": "Remove duplicates",
"type": "boolean"
},
"includeDetails": {
"default": true,
"description": "Look up each returned place's own page for its canonical Place ID, address, website, phone, categories, plus code, photo count, and image. Adds one request per row and slows dense runs.",
"prefill": false,
"title": "Include details",
"type": "boolean"
},
"includeMedia": {
"default": true,
"description": "Include the image URL when Google publishes one.",
"prefill": true,
"title": "Include images",
"type": "boolean"
},
"language": {
"default": "en",
"description": "Google Maps interface language. Affects names, categories, and the fallback category query.",
"editor": "select",
"enum": [
"en",
"es",
"fr",
"de",
"it",
"pt",
"ja",
"ko",
"zh",
"ar",
"ru"
],
"enumTitles": [
"English",
"Spanish",
"French",
"German",
"Italian",
"Portuguese",
"Japanese",
"Korean",
"Chinese",
"Arabic",
"Russian"
],
"prefill": "en",
"title": "Language",
"type": "string"
},
"location": {
"description": "City or area appended to every place name (mode=byQuery).",
"editor": "textfield",
"example": "New York",
"title": "Location",
"type": "string"
},
"maxDistanceKm": {
"description": "Keep only related places within this straight-line distance from the source. Requires published coordinates.",
"example": 2,
"maximum": 50,
"minimum": 0.1,
"title": "Maximum distance (km)",
"type": "number"
},
"maxItems": {
"default": 100,
"description": "Maximum number of similar places to return across all sources.",
"maximum": 500,
"minimum": 1,
"prefill": 3,
"title": "Max results",
"type": "integer"
},
"minRating": {
"description": "Drop related places rated below this value. Places without a published rating are dropped when this is above zero.",
"example": 4.5,
"maximum": 5,
"minimum": 0,
"title": "Minimum rating",
"type": "number"
},
"minReviews": {
"description": "Drop related places with fewer than this many reviews.",
"example": 1000,
"maximum": 1000000,
"minimum": 0,
"title": "Minimum reviews",
"type": "integer"
},
"minSimilar": {
"default": 5,
"description": "In auto mode, use the same-category fallback when the carousel has fewer usable rows than this number and cannot already fill Max results.",
"maximum": 20,
"minimum": 0,
"prefill": 1,
"title": "Min similar",
"type": "integer"
},
"mode": {
"default": "byPlace",
"description": "Choose how to enter the source places.",
"editor": "select",
"enum": [
"byPlace",
"byQuery"
],
"enumTitles": [
"By place URL or Place ID",
"By place name and location"
],
"prefill": "byPlace",
"title": "Mode",
"type": "string"
},
"placeUrls": {
"description": "Google Maps place URLs, canonical ChIJ Place IDs, or legacy 0x…:0x… feature IDs. Mixed values are allowed (mode=byPlace).",
"editor": "stringList",
"example": [
"ChIJ8Q2WSpJZwokRQz-bYYgEskM",
"https://maps.app.goo.gl/example"
],
"prefill": [
"https://www.google.com/maps/place/The+Ritz+London/@51.5070782,-0.1416273,17z/data=!3m1!4b1!4m6!3m5!1s0x48760529d30fc857:0x596135811e044014!8m2!3d51.5070782!4d-0.1416273!16zL20vMDQ3enJ2?hl=en"
],
"title": "Place URLs or IDs",
"type": "array"
},
"searchQueries": {
"description": "Business, hotel, or landmark names to resolve and analyze (mode=byQuery).",
"editor": "stringList",
"example": [
"Joe's Pizza",
"The Ritz London"
],
"title": "Place names",
"type": "array"
},
"similaritySource": {
"default": "auto",
"description": "Auto uses Google's related carousel and falls back to same-category nearby places when the carousel has fewer than Min similar. Carousel never uses the fallback. Same category skips the carousel.",
"editor": "select",
"enum": [
"auto",
"carousel",
"sameCategory"
],
"enumTitles": [
"Auto (carousel, then same category)",
"Google carousel only",
"Same category nearby only"
],
"prefill": "auto",
"title": "Related places source",
"type": "string"
},
"sortBy": {
"default": "recommended",
"description": "Order of the returned rows. Recommended keeps Google's carousel and search order.",
"editor": "select",
"enum": [
"recommended",
"rating",
"reviews",
"distance"
],
"enumTitles": [
"Recommended (Google order)",
"Highest rating",
"Most reviews",
"Closest first"
],
"prefill": "recommended",
"title": "Sort by",
"type": "string"
}
},
"required": [],
"schemaVersion": 1,
"title": "Google Maps Similar Places Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
similarPlaces | string | optional | Each item is one related place. relationMode says whether Google recommended it (googleCarousel) or it was found nearby in the same category (sameCategoryNearby). Fields Google does not publish are omitted. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One row per related place, with its explicit relation provenance (Google carousel or same-category nearby), canonical and legacy identifiers, category, rating, reviews, contacts, coordinates, image, straight-line distance, and a back-reference to the source place.",
"properties": {
"similarPlaces": {
"description": "Each item is one related place. relationMode says whether Google recommended it (googleCarousel) or it was found nearby in the same category (sameCategoryNearby). Fields Google does not publish are omitted.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Similar Places",
"type": "string"
}
},
"title": "Google Maps Related Place & Competitor Finder Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"address": {
"format": "text",
"label": "Address"
},
"categoryName": {
"format": "text",
"label": "Category"
},
"distanceMeters": {
"format": "number",
"label": "Distance (m)"
},
"googleMapsUrl": {
"format": "link",
"label": "Maps URL"
},
"name": {
"format": "text",
"label": "Related Place"
},
"phone": {
"format": "text",
"label": "Phone"
},
"rank": {
"format": "number",
"label": "Rank"
},
"relationMode": {
"format": "text",
"label": "Relation"
},
"reviewsCount": {
"format": "number",
"label": "Reviews"
},
"scrapedAt": {
"format": "datetime",
"label": "Scraped At"
},
"sourceBusinessName": {
"format": "text",
"label": "Source Business"
},
"totalScore": {
"format": "number",
"label": "Rating"
},
"website": {
"format": "link",
"label": "Website"
}
}
},
"title": "Similar Places",
"transformation": {
"fields": [
"recordType",
"relationMode",
"relationQuery",
"relatedSectionType",
"rank",
"name",
"placeId",
"featureId",
"kgmid",
"cid",
"categoryName",
"categories",
"totalScore",
"reviewsCount",
"address",
"website",
"phone",
"photoCount",
"plusCode",
"distanceMeters",
"distance",
"price",
"description",
"latitude",
"longitude",
"image",
"sourceBusinessName",
"sourcePlaceId",
"sourceFeatureId",
"sourceCategory",
"sourceLongitude",
"sourceLatitude",
"sourceAddress",
"sourcePlaceUrl",
"googleMapsUrl",
"sourceUrl",
"scrapedAt"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Google Maps Related Place & Competitor Finder
Find the places Google Maps treats as related to a business, hotel, or landmark — and keep going when Google shows no carousel by discovering same-category places around the same pin. Enter many URLs, Place IDs, or place names in one run, filter and sort the results, and get an explicit relationMode on every row so you always know whether Google recommended the place or it was found nearby.
What it does
- Two entry modes:
byPlaceaccepts Google Maps URLs, canonicalChIJPlace IDs, and legacy0x…:0x…feature IDs;byQueryaccepts business names plus an optional city or area. Batch both. - Carousel first, nearby fallback second: reads Google's related-place carousel when it exists, then fills short results with places from the source's own category around the same coordinates.
- Explicit provenance: every row says
googleCarouselorsameCategoryNearby; fallback rows are never presented as Google recommendations. - Filters and order: minimum rating, minimum reviews, maximum straight-line distance, category text, and sort by recommended order, rating, reviews, or distance.
- Identity, contacts, and distance: canonical Place ID, legacy feature ID, CID, KG MID, address, website, phone, plus code, photo count, coordinates, image, and computed
distanceMeters. - Empty fields are omitted rather than sent as
nullor guessed.
Services
| Service | What it returns | Used by |
|---|---|---|
| Google Maps place record | Source name, canonical and legacy IDs, category, address, rating, reviews, website, phone, coordinates | both modes |
| Google Maps related carousel | Up to the cards Google publishes for that place, with names, ratings, reviews, coordinates, images, and visible card text | byPlace, byQuery |
| Google Maps same-category search | Ranked places in the source category around the source coordinates, 20 per page | fallback in both modes |
| Google Maps place details | Canonical Place ID, address, contacts, categories, plus code, photo count, image for one returned place | optional enrichment |
How it works
- Resolve the source. A place URL provides its feature ID and coordinates directly. A canonical
ChIJID is resolved through Google's public place page in one request. A name query is resolved through Google's map search, preferring the focused result and requiring a name match otherwise. - Read the source record and carousel. The same place response carries the source business data and, when Google exposes one, the related-place carousel.
- Decide whether to fall back. In
automode the fallback runs when the carousel has fewer usable rows thanminSimilarand the carousel cannot already fillmaxItems.carouselnever falls back;sameCategoryskips the carousel entirely. - Search the same category nearby. The fallback uses the source's first category (or
categoryOverride) anchored at the source coordinates, page by page, until enough places pass the filters, the result window is exhausted, ormaxItemsis reached. Sorting by rating, reviews, or distance considers the full window before the cap is applied. - Clean the result set. The source place is removed, filters are applied, identities are deduplicated, and rows are sorted.
- Optionally enrich.
includeDetails=truelooks up each emitted place's own page for its canonical Place ID, contacts, category, plus code, photo count, and image. - Push immediately. Records are emitted as they are finalised, with the global
maxItemscap. Unresolved inputs are skipped and reported without failing the whole run.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | byPlace |
byPlace accepts URLs or IDs; byQuery accepts place names |
placeUrls |
array | – | Google Maps URLs, ChIJ… IDs, or 0x…:0x… feature IDs (mode=byPlace) |
searchQueries |
array | – | Business, hotel, or landmark names (mode=byQuery) |
location |
string | – | City or area appended to every name (mode=byQuery) |
maxItems |
integer | 100 |
Global cap on returned rows (1–500) |
similaritySource |
string | auto |
auto, carousel, or sameCategory |
minSimilar |
integer | 5 |
In auto, fall back when the carousel has fewer usable rows than this and cannot fill maxItems (0–20) |
categoryOverride |
string | – | Category used by the fallback instead of the source's own |
minRating |
number | – | Drop places below this rating (0–5) |
minReviews |
integer | – | Drop places below this review count |
maxDistanceKm |
number | – | Keep places within this straight-line distance (0.1–50 km) |
categoryFilter |
string | – | Keep places whose category list contains this text |
sortBy |
string | recommended |
recommended, rating, reviews, or distance |
deduplicate |
boolean | true |
Keep one row per place identity |
includeDetails |
boolean | true |
Look up each returned place's own page for extra fields |
includeMedia |
boolean | true |
Include image URLs when Google publishes them |
language |
string | en |
Maps language: en, es, fr, de, it, pt, ja, ko, zh, ar, ru |
Example: related hotels for one place URL
{
"mode": "byPlace",
"placeUrls": [
"https://www.google.com/maps/place/The+Ritz+London/@51.5070782,-0.1416273,17z/data=!3m1!4b1!4m6!3m5!1s0x48760529d30fc857:0x596135811e044014!8m2!3d51.5070782!4d-0.1416273!16zL20vMDQ3enJ2?hl=en"
],
"maxItems": 20,
"similaritySource": "auto",
"minSimilar": 5
}
Example: competitors for a restaurant with no carousel
{
"mode": "byPlace",
"placeUrls": ["ChIJ8Q2WSpJZwokRQz-bYYgEskM"],
"similaritySource": "sameCategory",
"maxItems": 50,
"includeDetails": true
}
Example: several names in one city, filtered and sorted
{
"mode": "byQuery",
"searchQueries": ["Joe's Pizza", "Peter Luger Steak House"],
"location": "New York",
"minRating": 4.2,
"minReviews": 500,
"maxDistanceKm": 5,
"sortBy": "rating",
"maxItems": 30
}
Example: carousel only, no fallback
{
"mode": "byPlace",
"placeUrls": ["ChIJ4fRwZb25yhQRpHwVijb3LeU"],
"similaritySource": "carousel",
"includeMedia": false,
"maxItems": 10
}
Output
Every row is one related place:
relationMode—googleCarouselorsameCategoryNearbyrelationQuery— category used by the fallback, when applicablerelatedSectionType— Google's own section label when the response exposes onerank— 1-based position in the returned ordername— related place nameplaceId— canonicalChIJ…Place ID, only when Google publishes onefeatureId— legacy0x…:0x…feature ID, never used in place ofplaceIdcid,kgmid— other observed identitiesgoogleMapsUrl— link to the related placecategoryName,categories— primary category and full observed listtotalScore,reviewsCount— rating and review countaddress,website,phone— contacts when Google publishes themplusCode,photoCount— detail fields when enrichment is enabledprice— visible carousel price string, kept exactly as showndescription— visible carousel comparison textdistance— visible carousel distance badgedistanceMeters— straight-line distance from the source coordinates, in metreslatitude,longitude— related place coordinatesimage— image URL at a larger size, when availablesourceBusinessName,sourcePlaceId,sourceFeatureId,sourcePlaceUrl— the place you searchedsourceCategory,sourceAddress,sourceLatitude,sourceLongitude— source contextsourceUrl— alias ofsourcePlaceUrlfor older integrationsrecordType— alwayssimilarPlacescrapedAt— ISO timestamp
Use cases
- Local SEO and competitive analysis — compare the places Google associates with a client's listing, or the competitors around its pin.
- Market and category research — expand a handful of seed businesses into a wider set of nearby places in the same category.
- Lead and partner discovery — collect contacts, websites, and ratings for businesses around a target area.
- Data enrichment — attach canonical Place IDs, categories, and coordinates to an existing list of businesses.
- Recommendation feeds — build a "places like this" list from Google's own related signal plus a transparent fallback.
Usage cost
- No Google API key, no billing account, and no paid API calls are required.
- The actor runs in 1024 MB and needs no browser.
- A small run with
includeDetails=falsereturns in seconds.includeDetails=trueadds one place lookup per returned row, so largemaxItemsvalues take longer. maxItemsis a hard cap: the actor stops when it reaches it, when Google's result window is exhausted, or when every input is resolved. Filters are counted before the cap, so they do not shorten the result set while eligible places remain.sortBy=rating,reviews, ordistancereads the full nearby window before selecting rows;recommendedstops as soon as the cap is met.
FAQ
Why did carousel mode return no rows? Google does not show a related-place carousel for many signed-out place pages. carousel is truthful about that; use auto or sameCategory when you need rows.
Are fallback rows Google recommendations? No. They are places in the source's category near the source coordinates. relationMode says sameCategoryNearby, and relationQuery shows the category used.
How many carousel results can I get? Google typically publishes 3–5 cards, and sometimes none. That is the whole carousel; no setting can make Google show more.
How many same-category places are available? Google returns 20 per page and the observed window is around 104 unique places for a dense query. Sparse categories or small towns exhaust sooner.
Why is address or website missing from a carousel row? The carousel does not carry contacts. Turn on includeDetails to look up each place's own page; if Google still does not publish the field, it is omitted.
Why does distanceMeters differ from the distance badge on the card? The badge is Google's own display string. distanceMeters is a straight-line calculation from the source coordinates to the related place coordinates.
Why are prices in an unexpected currency? The carousel price is Google's localized display string for the request location. It is kept raw, not converted or normalised.
Can I use a Place ID instead of a URL? Yes. Canonical ChIJ… IDs work in placeUrls, and legacy 0x…:0x… feature IDs are accepted too.
Do I need a proxy or cookies? No. The actor reads public place data and selects a working connection automatically.
What happens if one input is invalid? That input is skipped and reported in the status message; the other inputs still run. If no input resolves, the run fails with a clear message instead of returning an empty success.
Notes
price,description,distance, andrelatedSectionTypeare emitted only when Google's response actually carries them.- A canonical
ChIJ…value always goes toplaceId; a legacy0x…:0x…value always goes tofeatureId. They are never relabelled. sourceUrlremains an alias ofsourcePlaceUrlso older integrations keep working.- Duplicate identities are removed by default: canonical Place ID first, then feature ID, then name plus rounded coordinates.
- In
automode, carousel rows and fallback rows can both appear;relationModeseparates them.
Limitations
- The carousel is conditional. Most signed-out place pages show no related carousel at all. The actor cannot create one; it uses the honest same-category fallback instead.
- Fallback relevance depends on category. If the source category is broad or wrong, nearby results can be broad too. Use
categoryOverrideorcategoryFilterto narrow them. - The nearby window is finite. Google stops returning new places after roughly 100 unique results for a dense query, and sooner for sparse categories.
- No similarity score. Google does not publish one, and the actor does not invent one.
- Detail fields are optional and conditional.
includeDetailsimproves coverage, but a field Google does not publish is omitted rather than fabricated.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build 97AjPnapucPrZpz9l. Documentation is regenerated from the default published build; private drafts are not included.