# App Store & Google Play Reviews Scraper (`logiover/app-reviews-scraper`) Actor

Scrape thousands of user reviews from the Apple App Store and Google Play by app ID or name. Ratings, text, versions, developer replies, sentiment. For ASO, sentiment analysis & market research. No API key.

- **URL**: https://apify.com/logiover/app-reviews-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## App Store & Google Play Reviews Scraper

**Scrape thousands of user reviews from the Apple App Store and Google Play** — by app ID or app name — and export them to Excel, CSV, or JSON. Pull star ratings, full review text, review titles, app versions, up-votes, developer replies, and derived sentiment for **App Store Optimization (ASO), sentiment analysis, competitor research, and product feedback mining**. No API key, no login, no scraping headaches.

This Actor is built for **the review corpus itself** — not just app metadata or top-chart rankings. Point it at any app (yours or a competitor's) and walk away with a clean, structured dataset of what real users are saying, ready for analysis.

---

### What this Actor does

- Collects **user reviews** from both major app stores in one run:
  - **Google Play** — deep, reliable pagination pulls **thousands of reviews per popular app**.
  - **Apple App Store** — the public customer-reviews feed, swept across multiple storefronts (US, UK, CA, AU, …) to maximize volume.
- Accepts **app package names** (Google Play, e.g. `com.spotify.music`), **numeric Apple track IDs** (e.g. `324684580`), or a plain **app-name search** (e.g. `Duolingo`) that is resolved automatically on each store.
- Returns **rich, analysis-ready rows**: rating (as a real number 1–5), title, text, helpful votes, app version, review date (ISO 8601), developer reply, and an auto-derived **sentiment** label.
- Runs with **completely empty input** — a bare run returns **1,000+ reviews** across a set of hugely-popular apps so you can see the output shape instantly.
- Ships with a **time budget** and **automatic Apify Proxy + direct-connection fallback**, so large jobs stay fast, cheap, and resilient.

---

### Use cases

- **App Store Optimization (ASO)** — mine the exact language users use in reviews to inform your keywords, title, and description. Track how ratings and sentiment shift after each release.
- **Sentiment analysis** — feed the review text and derived sentiment into your own NLP / LLM pipeline to quantify user happiness over time and by app version.
- **Competitor research** — scrape a competitor's reviews to find what their users love, hate, and beg for. Spot their weaknesses before your next release.
- **Feature-request & pain-point discovery** — surface recurring complaints, crashes, and requested features straight from the people who use the app daily.
- **Product & CX teams** — build a searchable archive of customer voice across both stores and every storefront, complete with developer-reply tracking.
- **Market & investment research** — gauge reception of any consumer app at scale, across countries and languages, without touching an official API.
- **Reputation monitoring** — schedule the Actor to run daily and alert on drops in rating or spikes in negative sentiment.

---

### Input

Every field is **optional**. Run the Actor with an empty input `{}` and it will scrape reviews for a set of hugely-popular apps (WhatsApp, Instagram, Spotify, TikTok, Netflix) so you always get data back.

| Field | Type | Description |
|-------|------|-------------|
| `store` | select | Which store(s) to scrape: **Both** (default), **Google Play only**, or **Apple App Store only**. |
| `appIds` | list of strings | Apps to scrape. Use the **Google Play package name** (`com.spotify.music`) for Google Play and the **numeric Apple track ID** (`324684580`) for the App Store. You can mix both in one list — package names route to Google Play, numeric IDs route to the App Store. Leave empty to use popular defaults. |
| `appQuery` | string | Optionally resolve an app **by name** (e.g. `Duolingo`) instead of an ID. The top match on each selected store is scraped. Combined with any `appIds` above. |
| `country` | select | Primary storefront / region. Sets the Google Play country and the main App Store storefront. Default `United States`. |
| `language` | select | Language for Google Play reviews (ISO 639-1). Default `English`. |
| `sort` | select | **Most recent** (default), **Most helpful**, or **Highest rating** (Google Play). The App Store maps "Most helpful" to its *Most Helpful* feed. |
| `maxReviews` | integer | Maximum total reviews to collect across all apps and stores. Default **1000**. Raise it to pull more; large jobs are bounded by a ~4-minute time budget. |
| `appleCountries` | list of strings | *Advanced.* Explicit App Store storefront codes to sweep (e.g. `["us","gb","ca","au","de"]`). Each storefront exposes up to ~500 reviews per app, so more storefronts = more App Store volume. Leave empty for sensible defaults. |
| `proxy` | proxy | Apify Proxy configuration. Automatic proxy is recommended; the App Store fetcher also falls back to a direct connection if a proxy IP fails. |

#### Example inputs

**1. Bare run (returns 1,000+ reviews across popular apps):**
```json
{}
````

**2. One specific app on both stores, up to 5,000 reviews:**

```json
{
  "appIds": ["com.spotify.music", "324684580"],
  "maxReviews": 5000,
  "sort": "newest"
}
```

**3. Resolve an app by name, Google Play only, Spanish reviews from Mexico:**

```json
{
  "store": "google_play",
  "appQuery": "Duolingo",
  "country": "mx",
  "language": "es",
  "maxReviews": 2000
}
```

**4. Apple App Store only, swept across five big storefronts:**

```json
{
  "store": "app_store",
  "appIds": ["389801252"],
  "appleCountries": ["us", "gb", "ca", "au", "de"],
  "maxReviews": 2000
}
```

***

### Output

Each row is a single review. Open the **Dataset** tab to browse, filter, and export as **CSV, JSON, Excel, HTML, or XML**. Numeric fields are stored as **real numbers** so you can sort and aggregate them directly.

| Field | Type | Description |
|-------|------|-------------|
| `appId` | string | Google Play package name or Apple track ID the review belongs to. |
| `appName` | string | Human-readable app name. |
| `store` | string | `google_play` or `app_store`. |
| `country` | string | Storefront / country code the review was pulled from. |
| `reviewId` | string | Unique identifier of the review within its store. |
| `userName` | string | Display name of the reviewer. |
| `rating` | number | Star rating from **1 to 5**. |
| `title` | string | Review title / headline (App Store; usually empty on Google Play). |
| `text` | string | Full body text of the review. |
| `thumbsUp` | number | Up-votes / helpful votes on the review. |
| `helpfulCount` | number | Helpful-vote count (mirrors up-votes). |
| `reviewCreatedVersion` | string | App version the review was written against, when available. |
| `appVersion` | string | App version associated with the review. |
| `reviewDate` | string | When the review was posted / last updated (ISO 8601). |
| `developerReplyText` | string | The developer's reply text, when present (Google Play). |
| `developerReplyDate` | string | Date of the developer's reply (ISO 8601), when present. |
| `sentiment` | string | Auto-derived from the rating: **positive** (4–5), **neutral** (3), **negative** (1–2). |
| `url` | string | Link to the review or reviewer profile. |

#### Sample output

```json
[
  {
    "appId": "com.spotify.music",
    "appName": "Spotify: Music and Podcasts",
    "store": "google_play",
    "country": "us",
    "reviewId": "abc247bd-ae0f-465d-be60-fcaff9763042",
    "userName": "Jordan M.",
    "rating": 5,
    "title": null,
    "text": "Best music app out there. The Discover Weekly playlist is scary good.",
    "thumbsUp": 34,
    "helpfulCount": 34,
    "reviewCreatedVersion": "8.9.72.609",
    "appVersion": "8.9.72.609",
    "reviewDate": "2026-07-12T07:12:41.980Z",
    "developerReplyText": "Thanks for the love, Jordan! 🎵",
    "developerReplyDate": "2026-07-12T10:03:00.000Z",
    "sentiment": "positive",
    "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=abc247bd-ae0f-465d-be60-fcaff9763042"
  },
  {
    "appId": "324684580",
    "appName": "Spotify: Music and Podcasts",
    "store": "app_store",
    "country": "gb",
    "reviewId": "14292661215",
    "userName": "tunes_lover_88",
    "rating": 2,
    "title": "Shuffle isn't random",
    "text": "Keeps playing the same ten songs. Please fix the shuffle algorithm.",
    "thumbsUp": 0,
    "helpfulCount": 0,
    "reviewCreatedVersion": "8.9.72",
    "appVersion": "8.9.72",
    "reviewDate": "2026-07-11T20:54:50-07:00",
    "developerReplyText": null,
    "developerReplyDate": null,
    "sentiment": "negative",
    "url": "https://itunes.apple.com/gb/reviews/id1803720282"
  }
]
```

***

### Export formats

Everything the Actor collects is stored in a standard Apify **Dataset**, which you can export from the UI or pull via API:

- **Excel (.xlsx)** — one click from the Dataset tab; perfect for slicing reviews in a spreadsheet.
- **CSV** — for BI tools, pandas, or Google Sheets.
- **JSON / JSONL** — for pipelines, LLMs, and data warehouses.
- **HTML / XML / RSS** — for quick sharing and integrations.

You can also fetch the data programmatically:

```
https://api.apify.com/v2/datasets/{datasetId}/items?format=csv
```

***

### Frequently asked questions

#### How do I scrape App Store reviews?

Set `store` to **Apple App Store only** (or **Both**) and add the app's **numeric Apple track ID** to `appIds` — for example `389801252` for Instagram. You can find the ID in the App Store URL (`apps.apple.com/app/id389801252`) or just use the `appQuery` field with the app's name and let the Actor resolve it. The Actor pulls reviews from the public customer-reviews feed and can sweep multiple storefronts to gather more.

#### How do I scrape Google Play reviews?

Set `store` to **Google Play only** (or **Both**) and add the app's **package name** to `appIds` — for example `com.spotify.music`. The package name is the `id=` part of the Play Store URL (`play.google.com/store/apps/details?id=com.spotify.music`). The Actor paginates through Google Play and can return thousands of reviews per popular app.

#### Do I need an API key or developer account?

**No.** This Actor uses publicly available review feeds and requires no API key, no OAuth, and no login. Just provide an app ID or name and run it.

#### How do I export Google Play reviews to Excel?

Run the Actor, open the **Dataset** tab, and click **Export → Excel** (`.xlsx`). You'll get a spreadsheet with one review per row and columns for rating, text, date, version, sentiment, and more. CSV and JSON exports are available from the same menu, and via the dataset API URL shown above.

#### How many reviews can I scrape per app?

On **Google Play**, popular apps yield **thousands** of reviews via pagination — set `maxReviews` as high as you need (bounded by a ~4-minute time budget per run; raise it and re-run for very large corpora). On the **App Store**, each storefront exposes up to roughly **500 reviews per app**, so add more `appleCountries` to multiply the volume for a single app.

#### Can I scrape reviews for a competitor's app?

Yes. The Actor works on **any public app** on either store. Add the competitor's package name or Apple ID (or search by name with `appQuery`) to build a dataset of their user reviews for competitive and feature-gap analysis.

#### How do I get reviews in a specific country or language?

Use the `country` dropdown to pick the storefront/region and the `language` dropdown for Google Play review language. For the App Store, use `appleCountries` to target one or more specific storefronts (each country has its own reviews).

#### How is the sentiment field calculated?

`sentiment` is derived directly from the star rating for a fast, dependency-free signal: **positive** for 4–5 stars, **neutral** for 3 stars, and **negative** for 1–2 stars. For deeper, text-based sentiment or topic modeling, feed the `text` field into your own NLP/LLM step — the raw review text is included in every row.

#### Why do App Store review counts vary between runs?

Apple's public review feed is paginated and can return sparse or shifting pages depending on the storefront and time of day. The Actor handles this gracefully (it never stops on an empty page and sweeps multiple storefronts). For the highest, most consistent volume on a single app, **Google Play** is the more reliable source, and adding `appleCountries` increases App Store coverage.

***

### Tips for best results

- **Want maximum volume for one app?** Use **Both** stores, add several `appleCountries`, and raise `maxReviews`.
- **Building a sentiment dashboard?** Sort by `newest` and schedule a daily run to append fresh reviews.
- **Doing ASO keyword mining?** Export to CSV and run keyword frequency on the `text` and `title` columns.
- **Large jobs:** each run stops after ~4 minutes and saves everything collected; for tens of thousands of reviews, run per-app or increase memory and re-run.

***

### Related Actors

Looking for more app-market intelligence? Explore the rest of the suite:

- **Google Play Store Scraper** — app metadata, ratings, installs, and category charts.
- **App Store Scraper** — App Store app details, pricing, and top-chart rankings.
- **Google Play Search Scraper** — discover apps by keyword and category.
- **App Reviews Scraper** *(this Actor)* — the review corpus itself, across both stores.

***

*Reviews are scraped from publicly available feeds for research, analytics, and ASO. Please use the data responsibly and in line with the app stores' terms and applicable laws.*

# Actor input Schema

## `store` (type: `string`):

Which app store(s) to scrape reviews from.

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

One or more apps to scrape. Use the Google Play package name (e.g. 'com.spotify.music') for Google Play and the numeric Apple track ID (e.g. '324684580') for the App Store. You can mix both — Google package names are routed to Google Play and numeric IDs to the App Store. Leave empty to scrape a set of hugely-popular apps.

## `appQuery` (type: `string`):

Optionally resolve an app by name instead of an ID (e.g. 'Duolingo'). The top matching app on each selected store is scraped. Combined with any App IDs above.

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

Primary storefront and language region. Controls the Google Play country and the main App Store storefront. For empty/broad runs the App Store also sweeps several large English storefronts to maximise review volume.

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

Language for Google Play reviews (ISO 639-1). Defaults to English.

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

Order in which reviews are fetched. 'Most recent' returns the newest reviews first; 'Most helpful' surfaces reviews with the most up-votes (App Store maps this to its 'Most Helpful' feed).

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

Maximum total number of reviews to collect across all apps and stores (default 1000). Raise it to pull more; the run is bounded by a ~4 minute time budget for very large jobs.

## `appleCountries` (type: `array`):

Advanced: explicit list of App Store storefront codes to sweep for reviews (e.g. \['us','gb','ca','au','de']). Each storefront exposes up to ~500 reviews per app, so adding storefronts multiplies App Store volume. Leave empty to use sensible defaults.

## `proxy` (type: `object`):

Apify Proxy configuration. Automatic proxy works well; the App Store fetcher also falls back to a direct connection if a proxy IP fails.

## Actor input object example

```json
{
  "store": "both",
  "appIds": [
    "com.spotify.music",
    "324684580"
  ],
  "country": "us",
  "language": "en",
  "sort": "newest",
  "maxReviews": 1000,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All reviews collected by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "appIds": [
        "com.spotify.music",
        "324684580"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/app-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 = {
    "appIds": [
        "com.spotify.music",
        "324684580",
    ],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/app-reviews-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 '{
  "appIds": [
    "com.spotify.music",
    "324684580"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call logiover/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store & Google Play Reviews Scraper",
        "description": "Scrape thousands of user reviews from the Apple App Store and Google Play by app ID or name. Ratings, text, versions, developer replies, sentiment. For ASO, sentiment analysis & market research. No API key.",
        "version": "1.0",
        "x-build-id": "IfsJvD3Q26gjqUmMc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~app-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-app-reviews-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/logiover~app-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-app-reviews-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/logiover~app-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-app-reviews-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": {
                    "store": {
                        "title": "Store",
                        "enum": [
                            "both",
                            "google_play",
                            "app_store"
                        ],
                        "type": "string",
                        "description": "Which app store(s) to scrape reviews from.",
                        "default": "both"
                    },
                    "appIds": {
                        "title": "App IDs / package names",
                        "type": "array",
                        "description": "One or more apps to scrape. Use the Google Play package name (e.g. 'com.spotify.music') for Google Play and the numeric Apple track ID (e.g. '324684580') for the App Store. You can mix both — Google package names are routed to Google Play and numeric IDs to the App Store. Leave empty to scrape a set of hugely-popular apps.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appQuery": {
                        "title": "App search query (optional)",
                        "type": "string",
                        "description": "Optionally resolve an app by name instead of an ID (e.g. 'Duolingo'). The top matching app on each selected store is scraped. Combined with any App IDs above."
                    },
                    "country": {
                        "title": "Country / storefront",
                        "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "in",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "br",
                            "mx",
                            "jp",
                            "kr",
                            "ru",
                            "tr",
                            "id",
                            "ph",
                            "th",
                            "vn",
                            "sa",
                            "ae",
                            "za",
                            "ng",
                            "pl",
                            "se",
                            "no",
                            "dk",
                            "fi",
                            "pt",
                            "ie",
                            "nz",
                            "sg",
                            "hk",
                            "tw",
                            "ar",
                            "cl",
                            "co"
                        ],
                        "type": "string",
                        "description": "Primary storefront and language region. Controls the Google Play country and the main App Store storefront. For empty/broad runs the App Store also sweeps several large English storefronts to maximise review volume.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "nl",
                            "ru",
                            "tr",
                            "ja",
                            "ko",
                            "zh",
                            "ar",
                            "hi",
                            "id",
                            "th",
                            "vi",
                            "pl",
                            "sv",
                            "no",
                            "da",
                            "fi"
                        ],
                        "type": "string",
                        "description": "Language for Google Play reviews (ISO 639-1). Defaults to English.",
                        "default": "en"
                    },
                    "sort": {
                        "title": "Sort reviews by",
                        "enum": [
                            "newest",
                            "helpfulness",
                            "rating"
                        ],
                        "type": "string",
                        "description": "Order in which reviews are fetched. 'Most recent' returns the newest reviews first; 'Most helpful' surfaces reviews with the most up-votes (App Store maps this to its 'Most Helpful' feed).",
                        "default": "newest"
                    },
                    "maxReviews": {
                        "title": "Max reviews",
                        "minimum": 1,
                        "maximum": 200000,
                        "type": "integer",
                        "description": "Maximum total number of reviews to collect across all apps and stores (default 1000). Raise it to pull more; the run is bounded by a ~4 minute time budget for very large jobs.",
                        "default": 1000
                    },
                    "appleCountries": {
                        "title": "App Store storefronts (advanced, optional)",
                        "type": "array",
                        "description": "Advanced: explicit list of App Store storefront codes to sweep for reviews (e.g. ['us','gb','ca','au','de']). Each storefront exposes up to ~500 reviews per app, so adding storefronts multiplies App Store volume. Leave empty to use sensible defaults.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy configuration. Automatic proxy works well; the App Store fetcher also falls back to a direct connection if a proxy IP fails.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
