# Google Play Reviews Scraper (`kaix/google-play-reviews-scraper`) Actor

🔥 ~$0.04/1K reviews 🔥 Collect every Google Play review for any Android app in 76 languages: rating, full text, author, date, app version, helpful votes, and developer replies. Sort by newest or relevance, and filter by star rating, date, keywords, developer reply, app version, and helpful votes.

- **URL**: https://apify.com/kaix/google-play-reviews-scraper.md
- **Developed by:** [Kai](https://apify.com/kaix) (community)
- **Stats:** 1 total users, 1 monthly users, 96.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Play Reviews Scraper

**Get every review of any Google Play app, in all 76 languages, with no limit.**

Set `maxReviews` to `0`, and the run reads reviews until Google Play has no more. Asana has more than
7,500 reviews in English, and this Actor reads all of them in under 30 seconds. Choose All languages,
and you do not list the languages one by one.

### What can you do with it?

- Feedback monitoring: track the new reviews of your own app in each of your languages.
- Bug research: collect the one-star and two-star reviews of an app, and find what users complain
  about.
- Feature requests: find the reviews that ask for a feature, and leave out the bug reports.
- Shared pain points: find the low-rated reviews that many users marked as helpful.
- Praise and testimonials: find the most relevant five-star reviews.
- Support follow-up: find the reviews that have no developer reply, and answer them.
- Support analysis: see who replies to reviews, how fast, and with what text.
- Release tracking: filter by `appVersions` to see how a release changed the ratings.
- Competitor benchmarking: compare the reviews and the rating summaries of several apps.
- Market research: compare how users in different languages rate the same app.
- All languages: read one app in all 76 languages in one run.
- Text and sentiment datasets: get the same number of reviews for each star rating, with the full
  text.
- Full archive: download every review of an app in one language.

### What data does it extract?

| Data | When you get it |
|---|---|
| Review ID, rating, text, date, and link | Every run |
| Reviewer name and picture | Every run |
| App version that the reviewer used | Every run |
| Helpful votes | Every run |
| Developer reply with author, text, and date | Every run |
| App ID, app name, and the review language | Every run |
| App details: name, description, category, content rating, icon, and developer | `includeAppDetails` |
| Rating summary: average rating and number of ratings | `includeAppDetails` |
| Price and currency | `includeAppDetails` |

A field without data is `null`.

#### Why this Actor?

| | Google Play Reviews Scraper |
|---|---|
| Languages | 76 review languages in one run |
| Depth | More than 15,000 reviews for each app and language |
| Apps | As many as you list, in one run |
| Sort order | Newest or most relevant |
| Filters | Stars, dates, keywords, developer reply, app version, and helpful votes |
| Star filter | Any mix of 1 to 5 stars, with its own limit for each star rating |
| Developer replies | Author, text, and date |
| Dates | ISO 8601 in UTC |
| App details | A second Dataset, with no charge |
| Restarts | A restarted run never saves or charges a review twice |

### Quick start

1. Open the app on Google Play and copy the link.
2. Paste it into **Apps**. Add more links or package names for more apps.
3. Choose the **Review Languages**. The default is `en`. Choose **All languages** to read all 76 languages.
4. Set **Max Reviews**. Use `0` to get all the reviews that match your filters.
5. Click **Start**. Download the results as JSON, CSV, Excel, or HTML.

The same input as JSON:

```json
{
  "apps": ["https://play.google.com/store/apps/details?id=com.asana.app"],
  "languages": ["en"],
  "maxReviews": 100
}
```

### Examples by use case

#### Feedback monitoring

Every review of your app since 1 October 2026, in four languages. A
`maxReviews` of `0` sets no limit, and `sinceDate` stops the run as soon as it reaches older reviews.
Schedule the run in Apify, for example every week, and keep the rows whose `id` you have not saved
before:

```json
{
  "apps": ["https://play.google.com/store/apps/details?id=com.asana.app"],
  "languages": ["en", "de", "pt", "ja"],
  "sort": "newest",
  "sinceDate": "2026-10-01",
  "maxReviews": 0
}
```

#### Bug research

The one-star and two-star reviews that mention a crash, a freeze, or a bug. The
limit applies to each star rating, so this input gives up to 500 one-star and 500 two-star reviews:

```json
{
  "apps": ["com.spotify.music"],
  "ratings": ["1", "2"],
  "keywords": ["crash", "freeze", "bug"],
  "maxReviews": 500
}
```

#### Feature requests

The 200 newest reviews that ask for a feature and do not mention a crash or a
bug. A review must have at least one of the `keywords` and none of the `excludeKeywords`:

```json
{
  "apps": ["com.spotify.music"],
  "keywords": ["please add", "wish", "feature request"],
  "excludeKeywords": ["crash", "bug"],
  "maxReviews": 200
}
```

#### Shared pain points

The one-star and two-star reviews that have at least 20 helpful votes. The
limit applies to each star rating:

```json
{
  "apps": ["com.spotify.music"],
  "ratings": ["1", "2"],
  "minHelpfulVotes": 20,
  "maxReviews": 200
}
```

#### Praise and testimonials

The 50 most relevant five-star reviews:

```json
{
  "apps": ["com.spotify.music"],
  "ratings": ["5"],
  "sort": "relevant",
  "maxReviews": 50
}
```

#### Support follow-up

The reviews of 2026 that have no developer reply:

```json
{
  "apps": ["com.asana.app"],
  "sinceDate": "2026-01-01",
  "untilDate": "2026-12-31",
  "developerReply": "without",
  "maxReviews": 0
}
```

#### Support analysis

The 500 most relevant reviews that have a developer reply. Read `developerReply`
to see who answers, how fast, and with what text:

```json
{
  "apps": ["com.todoist"],
  "sort": "relevant",
  "developerReply": "with",
  "maxReviews": 500
}
```

#### Release tracking

The reviews for two app versions:

```json
{
  "apps": ["com.asana.app"],
  "appVersions": ["8.78.2", "8.75.7"],
  "maxReviews": 0
}
```

#### Competitor benchmarking

The 100 newest reviews of each of three apps, with the app details of
the UK store. The `country` sets the price and the currency. Compare `rating` and `ratingCount` in the
`apps` Dataset:

```json
{
  "apps": ["com.instagram.android", "com.zhiliaoapp.musically", "com.snapchat.android"],
  "country": "gb",
  "maxReviews": 100,
  "includeAppDetails": true
}
```

#### Market research

The 100 newest reviews of the same app in each of eight languages. Compare the
average `rating` of the reviews for each `language`:

```json
{
  "apps": ["com.spotify.music"],
  "languages": ["en", "de", "fr", "es", "pt", "ja", "ko", "it"],
  "maxReviews": 100
}
```

#### All languages

The 100 newest reviews of one app in each of the 76 languages. The value `all`
selects every language. The run takes longer than a run with one language:

```json
{
  "apps": ["com.spotify.music"],
  "languages": ["all"],
  "maxReviews": 100
}
```

#### Text and sentiment datasets

Up to 1,000 reviews for each star rating, so no rating dominates the dataset:

```json
{
  "apps": ["com.spotify.music"],
  "languages": ["en"],
  "ratings": ["1", "2", "3", "4", "5"],
  "maxReviews": 1000
}
```

#### Full archive

Every review that Google Play gives for an app in one language:

```json
{
  "apps": ["com.asana.app"],
  "languages": ["en"],
  "maxReviews": 0
}
```

### Choose the apps and languages

Give one link or one package name for each app. The Actor reads only the package name in the link, such
as `com.spotify.music` in `...details?id=com.spotify.music`.

- `maxReviews` applies to each app, each language, and each chosen star rating.
- Each app and each language is read once. Two entries for the same app give one set of reviews.
- **All languages** is the value `all` in the API. It reads all 76 languages. The run takes longer, and
  `maxReviews` applies to each language.
- An entry that is not a Google Play link or a package name stops the run before it starts. The status
  message names the entry.
- Google Play shows the reviews that fit a language. A run with `en` and a run with `de` return
  different reviews for the same app.
- Choose a language from the list in the input form. Use the base language, such as `pt` for Portuguese in
  Brazil and in Portugal. Use `zh-TW` for Traditional Chinese, including Hong Kong. The platform refuses a
  language that is not in the list before the run starts.
- An app that Google Play does not offer gets a warning in the log. The run goes on with the other apps.

### Sort order and filters

A review must pass every filter that you set. A filter that you leave empty keeps all reviews.

- **Sort.** `newest` returns the newest reviews first. `relevant` returns the order that Google Play
  calls most relevant.
- **Star ratings.** With `ratings`, the Actor reads each chosen rating on its own, and `maxReviews`
  applies to each one. The reviews then come grouped by rating, and each group keeps the chosen sort.
- **Dates.** `sinceDate` and `untilDate` use UTC. A date such as `2026-01-31` covers the whole day. With
  the `newest` sort, the run stops soon after the reviews become older than `sinceDate`, so a recent
  range is fast.
- **Keywords.** `keywords` keeps a review whose text has at least one of the words. `excludeKeywords`
  drops a review whose text has any of its words. Capital letters do not matter.
- **Developer reply.** `developerReply` is `with` or `without`.
- **App versions.** `appVersions` keeps the reviews for the versions that you list. Google Play shows
  the version for part of the reviews of an app, and a review without a version never matches.
- **Helpful votes.** `minHelpfulVotes` keeps the reviews that have at least that number of helpful
  votes.

### Input reference

| Field | Type | Default | Behavior |
|---|---|---:|---|
| `apps` | string\[] | required | Google Play links or package names. Each app is read once. |
| `languages` | string\[] | `["en"]` | Review languages from the list in the input form, or `all` for every language. The Actor reads every app in every language. |
| `country` | string | `us` | Country of the store. It sets the price and the currency of the app details. The `newest` sort returns the same reviews in every country. The `relevant` sort can return other reviews in another country. |
| `maxReviews` | integer, 0 or greater | `100` | Maximum reviews for each app, language, and chosen star rating. Use `0` for every review that matches your filters. |
| `sort` | `newest` or `relevant` | `newest` | Order of the reviews, and so the reviews that fit inside the limit. |
| `ratings` | string\[] | `[]` | Star ratings to keep, from `"1"` to `"5"`. An empty list keeps all ratings. |
| `sinceDate` | string | none | Keep reviews written on or after this date. |
| `untilDate` | string | none | Keep reviews written on or before this date. The whole last day counts. |
| `keywords` | string\[] | `[]` | Keep reviews whose text holds at least one of these words or phrases. |
| `excludeKeywords` | string\[] | `[]` | Drop reviews whose text holds any of these words or phrases. |
| `developerReply` | `any`, `with`, or `without` | `any` | Keep all reviews, only reviews with a developer reply, or only reviews without one. |
| `appVersions` | string\[] | `[]` | Keep reviews for these app versions. |
| `minHelpfulVotes` | integer, 0 or greater | `0` | Keep reviews with at least this number of helpful votes. |
| `includeAppDetails` | boolean | `false` | Write one record for each app to the `apps` Dataset. App records have no charge. |
| `proxyConfiguration` | object | Apify Proxy | Connection settings. The default works for most runs. |

A `sinceDate` that is later than `untilDate` stops the run before it starts.

#### Complete input example

This reference example covers every input field. It limits the result to 10 reviews for each app,
language, and star rating.

<details>
<summary>Open the complete input</summary>

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "com.instagram.android"
  ],
  "languages": ["en", "pt"],
  "country": "us",
  "maxReviews": 10,
  "sort": "relevant",
  "ratings": ["1", "5"],
  "sinceDate": "2025-01-01",
  "untilDate": "2026-10-31",
  "keywords": ["update", "login"],
  "excludeKeywords": ["spam"],
  "developerReply": "any",
  "appVersions": [],
  "minHelpfulVotes": 0,
  "includeAppDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

</details>

### Output

The run writes two Datasets with different shapes:

| Dataset | One item for each | When |
|---|---|---|
| default | Review | Every run |
| `apps` | App | `includeAppDetails: true` |

Through the API, read the ID of the `apps` Dataset from `storageIds.datasets.apps` in the run object.

#### Review fields by topic

- **Review.** Review ID, rating from 1 to 5, text, date in ISO 8601 and UTC, and the link to the review.
- **Reviewer.** Name, and the link to the picture. The picture is `null` when the reviewer has none.
- **Engagement.** Helpful votes.
- **Developer reply.** Author, text, and date. The whole object is `null` when the developer did not
  answer.
- **App.** App ID, app name, the app version that the reviewer used, and the language that you asked for.

#### Review example

This is a complete review from a run on 25 October 2026.

<details>
<summary>Open the review</summary>

```json
{
  "id": "adb6d5d2-781b-4db9-b050-4fcb7e735e8b",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "language": "en",
  "rating": 1,
  "text": "Plays 1 song at a time. No longer able to listen to playlists or stations. It stops after 1 song. I've cleared cache. Restarted my phone. Uninstalled and reinstalled. Even cleared storage and Uninstalled other apps. Nothing works. I stopped my subscription due to similar issues and now this free version is no longer worth the work or time. I'm done.",
  "author": {
    "name": "Avalia Leyva",
    "avatarUrl": "https://play-lh.googleusercontent.com/a-/ALV-UjWoQvpZSPFNnHUwpvSj9BQclCYkTSpuRBmLlDDaeyDfaE7HtUd7eg"
  },
  "date": "2024-12-29T17:31:11.298Z",
  "appVersion": "9.0.2.459",
  "helpfulVotes": 359,
  "developerReply": {
    "author": "Spotify AB",
    "text": "Hi! We'd suggest reaching out to our Customer Service team to get help on this. Just search \"Contact Us\" at http://.support.spotify.com.",
    "date": "2024-12-30T01:53:05.580Z"
  },
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=adb6d5d2-781b-4db9-b050-4fcb7e735e8b"
}
```

</details>

#### Review field reference

| Path | Type and nullability |
| --- | --- |
| `id`, `appId`, `appName`, `language` | string |
| `rating` | number from 1 to 5 |
| `text` | string |
| `author.name` | string |
| `author.avatarUrl` | string or `null` |
| `date` | string, ISO 8601 in UTC |
| `appVersion` | string or `null` |
| `helpfulVotes` | number |
| `developerReply` | `{ author: string, text: string, date: string }` or `null` |
| `url` | string |

A review is saved once for each app and language in a run.

### App Dataset reference

When `includeAppDetails` is `true`, the `apps` Dataset receives one row for each app.

<details>
<summary>Open an app record</summary>

```json
{
  "id": "com.spotify.music",
  "name": "Spotify: Music and Podcasts",
  "country": "us",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music",
  "description": "Listen to songs, play podcasts, create playlists and discover music you'll love",
  "category": "MUSIC_AND_AUDIO",
  "iconUrl": "https://play-lh.googleusercontent.com/IzQgYCcnCFCD08GR-3bdtcT8xzOvrNkC84avGT5CwTX2VIqmTmKKJcP_Cd4JoBOdmCMlTndlOzV6hrthg2fOWA",
  "contentRating": "Teen",
  "developer": {
    "name": "Spotify AB",
    "url": "https://www.spotify.com"
  },
  "rating": 4.349088668823242,
  "ratingCount": 36540155,
  "price": 0,
  "currency": "USD"
}
```

</details>

| Path | Type and nullability |
| --- | --- |
| `id`, `name`, `country`, `url` | string |
| `description`, `category`, `iconUrl`, `contentRating` | string or `null` |
| `developer.name` | string |
| `developer.url` | string or `null` |
| `rating` | number from 1 to 5, or `null` |
| `ratingCount` | number or `null` |
| `price` | number or `null` |
| `currency` | string or `null` |

### Run status and completeness

- The run finishes with `SUCCEEDED` when every app and language was read to the limit or to the last
  review that Google Play gives. An app that Google Play does not offer, and an app with no reviews in a
  language, do not fail the run.
- The run finishes with `FAILED` when the connection failed on part of the work, even after retries.
  The status message starts with `Incomplete results`, gives the number of saved reviews, and lists the
  apps and languages that stopped. The reviews saved before the stop stay in the Dataset.
- The Actor tries every app and language before it reports a failure.
- When the run reaches the maximum cost that you set, it stops, keeps the saved reviews, and finishes
  with `SUCCEEDED`. The status message says so.
- If the platform restarts the run, the Actor does not save or charge a review twice.

### FAQ

#### How many reviews can I get?

There is no fixed limit. One run read 15,920 reviews of one app in one language, and Google Play had
more. Popular apps have millions of reviews, so set `maxReviews` for them. With `0`, the run goes on
until Google Play has no more reviews or until the maximum cost that you set is spent.

#### What does a run cost?

Each saved review is one billed item. The price is on the Actor page. App records have no charge. Set
a maximum cost for the run to cap the price. The Actor then stops at that cost and keeps the saved
reviews.

#### Why did I get fewer reviews than `maxReviews`?

The app has fewer reviews in that language, or your filters leave fewer. A small app can have only
a few reviews in a rare language. The log gives the number of reviews for each app and language.

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

Set `sinceDate` to the day of your last run and `sort` to `newest`. Keep the rows whose `id` you have
not saved before. The run stops soon after the reviews become older than the date.

#### Why do some reviews have `null` for the version?

Google Play shows the app version for part of the reviews of an app. A review without a version never
matches `appVersions`.

#### Can I get App Store reviews?

Use [App Store Reviews Scraper](https://apify.com/kaix/app-store-reviews-scraper).

#### A feature or field that I need is missing. What can I do?

Tell us in the **Issues** tab. Describe what you need and give an example app.

#### Where can I report a problem?

Open an issue in the **Issues** tab. Include the run ID and the input, so that we can reproduce it.

# Actor input Schema

## `apps` (type: `array`):

Google Play links or package names. The package name is the text after <code>id=</code> in the link, for example <code>com.instagram.android</code>.

## `languages` (type: `array`):

The run collects the reviews of every app in every language that you choose. Use the base language, such as <code>pt</code> for Portuguese in Brazil and in Portugal, and <code>zh-TW</code> for Traditional Chinese. Choose All languages to read all 76 languages. The run takes longer, and the review limit applies to each language.

## `country` (type: `string`):

The country of the store. It sets the price and the currency of the app details. The newest sort returns the same reviews in every country. The relevant sort can return other reviews in another country.

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

Maximum number of reviews for each app, language, and chosen rating. Set to 0 for every review that matches your filters. Popular apps have millions of reviews, so set a limit for them.

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

The order of the reviews, and so the reviews that fit inside the limit.

## `ratings` (type: `array`):

Only collect reviews with these star ratings. An empty list means all ratings. The limit applies to each rating.

## `sinceDate` (type: `string`):

Only collect reviews written on or after this date. A date such as 2026-01-01 starts at 00:00:00 UTC.

## `untilDate` (type: `string`):

Only collect reviews written on or before this date. The whole last day counts, up to 23:59:59 UTC.

## `keywords` (type: `array`):

Only collect reviews whose text holds at least one of these words or phrases. Capital letters do not matter.

## `excludeKeywords` (type: `array`):

Skip reviews whose text holds any of these words or phrases.

## `developerReply` (type: `string`):

Keep all reviews, only the reviews that have a reply from the developer, or only the reviews that have none.

## `appVersions` (type: `array`):

Only collect reviews written for one of these app versions, for example <code>450.0</code>. The version is known for part of the reviews of an app. A review without a version never matches.

## `minHelpfulVotes` (type: `integer`):

Only collect reviews that have at least this number of helpful votes.

## `includeAppDetails` (type: `boolean`):

Also save one record for each app, with the name, developer, category, price, and rating summary. The records go to the <code>apps</code> dataset.

## `proxyConfiguration` (type: `object`):

Connection settings. The default works for most runs.

## Actor input object example

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.asana.app"
  ],
  "languages": [
    "en"
  ],
  "country": "us",
  "maxReviews": 100,
  "sort": "newest",
  "ratings": [],
  "keywords": [],
  "excludeKeywords": [],
  "developerReply": "any",
  "appVersions": [],
  "minHelpfulVotes": 0,
  "includeAppDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

No description

## `apps` (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 = {
    "apps": [
        "https://play.google.com/store/apps/details?id=com.asana.app"
    ],
    "languages": [
        "en"
    ],
    "maxReviews": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kaix/google-play-reviews-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 = {
    "apps": ["https://play.google.com/store/apps/details?id=com.asana.app"],
    "languages": ["en"],
    "maxReviews": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kaix/google-play-reviews-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 '{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.asana.app"
  ],
  "languages": [
    "en"
  ],
  "maxReviews": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kaix/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kaix/google-play-reviews-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/VrQ6MMkQPMB65W0sO/builds/C7HEp5dcJtIxMZahL/openapi.json
