# App Reviews Scraper: App Store + Google Play in One (`tidyscrape/app-reviews-scraper`) Actor

Get iOS App Store and Google Play reviews in one run with one output format: rating, text, date, app version, developer reply. Full App Store history, many apps, countries and languages, monitoring mode.

- **URL**: https://apify.com/tidyscrape/app-reviews-scraper.md
- **Developed by:** [Alexander Burch](https://apify.com/tidyscrape) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## App Reviews Scraper: App Store + Google Play in One

Get **iOS App Store and Google Play reviews in one run, in one output format**: rating, title,
text, date, app version, helpful votes, developer reply and reviewer name. Full App Store review
history (no 500-review cap), many apps, countries and languages, and a Since date for monitoring
new reviews. Export to JSON, CSV or Excel, or call it from your code, Make, Zapier, n8n, or an AI
agent via MCP.

### Why one Actor for both stores?

Product teams track the same app on iOS and Android. Here both come back in **the same columns**:
fields only one store has (App Store titles, Google Play app versions and developer replies) are
`null` for the other store instead of missing, so you can drop the dataset straight into a
spreadsheet, BI tool or LLM without reshaping it.

| Field | App Store (iOS) | Google Play (Android) |
|---|---|---|
| `rating`, `text`, `date`, `reviewerName` | ✓ | ✓ |
| `title`, `isEdited` | ✓ | null |
| `appVersion`, `thumbsUp`, `developerReply`, `reviewUrl` | null | ✓ |
| `country` / `language` | country | language |

<details><summary>Sample output (one iOS and one Android review)</summary>

```json
[
    {
        "store": "apple",
        "appId": "324684580",
        "appName": "Spotify: Music and Podcasts",
        "developer": "Spotify",
        "country": "us",
        "language": null,
        "reviewId": "14603418822",
        "rating": 5,
        "title": "Songs",
        "text": "Hi I love Spotify and how I love it it’s because when I go on a other app the song is till playing and I like it shows the words",
        "date": "2026-09-28T13:39:43Z",
        "appVersion": null,
        "thumbsUp": null,
        "developerReply": null,
        "developerReplyDate": null,
        "isEdited": false,
        "reviewerName": "(reviewer name)",
        "reviewUrl": null,
        "appUrl": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "scrapedAt": "2026-09-29T18:16:26.937Z"
    },
    {
        "store": "google",
        "appId": "com.spotify.music",
        "appName": "Spotify: Music and Podcasts",
        "developer": "Spotify AB",
        "country": null,
        "language": "en",
        "reviewId": "695aa257-cf41-48e5-891a-9d8f250a6a94",
        "rating": 1,
        "title": null,
        "text": "after some time it makes so much trouble to ply any song",
        "date": "2026-09-28T18:10:44.256Z",
        "appVersion": null,
        "thumbsUp": 0,
        "developerReply": "Hi. Have you tried a quick reinstall? If that doesn't help, we'd recommend reaching out to our Customer Service at support.spotify.com. Just search “Contact Us”, and they'll be happy to help.",
        "developerReplyDate": "2026-09-28T18:36:47.980Z",
        "isEdited": null,
        "reviewerName": "(reviewer name)",
        "reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=695aa257-cf41-48e5-891a-9d8f250a6a94",
        "appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us",
        "scrapedAt": "2026-09-29T18:16:27.873Z"
    }
]
```

</details>

### How much does it cost?

**$0.25 per 1,000 reviews** plus $0.003 per run, for both stores. Example: the latest 1,000 reviews
of one app on iOS and 1,000 on Android ≈ **$0.50**. A daily monitoring run that finds 50 new
reviews ≈ **$0.02**. Apify's free plan credits cover a first test.

### How to use it

1. Add **App Store apps** (URLs, ids or bundle ids) and/or **Google Play apps** (URLs or package names).
2. Pick **App Store countries** (iOS reviews are per country) and **Google Play languages**
   (Android reviews are per language).
3. Set **Max reviews per app**, and optionally **Since date**.
4. Run, then download the dataset.

**API:** `POST https://api.apify.com/v2/acts/tidyscrape~app-reviews-scraper/run-sync-get-dataset-items`

```json
{ "appStoreApps": ["com.spotify.client"], "googlePlayApps": ["com.spotify.music"], "countries": ["us"], "languages": ["en"], "maxReviewsPerApp": 500 }
```

**AI agents:** available through the Apify MCP server with fully described inputs and outputs.

Only need one store? See our [App Store Reviews Scraper](https://apify.com/tidyscrape/app-store-reviews-scraper)
and [Google Play Reviews Scraper](https://apify.com/tidyscrape/google-play-reviews-scraper).

### FAQ

**Is it legal?** This Actor only collects reviews both stores show publicly, without logging in.
Reviews include reviewer names, which can be personal data; turn off **Include reviewer names** if
you do not need them. You are responsible for lawful use (e.g. GDPR/CCPA). Not for FCRA purposes.
Not affiliated with Apple or Google.

**Why countries for iOS but languages for Android?** Apple keeps separate reviews per country
storefront; Google Play shows the same reviews everywhere, grouped by language.

**Something broke or a field is missing?** Open an Issue. We usually respond within a day.

### Changelog

- 2026-09-29: first release.

# Actor input Schema

## `appStoreApps` (type: `array`):

iOS apps: App Store URLs (https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580), numeric ids (324684580) or bundle ids (com.spotify.client). Full review history, no 500 cap.

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

App Store reviews are per country: 2-letter codes (us, gb, de...). Each iOS app is scraped once per country.

## `googlePlayApps` (type: `array`):

Android apps: Google Play URLs (https://play.google.com/store/apps/details?id=com.spotify.music) or package names (com.spotify.music).

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

Google Play reviews are per language, not country: codes like en, de, pt-BR. Each Android app is scraped once per language.

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

Stop after this many reviews for each app in each App Store country / Google Play language. You pay per review, so this also caps cost.

## `sinceDate` (type: `string`):

Only reviews posted on or after this date (YYYY-MM-DD), for scheduled monitoring runs.

## `includeReviewerNames` (type: `boolean`):

Include reviewer nicknames / display names. Turn off if you do not need personal data.

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

Fallback proxy (requests go direct first; the proxy is used if a store starts rate-limiting).

## Actor input object example

```json
{
  "appStoreApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us"
  ],
  "googlePlayApps": [
    "https://play.google.com/store/apps/details?id=com.spotify.music"
  ],
  "languages": [
    "en"
  ],
  "maxReviewsPerApp": 10,
  "includeReviewerNames": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "appStoreApps": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "countries": [
        "us"
    ],
    "googlePlayApps": [
        "https://play.google.com/store/apps/details?id=com.spotify.music"
    ],
    "languages": [
        "en"
    ],
    "maxReviewsPerApp": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyscrape/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 = {
    "appStoreApps": ["https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"],
    "countries": ["us"],
    "googlePlayApps": ["https://play.google.com/store/apps/details?id=com.spotify.music"],
    "languages": ["en"],
    "maxReviewsPerApp": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tidyscrape/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 '{
  "appStoreApps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "countries": [
    "us"
  ],
  "googlePlayApps": [
    "https://play.google.com/store/apps/details?id=com.spotify.music"
  ],
  "languages": [
    "en"
  ],
  "maxReviewsPerApp": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tidyscrape/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyscrape/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/7GRwdcD0M6O58GQ5r/builds/BTZlrnZwDIPVG87Rg/openapi.json
