# Google Play Scraper - Apps, Reviews, Charts & More (`sourabhbgp/google-play-scraper`) Actor

Scrape Google Play app details, uncapped reviews, keyword search, top charts, developer portfolios, permissions, and data safety in one actor. Flat $2 per 1,000 results, every country and language.

- **URL**: https://apify.com/sourabhbgp/google-play-scraper.md
- **Developed by:** [Sourabh Kumar](https://apify.com/sourabhbgp) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 7 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 scraper: app details, reviews, search, charts & more

One actor for the whole Google Play Store: app metadata, user reviews, keyword search, top charts, a developer's full app list, similar apps, permissions, and the Data safety section. Pick a mode, paste app IDs or keywords, get clean JSON.

**$2 per 1,000 results. Flat for every mode. No per-run fee.**

Works in every country and language: `us`, `gb`, `in`, `de`, `jp`, `br`, `mx`, `kr`, and the rest. Native scripts come back unchanged.

### Why this scraper?

- 💸 **$2 per 1,000 results, flat.** Same price for every mode. No per-run start fee, no monthly minimum.
- 📦 **Reviews go past the cap** that locks most scrapers. Pull thousands per app for sentiment analysis or backfilling history.
- 🧩 **8 modes in one actor** instead of juggling separate scrapers for apps, reviews, and charts.
- 🔒 **Data safety and permissions** on demand, the part almost no other scraper exposes.
- ⭐ **Full 1 to 5 star breakdown** on every app, so you know if a 4.6 is mostly 5s or barely-3s averaged up.
- 🌍 **Every country and language**, with results returned in the local market's text and currency.
- ⚡ **No browser, no proxy setup.** Fast and lightweight, bot protection handled for you.
- 🚫 **No empty-input surprise charge.** Send `{}` and you get a clean error, not a bill.

### What data can you extract?

<table>
<tr><td>📱 App name + package ID</td><td>👤 Developer + contact</td><td>💰 Price + currency</td><td>📊 1 to 5 star breakdown</td></tr>
<tr><td>⭐ Rating + review count</td><td>📥 Install count</td><td>📝 Full review text</td><td>💬 Developer replies</td></tr>
<tr><td>🏆 Top chart rank</td><td>🔗 Similar apps</td><td>🗂️ Developer's full catalog</td><td>🧮 In-app purchase range</td></tr>
<tr><td>🔐 App permissions</td><td>🛡️ Data safety section</td><td>🖼️ Screenshots + icon</td><td>🆕 What's new + updated date</td></tr>
</table>

### How it compares

Google has no public API for app listings, reviews, or charts, so most teams stitch together several single-purpose scrapers.

| | Google's public surface | Other scrapers | This scraper |
|---|---|---|---|
| Reviews per app | n/a | usually a few dozen | **thousands, paged to your limit** |
| 1 to 5 star breakdown | ❌ | rarely | ✅ on every app |
| Data safety + permissions | ❌ | rarely | ✅ |
| Top charts + developer catalog | ❌ | split actors | ✅ built in |
| Per-run fee | n/a | $0.005 to $0.01 | **none** |
| Coverage | n/a | often 3 to 6 separate actors | **8 modes, one actor** |

### Scraping modes

Set `mode`, then paste your input in `urls` (app package IDs, Play Store URLs, developer IDs, or search keywords depending on the mode).

#### 📱 app-details: full record for one or more apps

```json
{ "mode": "app-details", "urls": ["com.whatsapp", "com.spotify.music"], "country": "us" }
````

#### 📝 reviews: uncapped review history

```json
{ "mode": "reviews", "urls": ["com.whatsapp"], "maxResults": 2000, "country": "us", "sinceDate": "2026-01-01" }
```

`maxResults` is the cap per app (default 1000). Set it to `0` to pull every available review.

#### 🔍 search: find apps by keyword

```json
{ "mode": "search", "urls": ["habit tracker", "vpn"], "country": "us" }
```

#### 🏆 top-charts: ranked apps by category

```json
{ "mode": "top-charts", "category": "COMMUNICATION", "country": "us", "maxResults": 100 }
```

Leave `category` empty for the all-apps chart.

#### 🗂️ developer-portfolio: every app by one developer

```json
{ "mode": "developer-portfolio", "urls": ["5700313618786177705", "Spotify AB"], "country": "us" }
```

#### 🔗 similar-apps: the "similar apps" shelf, enriched

```json
{ "mode": "similar-apps", "urls": ["com.google.android.apps.translate"], "maxResults": 20, "country": "us" }
```

#### 🔐 permissions: what an app can access

```json
{ "mode": "permissions", "urls": ["com.whatsapp"], "country": "us" }
```

#### 🛡️ data-safety: declared data collection and sharing

```json
{ "mode": "data-safety", "urls": ["com.spotify.music"], "country": "us" }
```

### How much does Google Play scraper cost?

Pay per result. **$2 per 1,000 results**, the same for every mode, with no per-run fee. The Apify Free plan's $5 monthly credit covers roughly **2,500 results**. The $29/month Starter plan covers about **14,500 results** a month, plus a small compute charge (a few cents per 1,000 for this lightweight HTTP actor).

### Input

```json
{
  "mode": "reviews",
  "urls": ["com.whatsapp"],
  "maxResults": 2000,
  "maxItems": 0,
  "country": "us",
  "language": "en",
  "maxConcurrency": 8,
  "sinceDate": "2026-01-01"
}
```

| Field | Type | Default | Notes |
|---|---|---|---|
| `mode` | string | auto | One of the 8 modes. Auto-detects `app-details` or `search` from the input if omitted. |
| `urls` | string\[] | required | App package IDs, Play Store URLs, developer IDs, or search keywords (depends on mode). |
| `maxResults` | integer | mode-aware | Cap per app / query / developer. Reviews default 1000; `0` means unlimited. |
| `maxItems` | integer | 0 | Optional global cap across the whole run. `0` means no global cap. |
| `country` | string | `us` | Two-letter country code. |
| `language` | string | `en` | Language code. |
| `countries` | string\[] | - | Optional: run across several countries at once. |
| `maxConcurrency` | integer | 8 | Parallel requests, 1 to 15. |
| `sortBy` | integer | 2 | Reviews only: 2 newest, 1 most relevant, 3 by rating. |
| `sinceDate` | string | - | Reviews only: stop at reviews older than this date. |
| `category` | string | - | Top charts only: a Google Play category like `GAME` or `COMMUNICATION`. |

### Output

Every row carries a `_recordType` so you can filter mixed runs. Representative shapes:

**app-details**

```json
{
  "_recordType": "app-detail",
  "packageId": "com.whatsapp",
  "name": "WhatsApp Messenger",
  "developer": "WhatsApp LLC",
  "developerEmail": "android@support.whatsapp.com",
  "rating": 4.671647,
  "ratingCount": 235826556,
  "ratingHistogram": { "1": 8409672, "2": 2657036, "3": 7468899, "4": 20886664, "5": 196404234 },
  "installs": "10,000,000,000+",
  "installsExact": 10000000000,
  "price": 0, "free": true, "offersIAP": true,
  "category": "Communication", "contentRating": "Everyone",
  "updatedOn": "2026-05-26T11:00:22.000Z",
  "icon": "https://play-lh.googleusercontent.com/...",
  "similarApps": ["com.google.android.youtube", "com.facebook.orca", "com.snapchat.android"],
  "url": "https://play.google.com/store/apps/details?id=com.whatsapp"
}
```

**reviews** (`replyText` and `replyDate` are `null` when the developer hasn't replied)

```json
{
  "_recordType": "review",
  "reviewId": "045b1b4e-b207-40f7-8a9e-d4e81664965e",
  "packageId": "com.instagram.android",
  "rating": 1,
  "userName": "Logan Chesley",
  "text": "The new update is so buggy...",
  "date": "2026-05-29T18:22:10.000Z",
  "thumbsUp": 14,
  "appVersion": "421.0.0.0.0",
  "replyText": null,
  "replyDate": null
}
```

**top-charts**

```json
{
  "_recordType": "chart-entry",
  "category": "COMMUNICATION", "rank": 1,
  "packageId": "com.enflick.android.TextNow",
  "name": "TextNow: Call + Text Unlimited",
  "developer": "TextNow, Inc.",
  "rating": 4.574007, "price": 0, "free": true,
  "url": "https://play.google.com/store/apps/details?id=com.enflick.android.TextNow"
}
```

**data-safety**

```json
{
  "_recordType": "data-safety",
  "packageId": "com.spotify.music",
  "dataShared": [
    { "category": "Location", "type": "Approximate location", "purpose": "Analytics, Advertising or marketing" }
  ],
  "dataCollected": [
    { "category": "Personal info", "type": "Email address", "purpose": "App functionality" }
  ],
  "securityPractices": ["Data is encrypted in transit", "You can request that data be deleted"]
}
```

**permissions**

```json
{
  "_recordType": "permission-group",
  "packageId": "com.whatsapp",
  "group": "Device & app history",
  "permissions": ["retrieve running apps"]
}
```

The `search`, `developer-portfolio`, and `similar-apps` modes share one flat `app-summary` shape (package ID, name, developer, rating, price, icon, URL).

### Use cases

- 📊 **App store market research**: compare ratings, installs, and pricing across competitors at scale.
- 💬 **Review sentiment analysis**: pull thousands of reviews to track what users love or hate by version.
- 🏆 **Rank and ASO tracking**: watch category top charts and your competitors' positions over time.
- 🔍 **Competitive intelligence**: map a rival developer's entire catalog and their similar-app neighborhood.
- 🛡️ **Privacy and compliance audits**: collect the Data safety section and permissions for app vetting.
- 🧲 **Developer lead generation**: surface developer names and contact emails from app listings.
- 📈 **Release monitoring**: track what's-new notes and update dates to catch competitor releases.
- 🧪 **Due diligence**: snapshot an app's rating history, install tier, and IAP range before an acquisition.

### Limitations

- **Search returns about 30 results per query.** That is Google Play's own web limit; there is no deeper paging.
- **Top-chart shelf labels are generic.** The ranked apps and their ranks are exact, but Google's category pages don't cleanly tag each shelf as free vs. paid vs. grossing.
- **Some fields are blank when Google omits them.** Apps marked "Varies with device" have no fixed version; apps without a promo video or developer address return those fields empty. Present data is never dropped.
- **A bad package ID becomes an error row,** not a crash. The run finishes and the rest of your input still scrapes.
- **Public data only.** This actor reads what a logged-out visitor sees; no install-count history or revenue estimates.

### FAQ

#### How much does Google Play scraper cost?

Google Play scraper uses pay-per-result pricing. You pay **$2 for 1,000 results**. The Apify Free plan gives you $5 in usage credits a month, enough for around 2,500 results. If you run regularly, the $29/month Starter plan covers about 14,500 results.

No subscription lock-in. Pause whenever.

#### Is it legal to scrape Google Play?

Scraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data covered by GDPR or CCPA without a lawful basis. This actor only touches publicly accessible pages, but how you use the output is on you.

Apify's full breakdown: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

#### Can I integrate Google Play scraper with other tools?

Push results into **Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive**, and more. Apify treats every actor as a webhook source, so anything that consumes webhooks or pulls from an API works.

Full list: [Apify integrations](https://docs.apify.com/platform/integrations).

#### Can I use Google Play scraper with the Apify API?

Yes. Every run is available via the Apify REST API:

```bash
curl -X POST "https://api.apify.com/v2/acts/sourabhbgp~google-play-scraper/runs?token=APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "app-details", "urls": ["com.whatsapp"]}'
```

Docs: [Apify API reference](https://docs.apify.com/api/v2).

#### Can I use Google Play scraper through an MCP Server?

Yes. Apify ships an MCP server that exposes every actor as a tool, so Claude Desktop, Cursor, and any other MCP-capable client can call Google Play scraper. Setup: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

### Your feedback

Bug, missing field, or odd behavior? Drop a note in the [Issues tab](https://console.apify.com/actors/Ni5XHNT94LjhAf7ys/issues). Reports go to a human and fixes usually ship the same week.

# Actor input Schema

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

Pick exactly one. If left blank, search keywords auto-detect to search and package ids auto-detect to app details.

## `urls` (type: `array`):

Entry list, interpreted per mode. For app-details, reviews, similar-apps, permissions, data-safety: package ids ("com.whatsapp") or app URLs. For search: keywords or search URLs. For developer-portfolio: developer ids or developer URLs. Not used by top-charts.

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

Per-unit cap: per app for reviews, per query for search, per category for top-charts, per developer for developer-portfolio, per source for similar-apps. Not used by app-details, permissions, or data-safety (one record per app). Leave blank for mode-aware defaults: reviews 1000, search 50, top-charts 100, developer-portfolio 100, similar-apps 20. Set 0 for no per-unit cap.

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

Global cap on total results across the whole run. 0 or empty means no global cap.

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

Two-letter language code. Example: "en", "de", "es".

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

Two-letter country code. Example: "us", "gb", "in".

## `countries` (type: `array`):

Multiple two-letter country codes. Takes precedence over the single Country field when set.

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

Parallel requests. Range 1 to 15.

## `sortBy` (type: `integer`):

Reviews mode only. 2 = newest (default), 1 = most relevant, 3 = rating.

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

Reviews mode only. ISO date cutoff; reviews older than this stop the per-app pull (sound only with newest-first sort).

## `chartType` (type: `string`):

Top-charts mode only. Example: "topselling\_free". Leave blank for all shelves.

## `category` (type: `string`):

Top-charts mode only. Example: "COMMUNICATION", "GAME". Use "APPLICATION" or leave blank for the top-level chart.

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

Proxy settings. Defaults to Apify Proxy with datacenter then residential escalation.

## Actor input object example

```json
{
  "mode": "app-details",
  "urls": [
    "com.whatsapp"
  ],
  "maxItems": 0,
  "language": "en",
  "country": "us",
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Scraped Google Play data.

# 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": "app-details",
    "urls": [
        "com.whatsapp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sourabhbgp/google-play-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": "app-details",
    "urls": ["com.whatsapp"],
}

# Run the Actor and wait for it to finish
run = client.actor("sourabhbgp/google-play-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": "app-details",
  "urls": [
    "com.whatsapp"
  ]
}' |
apify call sourabhbgp/google-play-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Scraper - Apps, Reviews, Charts & More",
        "description": "Scrape Google Play app details, uncapped reviews, keyword search, top charts, developer portfolios, permissions, and data safety in one actor. Flat $2 per 1,000 results, every country and language.",
        "version": "0.1",
        "x-build-id": "oLCd4Y4A2ZaYznVIZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sourabhbgp~google-play-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sourabhbgp-google-play-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/sourabhbgp~google-play-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sourabhbgp-google-play-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/sourabhbgp~google-play-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sourabhbgp-google-play-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": "Mode",
                        "enum": [
                            "app-details",
                            "reviews",
                            "search",
                            "top-charts",
                            "developer-portfolio",
                            "similar-apps",
                            "permissions",
                            "data-safety"
                        ],
                        "type": "string",
                        "description": "Pick exactly one. If left blank, search keywords auto-detect to search and package ids auto-detect to app details."
                    },
                    "urls": {
                        "title": "URLs, package ids, or keywords",
                        "type": "array",
                        "description": "Entry list, interpreted per mode. For app-details, reviews, similar-apps, permissions, data-safety: package ids (\"com.whatsapp\") or app URLs. For search: keywords or search URLs. For developer-portfolio: developer ids or developer URLs. Not used by top-charts.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results per unit",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Per-unit cap: per app for reviews, per query for search, per category for top-charts, per developer for developer-portfolio, per source for similar-apps. Not used by app-details, permissions, or data-safety (one record per app). Leave blank for mode-aware defaults: reviews 1000, search 50, top-charts 100, developer-portfolio 100, similar-apps 20. Set 0 for no per-unit cap."
                    },
                    "maxItems": {
                        "title": "Max items (global)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Global cap on total results across the whole run. 0 or empty means no global cap.",
                        "default": 0
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter language code. Example: \"en\", \"de\", \"es\".",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code. Example: \"us\", \"gb\", \"in\".",
                        "default": "us"
                    },
                    "countries": {
                        "title": "Countries (optional)",
                        "type": "array",
                        "description": "Multiple two-letter country codes. Takes precedence over the single Country field when set.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Parallel requests. Range 1 to 15.",
                        "default": 8
                    },
                    "sortBy": {
                        "title": "Reviews sort (optional)",
                        "type": "integer",
                        "description": "Reviews mode only. 2 = newest (default), 1 = most relevant, 3 = rating."
                    },
                    "sinceDate": {
                        "title": "Reviews since date (optional)",
                        "type": "string",
                        "description": "Reviews mode only. ISO date cutoff; reviews older than this stop the per-app pull (sound only with newest-first sort)."
                    },
                    "chartType": {
                        "title": "Chart type (optional)",
                        "type": "string",
                        "description": "Top-charts mode only. Example: \"topselling_free\". Leave blank for all shelves."
                    },
                    "category": {
                        "title": "Category (optional)",
                        "type": "string",
                        "description": "Top-charts mode only. Example: \"COMMUNICATION\", \"GAME\". Use \"APPLICATION\" or leave blank for the top-level chart."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Defaults to Apify Proxy with datacenter then residential escalation.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
