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

Get App Store and Google Play reviews in one clean table: stars, text, date, app version, developer replies. Find apps by name or link, many countries at once, star and keyword filters, 'only new reviews' monitoring.

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

## Pricing

from $0.17 / 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

Get **App Store and Google Play reviews in one clean table**, with star rating, title, text, date, app version, helpful votes and developer replies. Type an app name or paste a store link, and it finds the app in both stores.

- 🍎🤖 **Both stores, one format.** Same columns for Apple and Google, ready to compare.
- 🔎 **Find apps by name.** Type `Spotify`, or paste any App Store / Google Play link or app id.
- 🌍 **Many countries at once.** `us`, `gb`, `sg`, `hk`… each with its own reviews.
- ⭐ **Star & keyword filters.** e.g. only 1–2 star reviews mentioning `crash` or `login`.
- 🔔 **Only new reviews.** Schedule it daily and get just the reviews you haven't seen.
- 💬 **Developer replies** (Google Play) and **app version** for every review.
- ⚡ **Fast.** Thousands of reviews in seconds, with no browser and no proxies.

### What can I use it for?

- **App developers & product teams:** catch bugs and complaints the day they're posted, by version and country.
- **Competitor research:** see what users love and hate about rival apps.
- **Market & UX research:** collect large review datasets for sentiment analysis or AI summaries.
- **Customer support:** monitor 1–2 star reviews and respond faster.
- **Agencies:** track reviews for all your clients' apps in one scheduled run.

### How to scrape app reviews

1. Add apps under **Apps**, one per line:
   ```
   Spotify
   https://apps.apple.com/us/app/duolingo-language-lessons/id570060128
   https://play.google.com/store/apps/details?id=com.grabtaxi.passenger
   com.whatsapp
   ```
2. Pick **Countries** (e.g. `us`, `gb`, `sg`) and optional filters (stars, keywords, last N days).
3. Click **Start**. Download as Excel, CSV or JSON, or use the API.

**Monitoring:** turn on **Only new reviews since the last run** and add a daily **Schedule**. Pair it with the Slack or Google Sheets integration to get new reviews delivered automatically.

### Output

```json
{
  "store": "google",
  "appId": "com.spotify.music",
  "appName": "Spotify: Music and Podcasts",
  "country": "us",
  "language": "en",
  "rating": 2,
  "title": null,
  "text": "keeps on crashing, stopping before the next track plays...",
  "date": "2026-10-12T00:16:00+00:00",
  "appVersion": null,
  "thumbsUp": 0,
  "developerReply": "Hi, this isn't the experience we'd like our users to have...",
  "developerReplyDate": "2026-10-12T03:10:00+00:00",
  "reviewerName": null,
  "reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=...",
  "appUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us"
}
```

App Store reviews also have a `title`. Google Play reviews have developer replies. Fields a store doesn't provide are `null`. A **SUMMARY** record lists, for each app, store and country, how many reviews were scanned and delivered, or why a line failed.

### How much does it cost?

You pay **per review delivered**: about **$0.20 per 1,000 reviews**, plus Apify's standard start charge of $0.00005 per run. Reviews removed by your filters, and reviews already delivered in monitoring mode, are free.

| Example | Reviews | Cost |
|---|---|---|
| One app, both stores, 1 country | ~1,000 | ~$0.20 |
| 5 apps, both stores, 4 countries | ~20,000 | ~$4.00 |
| Daily monitor of 10 apps (new reviews only) | ~50/day | ~$0.30/month |

### Limits to know

- The **App Store's public review feed** returns at most the **500 most recent reviews per app per country**. Add more countries to get more.
- **Google Play** has no such limit. Set **Max reviews** to what you need.
- App names use the store's **top search result**, checked against the name you typed. For an exact app, paste its link.

### FAQ

**Can I get reviewer names?** Turn on *Include reviewer's public display name*. It's off by default because names are personal data. Profile photos are never collected.

**Why is the developer reply empty on App Store reviews?** Apple's public feed doesn't include replies.

**Is it legal?** It reads publicly visible app reviews. By default it collects no personal data. You are responsible for using the data in line with applicable laws, such as GDPR, and the stores' terms.

### More tools by TidyRows

- [Company Job Boards Scraper](https://apify.com/tidyrowsfetcher/company-job-boards-scraper): every open job from Greenhouse, Lever, Ashby, SmartRecruiters and Workable.

# Actor input Schema

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

One per line: an app name (e.g. <code>Spotify</code>, searched in both stores), an App Store link, a Google Play link, an Apple app id (<code>324684580</code>) or a Google Play package (<code>com.spotify.music</code>).

## `stores` (type: `array`):

Which stores to search when you give an app name.

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

Two-letter country codes, e.g. <code>us</code>, <code>gb</code>, <code>sg</code>, <code>hk</code>. Each country is a separate review list (the App Store gives up to 500 recent reviews per country).

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

Two-letter language code for Google Play reviews, e.g. <code>en</code>, <code>zh</code>, <code>ja</code>.

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

Newest reviews first. The App Store's public feed stops at 500 per country.

## `minStars` (type: `integer`):

Keep reviews with at least this many stars.

## `maxStars` (type: `integer`):

Keep reviews with at most this many stars, e.g. <code>2</code> for complaints only.

## `keywords` (type: `array`):

Keep only reviews mentioning at least one of these words, e.g. <code>crash</code>, <code>login</code>, <code>price</code>.

## `excludeKeywords` (type: `array`):

Drop reviews mentioning any of these words.

## `reviewedWithinDays` (type: `integer`):

Keep only reviews from the last N days.

## `onlyNewReviews` (type: `boolean`):

Turn on and schedule this Actor (e.g. daily) to receive only reviews you haven't received before. The first run returns everything that matches.

## `monitorName` (type: `string`):

Keeps separate 'already seen' lists for different watches (e.g. <code>my-app</code>, <code>competitors</code>).

## `includeReviewerName` (type: `boolean`):

Off by default. Reviewer names are personal data: only turn on if you have a lawful reason to process them.

## Actor input object example

```json
{
  "apps": [
    "Spotify"
  ],
  "stores": [
    "apple",
    "google"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "maxReviewsPerApp": 500,
  "onlyNewReviews": false,
  "includeReviewerName": false
}
```

# Actor output Schema

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

One row per review, in the same format for the App Store and Google Play.

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

Per app, store and country: reviews scanned and delivered, or why it 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": [
        "Spotify"
    ],
    "countries": [
        "us"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyrowsfetcher/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": ["Spotify"],
    "countries": ["us"],
}

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

```

## MCP server setup

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