Skip to content

Google Maps Scraper

Try for free

Scrape Google Maps places for any search term and location: names, addresses, ratings, review counts, categories, opening hours, phones, websites, and coordinates. Export to JSON, CSV, or Excel.

📍 Google Maps Scraper

Turn a search term and a place name into a dataset of public Google Maps listings: name, address, rating, hours, phone, and website when Maps already shows them.

For local lead lists, store locators, and market scans that need the search card, not a guessed profile.

✨ Features

  • 🔎 Search. One or many strings in searchStringsArray, biased by locationQuery and the results language.
  • ⭐ Filters. Minimum stars, website present or absent, skip places Maps already marks closed, and category words that must all match or any-match.
  • ⚡ Fast. Each search is one request to Google Maps' own search data, so 20 places usually take a few seconds, and several search terms run in parallel.
  • 📌 Identity. Place id, Maps URL, lat/lng, fid, cid, and kgmid when the search record has them.
  • 🧾 Card text. Address parts, phone, website, categories, description, subtitle, claim link, and reserve-table URL only when the record already contains them.

🚀 Why teams use this

  • Request-based. Plain GET requests against the public Maps search data. No browser.
  • The actor does not invent a closed flag, a review count, or a phone number. If the record does not contain the field, it is not filled in.
  • A slow or failed request is sent again over another proxy exit, so one bad connection does not stall the run.
  • Each search term's places are saved as soon as that search is done.

💡 Use cases

  • Build local lead lists of restaurants, shops, or service businesses in a city.
  • Map competitors with their ratings, review counts, and opening hours.
  • Keep a store locator or directory in sync with what Google Maps shows.
  • Run local SEO checks on how a category ranks for a search in one area.

🧪 Example input

{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "Konstanz",
  "maxCrawledPlacesPerSearch": 20,
  "language": "en"
}

🧾 Sample output

One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.

{
  "title": "Constanzer Wirtshaus",
  "placeId": "ChIJQ1SYOwL3mkcR5uAfq9NPpfU",
  "address": "Spanierstraße 3, 78467 Konstanz-Petershausen-West, Germany",
  "categoryName": "German restaurant",
  "categories": [
    "German restaurant",
    "Bavarian restaurant"
  ],
  "totalScore": 4.4,
  "reviewsCount": 7511,
  "location": {
    "lat": 47.667655499999995,
    "lng": 9.1775302
  },
  "street": "Spanierstraße 3",
  "city": "Konstanz",
  "postalCode": "78467",
  "neighborhood": "Petershausen-West",
  "countryCode": "DE",
  "phone": "+1 555 0100",
  "phoneUnformatted": "+1 555 0100",
  "website": "http://www.constanzer-wirtshaus.de/",
  "openingHours": [
    {
      "day": "Tuesday",
      "hours": "11 AM to 11 PM"
    },
    {
      "day": "Wednesday",
      "hours": "11 AM to 11 PM"
    }
  ],
  "imageUrl": "https://lh3.googleusercontent.com/…",
  "imagesCount": 6505,
  "fid": "0x479af7023b985443:0xf5a54fd3ab1fe0e6",
  "cid": "17700641680977289446",
  "kgmid": "/g/11b88lxycm",
  "businessProfileId": "10637748826151191896",
  "url": "https://www.google.com/maps/search/?api=1&query=Constanzer+Wirtshaus&query_place_id=ChIJQ1SYOwL3mkcR5uAfq9NPpfU",
  "searchPageUrl": "https://www.google.com/maps/search/restaurant/@47.66424335,9.1784748,17z?hl=en"
}

📥 Input

searchStringsArray is the list of queries. locationQuery is the city or area. maxCrawledPlacesPerSearch caps each query. language is the Maps hl value, defaulting to en.

placeMinimumStars drops listings under that rating; it takes a number (4.5) or a name (two, twoAndHalf, three, threeAndHalf, four, fourAndHalf). website is allPlaces, onlyWithWebsite, or onlyWithoutWebsite. skipClosedPlaces drops a place only when the record already says it is permanently or temporarily closed. categoryFilterWords with searchMatching all or any filters category text. Filtered-out places do not count toward maxCrawledPlacesPerSearch: with a filter set, the actor reads further down the Maps results (up to about 200 places per search) to fill the limit.

📤 Output

Written from the Maps search record: title, placeId, address, categoryName, categories, totalScore, reviewsCount, location (lat, lng), street, city, postalCode, neighborhood, countryCode, phone, phoneUnformatted, website, openingHours, imageUrl, imagesCount, fid, cid, kgmid, businessProfileId, url, searchPageUrl, searchString, language, rank, isAdvertisement, and scrapedAt.

Also present only when the record already has them: description, subTitle, claimThisBusiness, reserveTableUrl, reviewsDistribution, additionalInfo, additionalOpeningHours, permanentlyClosed, and temporarilyClosed. From the place panel: plusCode, reviewsTags (review topics with how many reviews mention them) and ownerUpdates (posts from the owner), when Google shows them.

💰 Pricing

$0.0036 per place ($3.60 per 1,000 places), plus platform usage (compute and proxy traffic). A search for 20 places costs $0.072 in place fees.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.