Use Google Maps Business Finder with Hours, Ratings & Location with Python
Find public Google Maps businesses by search term or place URL and get name, address, phone, website, category, rating, review count, hours and coordinates.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"excludeCategories": [],
"hasPhone": false,
"hasWebsite": false,
"includeClosed": true,
"includeDetails": false,
"locations": [],
"maxResults": 3,
"mode": "search",
"openNow": false,
"searchQuery": "coffee shops in New York",
"searchTerms": []
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Search mode uses a text query; placeUrls mode reads specific Maps URLs; placeIds mode resolves canonical ChIJ Place IDs. |
searchQuery | string | optional | What to search for on Google Maps. Include a location for best results, for example 'coffee shops in New York'. Used when mode is search. |
location | string | optional | Optional location appended to each search term, for example 'Austin, TX'. Leave blank when the location is already in the query. |
placeUrls | array | optional | Google Maps place URLs to read directly. Used in placeUrls and placeIds modes; the two direct modes accept a mixed batch. |
placeIds | array | optional | Canonical Google Place IDs beginning with ChIJ. Used in placeUrls and placeIds modes; the two direct modes accept a mixed batch. |
maxResults | integer | optional | Places to collect per search in search mode, or in total in the direct modes. Google returns a ranked window of roughly 160-230 places for a typical query; split broad searches by neighborhood or category for wider coverage. |
language | string | optional | Language for Google Maps names, categories, addresses and hours. |
includeDetails | boolean | optional | Read the place panel for Plus Code, price range, hotel and fuel details, attributes, photo count and rating histogram. Adds one request per place; the basic listing fields and weekly hours are always included. |
searchTerms | array | optional | Several search terms in one run, for example ["coffee shops", "dentists"]. Each term is searched in every location. |
locations | array | optional | Several locations in one run, for example ["New York, NY", "Austin, TX"]. Each term is searched in each location. |
minRating | number | optional | Only keep businesses rated at or above this value. Businesses with no published rating are skipped. |
maxRating | number | optional | Only keep businesses rated at or below this value. |
minReviews | integer | optional | Only keep businesses with at least this many reviews. |
maxReviews | integer | optional | Only keep businesses with at most this many reviews. |
openNow | boolean | optional | Only keep businesses Google currently shows as open. |
hasWebsite | boolean | optional | Only keep businesses that publish a website on their Google Maps listing. |
hasPhone | boolean | optional | Only keep businesses that publish a phone number on their Google Maps listing. |
nameFilter | string | optional | Only keep businesses whose name contains this text, for example "pizza". |
includeClosed | boolean | optional | When off, businesses Google marks as permanently closed are skipped. |
excludeCategories | array | optional | Skip businesses whose category contains any of these words, for example ["hotel", "casino"]. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/cbcgtWlBcgrsLiv99/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Dataset of public Google Maps places with name, address, category, rating, review count, hours, price, attributes, coordinates and place identifiers.
Questions before you run
Which inputs are required?
No top-level fields are marked required in the published schema. Conditional requirements can still apply; check the README.
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build Znvinlco4eXEZqAMR and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.