Google Maps Scraper & Business Intelligence avatar

Google Maps Scraper & Business Intelligence

Pricing

from $2.00 / 1,000 business results

Go to Apify Store
Google Maps Scraper & Business Intelligence

Google Maps Scraper & Business Intelligence

Find businesses, enrich public company data and track Google Maps changes.

Pricing

from $2.00 / 1,000 business results

Rating

0.0

(0)

Developer

Akatra

Akatra

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 days ago

Last modified

Categories

Share

Find businesses, enrich public company data and track Google Maps changes.

Business leads, emails and places from Google Maps, by Akatra. Search Google Maps for any kind of business in any city or country and get one clean row per business location: name, category, address, coordinates, phone, website, rating, review count, opening hours and status. Optionally complete the company email and social profiles from the business's own website, but only the fields Google Maps does not already show. Give the job a monitor key and later runs tell you what changed: rating, review count, phone, website, hours, status, address or name, with only the changed businesses written if you want.

Pay per result · No login, no API key · Public business data only · Any country and language · Structured output for AI agents (MCP)

🛠️ What does Google Maps Scraper & Business Intelligence do?

  • 🔎 Search any business anywhere. dentists in London, Restaurants in Berlin, meyve toptancısı in Antalya, software companies in New York. You choose the country and the language of the results.
  • 🧭 Clean, deduplicated rows. One row per physical location, identified by Google's own place ID. A business found by several queries appears once, with every query and rank that found it. Branches of a chain stay separate rows.
  • 📇 Company contact completion (optional). Role-based company email (info@, contact@, sales@ ...), LinkedIn company page, Instagram, Facebook, X and YouTube from the official website. Only the fields you ask for, and only when Google Maps does not already have them. Every value says where it was found.
  • 🔁 Change tracking. Run the same job weekly or daily with a monitor key: the first run stores a baseline, later runs report RATING_CHANGED, REVIEW_COUNT_CHANGED, PHONE_CHANGED, WEBSITE_CHANGED, HOURS_CHANGED, STATUS_CHANGED, ADDRESS_CHANGED, NAME_CHANGED, NEW_RESULT, BUSINESS_REMOVED and BUSINESS_RETURNED.
  • 🧹 Only what changed. With onlyChanged, unchanged businesses are not written and not charged, and their websites are not read again.
  • 🗺️ Area search past the result limit. One Google Maps search ends after about 240 businesses. Give coordinates and a radius and the area is searched cell by cell (at most 64 cells), with duplicates removed.
  • 🔒 No personal data. No review texts, no reviewer names, no owner or employee names, no personal emails, no personal LinkedIn profiles.

What people use it for

  • Lead lists. Every dentist, cafe or software company in a city with phone, website and a company contact email.
  • Local market monitoring. Watch competitors' ratings, review growth, opening hours and closures week by week.
  • Data hygiene. Track a list of known businesses by Google Maps link and get told when a phone number, website or address changes, or when a place closes.
  • AI agents. "Find dentists in London", "which places lost rating since last week", "which of these businesses changed their phone number" are answered by plain fields, no text parsing needed.

📊 What data can you extract?

GroupFields
IdentityplaceId, cid, fid, googleMapsUrl, businessName, primaryCategory, categories
Locationaddress, street, city, state, postalCode, countryCode, latitude, longitude
Google Maps contactphone, phoneInternational, website, websiteDomain
Reputation and statusrating, reviewCount, openingHours, businessStatus (open, temporarily_closed, permanently_closed, unknown), imageUrl, isPartial
Search contextsearchQuery, searchLocation, searchRank, appearances, language, searchCountryCode, sourceUrl, scrapedAt
Company contacts (optional)businessEmail, linkedinCompany, instagram, facebook, x, youtube, enrichmentStatus, enrichmentError, enrichedFields, fieldsAlreadyComplete, contactProvenance
Changes (with a monitor key)monitorStatus, changeTypes, changes, previousRating, previousReviewCount, previousPhone, previousWebsite, previousBusinessStatus, firstSeenAt, lastSeenAt, changedAt

A field Google does not show for a place is null. Nothing is guessed.

🚀 How to use it

  1. Open the Actor and add one or more search queries, for example dentists.
  2. Type a location with its country, for example London, United Kingdom, and set the country and language of the results.
  3. Set max businesses per query. For more than about 240, use coordinates and a radius.
  4. Optional: turn on Find company email and social profiles and pick the fields to complete.
  5. Optional: set a monitor key (and Only changed businesses) and schedule the Actor. Download the results as JSON, CSV or Excel, or read them through the API.

⬇️ Input examples

Search one city:

{
"searchQueries": ["dentists"],
"location": "London, United Kingdom",
"countryCode": "GB",
"language": "en",
"maxResultsPerQuery": 100
}

Leads with company contacts:

{
"searchQueries": ["software companies"],
"location": "New York, NY, USA",
"countryCode": "US",
"language": "en",
"maxResultsPerQuery": 50,
"includeContactEnrichment": true,
"requiredFields": ["businessEmail", "linkedinCompany"]
}

Weekly change tracking, only changed businesses:

{
"searchQueries": ["restaurants", "cafes"],
"location": "Leeds, United Kingdom",
"countryCode": "GB",
"language": "en",
"maxResultsPerQuery": 60,
"monitorKey": "leeds-food-weekly",
"onlyChanged": true
}

Track known businesses by Google Maps link (a place ID goes in as https://www.google.com/maps/place/?q=place_id:<ID>):

{
"startUrls": [
{"url": "https://www.google.com/maps/place/?q=place_id:ChIJnz_uNxpceUgRsqujbrD1VYc"},
{"url": "https://maps.google.com/?cid=9751970706259946418"}
],
"countryCode": "GB",
"language": "en",
"monitorKey": "my-accounts"
}

⬆️ Output example

One row from a live run (restaurants in Leeds, contact enrichment on; shortened):

{
"placeId": "ChIJnz_uNxpceUgRsqujbrD1VYc",
"cid": "9751970706259946418",
"googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJnz_uNxpceUgRsqujbrD1VYc",
"businessName": "Ox Club",
"primaryCategory": "Modern British restaurant",
"address": "19a The Headrow, Leeds LS1 6PU",
"city": "Leeds",
"postalCode": "LS1 6PU",
"countryCode": "GB",
"latitude": 53.798875,
"longitude": -1.540921,
"phone": "0113 487 1814",
"phoneInternational": "+44 113 487 1814",
"website": "http://oxclub.co.uk/",
"rating": 4.7,
"reviewCount": 648,
"openingHours": [{"day": "Saturday", "hours": "12–11 pm"}, {"day": "Sunday", "hours": "12–5:30 pm"}],
"businessStatus": "open",
"searchQuery": "restaurants",
"searchLocation": "Leeds, United Kingdom",
"searchRank": 5,
"businessEmail": "info@oxclub.co.uk",
"instagram": "https://www.instagram.com/oxclubleeds",
"facebook": "https://www.facebook.com/oxclubleeds",
"enrichmentStatus": "enriched",
"enrichedFields": ["businessEmail", "instagram", "facebook"],
"fieldsAlreadyComplete": [],
"contactProvenance": {
"businessEmail": {"source": "official_website", "sourceUrl": "https://www.oxclub.co.uk/contact/", "method": "page_text", "scrapedAt": "2026-10-03T21:19:28+00:00"}
},
"monitorStatus": "off"
}

A changed row from a monitored run carries "monitorStatus": "changed", "changeTypes": ["RATING_CHANGED"], "changes": [{"field": "rating", "previous": 4.3, "current": 4.5}] and "previousRating": 4.3.

📇 Company contact enrichment

  • Only the fields in Fields to complete are researched, and only when Google Maps does not already have them. If the Maps website of a business is its Instagram page, instagram is filled from Google Maps (fieldsAlreadyComplete) and nothing is crawled.
  • Only the business's own website is read: the home page, then contact, about and imprint pages linked from it, at most 5 pages, stopping as soon as the requested fields are found. Social platforms are never crawled.
  • Branches that share a website share one crawl; each branch keeps its own Google Maps phone, address and hours.
  • businessEmail is a role-based company address only. Personal-looking addresses (john.smith@) are never written. LinkedIn means company pages; /in/ personal profiles are never written.
  • A website that is a page on another organisation's domain (a booking or menu platform, a parent company or council site, a link shortener) is not read, so no other organisation's email lands on the business (enrichmentStatus = no_website, enrichmentError = shared_website where it applies).
  • enrichmentStatus tells you what happened: enriched, complete_from_maps, not_found, no_website, failed, not_requested. enrichmentError gives the reason (rate_limited, blocked, js_only, security_blocked, timeout ...).

🔁 Change tracking

  • First run of a key: every business is stored as the baseline (monitorStatus = baseline). Nothing is reported as a change.
  • Later runs: each business is unchanged, changed, new, returned or removed. With Only changed businesses only new, changed, removed and returned rows are written.
  • No false alarms from missing data. A value Google does not show in one run is never a change; the last known value is kept. Opening hours are compared only between two complete answers.
  • NEW_RESULT means the business was not in the previous monitored result set and is now in it: newly listed, newly ranking for your query, or moved inside the result limit. It does not mean the business is newly opened.
  • Removal is conservative. BUSINESS_REMOVED is reported only for businesses you track by link or place ID, after two runs in a row in which Google answered that it knows no such place. Timeouts, blocks and rate limits never count, and a business missing from search results is never "removed" (rankings move). A permanent closure is a STATUS_CHANGED, not a removal.
  • Categories are not tracked as changes: Google returns slightly different category lists for the same place from one search to the next.
  • Keys are isolated. History is stored per monitor key, language and country in a key-value store of your own account (maps-business-monitor). Businesses not seen for 180 days are dropped from the history.

🤖 For AI agents, MCP and the API

Call the Actor through the Apify API, the Apify MCP server or any Apify integration. Every answer is a field: searchRank and searchQuery say which search found a business, changeTypes lists what changed, enrichedFields lists what the website added and fieldsAlreadyComplete what Google Maps already had. Dataset views overview, contacts and changes give ready-made column sets. The SUMMARY record of the run's key-value store lists every query with its status and error code, duplicates removed, enrichment counts, changes, requests and bytes per proxy type.

💲 Pricing: pay per result

You pay per business row written to the dataset, and separately per row to which the official website added at least one requested contact field. See the Pricing tab for the current prices.

  • Contact fields Google Maps already had are not charged as enrichment, and neither are websites with nothing to find or websites that could not be read.
  • Rows that Only changed businesses suppresses are not written and not charged.
  • Failed queries produce no rows and cost nothing. There is no start fee.
  • You can cap a run with the maximum charge setting; the run stops writing at the cap.

🚦 Run status and messages

A run ends as failed only when the input is invalid (for example a link that is not a Google Maps link). Everything else ends as succeeded with a message such as:

MessageMeaning
Saved N business(es) from X/Y quer(ies)Done. Failed queries are listed in SUMMARY with an error code (blocked, rate_limited, timeout, parse_error, temporary_failure)
N duplicate(s) mergedThe same place came from several queries; one row, all appearances listed
N enriched from websites, M already complete from MapsContact enrichment result
monitor baseline createdFirst run of a monitor key
N changed or new; M unchanged not repeatedMonitoring run with only changed businesses
N quer(ies) returned no businessesGoogle Maps had nothing for that query and location
Stopped early: the run's maximum charge was reachedThe saved rows are complete; the rest was not written

ℹ️ Good to know

  • Coverage. One Google Maps search returns at most about 240 businesses, and the list depends on the query, location, language and time. Results are not an exhaustive register of every business in an area. Area search (coordinates + radius) goes further, within 64 cells.
  • Rank. searchRank is the position in Google's list for that query, location and language at run time. It is not a global ranking.
  • Sponsored results are not identified. The source carries no sponsored marker, so the output has no sponsored field and makes no claim that a result is organic or sponsored.
  • Reduced answers. Google sometimes answers with reduced data (no review count, one day of hours). The Actor asks again and completes such places from the place details; what still stays reduced is marked isPartial: true.
  • Status. Permanent closure is read from Google's status codes in any language. Temporary closure is read from the status text and is recognised in English, German, Turkish, French, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Japanese, Chinese, Korean and Nordic languages.
  • Website enrichment limits. Websites that build their content with JavaScript only are reported as js_only. Some website platforms (Shopify stores in our tests, about 15 percent of sites) refuse requests from cloud servers; they are reported as rate_limited. robots.txt is respected.
  • Fields not available. Google's search answer carries no price level and no country name; countryCode is given.
  • Access. Requests go straight from Apify servers; a proxy is used only when Google refuses, so you do not pay for proxy traffic you do not need. Nothing logs in, no CAPTCHA is solved, no private API is used.
  • Monitoring is not real-time. Changes are found when the Actor runs; schedule it as often as you need.
  • Limits per run: 50 queries, 500 start URLs, 1,000 businesses per query.

📝 Changelog

  • 1.0 (October 2026). First version: global Google Maps search, area search, start URLs and place IDs, deduplication, company contact enrichment from official websites, change tracking with only-changed output.

The Actor reads publicly visible business information from Google Maps and, when you ask for it, from the business's own public website. It collects no customer or reviewer data, no review texts, no employee or owner names, no personal emails and no personal social profiles. You are responsible for using the data in line with the terms of the sites and the laws that apply to you (for example data protection and anti-spam rules when contacting businesses). This Actor is not affiliated with Google.