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

Get Google Play and Apple App Store reviews in one clean dataset. Paste store links, package names or App Store IDs. Rating, text, date, app version, likes and developer replies. Filter by stars, date and country. $0.10 per 1,000 reviews; failed apps are free.

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

## Pricing

from $0.10 / 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/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 – Google Play & App Store Reviews

Export Google Play and Apple App Store reviews into one clean table. Paste store links, package names or App Store IDs and get star rating, review text, date, app version, likes and developer replies in JSON, CSV or Excel.

✅ Pay per result: $0.10 per 1,000 reviews · 🆓 Apps that fail are never charged · 🔑 No API key, no login, no proxy needed

[▶ Try it with one click](#how-to-use-it) · [📄 Real example output](#output-example-from-a-real-public-run) · [💲 Pricing](#how-much-does-it-cost-to-scrape-app-reviews) · [🔌 API & integrations](#integrations-api-ai-agents-make-zapier) · [❓ FAQ](#faq) · [🛟 Support](#support-reliability-and-feature-requests)

### What does App Reviews Scraper do?

- 📱 **Both stores in one run.** Google Play and Apple App Store reviews share the same fields, so you can compare an app's Android and iOS feedback side by side.
- 🔗 **Any app reference.** Google Play links, package names (`com.spotify.music`), App Store links, numeric IDs (`324684580`) or just an app name (looked up on the App Store).
- 🌍 **Many countries.** Add country codes (`us`, `gb`, `de`, `in`…) and each app is scraped per country.
- ⭐ **Filters that save money.** Keep only 1–2 star complaints, only 5-star praise, or only reviews since a date. Filtered-out reviews are not saved and not charged.
- 💬 **Developer replies** from Google Play (text and date) for support and reputation analysis.
- 🕵️ **Privacy by default.** Reviewer names are left out unless you switch them on.
- 📊 **SUMMARY** record in the key-value store lists the review count (or the error) for every app and country.

### Use cases

- **Product managers** – read what users complain about after each release (filter by `appVersion`).
- **App marketers / ASO** – track rating trends and competitor reviews across countries.
- **Support teams** – find unanswered Google Play reviews (`developerReply` is empty).
- **Data and AI teams** – feed review text into sentiment analysis, topic clustering or an LLM summary.
- **Agencies** – monthly review reports for client apps on both stores.

### How to use it

1. Click **Try for free**. The prefilled input (Spotify on Google Play and the App Store, 50 reviews each, US) runs in about 5 seconds and costs about $0.01.
2. Replace the apps with your own links or IDs and set **Max reviews per app and country**.
3. Optional: add countries, star filters or a "since" date.
4. Click **Start**, then export the dataset as CSV, Excel or JSON, or read it through the API.

#### Input example

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "maxReviewsPerApp": 50,
  "countries": ["us"]
}
```

Other options: `sort` (`newest` or `helpful`), `minRating`, `maxRating`, `sinceDate` (YYYY-MM-DD), `language` (Google Play, default `en`), `includeReviewerNames` (default off).

#### Output example (from a real public run)

The prefilled input above returned 100 reviews (50 per store) in 4.6 seconds of run time ([run KwugbuZEwYVVggJKI](https://console.apify.com/view/runs/KwugbuZEwYVVggJKI)). Two of the rows:

```json
[
  {
    "store": "google-play",
    "appId": "com.spotify.music",
    "appName": "Spotify: Music and Podcasts",
    "country": "us",
    "reviewId": "74467ec7-dc16-439a-b0aa-9c76b5a72a11",
    "rating": 4,
    "title": null,
    "text": "very helpful but it is not for free",
    "date": "2026-10-15T18:29:48.130Z",
    "appVersion": "9.1.90.2270",
    "thumbsUp": 0,
    "developerReply": null,
    "developerReplyDate": null,
    "reviewUrl": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=74467ec7-dc16-439a-b0aa-9c76b5a72a11"
  },
  {
    "store": "app-store",
    "appId": "324684580",
    "appName": "Spotify: Music and Podcasts",
    "country": "us",
    "reviewId": "14665076616",
    "rating": 5,
    "title": "Facts",
    "text": "Where would I be without it tho",
    "date": "2026-10-14T10:41:04.000Z",
    "appVersion": "9.1.90",
    "thumbsUp": 0,
    "developerReply": null,
    "developerReplyDate": null,
    "reviewUrl": "https://apps.apple.com/us/app/id324684580?see-all=reviews"
  }
]
```

| Field | Meaning |
|---|---|
| `store` | `google-play` or `app-store` |
| `appId`, `appName`, `country` | Which app and storefront the review came from |
| `reviewId` | The store's review ID (use it to dedupe scheduled runs) |
| `rating` | 1–5 stars |
| `title` | Review title (App Store only; Google Play has none) |
| `text` | Review text |
| `date` | ISO 8601, UTC |
| `appVersion` | App version the reviewer used, when the store gives it |
| `thumbsUp` | Helpful votes (Google Play) or vote sum (App Store) |
| `developerReply`, `developerReplyDate` | Developer's public reply (Google Play) |
| `reviewUrl` | Link to the review or the app's reviews page |
| `reviewerName` | Only when `includeReviewerNames` is on |

### How much does it cost to scrape app reviews?

| Event | Price |
|---|---|
| Review saved to the dataset | $0.0001 ($0.10 per 1,000) |
| Actor start | $0.00005 per run (per GB of memory; default 256 MB) |

| Job | Arithmetic | Cost |
|---|---|---|
| One-click example (100 reviews) | 100 × $0.0001 + $0.00005 | ≈ $0.01 |
| 1 app, both stores, 1,000 reviews | 1,000 × $0.0001 | $0.10 |
| 10 competitor apps × 500 reviews | 5,000 × $0.0001 | $0.50 |

Never charged: apps that can't be found or fail, and reviews removed by your star or date filters. You can also set **Max cost per run** in the run options.

### Integrations (API, AI agents, Make, Zapier)

```bash
curl -X POST "https://api.apify.com/v2/acts/chris_elder~app-reviews-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apps":["com.spotify.music","324684580"],"maxReviewsPerApp":200,"maxRating":2}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("chris_elder/app-reviews-scraper").call(run_input={"apps": ["com.spotify.music"], "maxReviewsPerApp": 500})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(review["rating"], review["text"])
```

- MCP for AI agents: `https://mcp.apify.com/?tools=chris_elder/app-reviews-scraper`
- Make, Zapier and n8n: use their "Run Actor" module.
- Schedule a daily run with `sinceDate` and `sort: newest` to collect only new reviews, and add a webhook to send them on.

### Limits and good to know

- **App Store:** Apple's public reviews feed returns at most 500 of the most recent (or most helpful) reviews per app and country (10 pages × 50). Add more countries to collect more. App Store developer replies are not in that feed.
- **Google Play:** no fixed cap; large jobs (tens of thousands of reviews) take longer. Reviews come in the language you set in `language`.
- An app name is matched to the first App Store search result. Use a link or ID when you need a specific app.
- Stores can change their pages or feeds. If something breaks, open an Issue and it gets fixed.

### Is it legal?

The Actor reads public review pages and Apple's public feeds, the same data anyone sees in the stores. It does not log in and does not collect reviewer names unless you turn that on. Reviews can contain personal data, so you are responsible for using the data lawfully (for example under GDPR). See Apify's post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### FAQ

**Can I get only negative reviews?** Yes. Set `maxRating` to 2.

**How do I get only new reviews every day?** Schedule the Actor with `sort: newest` and `sinceDate`. It stops as soon as it reaches older reviews, so you pay only for new ones.

**Why did I get fewer than my max for the App Store?** Apple's feed holds at most 500 recent reviews per country, and some apps have fewer in a given country.

**Do I need a Google or Apple account or API key?** No.

**Can I export to Excel or Google Sheets?** Yes. Export the dataset as CSV/Excel, or use the Google Sheets Sync Actor below.

### Support, reliability and feature requests

- Bugs reported in the Issues tab are read and answered, and fixes are tested on real apps before release.
- Failed apps are never charged.
- Tested on Spotify (both stores) and Duolingo (App Store, found by name) in the US and UK, plus a non-existent package name (skipped, not charged).
- Built by GPT Shop Ltd with AI-assisted development; every release is reviewed and tested.

### More tools from GPT Shop Ltd

- [Apple App Store Scraper – App Search & Metadata](https://apify.com/chris_elder/itunes-app-store-search)
- [Google Sheets Sync](https://apify.com/chris_elder/google-sheets-sync)
- [Dataset Transformer](https://apify.com/chris_elder/dataset-transformer)
- [Bulk Image Downloader](https://apify.com/chris_elder/bulk-file-downloader)
- All tools: https://apify.com/chris_elder

# Actor input Schema

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

One app per line. Accepts Google Play links or package names (com.spotify.music), App Store links or numeric IDs (324684580). A plain app name is looked up on the App Store.

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

Stop after this many reviews for each app in each country. Apple's public feed returns at most 500 recent reviews per app and country; Google Play has no such limit.

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

Two-letter country codes (us, gb, de, in…). Each app is scraped once per country. Add more countries to get more App Store reviews.

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

Newest first is best for monitoring and works with the date filter.

## `minRating` (type: `integer`):

Only keep reviews with at least this many stars. Leave empty for all.

## `maxRating` (type: `integer`):

Only keep reviews with at most this many stars. Set 2 to collect complaints only.

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

Skip reviews older than this date (YYYY-MM-DD). With 'Newest first' the scraper stops early, so you pay only for what you keep.

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

Language code for Google Play reviews (en, de, es…). App Store reviews follow the country.

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

Off by default. Turn on only if you have a lawful reason to process reviewer names.

## Actor input object example

```json
{
  "apps": [
    "https://play.google.com/store/apps/details?id=com.spotify.music",
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
  ],
  "maxReviewsPerApp": 50,
  "countries": [
    "us"
  ],
  "sort": "newest",
  "language": "en",
  "includeReviewerNames": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `summary` (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 = {
    "apps": [
        "https://play.google.com/store/apps/details?id=com.spotify.music",
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
    ],
    "maxReviewsPerApp": 50,
    "countries": [
        "us"
    ]
};

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

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

```

## MCP server setup

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