# App Store and Google Play Reviews Scraper, Both Stores (`sourcedirect/app-reviews-scraper`) Actor

Scrape app reviews from Google Play and the Apple App Store together. Paste a store URL or an app ID, pick your countries, get every review with rating, text, version, and developer replies.

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

## Pricing

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

Get app reviews from **both stores in a single run**. Paste a Google Play package name, an App Store ID, or just a store URL from either one, the Actor works out which store each app belongs to.

Most review scrapers make you run one Actor for Google Play and a different one for the App Store, then stitch the two exports together yourself. This one returns both in one dataset, with the same column names for both stores.

***

### What you get

| Field | Description |
|---|---|
| `store` | `play` or `apple` |
| `appName` / `appId` / `developer` | Which app the review belongs to |
| `country` | Storefront the review was read from |
| `rating` | Star rating, 1 to 5 |
| `title` | Review headline (App Store; Google Play reviews have no title) |
| `text` | The review itself |
| `userName` | Reviewer's display name |
| `postedAt` | When it was posted |
| `appVersion` | Version the review was left against |
| `thumbsUp` | Helpful votes |
| `replyText` / `repliedAt` | The developer's public reply (Google Play) |
| `appUrl` / `reviewUrl` | Links back to the store |

### Input

```json
{
  "apps": [
    "com.spotify.music",
    "https://apps.apple.com/us/app/spotify/id324684580"
  ],
  "countries": ["us", "gb", "de"],
  "language": "en",
  "maxReviewsPerApp": 500,
  "sort": "newest"
}
```

- **`apps`**, package names, App Store IDs, or full store URLs, mixed freely.
- **`countries`**, storefronts to read. See the note below on why this matters more for the App Store.
- **`maxReviewsPerApp`**, `0` means no limit. Popular apps have millions of reviews, so keep a limit while testing.
- **`sort`**, newest, by rating, or most helpful. Google Play only.

### How deep it goes

- **Google Play** paginates until the store runs out. In testing it returned 5,000 reviews for Spotify in under 7 seconds, and the pagination had not finished. Set `maxReviewsPerApp` to `0` if you genuinely want everything.
- **The App Store** is different, and it is worth knowing before you run it: Apple's public review feed returns **50 reviews per storefront**, and there is no second page. That is Apple's limit, not the Actor's. The way to get more Apple reviews is to list more countries, each storefront has its own 50. Querying 20 countries gets you up to 1,000 Apple reviews for an app.

Reviews are de-duplicated across countries, so you are never billed twice for the same review.

### What it costs

$0.75 per 1,000 reviews. You are charged for reviews actually returned, with no monthly fee, no per-run start fee, and no separate charge for compute or proxies.

Comparable review scrapers on the store charge $1.00 to $1.50 per 1,000, and several add a per-run fee on top. This Actor needs no proxies to work, which is why it can be cheaper.

### Common uses

- **Track a release**, filter by `appVersion` and `postedAt` to see whether ratings moved after a launch.
- **Competitor research**, pull a rival's one and two star reviews and read what their users complain about.
- **Support triage**, find reviews that never got a developer reply.
- **Localisation checks**, compare ratings and complaints across storefronts.

### Notes and limits

- Not every app is published in every storefront. An empty result for a country is a real answer, not a failure, and the run summary records what came from where.
- Google Play review text is returned in the language you request; the App Store returns each storefront's own reviews.
- Both stores are read through their public interfaces. No login, and nothing private is accessed.

# Actor input Schema

## `apps` (type: `array`):

One or more apps, from either store. You can paste anything: a Google Play package name (`com.spotify.music`), an App Store ID (`324684580`), or a full store URL from either store. The Actor works out which store each one belongs to.

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

Two-letter country codes for the storefronts to read, e.g. `us`, `gb`, `de`, `jp`. **This matters more on the App Store**, where Apple's public feed returns 50 reviews per country, so adding countries is how you get more Apple reviews. Google Play paginates fully in each country.

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

Two-letter language code for Google Play, e.g. `en`, `de`, `pt`. Ignored for the App Store, which returns each storefront's own reviews.

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

Stop after this many reviews for each app. Set to 0 for no limit. Popular apps have millions of reviews, so set a limit while you are testing.

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

Which reviews to read first. Google Play only; the App Store feed is always most recent first.

## `delayBetweenPages` (type: `number`):

Politeness delay between requests. 0 is fine for normal jobs.

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music",
    "https://apps.apple.com/us/app/spotify/id324684580"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "maxReviewsPerApp": 200,
  "sort": "newest",
  "delayBetweenPages": 0
}
```

# Actor output Schema

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

Every review found, one row per review, de-duplicated across countries.

## `reviewsCsv` (type: `string`):

The same reviews as a CSV download.

## `summary` (type: `string`):

Per-app counts, the countries queried, and anything that failed.

# 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 = {
    "apps": [
        "com.spotify.music",
        "https://apps.apple.com/us/app/spotify/id324684580"
    ],
    "countries": [
        "us"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("sourcedirect/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 '{
  "apps": [
    "com.spotify.music",
    "https://apps.apple.com/us/app/spotify/id324684580"
  ],
  "countries": [
    "us"
  ]
}' |
apify call sourcedirect/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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