Google Maps Scraper & Business Intelligence
Pricing
from $2.00 / 1,000 business results
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
Maintained by CommunityActor 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.
dentistsin London,Restaurantsin Berlin,meyve toptancısıin Antalya,software companiesin 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_REMOVEDandBUSINESS_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?
| Group | Fields |
|---|---|
| Identity | placeId, cid, fid, googleMapsUrl, businessName, primaryCategory, categories |
| Location | address, street, city, state, postalCode, countryCode, latitude, longitude |
| Google Maps contact | phone, phoneInternational, website, websiteDomain |
| Reputation and status | rating, reviewCount, openingHours, businessStatus (open, temporarily_closed, permanently_closed, unknown), imageUrl, isPartial |
| Search context | searchQuery, 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
- Open the Actor and add one or more search queries, for example
dentists. - Type a location with its country, for example
London, United Kingdom, and set the country and language of the results. - Set max businesses per query. For more than about 240, use coordinates and a radius.
- Optional: turn on Find company email and social profiles and pick the fields to complete.
- 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,
instagramis 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.
businessEmailis 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_websitewhere it applies). enrichmentStatustells you what happened:enriched,complete_from_maps,not_found,no_website,failed,not_requested.enrichmentErrorgives 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,returnedorremoved. With Only changed businesses onlynew,changed,removedandreturnedrows 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_RESULTmeans 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_REMOVEDis 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 aSTATUS_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:
| Message | Meaning |
|---|---|
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) merged | The same place came from several queries; one row, all appearances listed |
N enriched from websites, M already complete from Maps | Contact enrichment result |
monitor baseline created | First run of a monitor key |
N changed or new; M unchanged not repeated | Monitoring run with only changed businesses |
N quer(ies) returned no businesses | Google Maps had nothing for that query and location |
Stopped early: the run's maximum charge was reached | The 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.
searchRankis 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 asrate_limited. robots.txt is respected. - Fields not available. Google's search answer carries no price level and no country name;
countryCodeis 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.
⚖️ Legal and privacy
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.