Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringoptionalSearch mode uses a text query; placeUrls mode reads specific Maps URLs; placeIds mode resolves canonical ChIJ Place IDs.
searchQuerystringoptionalWhat to search for on Google Maps. Include a location for best results, for example 'coffee shops in New York'. Used when mode is search.
locationstringoptionalOptional location appended to each search term, for example 'Austin, TX'. Leave blank when the location is already in the query.
placeUrlsarrayoptionalGoogle Maps place URLs to read directly. Used in placeUrls and placeIds modes; the two direct modes accept a mixed batch.
placeIdsarrayoptionalCanonical Google Place IDs beginning with ChIJ. Used in placeUrls and placeIds modes; the two direct modes accept a mixed batch.
maxResultsintegeroptionalPlaces 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.
languagestringoptionalLanguage for Google Maps names, categories, addresses and hours.
includeDetailsbooleanoptionalRead 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.
searchTermsarrayoptionalSeveral search terms in one run, for example ["coffee shops", "dentists"]. Each term is searched in every location.
locationsarrayoptionalSeveral locations in one run, for example ["New York, NY", "Austin, TX"]. Each term is searched in each location.
minRatingnumberoptionalOnly keep businesses rated at or above this value. Businesses with no published rating are skipped.
maxRatingnumberoptionalOnly keep businesses rated at or below this value.
minReviewsintegeroptionalOnly keep businesses with at least this many reviews.
maxReviewsintegeroptionalOnly keep businesses with at most this many reviews.
openNowbooleanoptionalOnly keep businesses Google currently shows as open.
hasWebsitebooleanoptionalOnly keep businesses that publish a website on their Google Maps listing.
hasPhonebooleanoptionalOnly keep businesses that publish a phone number on their Google Maps listing.
nameFilterstringoptionalOnly keep businesses whose name contains this text, for example "pizza".
includeClosedbooleanoptionalWhen off, businesses Google marks as permanently closed are skipped.
excludeCategoriesarrayoptionalSkip 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.