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

Scrape App Store and Google Play reviews in one run: full App Store history beyond the usual 500-review limit, star, date and keyword filters, developer replies and a monitor mode for new reviews. Paste URLs, ids or app names. No login. Pay only for results.

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

## Pricing

from $0.15 / 1,000 dataset items

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 Scraper

Export app reviews from the **Apple App Store** and **Google Play** into one clean table. Paste app URLs, ids or just
app names and get every review with star rating, title, text, date, reviewer, helpful votes and, on Google Play, the
developer's reply and the app version.

**Full App Store history, not just the latest 500.** Most App Store review tools read Apple's RSS feed, which stops at
500 reviews per app and country. This Actor pages through the complete review history: in our tests 5,840 reviews for
Todoist (back to 2012) and over 180,000 for Instagram in the US store.

Made for app marketers, ASO agencies, product managers, UX researchers and data teams who track what users say about
their app and their competitors. No login, no API key, no cookies.

### What you get

| Field | Description |
| --- | --- |
| `store` | `appStore` or `googlePlay` |
| `appId`, `appName`, `developer`, `appUrl` | Which app the review belongs to |
| `appRating`, `appRatingsCount` | The app's average rating and number of ratings in that store |
| `country` | App Store country of the review list (App Store only) |
| `language` | Google Play review language (Google Play only) |
| `reviewId`, `rating`, `title`, `text`, `date` | The review: 1–5 stars, title (App Store only), text, date written (UTC) |
| `userName`, `userImage` | Reviewer name and avatar (avatar on Google Play only) |
| `thumbsUp`, `totalVotes` | Helpful votes (and all votes on the App Store) |
| `isEdited` | The reviewer edited the review (App Store only) |
| `appVersion` | App version the review was written for (Google Play only) |
| `developerReply` | `{text, date, author}` of the developer's answer (Google Play only) |
| `reviewUrl` | Direct link to the review (Google Play only) |
| `sortedBy`, `scrapedAt` | Run details |

The App Store does not publish the app version or developer replies in its review data, so those fields are empty for
App Store rows.

### Use cases

- **Competitor research:** pull every 1- and 2-star review of a rival app to find the features and bugs users complain
  about most.
- **Release monitoring:** schedule a daily run with "Only new reviews since the last run" and pipe new reviews into
  Slack, a sheet or your support tool.
- **ASO and product feedback:** collect reviews that mention "widget", "sync" or "dark mode" across both stores.
- **Sentiment analysis and AI:** export years of App Store and Google Play reviews as training or evaluation data for
  sentiment models and LLM pipelines.
- **Market research:** compare how the same app is rated in the US, UK, Germany or Japan.

### Input

| Field | What it does |
| --- | --- |
| `apps` | App Store URLs or ids (`id572688855`), Google Play URLs or package names (`com.todoist`), or plain app names |
| `stores` | Both stores (default), App Store only or Google Play only. App names are looked up in the selected stores |
| `countries` | App Store countries (`us`, `gb`, `de`, `jp`...). Each country has its own reviews |
| `languages` | Google Play review languages (`en`, `de`, `pt-BR`...). Google Play splits reviews by language, not country |
| `sort` | Newest, most helpful, most critical (1 star first) or most favorable (5 stars first) |
| `maxReviewsPerApp` | Reviews to save per app and country/language. `0` = everything available |
| `ratings` | Keep only these star ratings |
| `since` / `until` | Keep reviews written in a date range. With newest-first order the run stops once it passes `since` |
| `keywords` | Keep reviews whose title or text contains one of the words. You pay only for kept reviews |
| `currentVersionOnly` | App Store: only reviews of the current app version |
| `onlyNewSinceLastRun` | Monitor mode for scheduled runs: return only reviews that earlier runs with the same input have not returned |
| `proxyConfiguration` | Optional; both stores work without a proxy |

Example input:

```json
{
    "apps": ["https://apps.apple.com/us/app/todoist-to-do-list-calendar/id572688855", "com.todoist", "Notion"],
    "countries": ["us", "gb"],
    "languages": ["en"],
    "sort": "newest",
    "ratings": ["1", "2"],
    "since": "2026-01-01",
    "maxReviewsPerApp": 0
}
```

### Example output

```json
{
    "store": "googlePlay",
    "appId": "com.todoist",
    "appName": "Todoist: To Do List & Calendar",
    "developer": "Todoist Inc.",
    "appRating": 4.61,
    "appRatingsCount": 306434,
    "appUrl": "https://play.google.com/store/apps/details?id=com.todoist",
    "country": null,
    "language": "en",
    "reviewId": "a5cc718f-aed5-4883-968e-3e9516244cd5",
    "rating": 5,
    "title": null,
    "text": "best thing for my youtube channel 😁",
    "date": "2026-10-19T00:29:03Z",
    "userName": "Naeem P",
    "thumbsUp": 0,
    "appVersion": "v12314",
    "developerReply": {
        "text": "Thanks so much for the 5 stars, Naeem! ...",
        "date": "2026-10-19T06:59:34Z",
        "author": "Todoist Inc."
    },
    "reviewUrl": "https://play.google.com/store/apps/details?id=com.todoist&reviewId=a5cc718f-aed5-4883-968e-3e9516244cd5",
    "sortedBy": "newest",
    "scrapedAt": "2026-10-20T01:22:09Z"
}
```

An App Store row has the same fields, with `country` set, a `title`, `totalVotes` and `isEdited`, and empty
`appVersion`, `developerReply` and `reviewUrl`.

### Scheduling and integrations

Schedule the Actor daily or weekly with `onlyNewSinceLastRun` turned on to receive only fresh reviews, and send them to
Google Sheets, Slack, Airtable, Make, Zapier or a webhook from the run's Integrations tab. If a long run is interrupted,
running it again with the same input continues where it stopped without duplicate rows.

### Use it from AI assistants

The Actor works as a tool through the Apify MCP server, so Claude, ChatGPT and other agents can ask for "the latest
1-star reviews of app X" and get structured JSON back.

### FAQ

**How many App Store reviews can I get?**
The full history Apple keeps for that country: thousands for most apps and six figures for the biggest ones (about
186,000 for Instagram in the US store in October 2026). Other tools stop at 500 because they use Apple's RSS feed.

**Why are the newest App Store reviews a day or two old?**
Apple publishes reviews roughly two days after they are written, on every channel including its RSS feed. Monitor mode
re-checks a three-day window on each run so late-published reviews are not missed.

**Why does Google Play use languages instead of countries?**
Google Play groups reviews by the reviewer's language; the store country does not change the list. Add several
languages to cover more reviewers.

**Can I get developer replies for App Store reviews?**
Not at the moment: Apple does not include them in the public review data this Actor reads. Google Play replies are
included.

**How fast is it?**
Roughly 500 App Store reviews or 1,000 Google Play reviews per request; 30,000 App Store reviews took about a minute in
our tests.

**Do I need a proxy?**
No. If a store starts throttling, the Actor retries through Apify Proxy by itself.

**Is it legal?**
The Actor reads publicly visible reviews without logging in. Reviews contain user names, so handle the data according
to the privacy rules that apply to you (for example GDPR) and the stores' terms.

# Actor input Schema

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

One app per line: an App Store URL or id (https://apps.apple.com/us/app/todoist/id572688855, 572688855), a Google Play URL or package name (https://play.google.com/store/apps/details?id=com.todoist, com.todoist), or a plain app name (looked up on the stores selected below, first match).

## `stores` (type: `string`):

Which store(s) to use for app names, and which store's apps to keep.

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

Two-letter App Store country codes (us, gb, de, jp, br...). Each country has its own review list. Google Play reviews are split by language instead (see below).

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

Google Play review languages (en, de, fr, es, pt-BR, ja...). Each language is a separate review list. The App Store ignores this field.

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

Order of the reviews. Most critical / most favorable on Google Play are built from one pass per star rating.

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

Stop each review list after this many saved reviews. 0 = everything available. The App Store returns the full history, not only the latest 500.

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

Keep only reviews with these star ratings. Leave empty for all.

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

Keep reviews written on or after this date (YYYY-MM-DD). With newest-first order the run stops as soon as it reaches older reviews.

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

Keep reviews written on or before this date (YYYY-MM-DD).

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

Keep only reviews whose title or text contains at least one of these words (case-insensitive). You pay only for kept reviews.

## `currentVersionOnly` (type: `boolean`):

App Store only: return reviews of the current app version.

## `onlyNewSinceLastRun` (type: `boolean`):

Monitor mode for scheduled runs with the same input: returns only reviews not seen by earlier runs (newest-first order is used).

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

Optional. Both stores answer without a proxy; if a store throttles the run, the Actor retries through Apify Proxy automatically.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/todoist-to-do-list-calendar/id572688855",
    "com.todoist"
  ],
  "stores": "both",
  "countries": [
    "us"
  ],
  "languages": [
    "en"
  ],
  "sort": "newest",
  "maxReviewsPerApp": 200,
  "currentVersionOnly": false,
  "onlyNewSinceLastRun": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "apps": [
        "https://apps.apple.com/us/app/todoist-to-do-list-calendar/id572688855",
        "com.todoist"
    ],
    "countries": [
        "us"
    ],
    "languages": [
        "en"
    ],
    "maxReviewsPerApp": 200,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/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://apps.apple.com/us/app/todoist-to-do-list-calendar/id572688855",
        "com.todoist",
    ],
    "countries": ["us"],
    "languages": ["en"],
    "maxReviewsPerApp": 200,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/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://apps.apple.com/us/app/todoist-to-do-list-calendar/id572688855",
    "com.todoist"
  ],
  "countries": [
    "us"
  ],
  "languages": [
    "en"
  ],
  "maxReviewsPerApp": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call axlymxp/app-reviews-scraper --silent --output-dataset

```

## MCP server setup

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