Google Maps Business Scraper avatar

Google Maps Business Scraper

Pricing

from $3.00 / 1,000 business listings

Go to Apify Store
Google Maps Business Scraper

Google Maps Business Scraper

Find local businesses by search term, such as "dentist in Chicago": name, address, phone, website, email, opening hours and coordinates. Free OpenStreetMap search by default; add your Google Places API key for Google ratings and reviews.

Pricing

from $3.00 / 1,000 business listings

Rating

0.0

(0)

Developer

Technical Dost Solutions

Technical Dost Solutions

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

8 days ago

Last modified

Security

Limited permissions

Share

What this Actor does

Find local businesses by category and place, e.g. dentist in Chicago or cafe in Seattle, and get name, address, phone, website, email, opening hours and coordinates as clean, structured JSON.

The Actor has three modes:

  • Free search mode (default): enter search terms and run. Results come from OpenStreetMap, so no API key is needed. Works best with a category plus a city, such as restaurant in Brooklyn, hairdresser in Toronto or hotel in Paris (up to 50 places per search term).
  • Google Places API mode: add your own Google Places API key to the same search terms to get live Google Maps data, including ratings, review counts and reviews, through the official API.
  • Business page mode: paste business website or location pages; the Actor reads their schema.org LocalBusiness data (name, address, phone, hours, rating).

It normalizes useful fields, deduplicates rows by business name and address, and saves structured records to the Apify dataset.

Why this Actor is useful

Teams pay for this kind of extraction because it saves manual research, builds repeatable lead lists, enriches CRMs, and turns public business data into clean, API-ready datasets, without violating Google's Terms of Service.

Who this is for

  • Lead generation agencies
  • Local SEO consultants
  • B2B sales teams
  • Market researchers
  • Directory and aggregator builders
  • Small business marketers
  • Data enrichment teams

Common use cases

  • Build local business lead lists for sales outreach
  • Enrich CRM records with contact and geo data
  • Monitor ratings and review counts for target businesses
  • Populate local directories and aggregators
  • Run local market research by category and area

Input

You must provide either startUrls or both placesApiKey and searchTerms. If neither is supplied, the Actor stops early with a clear error.

  • startUrls: Public business listing or place pages to extract from. Use only pages you are allowed to access without login or bypassing access controls. Do not point this at google.com/maps.
  • searchTerms: Search queries used only in Places API mode (for example coffee shops in Austin TX).
  • placesApiKey: Optional Google Places API key (stored as a secret). Enables the official Places API mode.
  • maxItems: Maximum number of rows to save.
  • maxConcurrency: Number of pages processed in parallel. The default is intentionally conservative.
  • includeReviews: Include public reviews (author, body, rating) when available.
  • requestTimeoutSecs: Maximum time to spend on a single page or API request.
  • proxyConfiguration: Optional Apify proxy configuration where permitted by your source review.

Output

  • businessName: Business or organization name.
  • category: Business category or schema.org type.
  • address: Street, locality, region, and country as published.
  • latitude / longitude: Geo coordinates when available.
  • phone: Public phone number.
  • website: Public website URL.
  • rating: Aggregate rating value.
  • reviewCount: Number of ratings or reviews.
  • priceLevel: Price range indicator.
  • hours: Opening hours lines when available.
  • photos: Photo URLs or references.
  • reviews: Public reviews (author, reviewBody, ratingValue) when includeReviews is enabled.
  • placeUrl: Canonical place or map URL.
  • sourceUrl: URL where the data was extracted.
  • detectedAt: Timestamp when this Actor extracted the row.
  • extractionMethod: openstreetmap for free search mode, places_api for the Google Places API, or structured_data for business pages.
  • confidenceScore: Heuristic confidence based on data source and completeness.
  • missingFields: Output fields that were not available from the source.

Sample input

{
"searchTerms": [
"dentist in Chicago"
],
"maxItems": 20
}

Sample output

{
"businessName": "Dentistry at Millennium Park",
"category": "dentist",
"address": "8 South Michigan Avenue, Chicago, Illinois, 60603, United States",
"latitude": 41.8819317,
"longitude": -87.6248124,
"phone": "+1 224-249-5977",
"website": "https://www.datmp.com/",
"email": "info@datmp.com",
"rating": null,
"reviewCount": null,
"priceLevel": null,
"hours": [
"Mo,We 09:00-16:30; Tu,Th 08:00-16:30; Fr 08:00-14:00 \"by appointment\"; Sa,Su off"
],
"photos": [],
"reviews": [],
"placeUrl": "https://www.openstreetmap.org/node/14212143300",
"sourceUrl": "https://nominatim.openstreetmap.org",
"detectedAt": "2026-10-21T12:09:34.192Z",
"extractionMethod": "openstreetmap",
"confidenceScore": 0.85,
"missingFields": [],
"searchTerm": "dentist in Chicago"
}

How to use

Run this Actor on Apify with search terms such as dentist in Chicago (free), optionally with a Google Places API key for Google data, or with public business page URLs. Export the dataset as JSON, CSV, Excel, or through the Apify API, then connect the output to Google Sheets, Make, Zapier, a webhook, your CRM, or an internal dashboard. For monitoring, save the input as an Apify task and schedule recurring runs.

Pricing

This Actor is designed for pay-per-event pricing at $0.003 per listing saved to the dataset. You pay only for the business rows you extract.

Best practices

  • Provide reviewed public listing URLs, or use Places API mode for live Google Maps data.
  • Prefer pages with schema.org LocalBusiness JSON-LD for the highest-quality structured output.
  • Keep maxConcurrency low for smaller websites.
  • Use specific searchTerms (category plus location) in Places API mode to keep results relevant.
  • Review source website rules and Google Places API terms before scheduling recurring runs.

Compliance and responsible use

This Actor does not scrape google.com/maps directly, which violates Google's Terms of Service. Instead it relies on two compliant sources: public schema.org LocalBusiness JSON-LD published on pages you are allowed to access, and the official Google Places API (which requires your own API key and is billed by Google).

It is for public data only. It must not be used to bypass logins, paywalls, CAPTCHAs, or security systems, collect private or sensitive personal data, or support spam or abuse. You are responsible for following applicable laws, Google's API terms, and source website rules.

Limitations

  • Output quality depends on the public structured data available on the source pages.
  • Places API mode requires your own Google Places API key and is subject to Google's quotas and billing.
  • Some fields may be empty when the source does not publish them; missing values are reported in missingFields, never invented.
  • The Actor does not claim support for any specific third-party platform beyond the official Places API.
  • Website markup and access policies can change.

Troubleshooting

  • Empty output in structured-data mode usually means the page has no public LocalBusiness JSON-LD.
  • A "No usable input" error means you provided neither startUrls nor both placesApiKey and searchTerms.
  • Places API errors usually indicate an invalid key, disabled API, or exceeded quota.
  • Slow runs can usually be improved by lowering maxConcurrency.

Changelog

  • v0.1.0: Initial release with structured-data and Google Places API modes.

Use Google Maps Business Scraper with AI agents (MCP)

Give Claude, ChatGPT, Cursor, VS Code or any MCP client this Actor as a tool through the hosted Apify MCP server. The agent sees the input fields with descriptions and example values, runs the Actor, and reads the results.

MCP server URL (this Actor only):

https://mcp.apify.com/?tools=technicaldost/google-maps-business-scraper

Claude Code:

$claude mcp add --transport http apify "https://mcp.apify.com/?tools=technicaldost/google-maps-business-scraper" --header "Authorization: Bearer YOUR_APIFY_TOKEN"

Cursor, VS Code, Claude Desktop and other clients (mcp.json or the client's MCP settings):

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=technicaldost/google-maps-business-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

Clients that support sign-in (such as Claude.ai connectors) can use the URL without a token and log in to Apify instead. Get your token in Apify Console → Settings → API & Integrations, or generate a ready config for your client at mcp.apify.com. In the agent the tool is named technicaldost--google-maps-business-scraper; ask it, for example, to "run Google Maps Business Scraper with {"searchTerms": ["dentist in Chicago"], "maxItems": 20}".

AI agents without an Apify account can also run and pay for this Actor per request with x402 agentic payments.

Run Google Maps Business Scraper via API

Run the Actor and get its results in one call (replace YOUR_APIFY_TOKEN):

curl -X POST "https://api.apify.com/v2/acts/technicaldost~google-maps-business-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["dentist in Chicago"], "maxItems": 20}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("technicaldost/google-maps-business-scraper").call(run_input={"searchTerms": ["dentist in Chicago"], "maxItems": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript / TypeScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('technicaldost/google-maps-business-scraper').call({"searchTerms": ["dentist in Chicago"], "maxItems": 20});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Long runs: start them with POST /v2/acts/technicaldost~google-maps-business-scraper/runs and fetch the dataset when the run finishes, or receive a webhook.

FAQ

Can I use Google Maps Business Scraper with AI agents like Claude or ChatGPT?

Yes. Connect the Apify MCP server with ?tools=technicaldost/google-maps-business-scraper (see above) and the agent can run the Actor and read its results on its own.

Can I call Google Maps Business Scraper from my own code?

Yes. Use the REST API, or the official Python and JavaScript clients shown above. Results are available as JSON, CSV, Excel, XML or HTML.

How do I run it on a schedule?

Save your input as a task in Apify Console and add a schedule (for example, daily). Use webhooks or integrations to send each run's results onward.

It works with publicly available data. Make sure your use complies with the source website's terms and with data protection laws such as GDPR, especially for personal data.

Something doesn't work or I need a feature. What should I do?

Open an issue in the Issues tab on this Actor's page with an example input, and we'll look into it.