# Google Maps Reviews Scraper (`boncross/google-maps-reviews`) Actor

Scrape Google Maps reviews for any place using URLs, Place IDs or names. Get review text, rating, exact timestamp, edited flag, owner reply, reviewer photos and stats, and restaurant or hotel detail scores. Sort four ways, or schedule it for only new reviews. $0.30 per 1,000 reviews.

- **URL**: https://apify.com/boncross/google-maps-reviews.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.21 / 1,000 review-scrapeds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Maps Reviews Scraper

### What is Google Maps Reviews Scraper?

Google Maps Reviews Scraper gets you the reviews of any place on Google Maps, each with the exact time it was posted where the page only says "a month ago". Paste a Maps link, a Place ID or just the name and city of a restaurant, hotel, shop or attraction. You get the review, the reviewer, the owner's reply and the photos, with the place's own details on the same row.

Where it's strong:

- Dates you can sort and chart. Each review has a timestamp to the millisecond, Google's relative label and an edited flag. In a 360-review check across four places, all 360 had exact timestamps.
- It's fast on a portfolio. 80 places at 60 reviews each (4,800 reviews) took 9 seconds, and 150 places took 19.
- One export is enough. Place name, address, categories, rating, phone, website, coordinates and plus code ride along on each review at no extra charge.
- A daily watch costs almost nothing. Reviews you've already had and reviews your rating filter drops are free, and a place with nothing new costs $0.0005.
- $0.30 per 1,000 reviews on the Free plan and $0.21 on Business, with proxy usage and platform usage included.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 22 of 22 live checks on its inputs and filters passed on 7 October 2026
- 13 places run the same day by name, link and Place ID: 300 reviews, 1 error row
- Charges matched the rows: 12 places, 300 reviews, 1 checked
- A place with no reviews gets a row saying so

What you can do with it:

- Read the full text of a review and its star rating
- See whether a review was edited after it was posted
- Read the owner's reply where the business has answered
- Collect the reviewer's name, profile, review count, photo count and Local Guide status
- Pull the detailed scores Google collects for restaurants and hotels
- Sort by newest, most relevant, highest or lowest, and filter by rating
- Return only the reviews you haven't had in earlier runs

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `place-resolved`, per place given by name; a URL, Place ID or cid skips it | $0.001 | $0.001 | $0.001 | $0.001 |
| `place-checked`, per place given by URL, Place ID or cid that returns no review (none on the place, or all filtered out or already seen) | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `review-scraped`, per review returned | $0.0003 | $0.00027 | $0.00024 | $0.00021 |

Enterprise plans pay the Business price.

**$0.30 per 1,000 reviews** on the Free plan, $0.21 on Business. That's the whole price, with proxy usage and platform usage included. Filtered, duplicate and previously-seen reviews are free.

Two sizes of run, worked through:

- A scheduled check of one place by URL, 20 newest reviews: $0.001 + 20 × $0.0003 = **$0.007** ($0.0052 on Business).
- A review archive for a chain, 200 locations by Place ID at 500 reviews each: $0.001 + 100,000 × $0.0003 = **$30.001** ($21.001 on Business).

Apify's Free plan includes $5 of credits a month, which is about 710 of those 20-review checks, or about 16,000 reviews in larger runs.

If you paste names, each one costs $0.001 to look up. Links and IDs skip that fee, which is one more reason to keep a list of Place IDs for anything you check often.

### What data is in each review?

| | |
|---|---|
| Review text | ⭐ Star rating |
| 🕑 Exact timestamp | Relative date as Google shows it |
| Edited flag | 👍 Helpful votes |
| 💬 Owner's reply | 📷 Review photos |
| 👤 Reviewer name and profile URL | Reviewer's review and photo counts |
| Local Guide status | 🔗 Review id and review URL |
| 🍽 Food, service and atmosphere scores | 🏨 Rooms, service and location scores for hotels |
| What was ordered and meal type | Trip type and travel group for hotels |
| Place name, categories and rating | 📍 Address, coordinates and plus code |
| ☎️ Place phone and website | Place ID, feature id and cid |

### How to scrape Google Maps reviews

You don't write any code. [Create a free Apify account](https://console.apify.com/sign-up), open [Google Maps Reviews Scraper](https://apify.com/boncross/google-maps-reviews), and then:

1. Paste your places, one per line: Maps links, Place IDs or names with the city.
2. Pick a sort order and how many reviews you want from each place. Add a rating filter if you only want the complaints or the praise.
3. Click Start. When the run finishes, download the reviews as Excel, CSV, JSON, XML or HTML.

### ⬇️ Input

Put one place per entry in "Places". Any of these works: a `/maps/place/` URL, a `?cid=` URL, a `place_id:` URL, a bare Place ID (`ChIJ…`), a feature id (`0x…:0x…`), a numeric cid, or a plain name. A name goes through Google Maps search and the first result is used. Add the city ("Café de Flore, Paris"), and paste a link or Place ID when you need to be certain which business you get.

Got a long list of links? Start URLs loads them in bulk from a file, a Google Sheet or a remote list, and is combined with whatever you put in Places.

You have two limits. "Max reviews per place" (1 to 20,000, default 100) applies to each place on its own: ten places at 50 each returns 500. "Maximum results for the whole run" caps the total. Nothing past it is fetched or charged for, and 0 means no cap.

"Sort" takes Google's four orderings: newest (the default), most relevant, highest and lowest. "Minimum rating" and "Maximum rating" (0 to 5, where 0 is off) drop reviews outside the band, and you aren't charged for the ones dropped.

"Include place summary on every review" is on by default and costs nothing extra. "Language" (default `en`) sets Google's interface language, which localises dates, labels and the place details. Review text stays in the language the reviewer wrote it in.

#### The newest 100 reviews of a place by URL

```json
{
  "places": ["https://www.google.com/maps/place/Eiffel+Tower"],
  "maxReviewsPerPlace": 100,
  "sort": "newest",
  "language": "en"
}
```

#### Several places by Place ID, feature id and name

```json
{
  "places": [
    "ChIJCar0f49ZwokR6ozLV-dHNTE",
    "0x89c2597777397641:0x4387a82ee10d3e3b",
    "Jardin Majorelle, Marrakech"
  ],
  "maxReviewsPerPlace": 60
}
```

#### Complaints only

```json
{
  "places": ["ChIJCar0f49ZwokR6ozLV-dHNTE"],
  "sort": "lowest",
  "maxRating": 2,
  "maxReviewsPerPlace": 300
}
```

#### A daily only-new monitor of a portfolio

```json
{
  "places": ["ChIJCar0f49ZwokR6ozLV-dHNTE", "ChIJQXY5d3dZwokROz4N4S6oh0M"],
  "sort": "newest",
  "maxReviewsPerPlace": 60,
  "dedupStoreName": "my-locations-reviews",
  "includePlaceInfo": false
}
```

#### For developers

- `maxReviewsPerPlace` is the per-place limit and `maxItems` the run-wide one. Error rows don't count toward `maxItems`.
- Scan guards: when a rating filter or the dedup store keeps nothing, a place's scan stops after five requests in a row with no review kept, and at three times the requests its limit needs (at least 20).
- With `sort: newest` and `dedupStoreName` set, a place's list stops at the first review an earlier run returned. `dedupStoreName` is the name of a key-value store that remembers what you've had.
- `minRating` above `maxRating` is refused before the run starts.
- A place given by URL or ID that returns no review bills the `place-checked` fee and writes a row saying so. A name has already paid `place-resolved`. An error row is free.
- `includePlaceInfo` (default `true`) reads the place's Maps listing once and adds `placeName`, `placeId`, address, categories, rating, phone, website, coordinates and plus code to each review record.
- `maxConcurrency` (Parallel requests, default `32`, 1 to 32) sets how many requests run at once across the whole run. Lower it only if a run reports errors. `delayMs` (Delay between requests, default `0`, up to 10,000) adds an optional pause before each request, in milliseconds.
- A run that's moved to another server or restarted carries on where it stopped, without writing or charging any review twice.

### ⬆️ Output

You get one record per review, viewable as a table or as JSON in the Output tab. With the place summary on, each row repeats the place record, and one export is enough for analysis.

```json
{
  "input": "Katz's Delicatessen, New York",
  "cid": "0x0:0x313547e757cb8cea",
  "placeName": "Katz's Delicatessen",
  "placeId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
  "placeFid": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
  "placeAddress": "Katz's Delicatessen, 205 E Houston St, New York, NY 10002",
  "placeCategories": ["Deli", "American restaurant", "…"],
  "placeRating": 4.5,
  "placeRatingScale": 5,
  "placePhone": "(212) 254-2246",
  "placeWebsite": "https://katzsdelicatessen.com/",
  "placeLat": 40.722232999999996,
  "placeLng": -73.98742899999999,
  "placePlusCode": "P2C7+V2 New York",
  "position": 1,
  "id": "Ci9DQUlRQUNvZENodHljRjlvT2xwWVRsbEViV2xuVlZaNGQxVnlaQzE1YUhoaVprRRAB",
  "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2xwWVRsbEViV2xuVlZaNGQxVnlaQzE1YUhoaVprRRAB",
  "url": "https://www.google.com/maps/reviews/…",
  "reviewUrl": "https://www.google.com/maps/reviews/…",
  "source": "Google",
  "sourceId": null,
  "author": "Dr. Ed Harris",
  "authorAvatar": "https://lh3.googleusercontent.com/…",
  "authorUrl": "https://www.google.com/maps/contrib/100376163683258008326/reviews?hl=en-US",
  "authorId": "100376163683258008326",
  "authorReviewCount": 135,
  "authorPhotoCount": 43,
  "authorLocalGuide": true,
  "postedText": "5 days ago",
  "isEdited": false,
  "postedAt": "2026-10-02T01:38:23.213Z",
  "postedAtIsApproximate": false,
  "postedAtMs": 1790905103213,
  "rating": 5,
  "ratingScale": 5,
  "text": "I had previously ordered Katz and had it shipped to Georgia. It was so good, I had to get to NY to try the sandwich fresh from the restaurant. It did NOT disappoint.…",
  "language": "en",
  "likes": 1,
  "details": { "order_type": "Dine in", "meal_type": "Lunch", "price_per_person": "$30–40", "food": 5, "service": 5, "atmosphere": 5, "noise_level": "Moderate noise", "parking_space": "Difficult to find parking" },
  "detailsRaw": [ { "key": "GUIDED_DINING_MODE", "label": "Order type", "question": "Did you dine in, take out, or get delivery?", "value": "Dine in" }, "…" ],
  "ownerResponse": null,
  "photos": ["https://lh3.googleusercontent.com/…", "…"],
  "sort": "newest",
  "scrapedAt": "2026-10-07T19:31:10.335Z"
}
```

Notes on a few columns:

- `id` and `reviewId` hold the same Google identifier. `id` is the name used across all BonCross actors, and `reviewId` is the review-specific one.
- `source` is always "Google" on this actor and `sourceId` is always null. On Google's hotel pages those two say which partner site a review came from, and a Maps review is always Google's own. Both are kept to give a dataset that combines this actor with Google Hotels Reviews Scraper one shape.
- Hotel reviews have three more fields where the reviewer filled them in: `hotelAspects` (Rooms, Service and Location scores, each with `rating` and `ratingScale`), `tripType` and `travelGroup`. They're absent on reviews of other kinds of place.
- `details` holds the reviewer's answers keyed by label (for a restaurant: `food`, `service`, `atmosphere`, meal type and what was ordered). `detailsRaw` keeps each answer with Google's own question text.
- `ownerResponse` and `detailsRaw` depend entirely on the place. Measured across four places, owner replies filled 39 of 40 reviews at one hotel, 3 of 40 at another and none at two more. The per-aspect detail filled 34 of 40 at one place and none at another. An empty column there means the business didn't reply. It isn't a missing field.
- A place Google lists no reviews for gets one row of its own: the place, an `error` message saying it has none, and no review fields. If you gave that place as a link or Place ID it costs the $0.0005 `place-checked` fee, and if you gave a name you've paid the $0.001 lookup and nothing more.
- In a CSV or Excel export, nested fields such as `details` and `photos` are flattened into columns.

### How many reviews can you get, and how fast?

Up to 20,000 reviews per place per run, and busy places have thousands available.

| Run | Reviews | Run time |
|---|---|---|
| 1 place, 10 reviews | 10 | 3 s |
| 5 places, 300 each | up to 1,500 | 18 to 44 s over seven runs, depending on how quickly Google answered |
| 32 places, 60 each | 1,920 | 7 s |
| 150 places, 20 each | 3,000 | 19 s |
| 80 places, 60 each | 4,800 | 9 s |

These are whole runs on Apify at the default settings, measured on 1 and 2 October 2026. Thousands of places fit comfortably in one run. Each place's reviews are read in order, which is why one place with many reviews takes longer than many places with a few each.

What fills in depends on the place. In a check of five inputs across four places (a Place ID URL, a name, a feature id, a full Maps URL and a name in another country), 90 newest reviews each, 360 reviews returned. All had exact timestamps, 55 had an owner reply and 111 had photos.

### Watch new reviews from a schedule, your code or an agent

Reputation monitoring is the commonest setup. Schedule the run daily in Apify, sort by newest, and name an "Only-new store". Each run then hands you only the reviews posted since the last one. A webhook can pass low ratings to Slack as they arrive, or append them to a Google Sheet. Zapier, Make and Airbyte hook in the same way.

The same data serves other jobs: comparing rating trends and complaint themes across rival locations, ranking branches of a chain by rating and review volume, finding the reviews a business never answered, and building dated, rated, multilingual text sets for sentiment analysis or model training.

From your own code, a `POST` to `https://api.apify.com/v2/acts/boncross~google-maps-reviews/run-sync-get-dataset-items` with the input JSON in the body returns the reviews when the run finishes. The `apify-client` package is on NPM for Node.js and on PyPI for Python.

Agents reach it through the Apify MCP server at `mcp.apify.com`, where it appears as the tool `google-maps-reviews`. An agent can pass a place name or URL, get dated and rated reviews as JSON, and summarise or classify them in the same session.

### FAQ

#### Do I need proxies or a Google account to scrape Google Maps reviews?

Neither. Proxy usage is included in the event prices and there's nothing to set up. The actor reads what Google shows a visitor who isn't signed in.

#### Is scraping Google reviews legal?

Web scraping is legal when the data is publicly available, which Google Maps reviews are. This actor reads only what Google serves to a logged-out visitor. Reviews are public content written by other people, and complying with Google's terms and your local law in how you use them is your responsibility.

#### How do I get only the new reviews each day?

Name an "Only-new store" and schedule the run sorted by newest. Anything you've had before is skipped and not charged. A place given by URL or ID with no new review at all costs only the $0.0005 `place-checked` fee.

#### How do I collect only the complaints?

Set "Maximum rating" to 2 and sort by lowest. You pay for the reviews that pass the filter and nothing for the ones it drops.

#### Why did a name return the wrong business?

A name resolves to Google's first search result. Add the city, or paste the place's Maps URL or Place ID. If Google finds nothing for a name, you get a row that says so, and it isn't charged.

#### Why does a reviewer show 0 reviews?

`authorReviewCount` is the number Google shows on the reviewer's profile, which counts written reviews. A reviewer who has only left star ratings can show 0. In one sample of 120 reviews, 23 authors showed 0.

#### Are reviews translated into my language?

They aren't. Review text is returned in the language the reviewer wrote it in. The "Language" setting localises the place details (such as `placeCategories`) and Google's labels.

#### What doesn't it return?

- The place's total review count. Google Maps doesn't provide that number alongside the reviews.
- Review topic chips such as "bathroom, 33 mentions".
- Partner-site reviews shown on Google's hotel pages. Those are collected by Google Hotels Reviews Scraper. This actor returns Google's own reviews only.
- An exact date for the owner's reply. Replies have a relative date, while the review itself has an exact timestamp.
- The Local Guide level. Local Guide status is a true or false flag.
- A separate last-edit timestamp. There's one date per review.
- The score behind "Most relevant". That's Google's own ranking and no column records it.

### More from BonCross

- [Google Maps Directions Scraper](https://apify.com/boncross/google-maps-directions): Google Maps directions as JSON for driving, transit, walking and cycling.
- [ikyu.com Reviews Scraper (一休)](https://apify.com/boncross/ikyu-reviews): ikyu.com (一休) reviews for hotels and ryokan.
- [Jalan.net Reviews Scraper (じゃらん クチコミ)](https://apify.com/boncross/jalan-reviews): Jalan (じゃらん クチコミ) hotel reviews, all or only new ones.
- [Marriott Reviews Scraper](https://apify.com/boncross/marriott-reviews): Guest reviews for any Marriott hotel.
- [Rakuten Travel Reviews Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-reviews): Rakuten Travel (楽天トラベル) hotel reviews by hotel number, URL or Japanese name: overall…
- [Reddit Scraper](https://apify.com/boncross/reddit-scraper): Reddit posts, comment trees, subreddit feeds, user profiles and communities by keyword…

### Your feedback

Is a review missing, or is there something on the place page you'd want in the row? Open an issue on the Issues tab in Apify Console. We read them all and reply there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/google-maps-reviews/changelog.md

# Actor input Schema

## `places` (type: `array`):

One place per entry: a Google Maps URL in any form (/maps/place/…, ?cid=…, place_id:…), a Place ID (ChIJ…), a feature id (0x…:0x…), a numeric cid, or a name with the city ("Café de Flore, Paris"). Names go through Google Maps search and the first result is used.

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

Google Maps page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

## `maxReviewsPerPlace` (type: `integer`):

Stop after this many reviews per place. Google serves 60 on the first request and 20 per page after that. With a rating or dedup filter the scan also stops after five requests in a row that keep no review, and at three times the requests the limit needs (at least 20).

## `maxItems` (type: `integer`):

A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

## `sort` (type: `string`):

Google's orderings. Use newest with an only-new store for monitoring.

## `minRating` (type: `number`):

Drop reviews below this star rating. 0 = off. Filtered reviews are not charged.

## `maxRating` (type: `number`):

Drop reviews above this star rating. 0 = off. Use maxRating 2 with sort lowest to collect complaints.

## `includePlaceInfo` (type: `boolean`):

Read the place's Maps listing once and add placeName, placeId, address, categories, rating, phone, website, coordinates and plus code to every review record. No extra charge.

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

Google interface language, e.g. en, ja, de. It localises dates and labels; review text stays in the language the reviewer wrote it in.

## `dedupStoreName` (type: `string`):

Name of a key-value store. When set, reviews already returned in earlier runs are skipped and not charged, so a scheduled run with sort newest gives you only what is new: with sort newest, a place's list stops at the first review an earlier run returned.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.

## Actor input object example

```json
{
  "places": [
    "https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO6p3I0",
    "Katz's Delicatessen, New York"
  ],
  "startUrls": [],
  "maxReviewsPerPlace": 100,
  "maxItems": 0,
  "sort": "newest",
  "minRating": 0,
  "maxRating": 0,
  "includePlaceInfo": true,
  "language": "en",
  "dedupStoreName": "",
  "maxConcurrency": 32,
  "delayMs": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Google Maps reviews: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# 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 = {
    "places": [
        "https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO6p3I0",
        "Katz's Delicatessen, New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/google-maps-reviews").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 = { "places": [
        "https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO6p3I0",
        "Katz's Delicatessen, New York",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/google-maps-reviews").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 '{
  "places": [
    "https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO6p3I0",
    "Katz'\''s Delicatessen, New York"
  ]
}' |
apify call boncross/google-maps-reviews --silent --output-dataset

```

## MCP server setup

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

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/VVilLKmMtoMotSXBd/builds/hUcQipsGDs9aS6Svn/openapi.json
