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

Fetch normalized user reviews from Google Play and the Apple App Store in a single run.

- **URL**: https://apify.com/cleanscrape/app-store-reviews-scraper.md
- **Developed by:** [Clean Scrape](https://apify.com/cleanscrape) (community)
- **Categories:** Automation, Developer tools, SEO tools
- **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 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 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Store & Google Play Reviews Scraper",
        "description": "Fetch normalized user reviews from Google Play and the Apple App Store in a single run.",
        "version": "0.1",
        "x-build-id": "CoXz4wItUktUsgTd9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cleanscrape~app-store-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cleanscrape-app-store-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/cleanscrape~app-store-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-cleanscrape-app-store-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/cleanscrape~app-store-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-cleanscrape-app-store-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 store(s) to fetch reviews from.",
                        "default": "both"
                    },
                    "googlePlayAppId": {
                        "title": "Google Play App ID",
                        "type": "string",
                        "description": "The Android package name, taken from the Google Play URL (?id=...). Example: com.spotify.music"
                    },
                    "appStoreId": {
                        "title": "Apple App Store ID",
                        "type": "string",
                        "description": "The numeric app ID from the App Store URL (the number after /id). Example: 324684580 for Spotify."
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country/storefront code. Example: us, gb, fi, de.",
                        "default": "us"
                    },
                    "language": {
                        "title": "Language (Google Play only)",
                        "type": "string",
                        "description": "Two-letter language code for Google Play reviews. Example: en, fi, de.",
                        "default": "en"
                    },
                    "maxReviews": {
                        "title": "Max reviews per store",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum reviews to fetch from each selected store. Note: the Apple App Store RSS feed caps at ~500.",
                        "default": 200
                    },
                    "sort": {
                        "title": "Sort (Google Play only)",
                        "enum": [
                            "newest",
                            "rating",
                            "helpfulness"
                        ],
                        "type": "string",
                        "description": "Ordering for Google Play reviews. The App Store feed is always most-recent.",
                        "default": "newest"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
