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

Scrape app reviews from Google Play and the Apple App Store into one unified schema. Bulk apps, multiple countries, rating filters, and monitoring.

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

## Pricing

from $0.20 / 1,000 reviews

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Reviews Scraper — Google Play & Apple App Store

Scrape app reviews from **both** the Apple App Store and Google Play into **one unified schema**.
Paste app URLs, IDs, or search by name; pull reviews across multiple countries with rating filters
and app metadata attached. No login, no API key.

Built for product teams, ASO/marketing, app support, competitor intelligence, and review
sentiment/theme analysis.

### Why this scraper

- **Two stores, one schema** — App Store and Google Play reviews come back as identical rows, so you
  can analyze them together instead of stitching two tools.
- **Bulk & multi-country** — many apps × many countries in a single run. Reviews are country-specific
  on both stores; add countries for wider coverage.
- **Flexible input** — paste App Store / Google Play URLs or IDs (auto-detected), or search by app
  name. Play name-search is title-validated so you don't scrape the wrong same-named app.
- **App metadata included** — title, developer, overall score, and total rating count on every review.
- **Monitoring-ready** — newest-first sorting and per-app resume make scheduled daily runs cheap and
  incremental.
- **Filters** — pull only 1–2★ complaints for support, or 4–5★ for testimonials.

### Input

```json
{
    "appUrls": [
        "https://apps.apple.com/us/app/spotify/id324684580",
        "https://play.google.com/store/apps/details?id=com.spotify.music"
    ],
    "searchTerms": ["notion"],
    "searchStore": "both",
    "countries": ["us", "gb", "de"],
    "sortBy": "newest",
    "maxReviewsPerApp": 200,
    "minRating": 0,
    "maxRating": 5
}
```

| Field | Default | Description |
|---|---|---|
| `appUrls` | — | App Store / Google Play URLs or IDs (numeric = App Store, dotted = Google Play) |
| `searchTerms` | `[]` | App names to resolve to apps instead of URLs |
| `searchStore` | `both` | Resolve search terms on `both`, `appstore`, or `googleplay` |
| `maxAppsPerSearch` | `3` | Top matches to take per search term, per store |
| `countries` | `["us"]` | Two-letter country codes |
| `languages` | `["en"]` | Language for Google Play content/metadata |
| `sortBy` | `newest` | `newest`, `rating`, or `mostRelevant` |
| `maxReviewsPerApp` | `200` | Cap per app per country |
| `minRating` / `maxRating` | `0` / `5` | Star-rating filter |
| `includeAppMetadata` | `true` | Attach app title/developer/score to each review |

Provide `appUrls`, `searchTerms`, or both.

### Output

One dataset item per review, identical shape across stores:

```json
{
    "store": "googleplay",
    "appId": "com.spotify.music",
    "appTitle": "Spotify: Music and Podcasts",
    "appDeveloper": "Spotify AB",
    "appScore": 4.34,
    "appRatingCount": 36101607,
    "country": "us",
    "reviewId": "…",
    "author": "Kaz 4life",
    "rating": 1,
    "title": null,
    "text": "…",
    "appVersion": "9.1.72.1891",
    "thumbsUp": 0,
    "date": "2026-08-10T22:27:17.000Z",
    "replyText": null,
    "replyDate": null,
    "scrapedAt": "2026-08-11T22:40:00.000Z"
}
```

App Store rows use the same fields; `title` carries the review headline, `voteSum`/`voteCount`
carry helpfulness, and `date` is null (Apple's public feed omits per-review timestamps — sort by
`newest` returns most-recent-first regardless).

### Pricing

Pay per event — **$0.20 per 1,000 reviews** ($0.0002 per review) plus a negligible actor-start fee
($0.00005 per GB of memory). Platform usage (compute, proxy, storage) is **included**.

| Run | You pay |
|---|---|
| 1 app, newest 200 reviews | $0.04 |
| 10 competitor apps × 500 reviews | ~$1.00 |
| 50 apps × 3 countries × 200 reviews | ~$6.00 |

Set **Maximum total charge** on the run to cap spend; the actor stops cleanly at the cap.

### Use cases

- **Review monitoring** — schedule daily newest-first runs on your apps and competitors.
- **Support triage** — filter to 1–2★ reviews and route them to your helpdesk.
- **ASO & product** — track sentiment and feature requests across versions and countries.
- **Competitor intelligence** — pull a competitor set in one run and compare.
- **AI/sentiment** — feed unified reviews into LLM theme/sentiment pipelines.

### Limitations

- The Apple App Store's public review feed returns at most ~500 recent reviews per country. For more
  history, add more countries. Google Play supports deep pagination (thousands of reviews).
- Apple reviews via the public feed don't include per-review dates; results are still ordered
  newest-first. Google Play reviews include full timestamps.
- Reviews are country-specific; a single country won't contain the whole global review set.

### FAQ

**Do I need an API key or login?** No. Both stores' public endpoints are used.

**Can I get developer replies?** Yes, on Google Play (`replyText`/`replyDate`). Apple's public feed
doesn't expose replies.

**How do I monitor an app daily?** Put its URL in `appUrls`, set `sortBy: newest`, and schedule the
actor from the **Schedules** tab. Per-app resume keeps re-runs efficient.

**What if two apps share a name?** Use the exact store URL/ID for certainty; search results on Google
Play are validated against the query name to avoid mismatches.

# Actor input Schema

## `appUrls` (type: `array`):

Apple App Store URLs (`apps.apple.com/.../id123456789`), Google Play URLs (`play.google.com/store/apps/details?id=com.example`), or bare IDs (numeric = App Store, dotted package = Google Play). The store is detected automatically.

## `searchTerms` (type: `array`):

App names to search for instead of (or in addition to) direct URLs. Each term resolves to the top matching apps on the selected store(s).

## `searchStore` (type: `string`):

Which store(s) to resolve search terms on.

## `maxAppsPerSearch` (type: `integer`):

How many top matches to take from each search term (per store).

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

Two-letter country codes to fetch reviews from (e.g. `us`, `gb`, `de`). Reviews are country-specific on both stores; add more countries for wider coverage.

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

Language code for Google Play review content and metadata (first entry is used, e.g. `en`).

## `sortBy` (type: `string`):

`newest` returns the most recent reviews first (best for monitoring). `rating`/`mostRelevant` surface prominent reviews.

## `maxReviewsPerApp` (type: `integer`):

Cap on reviews fetched for each app in each country. Note: the Apple App Store's public feed returns at most ~500 recent reviews per country.

## `minRating` (type: `integer`):

Only keep reviews with at least this many stars (1–5). Leave at 0 for all.

## `maxRating` (type: `integer`):

Only keep reviews with at most this many stars (1–5).

## `includeAppMetadata` (type: `boolean`):

Attach app title, developer, overall score, and total rating count to every review row.

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

Proxy settings. Apify Proxy (automatic) is recommended for larger runs to avoid rate limits.

## Actor input object example

```json
{
  "appUrls": [
    "https://apps.apple.com/us/app/spotify/id324684580",
    "https://play.google.com/store/apps/details?id=com.spotify.music"
  ],
  "searchStore": "both",
  "maxAppsPerSearch": 3,
  "countries": [
    "us"
  ],
  "languages": [
    "en"
  ],
  "sortBy": "newest",
  "maxReviewsPerApp": 200,
  "minRating": 0,
  "maxRating": 5,
  "includeAppMetadata": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "appUrls": [
        "https://apps.apple.com/us/app/spotify/id324684580",
        "https://play.google.com/store/apps/details?id=com.spotify.music"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sauliusautomatesit/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 = { "appUrls": [
        "https://apps.apple.com/us/app/spotify/id324684580",
        "https://play.google.com/store/apps/details?id=com.spotify.music",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("sauliusautomatesit/app-reviews-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "appUrls": [
    "https://apps.apple.com/us/app/spotify/id324684580",
    "https://play.google.com/store/apps/details?id=com.spotify.music"
  ]
}' |
apify call sauliusautomatesit/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gusIoUPp7pxzVX4CI/builds/4KQEg1dvf6Lmb2cAO/openapi.json
