# Google Maps Scraper - Every Place, Not Just the Top 250 (`zen-studio/google-maps-scraper`) Actor

Extract every place from Google Maps with 40+ fields: ratings, phone, website, opening hours, popular times, amenities, photos, reviews. Full coverage past Google's 250-per-view cap, hundreds of places per minute. $4.99 per 1,000 places.

- **URL**: https://apify.com/zen-studio/google-maps-scraper.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Lead generation, SEO tools, Travel
- **Stats:** 27 total users, 3 monthly users, 97.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.29 / 1,000 places

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Maps Scraper | Contacts, Reviews, Photos & Popular Times (2026)

![Google Maps Scraper](https://iili.io/CdnHOnp.png)

<blockquote style="border-left:4px solid #4C945E;background:#F0FDF4;padding:12px 16px">
<span style="font-size:16px;font-weight:700;color:#1C1917">40+ fields on every place — not just the top 250 Google shows you</span> <span style="font-size:15px;color:#57534E"> — full address, phone, opening hours, hour-by-hour popular times, amenities, reservation links, photos, and reviews, at hundreds of places per minute. The richest Google Maps output on Apify.</span>
</blockquote>

<table>
<tr><td colspan="4" style="padding:10px 14px;background:#4C945E;border:none"><span style="color:#FFFFFF;font-size:14px;font-weight:700">Place and review tools</span></td></tr>
<tr>
<td style="width:25%;padding:10px 12px;background:#D3EDD9;border:none;vertical-align:top"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-vBUd2ObzJUemitHHP-IYaavrd0t8-google-maps-directions-api-logo.png" alt="Google Maps" width="24" height="24" style="vertical-align:middle;border-radius:3px"> &nbsp;<a href="https://apify.com/zen-studio/google-maps-scraper" style="color:#1C1917;text-decoration:none;font-size:14px;font-weight:700">Google Maps</a><br><span style="color:#44403C;font-size:12px">➤ You are here</span></td>
<td style="width:25%;padding:10px 12px;background:#E8F5E9;border:none;vertical-align:top"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-2EJcvIYcO9H0KQOIO-RfOMRAFXbQ-local-business-leads-scraper.png" alt="Place Aggregator" width="24" height="24" style="vertical-align:middle;border-radius:3px"> &nbsp;<a href="https://apify.com/zen-studio/place-review-aggregator" style="color:#1C1917;text-decoration:none;font-size:14px;font-weight:700">Place Aggregator</a><br><span style="color:#44403C;font-size:12px">5 platforms, one export</span></td>
<td style="width:25%;padding:10px 12px;background:#E8F5E9;border:none;vertical-align:top"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-ojjo6BxQiOiLYRca1-RU3DuH650K-google-maps-directions-api-logo.png" alt="Google Reviews" width="24" height="24" style="vertical-align:middle;border-radius:3px"> &nbsp;<a href="https://apify.com/zen-studio/google-maps-reviews-scraper" style="color:#1C1917;text-decoration:none;font-size:14px;font-weight:700">Google Reviews</a><br><span style="color:#44403C;font-size:12px">Reviews from Google only</span></td>
<td style="width:25%;padding:10px 12px;background:#E8F5E9;border:none;vertical-align:top"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-y6Jak0F6vxdZew3b2-HljeTJZkhm-google-maps-directions-api-logo.png" alt="Directions" width="24" height="24" style="vertical-align:middle;border-radius:3px"> &nbsp;<a href="https://apify.com/zen-studio/google-maps-directions-api" style="color:#1C1917;text-decoration:none;font-size:14px;font-weight:700">Directions</a><br><span style="color:#44403C;font-size:12px">Routes, ETA and steps</span></td>
</tr>
</table>

Use a Google Maps place link from your results in [Place Review Aggregator](https://apify.com/zen-studio/place-review-aggregator) to compare reviews for that location across Google Maps, Yelp and Tripadvisor, with optional Facebook recommendations and Swarm tips.

### Key Features

- **40+ fields per place** — every result is auto-enriched with the full detail page. No toggles, no opt-ins.
- **Goes past the 250-per-view ceiling** — get every restaurant in Manhattan, not just the top 200 you'd see in the Maps UI.
- **Fast at scale** — hundreds of places per minute; a dense 1,500-place city finishes in minutes.
- **Hour-by-hour popular times** — 7 days × 24 hours of busyness data per place. Few scrapers capture this.
- **Free tier** — 10 lifetime runs with up to 10 dataset records per run. No credit card required.

#### Copy to your AI assistant

```
zen-studio/google-maps-scraper on Apify. Google Maps search with 40+ fields per place including hour-by-hour popular times, amenities, and reservation links. Call ApifyClient("TOKEN").actor("zen-studio/google-maps-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Provide searchStringsArray+locationQuery, OR startUrls, OR placeIds. Full spec: GET https://api.apify.com/v2/acts/zen-studio~google-maps-scraper/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations
```

### How to Scrape Google Maps Data

#### Basic — search a city

```json
{
  "searchStringsArray": ["restaurants"],
  "locationQuery": "Astoria, NY",
  "maxCrawledPlacesPerSearch": 50
}
```

#### Every place in a dense city — go past the 250-per-view ceiling

```json
{
  "searchStringsArray": ["restaurants"],
  "locationQuery": "Manhattan, NY",
  "maxCrawledPlacesPerSearch": 1500
}
```

#### Scrape specific places by URL or ID — no search needed

```json
{
  "placeIds": ["ChIJlxDiXJxZwokRp4HHbeYqXXU"],
  "startUrls": [
    {"url": "https://www.google.com/maps/place/Veselka/..."}
  ],
  "maxReviews": 20,
  "maxImages": 10
}
```

#### Stream a large review history

```json
{
  "placeIds": ["ChIJlxDiXJxZwokRp4HHbeYqXXU"],
  "outputMode": "reviews",
  "maxReviews": 5000,
  "reviewsSort": "newest",
  "reviewsOrigin": "google"
}
```

`outputMode: "reviews"` emits one dataset row per review and includes `placeId`, `placeName`, `googleMapsUrl`, address, coordinates, place rating, and review count on every row. Rows are delivered progressively in bounded batches, so large histories do not build one huge nested object in memory. The actor stops at the requested positive limit or when the source is exhausted. `maxReviews: 0` still means no reviews.

The default `outputMode: "places"` preserves the existing one-row-per-place contract. It supports up to 1,000 nested reviews per place; use review-row output above for anything larger.

#### Bulk lead-gen — trim heavy fields to keep your export small

```json
{
  "searchStringsArray": ["dentist"],
  "locationQuery": "Chicago, IL",
  "maxCrawledPlacesPerSearch": 500,
  "websiteFilter": "with_website",
  "excludeFields": [
    "popularTimes",
    "amenities",
    "relatedPlaces",
    "reviewTeasers"
  ]
}
```

### What Data Can You Extract from Google Maps?

Every place includes:

- **Identity** — name, place ID, hex ID, feature ID, Google Maps URL, verified owner
- **Address** — full address, street, locality, country, Plus Code (compound + global)
- **Geo** — latitude, longitude, neighborhood, city label, country code, timezone, region hierarchy (continent → district)
- **Contact** — phone, website, menu URL
- **Categories** — human-readable list, primary category, machine-readable GCID slugs, entity type
- **Ratings & price** — rating, reviews count, price range, price label
- **Hours & status** — full opening hours (Mon–Sun), the live status line ("Open ⋅ Closes 10 PM"), extra schedules per department (delivery, happy hour, emergency room), hour-by-hour popular times (busyness 0–100, wait labels), permanently-closed flag
- **Menu & services** — the menu as sections of priced items, popular dishes with review-mention and photo counts, the services list of trades and stations
- **Rich content** — description, meta description, typical visit length, amenities (14 sections)
- **Photos** — hero photo with native size + total photo count, photo tab catalog (All / Latest / Menu / Vibe / dish tabs), Street View thumbnail
- **Reviews** — featured snippets, review keyword pills with sentiment counts, optional full reviews (review ID, rating, date, text, language, source, photos, author)
- **Discovery** — "people also search for" related places, immersive 360° media, walking-time travel markers (15 / 30 min landmarks)
- **Reservations** — booking links, partner provider blocks (Resy, OpenTable, etc.)
- **Photos / videos** (optional add-on) — photo URL, photo ID, width, height, upload date, source, tab tags; video MP4 + HLS + DASH streams
- **Vertical-specific** — hotel editorial + amenities + check-in policies + one priced offer per booking partner; fuel prices for gas stations; directory of sub-tenants for malls / plazas

#### Output Example

One row per place, taken from a live run. Fields that only apply to certain
place types are `null` elsewhere: `menu` and `popularDishes` on food places,
`services` on trades and stations, `departments` where a place keeps more than one
schedule, `hotelOffers`, `hotelAmenities`, `hotelDescription`, `hotelEditorial` and
`hotelInfo` on hotels, `fuelPrices` on gas stations, `directoryPlaces` and
`anchorPlaces` on malls and landmarks. Long arrays are shortened here with a
`... +N more` marker; the run carries every item.

```json
{
  "name": "Veselka",
  "placeId": "ChIJlxDiXJxZwokRp4HHbeYqXXU",
  "hexId": "0x89c2599c5ce21097:0x755d2ae66dc781a7",
  "latitude": 40.729015499999996,
  "longitude": -73.9871139,
  "localName": null,
  "address": "Veselka, 144 2nd Ave, New York, NY 10003",
  "addressFormatted": "144 2nd Ave, New York, NY 10003",
  "addressComponents": {
    "street": "144 2nd Ave",
    "locality": "New York, NY 10003",
    "country": null
  },
  "ftid": "/m/080lxnb",
  "rating": 4.6,
  "reviewsCount": 7922,
  "priceRange": "$20–30",
  "priceLabel": "$20 to $30",
  "plusCode": {
    "compound": "P2H7+J5 New York",
    "global": "87G8P2H7+J5"
  },
  "phone": "(212) 228-9682",
  "website": "https://www.veselka.com/",
  "menuUrl": "https://veselka.com/blogs/menu-list/main-location-specials",
  "categories": [
    "Ukrainian restaurant",
    "Breakfast restaurant",
    "Diner",
    "... +6 more"
  ],
  "primaryCategory": {
    "id": 8,
    "slug": "restaurants"
  },
  "categoryGcids": [
    {
      "gcid": "ukrainian_restaurant",
      "label": "Ukrainian"
    },
    {
      "gcid": "breakfast_restaurant",
      "label": "Breakfast"
    },
    {
      "gcid": "diner",
      "label": null
    },
    "... +6 more"
  ],
  "entityType": "restaurant",
  "shortDescription": "Neighborhood diner serving Ukrainian food",
  "neighborhood": "Manhattan",
  "cityLabel": "New York, NY",
  "countryCode": "US",
  "timezone": "America/New_York",
  "description": "Borscht and pierogi are menu highlights at this lively Ukrainian eatery with a rustic vibe and murals on the walls.  ...",
  "metaDescription": "EST. 1954\nFor seventy years, customers have crowded into Veselka, a cozy Ukrainian coffee shop in New York City's Eas...",
  "popularSpendTime": "People typically spend 45 min to 2 hr here",
  "amenities": {
    "Service options": [
      "Outdoor seating",
      "Delivery",
      "Onsite services",
      "Takeout",
      "Dine-in"
    ],
    "Highlights": [
      "Fast service",
      "Great coffee",
      "Great dessert",
      "Serves local specialty"
    ],
    "Popular for": [
      "Breakfast",
      "Lunch",
      "Dinner",
      "Solo dining"
    ],
    "Accessibility": [
      "Wheelchair accessible entrance",
      "Wheelchair accessible restroom",
      "Wheelchair accessible seating",
      "Wheelchair accessible parking lot"
    ],
    "Offerings": [
      "Alcohol",
      "Beer",
      "Cocktails",
      "Coffee",
      "Comfort food",
      "Healthy options",
      "Late-night food",
      "Quick bite",
      "Small plates",
      "Vegetarian options",
      "Wine"
    ],
    "Dining options": [
      "Breakfast",
      "Brunch",
      "Lunch",
      "Dinner",
      "Catering",
      "Counter service",
      "Dessert",
      "Seating",
      "Table service"
    ],
    "Amenities": [
      "Bar onsite",
      "Restroom",
      "Wi-Fi",
      "Wi-Fi"
    ],
    "Atmosphere": [
      "Casual",
      "Cozy",
      "Historic",
      "Trendy"
    ],
    "Crowd": [
      "College students",
      "Groups",
      "Tourists"
    ],
    "Planning": [
      "Accepts reservations",
      "Usually a wait"
    ],
    "Payments": [
      "Credit cards",
      "Debit cards",
      "NFC mobile payments",
      "Credit cards"
    ],
    "Children": [
      "Good for kids",
      "Has changing table(s)",
      "High chairs",
      "Kids' menu"
    ],
    "Parking": [
      "Paid parking garage",
      "Paid street parking",
      "Parking"
    ],
    "Pets": [
      "Dogs allowed"
    ]
  },
  "openingHours": {
    "Wednesday": "9 AM–12 AM",
    "Thursday": "9 AM–12 AM",
    "Friday": "9 AM–12 AM",
    "Saturday": "Open 24 hours",
    "Sunday": "12 AM–11 PM",
    "Monday": "9 AM–12 AM",
    "Tuesday": "9 AM–12 AM"
  },
  "openStatus": "Closed · Opens 9 AM",
  "departments": [
    {
      "name": "Brunch",
      "openingHours": {
        "Wednesday": "Closed",
        "Thursday": "Closed",
        "Friday": "Closed",
        "Saturday": "8 AM–4 PM",
        "Sunday": "8 AM–4 PM",
        "Monday": "Closed",
        "Tuesday": "Closed"
      }
    }
  ],
  "menu": [
    {
      "name": "Seasonal Beverages",
      "items": [
        {
          "name": "Raspberry Lemonade",
          "price": "$5.00"
        },
        {
          "name": "Honey Mint Ginger Iced Tea",
          "price": "$5.00"
        },
        {
          "name": "Rose Wine",
          "price": "$9.00"
        },
        "... +1 more"
      ]
    },
    {
      "name": "Seasonal Desserts",
      "items": [
        {
          "name": "Ben & Jerry's Ice Cream",
          "price": "$4.00"
        },
        {
          "name": "Blueberry Pierogi Dessert Bowl",
          "price": "$10.00"
        }
      ]
    },
    {
      "name": "Featured Specials of the Week",
      "items": [
        {
          "name": "Classic Ukrainian Veselka Pierogi Bowl: 65th Anniversary",
          "price": "$14.00"
        },
        {
          "name": "Classic Ukrainian Veselka Pierogi Bowl: Vegetarian",
          "price": "$12.00"
        },
        {
          "name": "Homemade Salmon Burger",
          "price": "$18.00"
        },
        "... +4 more"
      ]
    }
  ],
  "services": null,
  "popularDishes": [
    {
      "name": "Coffee",
      "id": "/g/11fk6z20gz",
      "reviewMentions": 76,
      "photoCount": 31,
      "photos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnJLp3cukO902c6y6pMQsS5mltPo3kPR1aG6HyG0yA2BIrqTxgsUBSmvmFqoOIYKkmuiL..."
      ]
    },
    {
      "name": "Beef Stroganoff",
      "id": "/g/11z8hs_rff",
      "reviewMentions": 71,
      "photoCount": 15,
      "photos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlIwqJiHfnyq1XYgHjxyE5DbR_z-3Rkbz_JEG0HpnPkPa15-9-OQbXy_VhXzCd639jGat..."
      ]
    },
    {
      "name": "Ola's Famous Veal Goulash",
      "id": "/g/11z1s2pqy3",
      "reviewMentions": 0,
      "photoCount": 78,
      "photos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnda7PLBvUXWb3S1fzGbrzbScO46qW5_bJpdWVTV8KUVsWeEqlXQZBEOmGCUDP1z9c1Ze..."
      ]
    },
    "... +10 more"
  ],
  "hotelOffers": null,
  "popularTimes": [
    {
      "day": "Monday",
      "hours": [
        {
          "hour": 6,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "6 AM"
        },
        {
          "hour": 7,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "7 AM"
        },
        {
          "hour": 8,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "8 AM"
        },
        "... +15 hours"
      ]
    },
    {
      "day": "Tuesday",
      "hours": [
        {
          "hour": 6,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "6 AM"
        },
        {
          "hour": 7,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "7 AM"
        },
        {
          "hour": 8,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "8 AM"
        },
        "... +15 hours"
      ]
    },
    {
      "day": "Wednesday",
      "hours": [
        {
          "hour": 6,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "6 AM"
        },
        {
          "hour": 7,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "7 AM"
        },
        {
          "hour": 8,
          "busyness": 0,
          "label": "",
          "waitLabel": null,
          "hourLabel": "8 AM"
        },
        "... +15 hours"
      ]
    },
    "... +4 days"
  ],
  "ratingHistogram": null,
  "reviewPills": [
    {
      "label": "pierogis",
      "topicId": "AA1Y4fAHawc",
      "count": 1117,
      "secondaryCount": 422,
      "positiveCount": 759,
      "neutralCount": 49,
      "negativeCount": 14,
      "fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6QUExWTRmQUhhd2M="
    },
    {
      "label": "blintzes",
      "topicId": "QXuIQGwzVyM",
      "count": 107,
      "secondaryCount": 239,
      "positiveCount": 77,
      "neutralCount": 3,
      "negativeCount": 2,
      "fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6UVh1SVFHd3pWeU0="
    },
    {
      "label": "outdoor seating",
      "topicId": "AEmHqxr-_tg",
      "count": 52,
      "secondaryCount": 43,
      "positiveCount": 38,
      "neutralCount": 6,
      "negativeCount": 8,
      "fusedTopicId": "ZnVzZWRfdG9waWNfaWQ6QUVtSHF4ci1fdGc="
    },
    "... +7 more"
  ],
  "verifiedOwner": {
    "name": "Veselka (Owner)",
    "ownerId": "101183567786896189438"
  },
  "regionHierarchy": [
    {
      "name": "Americas",
      "weight": 0.75
    },
    {
      "name": "Lower Manhattan",
      "weight": 1
    },
    {
      "name": "Manhattan",
      "weight": 0.99
    },
    "... +11 more"
  ],
  "heroPhoto": {
    "url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmvCVX1bUt4da3pNv-jpw_D9_x_q_R4SDvXY7c3fD5ppPRqJNy6_Onvo7Ic4VquQEEJD7...",
    "photoId": "CIHM0ogKEICAgICEhd6u3AE",
    "nativeWidth": 5472,
    "nativeHeight": 2736,
    "caption": null,
    "photoCount": 7283
  },
  "photoTabs": [
    {
      "name": "All",
      "previewPhotoCount": 1,
      "previewPhotos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlfwsvaHHhUlWRndTsNjNZZ6yZwv2xm9vEpf1OoR6SU5woOb_OsHuF8O5WOTNcr_K_Bs8..."
      ]
    },
    {
      "name": "Latest",
      "previewPhotoCount": 1,
      "previewPhotos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmxwK-g6S_hi5xl9zIKwP-I0GzmbEElDvPHPdJF1LMzHbVvnnhIp7nOi3qYYh0uxbYxm0..."
      ]
    },
    {
      "name": "Videos",
      "previewPhotoCount": 1,
      "previewPhotos": [
        "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkjdfFNtULt54GQc-euPBI1c4LH96Xt8TogGnLkQ6S6kdtbTPqewGG7n3vQAu3LtFpafC..."
      ]
    },
    "... +13 more"
  ],
  "travelTimeMarkers": [
    {
      "durationSeconds": 900,
      "label": "15 min",
      "latitude": 40.729131599999995,
      "longitude": -73.98729519999999
    },
    {
      "durationSeconds": 1800,
      "label": "30 min",
      "latitude": 40.729131599999995,
      "longitude": -73.98729519999999
    },
    {
      "durationSeconds": 900,
      "label": "15 min",
      "latitude": 40.729131599999995,
      "longitude": -73.98729519999999
    },
    "... +6 more"
  ],
  "reviewTeasers": [
    {
      "text": "Beers, wines, specialty drinks, and soft drinks, coffee, tea, etc. served.",
      "authorProfile": "https://www.google.com/maps/contrib/105081235751380118019?hl=en-US",
      "authorPhoto": "https://lh3.googleusercontent.com/a/ACg8ocKLqB-KcWYIpvD34HdpFELRShkAQbN2fBgwAXe5KxVh3_sADw4=s40-k-cc-rp-mo",
      "rating": 2,
      "reviewId": null
    },
    {
      "text": "Great place for early morning breakfast and people watching.",
      "authorProfile": "https://www.google.com/maps/contrib/112218215948416192664?hl=en-US",
      "authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjWd8PZZ19WFZk8rJHzQ4VwpqwjTBe2Ib8N09h963d4wUPxs88Nihg=s40-k-cc-rp-mo",
      "rating": 2,
      "reviewId": null
    }
  ],
  "bookingLinks": [
    "https://resy.com/cities/new-york-ny/venues/veselka-east-village?rwg_token=AE37R_jNS4ADM4jzRLpXhUgI3_JjoIIC4J4jIJSj-cp..."
  ],
  "bookingPartners": [
    {
      "type": "Reserve a table",
      "provider": "Resy",
      "providerDomain": "resy.com",
      "providerLogo": "https://lh3.googleusercontent.com/yxi7m1BMVsqDfDtvz4YCZTFs4roT3nGw6JswN8bD5gNOYxEgEt9f68nq2GbrihK0",
      "url": "https://resy.com/cities/new-york-ny/venues/veselka-east-village?rwg_token=AE37R_jNS4ADM4jzRLpXhUgI3_JjoIIC4J4jIJSj-cp..."
    },
    {
      "type": "Order online",
      "provider": null,
      "providerDomain": null,
      "providerLogo": null,
      "url": "https://www.google.com/searchviewer/42?cvd=CLw_EiQKIuICHzIdEhYiFNLX29IPDgoKL20vMDgwbHhuYhgAOgMI8A0%3D&g2lbs=AEzIGDuWg..."
    }
  ],
  "immersiveView": [
    {
      "url": "https://lh3.googleusercontent.com/iv/AL0AxSVrNXhChUMm3bsktfK9862wvM0cY7ruWDvTG0RjrwF0Ha8xqbtUPZmLGArI4eCYcJghGV36ZTGH...",
      "type": "immersive_view"
    }
  ],
  "fuelPrices": null,
  "editorial": null,
  "anchorPlaces": null,
  "directoryPlaces": null,
  "hotelAmenities": null,
  "hotelDescription": null,
  "hotelEditorial": null,
  "hotelInfo": null,
  "nearbyCategories": null,
  "relatedPlaces": [
    {
      "name": "Ukrainian East Village Restaurant",
      "hexId": "0x0:0x368f0888d6eac978",
      "rating": 4.3,
      "reviewsCount": 889,
      "latitude": 40.728891499999996,
      "longitude": -73.9870955,
      "categories": [
        "Ukrainian",
        "Family-friendly"
      ]
    },
    {
      "name": "Streecha",
      "hexId": "0x0:0x2c81041ca4925043",
      "rating": 4.7,
      "reviewsCount": 699,
      "latitude": 40.728475599999996,
      "longitude": -73.9889486,
      "categories": [
        "Ukrainian",
        "Restaurant"
      ]
    },
    {
      "name": "Little Poland",
      "hexId": "0x0:0x629c88aa869a5aa",
      "rating": 4.4,
      "reviewsCount": 1221,
      "latitude": 40.731151200000006,
      "longitude": -73.9854506,
      "categories": [
        "Polish",
        "Eastern European",
        "European"
      ]
    },
    "... +2 more"
  ],
  "streetViewThumb": "https://lh3.googleusercontent.com/-560plyIzZdo/AAAAAAAAAAI/AAAAAAAAAAA/cv5jxU4uOxA/s44-p-k-no-ns-nd/photo.jpg",
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJlxDiXJxZwokRp4HHbeYqXXU",
  "businessStatus": null,
  "permanentlyClosed": false,
  "reviews": [
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2tOWVFYZG9NamcyTldwUE4yRnlkbVk1TFhWTFZrRRAB",
      "rating": 5,
      "ratingScale": 5,
      "date": "a day ago",
      "publishedAtMicros": 1788823286187228,
      "editedAtMicros": null,
      "isEdited": false,
      "text": null,
      "textTranslated": null,
      "language": null,
      "translatedLanguage": null,
      "likes": 0,
      "source": "Google",
      "sourceIcon": "https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",
      "ownerResponse": null,
      "attributes": [
        {
          "key": "GUIDED_DINING_MEAL_TYPE",
          "label": "Meal type",
          "question": "What did you get?",
          "rating": null,
          "values": [
            "Dinner"
          ]
        },
        {
          "key": "GUIDED_DINING_PRICE_RANGE",
          "label": "Price per person",
          "question": "How much did you spend per person?",
          "rating": null,
          "values": [
            "$20–30"
          ]
        },
        {
          "key": "GUIDED_DINING_FOOD_ASPECT",
          "label": "Food",
          "question": "Food",
          "rating": 5,
          "values": null
        },
        "... +3 more"
      ],
      "media": null,
      "photos": null,
      "author": "Oyku Akcin",
      "authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjXMg365gjU3Ft-lyxcXuDTEG5c2gr8pvBXOmePW5jPSmR5bx-72=s120-c-rp-mo-ba12-br100",
      "authorProfile": "https://www.google.com/maps/contrib/106806605107580398553/reviews?hl=en",
      "authorId": "106806605107580398553",
      "authorReviewCount": 13,
      "authorPhotoCount": 15,
      "isLocalGuide": true,
      "localGuideLevel": 4,
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2tOWVFYZG9NamcyTldwUE4yRnlkbVk1..."
    },
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xWeE1tOUVURE5XU0ZoSlVUVlZZemwxYVcxclQzYxAB",
      "rating": 5,
      "ratingScale": 5,
      "date": "a day ago",
      "publishedAtMicros": 1788818486311395,
      "editedAtMicros": null,
      "isEdited": false,
      "text": "When I was a kid I could not stand halopkas so at the age of 68 I thought I'd give it another try. This is a good pla...",
      "textTranslated": null,
      "language": "en",
      "translatedLanguage": null,
      "likes": 0,
      "source": "Google",
      "sourceIcon": "https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",
      "ownerResponse": null,
      "attributes": [
        {
          "key": "GUIDED_DINING_MEAL_TYPE",
          "label": "Meal type",
          "question": "What did you get?",
          "rating": null,
          "values": [
            "Dinner"
          ]
        },
        {
          "key": "GUIDED_DINING_PRICE_RANGE",
          "label": "Price per person",
          "question": "How much did you spend per person?",
          "rating": null,
          "values": [
            "$20–30"
          ]
        },
        {
          "key": "GUIDED_DINING_FOOD_ASPECT",
          "label": "Food",
          "question": "Food",
          "rating": 5,
          "values": null
        },
        "... +4 more"
      ],
      "media": null,
      "photos": null,
      "author": "jon winston",
      "authorPhoto": "https://lh3.googleusercontent.com/a-/ALV-UjU5x0JSIIo8XsoeFKDjdT_yMoaovPQMW_wE7mR9kNGb_HLSI8bmZQ=s120-c-rp-mo-ba12-br100",
      "authorProfile": "https://www.google.com/maps/contrib/114831321821228718510/reviews?hl=en",
      "authorId": "114831321821228718510",
      "authorReviewCount": 171,
      "authorPhotoCount": 192,
      "isLocalGuide": true,
      "localGuideLevel": 7,
      "reviewUrl": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2xWeE1tOUVURE5XU0ZoSlVUVlZZemwx..."
    }
  ],
  "images": [
    {
      "url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWmvCVX1bUt4da3pNv-jpw_D9_x_q_R4SDvXY7c3fD5ppPRqJNy6_Onvo7Ic4VquQEEJD7...",
      "mediaType": "image",
      "source": "embedded",
      "tags": []
    },
    {
      "url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWm5jfBskKHI9LIsoW7SY1BIWzFohLjiTAMN0O2ZJqEhKNM6dfAlYx8M_Fyg_P3LyfpPzt...",
      "mediaType": "image",
      "source": "embedded",
      "tags": []
    }
  ],
  "videos": [
    {
      "url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT...",
      "photoId": "CIABIhBWhABsxJsW1AIA44shF2DV",
      "mediaType": "video",
      "width": 1080,
      "height": 2400,
      "uploadedAt": "2025-07-09",
      "source": "gmm_android_review_post",
      "tags": [
        "All"
      ],
      "videoUrls": {
        "dash": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT...",
        "hls": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT...",
        "mp4_864p": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkql_Mh3QqkZQZ7nUUsai9RV1sLKxUfLS2Nk5S0oGeAQE3MUv9h96hbCKvroPiNKM9dtT..."
      }
    }
  ]
}
```

### Advanced Usage

#### Search a structured area instead of free text

```json
{
  "searchStringsArray": ["bakeries"],
  "city": "Brooklyn",
  "state": "NY",
  "postalCode": "",
  "countryCode": "us"
}
```

Combine `city` + `state` for US/AU/IN/BR/MX/DE. Use `postalCode` + `countryCode` alone (never with `city` — they conflict in the geocoder).

#### Custom polygon — only this neighborhood

```json
{
  "searchStringsArray": ["pizza"],
  "customGeolocation": {
    "type": "Polygon",
    "coordinates": [[
      [-73.99, 40.72],
      [-73.96, 40.72],
      [-73.96, 40.74],
      [-73.99, 40.74],
      [-73.99, 40.72]
    ]]
  }
}
```

Coordinate order is `[longitude, latitude]`. `customGeolocation` overrides every other location field.

#### Filtered hospitality dataset with reviews and photos

```json
{
  "searchStringsArray": ["hotel"],
  "locationQuery": "Miami Beach, FL",
  "maxCrawledPlacesPerSearch": 200,
  "placeMinimumStars": "4.0",
  "openNow": false,
  "maxReviews": 30,
  "reviewsSort": "newest",
  "reviewsFilterString": "breakfast",
  "maxImages": 20
}
```

`reviewsFilterString` scans until it has the requested number of matching reviews or the source is exhausted, then filters by substring (case-insensitive).

#### Narrow by category and price

```json
{
  "searchStringsArray": ["restaurants"],
  "locationQuery": "New York, NY",
  "categoryFilterWord": "chinese_restaurant",
  "priceMin": 20,
  "priceMax": 60
}
```

`categoryFilterWord` takes a Google category slug. Common ones: `chinese_restaurant`, `coffee_shop`, `hotel`, `plumber`, `dentist`. Full list of 4,400+ slugs: [category reference](https://files.catbox.moe/qsc727.json). `priceMin`/`priceMax` set a per-person dining band in the country's local currency (restaurants only).

#### Multilingual run

```json
{
  "searchStringsArray": ["Café"],
  "locationQuery": "Paris, France",
  "language": "fr",
  "countryCode": "fr",
  "maxCrawledPlacesPerSearch": 100
}
```

`language` affects category labels and review text preferences. `countryCode` biases search results geographically.

### Pricing — Pay Per Event (PPE)

**$5.99 per 1,000 places** (every place is auto-enriched with the full detail page — no separate enrichment fee). Subscription plans get a lower per-place rate.

| Event | Per call | Per 1,000 |
|-------|----------|-----------|
| Place scraped (40+ fields) | $0.00599 | $5.99 |
| Review scraped | $0.00050 | $0.50 |
| Photo / video scraped | $0.00050 | $0.50 |

**Free tier:** 10 lifetime runs, up to 10 dataset records per run. No credit card required.

### FAQ

**How many places can I extract per run?**
Up to your `maxCrawledPlacesPerSearch` cap per search term. The actor reliably returns 1,500+ places in dense cities (validated on Manhattan restaurants); sparse areas return the natural supply ceiling.

**How do you get past Google's 250-per-view ceiling?**
For dense queries (every restaurant in Manhattan, every dentist in LA), the actor sweeps the search area systematically and deduplicates by place ID. You always get unique places, never the same place twice.

**Is the data fresh?**
Every run hits Google Maps directly. No cached snapshots. Opening hours, reviews, photos — all live at run time.

**My search returned the wrong Starbucks. How do I target a specific one?**
Google has many places sharing a name. Use `placeIds` or a full Google Maps URL when you need a specific location. Free-text searches return whatever Google ranks first for that name + area.

**Can I scrape reviews without scraping places first?**
Use `placeIds` or `startUrls` with `outputMode: "reviews"` and `maxReviews` > 0. The actor skips search and progressively emits one row per review. Keep the default place output only when you specifically need reviews nested inside each place row.

**What languages and countries are supported?**
15 display languages (English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Japanese, Chinese (Simplified/Traditional), Korean, Arabic, Turkish, Russian) and 249 ISO country codes for geo-biasing.

**What's the free tier?**
10 lifetime runs with up to 10 dataset records per run. No credit card required. Upgrade to a paid Apify plan to unlock full runs.

**Can I run this on a schedule?**
Yes — Apify schedules let you run this actor hourly, daily, or on cron. Pipe results into your own database via webhooks or pull from the dataset API.

### More Zen Studio & Clearpath scrapers for maps & local data

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-EgDf0I1X8lNhCes2E-kpZCa398Jg-baidu-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Baidu Maps 百度地图**
  - [Baidu Maps Scraper](https://apify.com/zen-studio/baidu-maps-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-y6Jak0F6vxdZew3b2-HljeTJZkhm-google-maps-directions-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Google Maps**
  - [Google Maps Directions & Routes API](https://apify.com/zen-studio/google-maps-directions-api)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-5bSvAQKSK3LPq9OXb-AgVhcT1mQC-apple-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Apple Maps**
  - [Apple Maps Scraper](https://apify.com/zen-studio/apple-maps-scraper-pro)
  - [Apple Maps Directions & Route API](https://apify.com/zen-studio/apple-maps-directions-route-api)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-fRSgBvgbsRB4o7t30-UkaIbH1Yhq-yandex-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Yandex Maps Яндекс Карты**
  - [Yandex Maps Scraper](https://apify.com/zen-studio/yandex-maps-scraper)
  - [Yandex Maps Reviews Scraper](https://apify.com/zen-studio/yandex-maps-reviews-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-NBmcHCtkUEhA0DNP3-SrXbUedsVm-2gis-scraper-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **2GIS 2ГИС**
  - [2GIS Places Scraper](https://apify.com/zen-studio/2gis-places-scraper-api)
  - [2GIS Reviews Scraper](https://apify.com/zen-studio/2gis-reviews-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-F5g6zADHgY9XgfKpv-uUDQtIEe9Q-naver-place-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Naver Map & Place 네이버 지도**
  - [Naver Map & Place Scraper](https://apify.com/zen-studio/naver-place-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-NrhaGcIgNVy9fCV5b-mEAgbbceA8-bing-maps-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Bing Maps**
  - [Bing Maps Scraper](https://apify.com/zen-studio/bing-maps-scraper)
    **🔗 Review aggregators**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-2EJcvIYcO9H0KQOIO-RfOMRAFXbQ-local-business-leads-scraper.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Place reviews**
  - [Place Review Aggregator](https://apify.com/zen-studio/place-review-aggregator)
    **📍 More maps**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-Qn4Jh4wff6sgCEvQ5-X3AegHM3lL-kakao-map-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Kakao Map 카카오맵**
  - [Kakao Map (카카오맵) Scraper - All Reviews, Places, Hours, Menus](https://apify.com/zen-studio/kakao-map-scraper)

### Support

- **Bugs**: Issues tab
- **Features**: Issues tab

### Legal Compliance

Extracts publicly available data. Users must comply with Google Maps terms of service and data protection regulations (GDPR, CCPA).

***

*The richest Google Maps scraper on Apify — every place auto-enriched with 40+ fields, hour-by-hour popular times, amenities, and reservation links, hundreds per minute. Goes past Google's 250-per-view ceiling.*

# Actor input Schema

## `searchStringsArray` (type: `array`):

What you'd type into the Google Maps search bar. One term per line, e.g. <code>restaurants</code> or <code>family dentist</code>.

## `locationQuery` (type: `string`):

Where to search. Type it like you would in Google Maps: <code>Astoria, NY</code>, <code>Berlin Germany</code>, <code>90210</code>, or a full street address. Required together with <b>Search terms</b>, unless you use the structured or custom-area fields below.

## `maxCrawledPlacesPerSearch` (type: `integer`):

How many places you want per search term. The actor systematically scans the location until it reaches this number or runs out of results. Smaller numbers finish faster.

## `city` (type: `string`):

City name only (no state or country — those have their own fields). Use instead of <b>Location</b> when you want a structured query.

## `state` (type: `string`):

State or region. Pairs well with <b>City</b> in countries that use states (US, AU, IN, BR, MX, DE).

## `county` (type: `string`):

County (US), regional district (CA), département (FR), or local equivalent.

## `postalCode` (type: `string`):

Postal/ZIP code. Pairs with <b>Country code</b>. If you also fill in <b>City</b>, the postal code wins (it's the more precise of the two).

## `customGeolocation` (type: `object`):

GeoJSON defining the exact area to search. Accepts a Point, a Polygon, or a Feature / FeatureCollection wrapping them (the default output of geojson.io and most map-drawing tools). Coordinate order is <code>\[longitude, latitude]</code>. When set, this overrides all other location fields.

## `startUrls` (type: `array`):

Skip the search step and scrape these places directly. Accepts <code>/maps/place/...</code>, <code>/maps?cid=...</code>, shortened <code>maps.app.goo.gl</code> links, and <code>share.google</code> links from the Share button in the Google app.

## `placeIds` (type: `array`):

Google Maps place IDs like <code>ChIJN1t\_tDeuEmsRUsoyG83frY4</code>. The <code>place\_id:</code> prefix is accepted but optional.

## `categoryFilterWord` (type: `string`):

Restrict results to one Google place category, given as its slug — e.g. <code>chinese\_restaurant</code>, <code>hotel</code>, <code>plumber</code>, <code>coffee\_shop</code>, <code>dentist</code>. Leave blank to include everything your search term returns.<br><br>Advanced: full list of 4,400+ category slugs → <a href="https://files.catbox.moe/qsc727.json" target="_blank">category reference</a>. The category must actually appear in your results to narrow them (e.g. <code>restaurants</code> + <code>chinese\_restaurant</code>).

## `placeMinimumStars` (type: `string`):

Drop places below this average rating. Leave blank to include unrated places too.

## `priceMin` (type: `integer`):

Lowest typical dining price per person to include, in the local currency of your selected <b>Country</b> (e.g. <code>20</code> for $20 / €20). Leave at 0 for no lower limit. Only affects restaurant-type places.

## `priceMax` (type: `integer`):

Highest typical dining price per person to include, in the local currency of your selected <b>Country</b> (e.g. <code>60</code> for $60 / €60). Leave at 0 to turn the price filter <b>off</b>. Only affects restaurant-type places.

## `openNow` (type: `boolean`):

Restrict to places that are currently open (in their local time).

## `skipClosedPlaces` (type: `boolean`):

Drop places marked permanently closed by Google.

## `websiteFilter` (type: `string`):

Keep places with a website, without one, or both.

## `searchMatching` (type: `string`):

How strictly the place name has to match your search term. <b>Anything Google returns</b> is the default and matches the usual Google Maps behavior.

## `outputMode` (type: `string`):

Keep <b>One row per place</b> for the existing place dataset, including up to 1,000 nested reviews per place. Choose <b>One row per review</b> for large review histories: results are delivered progressively, and every review row includes its place identity.

## `maxReviews` (type: `integer`):

<code>0</code> = no reviews. Use a positive number to stop at that many reviews per place, or earlier when no more are available. Place-row output supports up to 1,000 nested reviews; review-row output supports large histories without an artificial result cap. Each review is billed at $0.50/1k.

## `reviewsSort` (type: `string`):

Sort order applied when fetching reviews. <b>Newest first</b> is most useful for monitoring; <b>Most relevant</b> matches the Google UI default.

## `reviewsFilterString` (type: `string`):

Keep only reviews whose text contains this substring (case-insensitive). Leave blank to keep all. Useful for over-fetching, then narrowing.

## `reviewsOrigin` (type: `string`):

Whether to include reviews from partner sources (Tripadvisor, Booking, etc.) or restrict to Google-native reviews only.

## `maxImages` (type: `integer`):

<code>0</code> = no photos. Each photo includes its tabs (All, Latest, Menu, Vibe, plus dish tabs), upload date, and source. Typical popular places have 100–200 photos available.

## `maxVideos` (type: `integer`):

<code>0</code> = no videos. Each video includes the poster image plus HLS, DASH, and best-quality MP4 stream URLs.

## `excludeFields` (type: `array`):

Tick any fields you don't need — they get dropped from every place row to keep your dataset small. None are required for the actor to work; defaults include everything.

## `language` (type: `string`):

Display language used when fetching results. Affects category labels and review text language preference.

## `parentActor` (type: `string`):

Optional integration label for orchestrated runs. It does not change scraping or output.

## `countryCode` (type: `string`):

Country used to bias search results geographically. The first 19 entries are common defaults; the rest are alphabetical.

## Actor input object example

```json
{
  "searchStringsArray": [
    "restaurants"
  ],
  "locationQuery": "Astoria, NY",
  "maxCrawledPlacesPerSearch": 50,
  "city": "",
  "state": "",
  "county": "",
  "postalCode": "",
  "startUrls": [],
  "placeIds": [],
  "categoryFilterWord": "",
  "placeMinimumStars": "",
  "priceMin": 0,
  "priceMax": 0,
  "openNow": false,
  "skipClosedPlaces": false,
  "websiteFilter": "all",
  "searchMatching": "all",
  "outputMode": "places",
  "maxReviews": 0,
  "reviewsSort": "newest",
  "reviewsFilterString": "",
  "reviewsOrigin": "all",
  "maxImages": 0,
  "maxVideos": 0,
  "excludeFields": [],
  "language": "en",
  "parentActor": "",
  "countryCode": "us"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchStringsArray": [
        "restaurants"
    ],
    "locationQuery": "Astoria, NY",
    "maxCrawledPlacesPerSearch": 50,
    "startUrls": [],
    "placeIds": [],
    "maxReviews": 0,
    "maxImages": 0,
    "maxVideos": 0,
    "excludeFields": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/google-maps-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchStringsArray": ["restaurants"],
    "locationQuery": "Astoria, NY",
    "maxCrawledPlacesPerSearch": 50,
    "startUrls": [],
    "placeIds": [],
    "maxReviews": 0,
    "maxImages": 0,
    "maxVideos": 0,
    "excludeFields": [],
}

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/google-maps-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchStringsArray": [
    "restaurants"
  ],
  "locationQuery": "Astoria, NY",
  "maxCrawledPlacesPerSearch": 50,
  "startUrls": [],
  "placeIds": [],
  "maxReviews": 0,
  "maxImages": 0,
  "maxVideos": 0,
  "excludeFields": []
}' |
apify call zen-studio/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zen-studio/google-maps-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vBUd2ObzJUemitHHP/builds/7OZaTM4S3qHzkftGx/openapi.json
