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

Scrape App Store and Google Play reviews in one run. One normalized schema for both stores: ratings, text, author, date, app version, and developer replies.

- **URL**: https://apify.com/cleanscrape/app-store-reviews-scraper.md
- **Developed by:** [CleanScrape](https://apify.com/cleanscrape) (community)
- **Categories:** Automation, Developer tools, AI
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 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 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 Store & Google Play Reviews Scraper API

**One reliable scraper for both stores.** Pull user reviews from Google Play and the Apple App Store into a single, identical schema — in one run.

Built to keep working: no proxies, no headless browsers. Just the maintained `google-play-scraper` library and Apple's official customer-reviews RSS feed. Fewer moving parts means fewer silent failures — so your pipeline doesn't break the next time a store redesigns its page.

### Why pick this over a cheaper single-store scraper

- **Two stores, one schema.** The same fields for Google Play *and* Apple — `source`, `rating`, `title`, `text`, `userName`, `date`, `appVersion`, `developerReply`, `country`, `url` — so you compare and merge reviews without writing any mapping code.
- **Stable by design.** Runs on officially-maintained, documented sources, not fragile HTML scraping that fails on every store update.
- **Honest and predictable.** Clear limits (see below), consistent output, and fixes shipped quickly when something changes.
- **Fair, all-in price.** $0.20 per 1,000 reviews, pay only for what you pull. No subscription, no minimum.

### What you get

Every review is returned with the same fields, whichever store it came from:

| Field | Description |
|-------|-------------|
| `source` | `google_play` or `app_store` |
| `appId` | The app identifier you provided |
| `rating` | Star rating (1–5) |
| `title` | Review title (App Store; empty for Google Play) |
| `text` | Review body |
| `userName` | Reviewer name |
| `date` | Review date, UTC ISO-8601 (Google Play; see Limitations for App Store) |
| `appVersion` | App version reviewed |
| `thumbsUp` | Helpful votes |
| `developerReply` | Developer's reply text, if any (Google Play) |
| `developerReplyDate` | Developer reply date, if any (Google Play) |
| `country` | Storefront country code |
| `language` | Review language (Google Play) |
| `url` | Link to the app listing |

### Input

| Field | Required | Description |
|-------|----------|-------------|
| `store` | – | `both`, `google_play`, or `app_store` (default `both`) |
| `googlePlayAppId` | for Google Play | Package name from the Play URL, e.g. `com.spotify.music` |
| `appStoreId` | for App Store | Numeric ID from the App Store URL, e.g. `324684580` |
| `country` | – | Two-letter storefront code, e.g. `us`, `gb`, `fi` (default `us`) |
| `language` | – | Two-letter code for Google Play reviews (default `en`) |
| `maxReviews` | – | Max reviews per store (default `200`) |
| `sort` | – | Google Play ordering: `newest`, `rating`, `helpfulness` |

#### How to find the app IDs

- **Google Play**: open the app's page, copy the value after `?id=` in the URL.
- **App Store**: open the app's page, copy the number after `/id` in the URL.

### Example output

A Google Play review:

```json
{
  "source": "google_play",
  "appId": "com.spotify.music",
  "rating": 5,
  "title": null,
  "text": "Great for discovering new music.",
  "userName": "A. User",
  "date": "2026-07-01T09:14:00+00:00",
  "appVersion": "9.0.12.567",
  "thumbsUp": 3,
  "developerReply": null,
  "country": "us",
  "language": "en",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
}
```

An App Store review (same schema):

```json
{
  "source": "app_store",
  "appId": "324684580",
  "rating": 4,
  "title": "Solid but battery-hungry",
  "text": "Love it, but it drains my phone.",
  "userName": "reviewer_42",
  "date": null,
  "appVersion": "9.1.60",
  "thumbsUp": 0,
  "developerReply": null,
  "country": "us",
  "language": null,
  "url": "https://apps.apple.com/us/app/id324684580"
}
```

### FAQ

**Is scraping app reviews allowed?** The data comes from Google Play and Apple's public review listings (Apple via its official RSS feed). Use it responsibly and in line with each store's terms and your local laws.

**How fresh is the data?** Reviews are fetched live at run time, newest first.

**How many App Store reviews can I get?** Apple's public RSS feed serves roughly the 500 most-recent reviews per country. To go deeper, run additional `country` storefronts. Google Play paginates to far more.

**Why is `date` empty for App Store rows?** Apple's reviews feed doesn't expose per-review timestamps. Google Play rows include full dates. (Apple dates are on the roadmap — request it if you need them.)

**Can I run it on a schedule?** Yes — save it as a task and attach a schedule for recurring runs.

### Common uses

- Track product feedback and bugs across both stores in one dataset.
- Monitor a competitor app's reviews and version-specific complaints.
- Feed reviews into sentiment/theme analysis or a support workflow.

### Limitations

- **App Store:** Apple's RSS feed returns roughly the **500 most-recent** reviews per country (newest first) and does **not** include per-review timestamps, so `date` is empty for App Store rows. Run multiple `country` storefronts for more coverage.
- **Google Play** returns full dates and paginates to far more reviews.

# Actor input Schema

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

Which store(s) to fetch reviews from.

## `googlePlayAppId` (type: `string`):

The Android package name, taken from the Google Play URL (?id=...). Example: com.spotify.music

## `appStoreId` (type: `string`):

The numeric app ID from the App Store URL (the number after /id). Example: 324684580 for Spotify.

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

Two-letter country/storefront code. Example: us, gb, fi, de.

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

Two-letter language code for Google Play reviews. Example: en, fi, de.

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

Maximum reviews to fetch from each selected store. Note: the Apple App Store RSS feed caps at ~500.

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

Ordering for Google Play reviews. The App Store feed is always most-recent.

## Actor input object example

```json
{
  "store": "both",
  "googlePlayAppId": "com.spotify.music",
  "appStoreId": "324684580",
  "country": "us",
  "language": "en",
  "maxReviews": 200,
  "sort": "newest"
}
```

# Actor output Schema

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

All fetched reviews as dataset items.

# 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 = {
    "googlePlayAppId": "com.spotify.music",
    "appStoreId": "324684580"
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanscrape/app-store-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 = {
    "googlePlayAppId": "com.spotify.music",
    "appStoreId": "324684580",
}

# Run the Actor and wait for it to finish
run = client.actor("cleanscrape/app-store-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 '{
  "googlePlayAppId": "com.spotify.music",
  "appStoreId": "324684580"
}' |
apify call cleanscrape/app-store-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fdiEOHRcllt4nh4W3/builds/CoXz4wItUktUsgTd9/openapi.json
