# App Store & Google Play Reviews API | $0.25/1K (`steadyrow/app-reviews`) Actor

Scrape app reviews from the Apple App Store and Google Play in one Actor. Paste IDs or store URLs, pick countries, star ratings and dates. Developer replies, app versions, helpful votes and a monitor mode that returns only new reviews. No reviewer names.

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

## Pricing

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

Get app reviews from **both the Apple App Store and Google Play in one run**. Paste app IDs or store URLs, choose countries, star ratings and a date range, and get clean JSON with ratings, review text, app versions, helpful votes and **developer replies**.

Turn on **monitor mode** and schedule the Actor: each run returns **only reviews you have not received yet**, which makes it a good fit for Slack alerts, support dashboards, release monitoring and AI agents.

**No reviewer names, profile links or avatars are collected.**

### What you can do with it

- **Track user feedback after every release.** Filter by app version and star rating to spot regressions fast.
- **Benchmark competitors** across countries and both stores in one dataset.
- **Feed support and product tools.** Send new 1–2★ reviews to Slack, Zendesk, Jira or a spreadsheet on a schedule.
- **Build AI pipelines.** Sentiment analysis, topic clustering and LLM summaries over clean, consistent JSON.
- **Check how the developer responds.** Google Play developer replies and reply dates are included.

### Features

| | |
|---|---|
| Both stores, one schema | App Store and Google Play reviews share the same output fields |
| Auto-detects the store | Numeric App Store IDs, `id123…`, apps.apple.com URLs, Google Play package names and play.google.com URLs |
| Countries & languages | Any App Store country storefront; any Google Play language |
| Filters | Star rating, `since` / `until` (absolute dates or "7 days"), newest or most helpful |
| Monitor mode | Returns only new reviews since the previous run |
| Developer replies | Google Play reply text and date |
| Privacy by design | No names, profile URLs or avatars. Optional anonymous `author_hash` |
| Fast and light | Plain HTTP requests to public endpoints. No browser, no proxy, polite rate limits |

### Input

```json
{
    "apps": [
        "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "com.spotify.music"
    ],
    "countries": ["us", "gb", "de"],
    "ratings": ["1", "2"],
    "since": "30 days",
    "maxReviewsPerApp": 500
}
```

| Field | Description |
|---|---|
| `apps` | App Store IDs/URLs and Google Play package names/URLs, mixed freely |
| `countries` | Two-letter codes. Default `us` |
| `languages` | Google Play only (`en`, `de`, `ja`, `pt-BR`…). Empty = main language of each country |
| `sort` | `newest` (default) or `most_helpful` |
| `ratings` | Star values to keep, e.g. `["1","2"]`. Empty = all |
| `since` / `until` | `2026-10-01` or relative values like `7 days`, `2 weeks`, `3 months` |
| `maxReviewsPerApp` | Limit per app per country (per language on Google Play). Default 200 |
| `monitorMode` | Only return reviews not returned by an earlier run |
| `monitorStateName` | Name of the memory used by monitor mode. Use different names for independent monitors |
| `includeAuthorHash` | Adds `author_hash`, a 12-character one-way hash of the reviewer account |

### Output

One item per review:

```json
{
    "store": "google_play",
    "app_id": "com.spotify.music",
    "app_name": "Spotify: Music and Podcasts",
    "country": "us",
    "language": "en",
    "review_id": "3f1c2a9e-0000-4b7d-9c1e-7a2b5d8e4f10",
    "rating": 1,
    "title": null,
    "text": "Playback stops after a few minutes since the last update.",
    "app_version": "9.1.90.2270",
    "review_date": "2026-10-18T13:42:26.000Z",
    "developer_reply": "Sorry about that! Please try reinstalling the app and contact our support team if it continues.",
    "reply_date": "2026-10-18T15:11:39.000Z",
    "thumbs_up": 0,
    "scraped_at": "2026-10-19T19:55:55.852Z"
}
```

| Field | App Store | Google Play |
|---|---|---|
| `title` | ✅ | always `null` (Play reviews have no title) |
| `app_version` | ✅ | ✅ when the reviewer's version is known |
| `developer_reply`, `reply_date` | `null` (not in Apple's public feed) | ✅ |
| `thumbs_up` | ✅ helpful votes | ✅ helpful votes |
| `language` | `null` (reviews belong to the country storefront) | ✅ |

A run summary (reviews per app and country, errors) is saved to the key-value store under `OUTPUT`.

### Monitor mode

1. Turn on **Monitor mode** and run once. This first run returns the latest reviews and remembers them.
2. Schedule the Actor (for example every hour or every day) with the same input.
3. Every later run returns **only reviews that are new since the last run**. If nothing is new, the dataset is empty and you pay only for the run start.

Each app × country (App Store) or app × language (Google Play) is tracked separately. If more than `maxReviewsPerApp` new reviews arrive between two runs, the oldest surplus is skipped, so raise the limit or run more often for very popular apps.

### How much does it cost?

You pay per review returned, plus a tiny fee per run. See the **Pricing** tab for current prices. Example: 10,000 reviews ≈ $2.50.

Reviews filtered out (wrong rating, outside the date range, already returned in monitor mode) are **not charged**. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

### Good to know

- **App Store depth:** Apple's public review feed exposes up to about **500 reviews per country and sort order**. To get more App Store reviews, add more countries or run both `newest` and `most_helpful`.
- **Google Play languages:** Google Play groups reviews by language, not by country. `us`, `gb` and `au` all return the same English reviews, so the Actor fetches each language once.
- **Freshness:** Both stores publish reviews with a delay of up to about a day.
- **Privacy:** Reviewer names, profile links and avatars are never stored or returned. `author_hash` is optional and cannot be reversed into a name.

### Use with AI agents (MCP)

This Actor works as a tool for AI agents through the [Apify MCP server](https://mcp.apify.com). Example prompt: *"Get the 1-star reviews of com.spotify.music from the last 7 days and summarise the top complaints."*

### Integrations

Use the Apify API, the JavaScript/Python clients, webhooks, or ready-made integrations (Google Sheets, Slack, Zapier, Make, n8n) to send reviews wherever you need them.

### Legal

This Actor reads publicly available review data from public store endpoints, without logging in, and does not collect personal data such as reviewer names or profiles. You are responsible for using the data in line with the stores' terms and the laws that apply to you.

# Actor input Schema

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

App IDs or store URLs. The store is detected automatically. App Store: numeric ID (284882215), "id284882215" or an apps.apple.com URL. Google Play: package name (com.spotify.music) or a play.google.com URL.

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

Two-letter country codes (us, gb, de, jp, ...). App Store reviews are separate per country storefront. Google Play reviews are grouped by language, so countries sharing a language (us, gb, au) are fetched once. Default: us.

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

Google Play review languages (en, de, ja, pt-BR, ...). Leave empty to use the main language of each country. Ignored for the App Store, where reviews belong to the country storefront.

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

Newest first, or most helpful first. Monitor mode always uses newest.

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

Upper limit of reviews returned for each app in each country (and each language on Google Play). The App Store public feed exposes up to ~500 reviews per country and sort order.

## `ratings` (type: `array`):

Only return reviews with these star ratings. Leave empty for all.

## `since` (type: `string`):

Only reviews on or after this date. Absolute (2026-10-01) or relative (7 days, 2 weeks, 3 months).

## `until` (type: `string`):

Only reviews on or before this date. Absolute (2026-10-15) or relative (1 day).

## `monitorMode` (type: `boolean`):

Return only reviews that were not returned by a previous run with the same monitor name. The first run returns the latest reviews as a baseline. Ideal for scheduled runs, alerts and support dashboards.

## `monitorStateName` (type: `string`):

Name of the key-value store that remembers which reviews were already delivered. Use different names for independent monitors.

## `includeAuthorHash` (type: `boolean`):

Adds author_hash, a 12-character one-way hash of the reviewer's store account, so you can group reviews by the same author without any personal data. Reviewer names, profile links and avatars are never returned.

## `deduplicate` (type: `boolean`):

Return (and charge) each review only once per run, even if the same app is listed twice (e.g. as ID and URL).

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
    "com.spotify.music"
  ],
  "countries": [
    "us"
  ],
  "sort": "newest",
  "maxReviewsPerApp": 100,
  "monitorMode": false,
  "monitorStateName": "app-reviews-monitor",
  "includeAuthorHash": false,
  "deduplicate": true
}
```

# Actor output Schema

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

All app reviews collected in this run, one row per review.

# 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://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
        "com.spotify.music"
    ],
    "countries": [
        "us"
    ],
    "maxReviewsPerApp": 100
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyrow/app-reviews"
        }
    }
}
```

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/wlkOfOQnafxcZyAKJ/builds/YqjMgfE2tU2IdgMMi/openapi.json
