# Google Play Store Scraper — Apps, Reviews, Charts (`khadinakbar/google-play-all-in-one-scraper`) Actor

Scrape Google Play: app details, reviews, keyword search, top charts, similar apps and developer portfolios. Auto-detects mode from URL or query. MCP-ready, HTTP-only.

- **URL**: https://apify.com/khadinakbar/google-play-all-in-one-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Developer tools, MCP servers, SEO tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 result scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Play Store Scraper — Apps, Reviews, Charts

**Google Play Store Scraper extracts everything on Google Play with one actor:** **app details, user reviews, keyword search, top charts, similar apps, and full developer portfolios**. Point it at a package ID, an app URL, or a search term and it auto-detects what to do. HTTP-only (no headless browser), fast, and built for both humans and AI agents (MCP-ready).

### What you get

| Mode | Input | Returns |
|------|-------|---------|
| **App details** | `com.spotify.music` or app URL | 50+ fields: title, description, installs, score, ratings histogram, price, IAP, version, content rating, screenshots, developer contact, privacy policy, and more |
| **Reviews** | package ID / URL | Paginated reviews: rating, text, author, date, helpful votes, developer reply, app version |
| **Search** | keyword (`searchQuery`) | Ranked matching apps with title, developer, score, price, icon |
| **Top charts (list)** | collection + optional category | Ranked chart apps (Top Free / Paid / Grossing) with rank |
| **Similar apps** | package ID / URL | Apps Google Play recommends as similar — great for competitor discovery |
| **Developer apps** | developer URL or name | The developer's full published portfolio |

### When to use it

- **ASO & market research** — track rankings, scores, install tiers, and competitor sets.
- **Sentiment analysis** — pull thousands of reviews per app, sorted by newest, rating, or helpfulness.
- **Competitive intelligence** — search a niche, pull top charts, map similar apps and developer portfolios.
- **AI agents** — narrow input, structured JSON out; callable directly over MCP.

Use the dedicated reviews-only actors if all you ever need is the cheapest possible review firehose. Use **this** actor when you want the full Google Play picture — apps, reviews, charts, and discovery — in one place with consistent output.

### Pricing (pay-per-event)

| Event | Price |
|-------|-------|
| Actor start | $0.00005 |
| App detail scraped (full 50+ field record) | **$0.005** |
| Result scraped (review, search result, chart entry, similar app, developer app) | **$0.003** |

Set **`maxResults`** to put a hard ceiling on spend — the run stops cleanly once reached, and the maximum possible cost is printed at the start of every run. Pay-per-usage (compute + proxy) is also available; pick whichever billing fits your job at run time.

### Quick start

Zero-config: the default input scrapes the Spotify app's details. Otherwise:

**App details + reviews + similar apps in one run**
```json
{
  "mode": "app-details",
  "appIds": ["com.whatsapp", "com.spotify.music"],
  "includeReviews": true,
  "maxReviews": 200,
  "includeSimilar": true,
  "country": "us",
  "language": "en",
  "maxResults": 500
}
````

**Keyword search, enriched to full details**

```json
{
  "mode": "search",
  "searchQuery": "meditation timer",
  "maxSearchResults": 30,
  "fullDetails": true,
  "maxResults": 30
}
```

**Top free games chart**

```json
{
  "mode": "list",
  "listCollection": "TOP_FREE",
  "listCategory": "GAME",
  "maxListResults": 100
}
```

**Auto-detect from mixed URLs**

```json
{
  "mode": "auto",
  "startUrls": [
    { "url": "https://play.google.com/store/apps/details?id=com.spotify.music" },
    { "url": "https://play.google.com/store/search?q=podcast" }
  ]
}
```

### Output

Every row carries a `recordType` discriminator (`app`, `review`, `searchResult`, `listEntry`, `similar`, `developerApp`) plus a `scrapedAt` ISO-8601 timestamp and the `sourceUrl`/`appId` it came from. App rows are flat with stable keys; review rows use `review*` prefixed fields. See the Output tab for the live schema.

```json
{
  "recordType": "app",
  "appId": "com.spotify.music",
  "title": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "score": 4.33,
  "ratings": 31000000,
  "installs": "1,000,000,000+",
  "price": 0,
  "free": true,
  "genre": "Music & Audio",
  "version": "VARY",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music",
  "scrapedAt": "2026-05-30T09:23:13.811Z"
}
```

### Calling from code

**Apify JavaScript client**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('khadinakbar/google-play-all-in-one-scraper').call({
  mode: 'reviews',
  appIds: ['com.spotify.music'],
  maxReviews: 500,
  reviewsSort: 'newest',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Apify Python client**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("khadinakbar/google-play-all-in-one-scraper").call(run_input={
    "mode": "search",
    "searchQuery": "habit tracker",
    "maxSearchResults": 50,
    "fullDetails": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item.get("score"))
```

### FAQ

**How many reviews can I get per app?** Reviews paginate automatically up to `maxReviews` (default 100; up to 50,000). Newest, rating, or helpfulness order.

**Search returns few/no results?** Google Play's search endpoint is region-sensitive and can rate-limit shared datacenter IPs. Set the right `country`, and for high-volume search switch the proxy to **residential**. App-details, reviews, charts, similar, and developer modes are unaffected.

**Can I get full details for every search/chart/similar result?** Yes — set `fullDetails: true` and each result is upgraded to a complete 50+ field record (billed as an app-detail event).

**Which country/language?** Use 2-letter ISO codes in `country` (storefront, pricing, availability) and `language` (localized text).

**Does it need a browser or login?** No. It reads Google Play's public endpoints over HTTP. No account, no cookies.

### Legal

This actor collects only publicly available information from Google Play Store listings. It does not bypass authentication, access private data, or circumvent technical access controls. You are responsible for using the data in compliance with Google's Terms of Service, applicable laws (including GDPR/CCPA where relevant), and any data-protection obligations. Do not use scraped personal data (e.g., review author names) in violation of privacy regulations. This actor is not affiliated with or endorsed by Google.

### Related actors

- [Apple App Store Scraper](https://apify.com/khadinakbar/apple-app-store-all-in-one-scraper) — full Apple App Store coverage (apps, reviews, charts, search, developer portfolio) for cross-platform mobile intelligence.
- [Amazon Reviews Scraper](https://apify.com/khadinakbar/amazon-reviews-scraper) — Amazon product reviews to pair with Google Play sentiment for consumer-brand monitoring.
- [Software Reviews Scraper](https://apify.com/khadinakbar/software-reviews-all-in-one-scraper) — G2, Capterra, TrustRadius B2B reviews for desktop/web counterparts to mobile apps.
- [Trustpilot Reviews Scraper](https://apify.com/khadinakbar/trustpilot-reviews-scraper) — Trustpilot reviews to extend brand sentiment beyond Google Play's review system.

# Actor input Schema

## `mode` (type: `string`):

What to scrape from Google Play. Leave as 'auto' to infer per item: a /store/apps/details URL or package id (e.g. 'com.spotify.music') becomes app-details, a /store/search URL or 'searchQuery' becomes search, a /store/apps/dev URL becomes developer. Set explicitly to force one behavior. NOT a free-text field — pick one of the listed values.

## `appIds` (type: `array`):

Google Play package IDs (e.g. 'com.spotify.music') or full app URLs (e.g. 'https://play.google.com/store/apps/details?id=com.spotify.music'). Used by app-details, reviews, and similar modes. Each entry yields one or more dataset records depending on mode. NOT a search keyword — use 'searchQuery' for that.

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

Google Play URLs to scrape — app, search, or developer pages. Each URL is auto-classified when mode is 'auto'. Use this instead of 'appIds' when you already have full URLs. NOT for non-Play URLs; only play.google.com links are accepted.

## `searchQuery` (type: `string`):

Free-text keyword run on Google Play search (e.g. 'meditation timer'). Triggers search mode and returns matching apps with title, developer, score, price, and icon. Combine with 'maxSearchResults' to cap volume and 'fullDetails' to enrich each hit into a full 50+ field record. NOT a package ID — use 'appIds' for direct app lookups.

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

Two-letter ISO country code for the Play storefront (e.g. 'us', 'gb', 'de', 'in'). Controls localized pricing, availability, ranking, and which reviews are returned. Defaults to 'us'. NOT a full country name — use the 2-letter code.

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

Two-letter ISO language code for localized text such as descriptions and review content (e.g. 'en', 'es', 'fr'). Defaults to 'en'. Combine with 'country' for region-accurate results. NOT a locale string like 'en-US' — use the 2-letter code.

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

Maximum reviews to fetch per app in reviews mode (or when 'includeReviews' is on). Reviews are paginated automatically until this cap. Defaults to 100; set to 0 to skip reviews. Large values increase run cost — each review is one billable result.

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

Order in which reviews are returned: 'newest' (most recent first), 'rating' (highest score first), or 'helpfulness' (most thumbs-up first). Defaults to 'newest'. Applies only to reviews mode and 'includeReviews'. NOT a filter — it sorts, it does not drop reviews.

## `maxSearchResults` (type: `integer`):

Maximum apps to return from a keyword search. Google Play caps search at roughly 250 results per query. Defaults to 30. Each result is one billable result row unless 'fullDetails' upgrades it to a full app-detail charge.

## `listCollection` (type: `string`):

Which top chart to pull in list mode: 'TOP\_FREE', 'TOP\_PAID', or 'GROSSING'. Defaults to 'TOP\_FREE'. Combine with 'listCategory' to scope the chart to a category like games. NOT a search — it returns ranked chart entries.

## `listCategory` (type: `string`):

Optional Google Play category to scope the chart in list mode (e.g. 'GAME', 'GAME\_ACTION', 'SOCIAL', 'PRODUCTIVITY', 'FINANCE'). Leave blank for the overall chart across all categories. Must be a valid Play category constant in UPPER\_SNAKE\_CASE. NOT a free-text genre name.

## `maxListResults` (type: `integer`):

Maximum ranked apps to return in list mode. Google Play charts cap at roughly 500 entries. Defaults to 50. Each entry is one billable result row unless 'fullDetails' upgrades it.

## `fullDetails` (type: `boolean`):

When on, every app returned by search, list, similar, or developer mode is enriched with a full 50+ field app-details lookup (description, install count, screenshots, content rating, version, etc.). Off returns the lighter summary each endpoint provides natively. Enriched rows are billed as app-detail events, which cost more than summary results. Defaults to off for speed and lower cost.

## `includeReviews` (type: `boolean`):

When on in app-details mode, also fetch up to 'maxReviews' reviews for each app and emit them as separate review records. Off returns app details only. Useful for one-shot app + sentiment pulls. Each review is one billable result.

## `includeSimilar` (type: `boolean`):

When on in app-details mode, also fetch the list of similar/related apps Google Play recommends for each app, emitted as separate result rows. Off skips it. Each similar app is one billable result. Useful for competitor discovery and ASO.

## `maxResults` (type: `integer`):

Global ceiling on billable records for the entire run, across all modes and apps combined. The actor stops and exits cleanly once reached, so this is your hard cost cap. Defaults to 1000. Set lower to bound spend, higher for large jobs.

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

Proxy used for Google Play requests. Apify Proxy (datacenter) is enabled by default and is sufficient for these endpoints; switch to residential only if you hit rate limits at high volume. Geo-targeting is independent of the 'country' field, which controls the storefront.

## Actor input object example

```json
{
  "mode": "auto",
  "appIds": [
    "com.whatsapp",
    "com.spotify.music"
  ],
  "startUrls": [
    {
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
    }
  ],
  "searchQuery": "habit tracker",
  "country": "us",
  "language": "en",
  "maxReviews": 100,
  "reviewsSort": "newest",
  "maxSearchResults": 30,
  "listCollection": "TOP_FREE",
  "listCategory": "GAME_ACTION",
  "maxListResults": 50,
  "fullDetails": false,
  "includeReviews": false,
  "includeSimilar": false,
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped records — apps, reviews, search/chart entries, similar apps, and developer apps.

## `runSummary` (type: `string`):

Per-run summary stored in the key-value store (counts by record type, billed events, warnings).

# 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 = {
    "mode": "auto",
    "appIds": [
        "com.spotify.music"
    ],
    "country": "us",
    "language": "en",
    "maxReviews": 100,
    "reviewsSort": "newest",
    "maxSearchResults": 30,
    "listCollection": "TOP_FREE",
    "maxListResults": 50,
    "maxResults": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/google-play-all-in-one-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 = {
    "mode": "auto",
    "appIds": ["com.spotify.music"],
    "country": "us",
    "language": "en",
    "maxReviews": 100,
    "reviewsSort": "newest",
    "maxSearchResults": 30,
    "listCollection": "TOP_FREE",
    "maxListResults": 50,
    "maxResults": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/google-play-all-in-one-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "auto",
  "appIds": [
    "com.spotify.music"
  ],
  "country": "us",
  "language": "en",
  "maxReviews": 100,
  "reviewsSort": "newest",
  "maxSearchResults": 30,
  "listCollection": "TOP_FREE",
  "maxListResults": 50,
  "maxResults": 1000
}' |
apify call khadinakbar/google-play-all-in-one-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/google-play-all-in-one-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Store Scraper — Apps, Reviews, Charts",
        "description": "Scrape Google Play: app details, reviews, keyword search, top charts, similar apps and developer portfolios. Auto-detects mode from URL or query. MCP-ready, HTTP-only.",
        "version": "1.0",
        "x-build-id": "zzWW9oSe3ML9rHqwk"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~google-play-all-in-one-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-google-play-all-in-one-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~google-play-all-in-one-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-google-play-all-in-one-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~google-play-all-in-one-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-google-play-all-in-one-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Scrape mode",
                        "enum": [
                            "auto",
                            "app-details",
                            "reviews",
                            "search",
                            "list",
                            "similar",
                            "developer"
                        ],
                        "type": "string",
                        "description": "What to scrape from Google Play. Leave as 'auto' to infer per item: a /store/apps/details URL or package id (e.g. 'com.spotify.music') becomes app-details, a /store/search URL or 'searchQuery' becomes search, a /store/apps/dev URL becomes developer. Set explicitly to force one behavior. NOT a free-text field — pick one of the listed values.",
                        "default": "auto"
                    },
                    "appIds": {
                        "title": "App package IDs or URLs",
                        "type": "array",
                        "description": "Google Play package IDs (e.g. 'com.spotify.music') or full app URLs (e.g. 'https://play.google.com/store/apps/details?id=com.spotify.music'). Used by app-details, reviews, and similar modes. Each entry yields one or more dataset records depending on mode. NOT a search keyword — use 'searchQuery' for that.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Google Play URLs to scrape — app, search, or developer pages. Each URL is auto-classified when mode is 'auto'. Use this instead of 'appIds' when you already have full URLs. NOT for non-Play URLs; only play.google.com links are accepted.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text keyword run on Google Play search (e.g. 'meditation timer'). Triggers search mode and returns matching apps with title, developer, score, price, and icon. Combine with 'maxSearchResults' to cap volume and 'fullDetails' to enrich each hit into a full 50+ field record. NOT a package ID — use 'appIds' for direct app lookups."
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter ISO country code for the Play storefront (e.g. 'us', 'gb', 'de', 'in'). Controls localized pricing, availability, ranking, and which reviews are returned. Defaults to 'us'. NOT a full country name — use the 2-letter code.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter ISO language code for localized text such as descriptions and review content (e.g. 'en', 'es', 'fr'). Defaults to 'en'. Combine with 'country' for region-accurate results. NOT a locale string like 'en-US' — use the 2-letter code.",
                        "default": "en"
                    },
                    "maxReviews": {
                        "title": "Max reviews per app",
                        "minimum": 0,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum reviews to fetch per app in reviews mode (or when 'includeReviews' is on). Reviews are paginated automatically until this cap. Defaults to 100; set to 0 to skip reviews. Large values increase run cost — each review is one billable result.",
                        "default": 100
                    },
                    "reviewsSort": {
                        "title": "Reviews sort order",
                        "enum": [
                            "newest",
                            "rating",
                            "helpfulness"
                        ],
                        "type": "string",
                        "description": "Order in which reviews are returned: 'newest' (most recent first), 'rating' (highest score first), or 'helpfulness' (most thumbs-up first). Defaults to 'newest'. Applies only to reviews mode and 'includeReviews'. NOT a filter — it sorts, it does not drop reviews.",
                        "default": "newest"
                    },
                    "maxSearchResults": {
                        "title": "Max search results",
                        "minimum": 1,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Maximum apps to return from a keyword search. Google Play caps search at roughly 250 results per query. Defaults to 30. Each result is one billable result row unless 'fullDetails' upgrades it to a full app-detail charge.",
                        "default": 30
                    },
                    "listCollection": {
                        "title": "Chart collection",
                        "enum": [
                            "TOP_FREE",
                            "TOP_PAID",
                            "GROSSING"
                        ],
                        "type": "string",
                        "description": "Which top chart to pull in list mode: 'TOP_FREE', 'TOP_PAID', or 'GROSSING'. Defaults to 'TOP_FREE'. Combine with 'listCategory' to scope the chart to a category like games. NOT a search — it returns ranked chart entries.",
                        "default": "TOP_FREE"
                    },
                    "listCategory": {
                        "title": "Chart category",
                        "type": "string",
                        "description": "Optional Google Play category to scope the chart in list mode (e.g. 'GAME', 'GAME_ACTION', 'SOCIAL', 'PRODUCTIVITY', 'FINANCE'). Leave blank for the overall chart across all categories. Must be a valid Play category constant in UPPER_SNAKE_CASE. NOT a free-text genre name."
                    },
                    "maxListResults": {
                        "title": "Max chart results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum ranked apps to return in list mode. Google Play charts cap at roughly 500 entries. Defaults to 50. Each entry is one billable result row unless 'fullDetails' upgrades it.",
                        "default": 50
                    },
                    "fullDetails": {
                        "title": "Enrich list/search/similar/developer results to full details",
                        "type": "boolean",
                        "description": "When on, every app returned by search, list, similar, or developer mode is enriched with a full 50+ field app-details lookup (description, install count, screenshots, content rating, version, etc.). Off returns the lighter summary each endpoint provides natively. Enriched rows are billed as app-detail events, which cost more than summary results. Defaults to off for speed and lower cost.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "Include reviews with app details",
                        "type": "boolean",
                        "description": "When on in app-details mode, also fetch up to 'maxReviews' reviews for each app and emit them as separate review records. Off returns app details only. Useful for one-shot app + sentiment pulls. Each review is one billable result.",
                        "default": false
                    },
                    "includeSimilar": {
                        "title": "Include similar apps",
                        "type": "boolean",
                        "description": "When on in app-details mode, also fetch the list of similar/related apps Google Play recommends for each app, emitted as separate result rows. Off skips it. Each similar app is one billable result. Useful for competitor discovery and ASO.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max total results (hard cost cap)",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Global ceiling on billable records for the entire run, across all modes and apps combined. The actor stops and exits cleanly once reached, so this is your hard cost cap. Defaults to 1000. Set lower to bound spend, higher for large jobs.",
                        "default": 1000
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy used for Google Play requests. Apify Proxy (datacenter) is enabled by default and is sufficient for these endpoints; switch to residential only if you hit rate limits at high volume. Geo-targeting is independent of the 'country' field, which controls the storefront.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
