Google Maps Radius Search Around a Coordinate
Find Google Maps places within a set radius of an exact latitude/longitude, with rating, reviews, address, phone, website, coordinates, and distance from the center point.
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 |
|---|---|---|---|
centerType | string | optional | How the center of the radius is supplied: exact latitude/longitude, a free-text address, or a Google Maps place URL / Place ID. |
latitude | number | optional | Latitude of the center when the center type is Coordinates. |
longitude | number | optional | Longitude of the center when the center type is Coordinates. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
centerType | string | optional | How the center of the radius is supplied: exact latitude/longitude, a free-text address, or a Google Maps place URL / Place ID. |
latitude | number | optional | Latitude of the center when the center type is Coordinates. |
longitude | number | optional | Longitude of the center when the center type is Coordinates. |
address | string | optional | Address, landmark or place name to use as the center when the center type is Address. Google resolves it to its own coordinates. |
place | string | optional | Google Maps place URL or canonical ChIJ Place ID to use as the center when the center type is Place. |
searchTerms | array | required | One or more categories or free-text keywords, for example ['coffee shop'], ['dentist', 'pharmacy'] or ['restaurant']. |
radiusKm | number | optional | Hard search radius in kilometres around the center. Places outside it are dropped; every returned row carries its exact distance from the center. |
maxResults | integer | optional | Maximum places to return for each search term. Google's ranked window usually contains roughly 130-180 places inside a dense radius; when the source runs out the run stops honestly instead of padding. |
includeDetails | boolean | optional | Add preview-panel fields such as plus code, price level, rating histogram, photos, description, attributes, service options, closing status and hotel/fuel/booking extras. Adds one request per place; listing fields and weekly hours are always collected. |
minRating | number | optional | Only keep places rated at or above this value. Places with no published rating are skipped. |
maxRating | number | optional | Only keep places rated at or below this value. Places with no published rating are skipped. |
minReviews | integer | optional | Only keep places with at least this many reviews. Places with no review count are skipped. |
maxReviews | integer | optional | Only keep places with at most this many reviews. Places with no review count are skipped. |
openNow | boolean | optional | Only keep places Google currently shows as open. A place whose open/closed state cannot be read is skipped, so this filter can return fewer rows. |
hasWebsite | boolean | optional | Only keep places that publish a website on their Google Maps listing. |
hasPhone | boolean | optional | Only keep places that publish a phone number on their Google Maps listing. |
includeClosed | boolean | optional | When off, places Google marks as permanently closed are skipped. This requires reading each place's preview panel. |
nameFilter | string | optional | Only keep places whose name contains this text, for example 'pizza'. |
excludeCategories | array | optional | Skip places whose category contains any of these words, for example ['hotel', 'casino']. |
language | string | optional | Language for place names, categories, addresses and hours. |
Download the published input schema
View complete JSON
{
"properties": {
"address": {
"description": "Address, landmark or place name to use as the center when the center type is Address. Google resolves it to its own coordinates.",
"editor": "textfield",
"example": "350 5th Ave, New York, NY 10118",
"title": "Address",
"type": "string"
},
"centerType": {
"default": "coordinates",
"description": "How the center of the radius is supplied: exact latitude/longitude, a free-text address, or a Google Maps place URL / Place ID.",
"editor": "select",
"enum": [
"coordinates",
"address",
"place"
],
"enumTitles": [
"Coordinates",
"Address",
"Place URL or Place ID"
],
"prefill": "coordinates",
"sectionCaption": "Search center",
"title": "Search Center Type",
"type": "string"
},
"excludeCategories": {
"default": [],
"description": "Skip places whose category contains any of these words, for example ['hotel', 'casino'].",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "Exclude Categories",
"type": "array"
},
"hasPhone": {
"default": false,
"description": "Only keep places that publish a phone number on their Google Maps listing.",
"prefill": false,
"title": "Must Have Phone",
"type": "boolean"
},
"hasWebsite": {
"default": false,
"description": "Only keep places that publish a website on their Google Maps listing.",
"prefill": false,
"title": "Must Have Website",
"type": "boolean"
},
"includeClosed": {
"default": true,
"description": "When off, places Google marks as permanently closed are skipped. This requires reading each place's preview panel.",
"prefill": true,
"title": "Include Permanently Closed",
"type": "boolean"
},
"includeDetails": {
"default": true,
"description": "Add preview-panel fields such as plus code, price level, rating histogram, photos, description, attributes, service options, closing status and hotel/fuel/booking extras. Adds one request per place; listing fields and weekly hours are always collected.",
"prefill": false,
"sectionCaption": "Output",
"title": "Include Place Details",
"type": "boolean"
},
"language": {
"default": "en",
"description": "Language for place names, categories, addresses and hours.",
"editor": "select",
"enum": [
"en",
"af",
"az",
"id",
"ms",
"bs",
"ca",
"cs",
"da",
"de",
"et",
"es",
"es-419",
"eu",
"fil",
"fr",
"gl",
"hr",
"zu",
"is",
"it",
"sw",
"lv",
"lt",
"hu",
"nl",
"no",
"uz",
"pl",
"pt-BR",
"pt-PT",
"ro",
"sq",
"sk",
"sl",
"fi",
"sv",
"vi",
"tr",
"el",
"bg",
"ky",
"kk",
"mk",
"mn",
"ru",
"sr",
"uk",
"ka",
"hy",
"iw",
"ur",
"ar",
"fa",
"am",
"ne",
"hi",
"mr",
"bn",
"pa",
"gu",
"ta",
"te",
"kn",
"ml",
"si",
"th",
"lo",
"my",
"km",
"ko",
"ja",
"zh-CN",
"zh-TW"
],
"enumTitles": [
"English",
"Afrikaans",
"azərbaycan",
"Bahasa Indonesia",
"Bahasa Melayu",
"bosanski",
"català",
"Čeština",
"Dansk",
"Deutsch",
"eesti",
"Español",
"Español (Latinoamérica)",
"euskara",
"Filipino",
"Français",
"galego",
"Hrvatski",
"isiZulu",
"íslenska",
"Italiano",
"Kiswahili",
"latviešu",
"lietuvių",
"magyar",
"Nederlands",
"norsk",
"oʻzbekcha",
"polski",
"Português (Brasil)",
"Português (Portugal)",
"română",
"shqip",
"Slovenčina",
"slovenščina",
"Suomi",
"Svenska",
"Tiếng Việt",
"Türkçe",
"Ελληνικά",
"български",
"кыргызча",
"қазақ тілі",
"македонски",
"монгол",
"Русский",
"српски",
"Українська",
"ქართული",
"հայերեն",
"עברית",
"اردو",
"العربية",
"فارسی",
"አማርኛ",
"नेपाली",
"हिन्दी",
"मराठी",
"বাংলা",
"ਪੰਜਾਬੀ",
"ગુજરાતી",
"தமிழ்",
"తెలుగు",
"ಕನ್ನಡ",
"മലയാളം",
"සිංහල",
"ไทย",
"ລາວ",
"ဗမာ",
"ខ្មែរ",
"한국어",
"日本語",
"简体中文",
"繁體中文"
],
"prefill": "en",
"sectionCaption": "Locale",
"title": "Language",
"type": "string"
},
"latitude": {
"default": 40.7484,
"description": "Latitude of the center when the center type is Coordinates.",
"maximum": 90,
"minimum": -90,
"prefill": 40.7484,
"title": "Latitude",
"type": "number"
},
"longitude": {
"default": -73.9857,
"description": "Longitude of the center when the center type is Coordinates.",
"maximum": 180,
"minimum": -180,
"prefill": -73.9857,
"title": "Longitude",
"type": "number"
},
"maxRating": {
"description": "Only keep places rated at or below this value. Places with no published rating are skipped.",
"maximum": 5,
"minimum": 1,
"title": "Maximum Rating",
"type": "number"
},
"maxResults": {
"default": 50,
"description": "Maximum places to return for each search term. Google's ranked window usually contains roughly 130-180 places inside a dense radius; when the source runs out the run stops honestly instead of padding.",
"maximum": 1000,
"minimum": 1,
"prefill": 6,
"title": "Max Results per Term",
"type": "integer"
},
"maxReviews": {
"description": "Only keep places with at most this many reviews. Places with no review count are skipped.",
"maximum": 1000000000,
"minimum": 0,
"title": "Maximum Review Count",
"type": "integer"
},
"minRating": {
"description": "Only keep places rated at or above this value. Places with no published rating are skipped.",
"maximum": 5,
"minimum": 1,
"sectionCaption": "Filters",
"title": "Minimum Rating",
"type": "number"
},
"minReviews": {
"description": "Only keep places with at least this many reviews. Places with no review count are skipped.",
"maximum": 1000000000,
"minimum": 0,
"title": "Minimum Review Count",
"type": "integer"
},
"nameFilter": {
"description": "Only keep places whose name contains this text, for example 'pizza'.",
"editor": "textfield",
"title": "Name Contains",
"type": "string"
},
"openNow": {
"default": false,
"description": "Only keep places Google currently shows as open. A place whose open/closed state cannot be read is skipped, so this filter can return fewer rows.",
"prefill": false,
"title": "Open Now Only",
"type": "boolean"
},
"place": {
"description": "Google Maps place URL or canonical ChIJ Place ID to use as the center when the center type is Place.",
"editor": "textfield",
"title": "Place URL or Place ID",
"type": "string"
},
"radiusKm": {
"default": 1,
"description": "Hard search radius in kilometres around the center. Places outside it are dropped; every returned row carries its exact distance from the center.",
"maximum": 50,
"minimum": 0.05,
"prefill": 0.5,
"sectionCaption": "Radius and result limit",
"title": "Radius (km)",
"type": "number"
},
"searchTerms": {
"default": [
"coffee shop"
],
"description": "One or more categories or free-text keywords, for example ['coffee shop'], ['dentist', 'pharmacy'] or ['restaurant'].",
"editor": "stringList",
"items": {
"type": "string"
},
"minItems": 1,
"prefill": [
"coffee shop"
],
"sectionCaption": "What to search for",
"title": "Categories / Keywords",
"type": "array"
}
},
"required": [
"searchTerms"
],
"schemaVersion": 1,
"title": "Google Maps Nearby Radius Search 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 |
|---|---|---|---|
places | string | optional | One row per place inside the radius. Fields are omitted when Google does not publish them. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Dataset of Google Maps places inside the requested radius, each with identity, contact, rating, hours, coordinates and distance from the center.",
"properties": {
"places": {
"description": "One row per place inside the radius. Fields are omitted when Google does not publish them.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Nearby Places",
"type": "string"
}
},
"title": "Google Maps Nearby Radius Search 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": {
"full": {
"display": {
"component": "table"
},
"title": "Complete Place Data",
"transformation": {
"fields": [
"recordType",
"name",
"categoryName",
"categories",
"totalScore",
"reviewsCount",
"ratingHistogram",
"address",
"phone",
"website",
"priceLevel",
"placeId",
"featureId",
"kgmid",
"cid",
"plusCode",
"location",
"latitude",
"longitude",
"distanceFromCenter",
"distanceFromCenterMeters",
"hours",
"hoursStatus",
"isOpenNow",
"timezone",
"countryCode",
"description",
"placeAttributes",
"attributes",
"amenities",
"serviceOptions",
"fuelPrices",
"hotelStars",
"hotelStarRating",
"priceOfferAmount",
"priceOfferCurrency",
"priceOfferDateRange",
"hotelAmenities",
"bookingLinks",
"checkInTime",
"checkOutTime",
"hasStreetView",
"streetViewCount",
"photosSample",
"photoCount",
"permanentlyClosed",
"temporarilyClosed",
"claimed",
"searchTerm",
"rankInSearch",
"googleMapsUrl",
"sourceUrl",
"scrapedAt"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"address": {
"format": "text",
"label": "Address"
},
"categoryName": {
"format": "text",
"label": "Category"
},
"distanceFromCenter": {
"format": "text",
"label": "Distance"
},
"googleMapsUrl": {
"format": "link",
"label": "Maps URL"
},
"name": {
"format": "text",
"label": "Name"
},
"phone": {
"format": "text",
"label": "Phone"
},
"reviewsCount": {
"format": "number",
"label": "Reviews"
},
"searchTerm": {
"format": "text",
"label": "Search term"
},
"totalScore": {
"format": "number",
"label": "Rating"
},
"website": {
"format": "link",
"label": "Website"
}
}
},
"title": "Nearby Places",
"transformation": {
"fields": [
"recordType",
"name",
"categoryName",
"totalScore",
"reviewsCount",
"address",
"phone",
"website",
"distanceFromCenter",
"searchTerm",
"googleMapsUrl",
"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 Nearby Radius Search — Address, Place & Coordinates
Point this actor at a coordinate, an address, or a Google Maps place, give it a radius and one or more categories or keywords, and it returns the places Google shows inside that radius. Every row carries its straight-line distance from the center, so "within 800 m of this address" is an auditable number instead of a relevance guess.
It reads Google Maps' public result feed without a browser, cookies or an API key. Runs are small (1 GB), fast, and do not need proxy configuration.
Search center
Choose one center type:
| Center type | What to provide | Example |
|---|---|---|
| Coordinates | latitude + longitude |
40.7484, -73.9857 |
| Address | address |
350 5th Ave, New York, NY 10118 |
| Place | place (Maps URL or ChIJ Place ID) |
https://www.google.com/maps/place/?q=place_id:ChIJ... |
An address or place is resolved to Google's own coordinates first, then the
radius search is anchored there. A place can be a full Maps URL, a short
maps.app.goo.gl-style link, or a canonical ChIJ... Place ID.
What it collects
For every place inside the radius:
name,categoryName,categoriestotalScore,reviewsCount,ratingHistogramaddress,phone,websitepriceLevel,plusCode,descriptionhours,hoursStatus,isOpenNowtimezone,countryCodeplaceId,featureId,kgmid,cidlocation({lat,lng}),latitude,longitudedistanceFromCenter(e.g.450 m),distanceFromCenterMetersphotosSample,photoCountplaceAttributes,attributes,amenities,serviceOptionsfuelPrices,hotelStars,hotelStarRating,priceOfferAmount,priceOfferCurrency,priceOfferDateRange,hotelAmenitiesbookingLinks,checkInTime,checkOutTimehasStreetView,streetViewCountpermanentlyClosed,temporarilyClosed,claimedsearchTerm,rankInSearchgoogleMapsUrl,sourceUrl,scrapedAt,recordType
Fields Google does not publish for a place are omitted, never sent as null or
an empty string. includeDetails adds the preview-panel fields (plus code,
price, histogram, photos, description, attributes, service options, closure
status and hotel/fuel/booking extras when Google publishes them) and costs one
extra request per place; listing fields and weekly hours are collected either
way.
Input
| Field | Type | Default | Description |
|---|---|---|---|
centerType |
select | coordinates |
coordinates, address or place |
latitude |
number | 40.7484 |
Center latitude for coordinate mode |
longitude |
number | -73.9857 |
Center longitude for coordinate mode |
address |
string | — | Center for address mode |
place |
string | — | Maps URL or ChIJ Place ID for place mode |
searchTerms |
string list | ["coffee shop"] |
One or more categories/keywords (required) |
radiusKm |
number | 1 |
Hard radius, 0.05–50 km |
maxResults |
integer | 50 |
Maximum places per term |
includeDetails |
boolean | true |
Read each place's preview panel |
minRating / maxRating |
number | — | Inclusive rating bounds |
minReviews / maxReviews |
integer | — | Inclusive review-count bounds |
openNow |
boolean | false |
Keep only places observed open |
hasWebsite / hasPhone |
boolean | false |
Require the field |
includeClosed |
boolean | true |
Keep permanently closed places |
nameFilter |
string | — | Name must contain this text |
excludeCategories |
string list | [] |
Drop matching categories |
language |
select | en |
74 Google Maps UI languages |
Examples
Coffee within 500 m of Times Square:
{
"centerType": "coordinates",
"latitude": 40.7484,
"longitude": -73.9857,
"searchTerms": ["coffee shop"],
"radiusKm": 0.5,
"maxResults": 30
}
Highly rated, open-now restaurants around an address:
{
"centerType": "address",
"address": "10 Downing St, London SW1A 2AA",
"searchTerms": ["restaurant"],
"radiusKm": 2,
"minRating": 4.5,
"openNow": true,
"maxResults": 50
}
Pharmacies and clinics around a place URL, in French:
{
"centerType": "place",
"place": "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z",
"searchTerms": ["pharmacy", "clinic"],
"radiusKm": 3,
"includeDetails": false,
"language": "fr",
"maxResults": 40
}
How pagination works
Google serves the nearby feed in pages of 20 ranked places. The actor follows
those pages until the per-term maxResults is reached, the feed returns an
empty section, or two consecutive pages contain nothing inside the radius
(Google appends unrelated places from other cities at the end of a window).
Deduplication is by Place ID, then feature ID, then Maps URL, then name +
address.
A single term's ranked window usually holds roughly 130–180 places inside a dense radius. When that window ends, the actor stops and says so in the status message rather than padding the dataset. For more coverage, split the area into smaller radii or run several narrower category terms.
FAQ
Do I need a Google Maps API key or cookies? No. The actor reads the same public result and preview endpoints the Maps website uses, with no account, cookie or key.
Do I need a proxy? No. It starts direct, and only if Google repeatedly blocks the connection does it move to Apify's datacenter pool and then US residential as a last resort. There is no proxy field to configure.
Why are there fewer rows than maxResults? The ranked window ends, or the
radius/filters removed places. The status message reports how many rows were
outside the radius and how many were filtered. A tight radius or strict
openNow filter can legitimately return zero rows.
Why is distanceFromCenter missing? It is never missing on a returned row:
a place without observed coordinates is dropped because it cannot be proven
inside the radius.
Can I search more than one category in one run? Yes. Put several entries in
searchTerms; each term is searched and paginated separately, and every row
records which term found it. maxResults applies per term.
Why do some detail fields appear only sometimes? Plus code, price level, rating histogram, description and attributes are conditional on Google publishing them for that place. Omitted means Google did not show it.
Does a smaller radius return more accurate results? Yes. The radius also selects the map zoom used for the search, so a 500 m request is anchored on a much tighter viewport than a 20 km request.
Is this affiliated with Google? No. It reads publicly visible Google Maps data and is not affiliated with, endorsed by or sponsored by Google.
Limitations
- One term's ranked window is finite; the actor reports the honest source end instead of inventing rows.
- Popular times, menus, reviews, emails and social profiles belong to separate actors in this suite.
- Bounding-box, polygon and multi-cell grid scans belong to the area-scanner actor.
- Google localises names, addresses and hours with
language; the values are returned exactly as Google serves them.
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 tsEGdQm2g6T1hH81o. Documentation is regenerated from the default published build; private drafts are not included.