Google Maps Scraper — Business Leads & Places API | $0.60/1k avatar

Google Maps Scraper — Business Leads & Places API | $0.60/1k

Pricing

from $0.48 / 1,000 places

Go to Apify Store
Google Maps Scraper — Business Leads & Places API | $0.60/1k

Google Maps Scraper — Business Leads & Places API | $0.60/1k

Scrape Google Maps places by keyword + location or by URL, place ID or CID: name, category, address, lat/lng, phone, website, rating, review count, hours.

Pricing

from $0.48 / 1,000 places

Rating

0.0

(0)

Developer

Raffy

Raffy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

What does Google Maps Scraper do?

Google Maps Scraper extracts business and place data from Google Maps and delivers it as clean JSON, CSV or Excel. Type what you are looking for ("dentist", "coffee shop", "hvac contractor") and where ("Austin, TX"), or paste Google Maps URLs, place IDs or CIDs, and get every place back with its name, categories, full address, coordinates, business phone, website, rating, review count, opening hours, closed status, plus code and Google IDs.

It works as a Google Maps API alternative and a cheap Google Places API substitute: no API key, no browser, no Google account. At $0.60 per 1,000 places it is one of the cheapest Google Maps scrapers on Apify.

Typical use cases:

  • Local lead lists: every plumber, roofer or dental clinic in a city, with phone and website, ready for your CRM.
  • Market research and site selection: how many competitors, how they are rated, where they cluster on the map.
  • Data enrichment: turn a list of place IDs, CIDs or Maps links into structured, up-to-date business records.
  • Monitoring: re-run a search weekly to spot new, closed or re-rated businesses.

It collects business data only. It does not collect reviews, reviewer names, owner names, photos or e-mail addresses, and it does not log in.

Why use this Google Maps scraper?

  • Cheap and fast. Plain HTTP requests to Google Maps' own data feed (no headless browser), so 1,000 places take a few minutes (deep scans longer) and cost $0.60.
  • Drop-in input. Field names match the popular compass/crawler-google-places input (searchStringsArray, locationQuery, maxCrawledPlacesPerSearch, language, countryCode, skipClosedPlaces, deeperCityScrape, startUrls) and its main output columns (title, categoryName, totalScore, reviewsCount, placeId, cid, location...), so switching takes minutes.
  • Past the 120-place limit. Google lists about 120 places per search; the deeper scan splits a city into map tiles to find many more.
  • No duplicates, honest rows. Places found by several searches are saved once. Every row has a status (ok, not_found, error), and you pay only for ok rows.
  • Runs anywhere Apify runs: schedules, API, webhooks, Google Sheets, Zapier, Make, and AI agents through the Apify MCP server.

What data can Google Maps Scraper extract?

FieldTypeDescription
titlestringBusiness or place name
categoryNamestringMain category, e.g. Dentist
categoriesarrayAll Google Maps categories
addressstringFull address as Google shows it
neighborhoodstringNeighborhood or district
streetstringStreet and house number
citystringCity
postalCodestringPostal / ZIP code
statestringState, region or province
countryCodestringTwo-letter country code, e.g. US
locationobjectPin coordinates { "lat": ..., "lng": ... }
plusCodestringPlus code (Open Location Code), e.g. 862466XV+7J
phonestringThe business phone as displayed
phoneUnformattedstringThe business phone in E.164 form, e.g. +15127173147
websitestringThe business website
totalScorenumberAverage Google rating, 1 to 5
reviewsCountintegerNumber of Google reviews (a count only)
pricestringPrice level or range, when Google serves one (often empty)
hotelStarsstringHotel class, e.g. 5-star hotel
openingHoursarrayWeekly hours [{ "day": "Monday", "hours": "8 AM–5 PM" }]
permanentlyClosedbooleanGoogle marks the place as permanently closed
temporarilyClosedbooleanGoogle marks the place as temporarily closed
timezonestringIANA time zone, e.g. America/Chicago
placeIdstringGoogle place ID (ChIJ...), works with the Google Places API
cidstringGoogle Maps CID; https://www.google.com/maps?cid=<cid> opens the place
fidstringGoogle Maps feature ID (0x...:0x...)
kgmidstringGoogle Knowledge Graph ID, e.g. /g/11cn2mvqwc
searchStringstringThe search term (or input URL/ID) that found the place
rankintegerPosition in that search's results (1 = first)
searchPageUrlstringGoogle Maps page of the search
languagestringLanguage the data was read in
urlstringGoogle Maps link of the place
statusstringok, not_found or error (see below)
errorstringReason when status is not ok
scrapedAtstringISO 8601 time of extraction

Optional fields are left out when Google does not publish them for a place (for example, many places have no website or phone).

Result status (tri-state output)

statusMeaningBilled?
okThe place was found and extracted.Yes
not_foundGoogle Maps answered, but the search has no results, the place ID does not exist, or every result was already saved by an earlier search in the run.No
errorGoogle Maps could not be read after retries, or an input entry is not a Maps URL/ID. error says why.No

How to scrape Google Maps

  1. Open the Actor in Apify Console and click Try for free.
  2. Enter one or more Search terms (e.g. dentist) and a Location (e.g. Austin, TX). Or paste Google Maps URLs or Place IDs or CIDs.
  3. Set Maximum places (the Console starts you at 20 to see the output; leave it empty to get every place each search finds, up to 200 per search).
  4. For a big city, switch on Deeper scan of the whole area to go past Google's ~120 places per search.
  5. Click Start. The default input finishes in well under a minute.
  6. Open the Output tab or Export the dataset as JSON, CSV, Excel, XML or HTML.

To automate it, use the API tab (Node.js, Python, curl examples) or add a Schedule.

How much does it cost to scrape Google Maps?

This Actor uses pay-per-event pricing:

EventPrice
Actor start$0.005 per run (at the default 1 GB memory)
Place (status: ok row)$0.0006 per place

Example: 1,000 places cost about $0.61 ($0.60 + one $0.005 start at the default 1 GB memory). 10,000 places cost about $6. Duplicates, not_found and error rows are never billed, and proxies are included. The free Apify plan's monthly credit covers several thousand places. You can cap spending with Maximum places and with the run's Max total charge option; the Actor stops fetching when either limit is reached.

Input

See the Input tab for the full schema. The main options:

FieldTypeDefaultDescription
searchStringsArrayarray of strings-What to search for, e.g. ["dentist", "orthodontist"]
locationQuerystring-Where, e.g. Austin, TX; each term is searched as "term in location"
maxItemsintegeremptyMaximum places saved in the whole run. Empty: up to maxCrawledPlacesPerSearch per search, or 200 per search when that is empty too, plus one row per place ID/URL
maxCrawledPlacesPerSearchintegeremptyMaximum places per search term
deeperCityScrapebooleanfalseSplit the area into map tiles to find more than ~120 places per search
startUrlsarray of stringsone example searchGoogle Maps search URLs, place URLs, ?cid= links, maps.app.goo.gl links
placeIdsarray of strings-Place IDs (ChIJ...) or numeric CIDs
languagestringenLanguage of categories, hours and addresses (hl)
countryCodestringusCountry that biases the search (gl)
skipClosedPlacesbooleanfalseLeave out permanently or temporarily closed places

Example input:

{
"searchStringsArray": ["dentist"],
"locationQuery": "Austin, TX",
"maxItems": 500,
"deeperCityScrape": true,
"language": "en",
"countryCode": "us"
}

Look up known places directly:

{
"placeIds": ["ChIJb5gBC-u0RIYRHkntaUcdJGs", "7720327853776914718"],
"startUrls": ["https://www.google.com/maps/place/Brandenburger+Tor/@52.5162746,13.3777041,17z"]
}

Output

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. Example rows from a real run (opening hours shortened):

[
{
"url": "https://www.google.com/maps/search/?api=1&query=Mozart%27s%20Coffee%20Roasters&query_place_id=ChIJTWZhRFW1RIYRrdGa7DPzT7w",
"status": "ok",
"scrapedAt": "2026-10-20T15:27:57.972Z",
"searchString": "coffee shop",
"rank": 1,
"title": "Mozart's Coffee Roasters",
"categoryName": "Coffee shop",
"categories": ["Coffee shop", "Bakery", "Cafe", "Event venue", "Tourist attraction"],
"address": "3825 Lake Austin Blvd, Austin, TX 78703",
"neighborhood": "Westfield",
"street": "3825 Lake Austin Blvd",
"city": "Austin",
"postalCode": "78703",
"state": "Texas",
"countryCode": "US",
"location": { "lat": 30.2954696, "lng": -97.7839512 },
"plusCode": "862476W8+5C",
"phone": "(512) 477-2900",
"phoneUnformatted": "+15124772900",
"website": "https://mozartscoffee.com/",
"totalScore": 4.5,
"reviewsCount": 10984,
"openingHours": [
{ "day": "Monday", "hours": "7 AM–12 AM" },
{ "day": "Tuesday", "hours": "7 AM–12 AM" }
],
"permanentlyClosed": false,
"temporarilyClosed": false,
"timezone": "America/Chicago",
"placeId": "ChIJTWZhRFW1RIYRrdGa7DPzT7w",
"cid": "13569331606629044653",
"fid": "0x8644b5554461664d:0xbc4ff333ec9ad1ad",
"kgmid": "/m/020z4hc",
"searchPageUrl": "https://www.google.com/maps/search/coffee+shop+in+Austin%2C+TX?hl=en",
"language": "en"
},
{
"url": "https://www.google.com/maps",
"status": "not_found",
"error": "7720327853776914718 was already returned earlier in this run.",
"scrapedAt": "2026-10-20T15:49:12.410Z"
}
]

Tips

  • Put several search terms into one run instead of many single-term runs: you pay the start fee once and duplicates are removed across terms.
  • Name the place in the search term itself ("pizza near Times Square") when a city-wide location is too broad, and leave Location empty.
  • Set Country to the country you search in when a city name exists in several countries (Paris, TX vs Paris, France).
  • For a whole metro area, turn on the deeper scan and raise Maximum places; you pay only for the places saved.

Limitations

  • Google lists about 120 places for one search and one map view. Without the deeper scan, that is the most one search term returns.
  • The deeper scan covers the area Google shows for the location (a city or region view); places just outside it are left out on purpose.
  • Reviews, review texts, reviewer names, owner names, photos, popular times and e-mail addresses are not collected.
  • price is often empty: Google's logged-out Maps feed serves price levels for few places.
  • Results reflect Google Maps at the time of the run. If Google changes its data format, rows come back as error; please report it in the Issues tab.

FAQ

The Actor collects publicly visible business listings (names, addresses, business phones, websites, ratings). You are responsible for how you use the output: read the legal notice below and Google's terms, and check the rules that apply to you, for example on cold calling or e-mail marketing.

How is this different from the Google Places API?

There is no API key, no per-request Google billing and no field masks: one flat price per place, with address parts, hours, plus code and IDs in every row. The placeId it returns works with Google's own Places API if you need more.

Can I use this Actor from an AI agent or MCP client?

Yes. Inputs are plain strings, every row is self-describing (status + error), and results can be fetched via the dataset API or the Apify MCP server.

Why did I get fewer places than maxItems?

Google listed fewer places for the search (turn on the deeper scan for big cities), places were duplicates of earlier searches, skipClosedPlaces removed closed ones, or the run hit your Max total charge limit. The run log says which.

Does it return e-mails or social profiles?

No. It returns the business's own website and phone as Google shows them; it does not crawl websites for e-mails.

This Actor extracts only business and place information that Google Maps shows publicly to any visitor; it does not extract reviews, reviewer or owner names, private e-mail addresses or other private user data, and it does not log in or get around access controls. However, your results could still contain personal data, for example when a business is listed under a person's name or uses a personal phone number as its business number. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with Google's terms of service and applicable law when using the extracted data.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google LLC. Google and Google Maps are trademarks of Google LLC. All trademarks belong to their respective owners.