# Google Play & App Store Scraper: Reviews, Details (`mrtrelock/google-play-app-scraper`) Actor

Get app details and reviews from Google Play and the Apple App Store in one run: ratings, installs, price, version, developer, and reviews with developer replies. Search by keyword, filter by stars and date, any country, and fetch only new reviews since your last run.

- **URL**: https://apify.com/mrtrelock/google-play-app-scraper.md
- **Developed by:** [Nick R](https://apify.com/mrtrelock) (community)
- **Categories:** Marketing, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

### What does Google Play & App Store Scraper do?

**Google Play & App Store Scraper** collects **app details and reviews from both the Google Play Store and the Apple App Store** in one run. Give it package names, App Store IDs, store links or search keywords. It returns clean, consistent data ready for spreadsheets, dashboards or AI.

- **App details**: rating, the full 1 to 5 star breakdown, number of ratings and reviews, installs (including Google's precise install count), price, in-app purchase range, ads, version, last update, release date, developer, category, content rating, chart position, description, "what's new", icon and screenshots.
- **Reviews**: text, stars, date, thumbs-up count, the app version the reviewer used, and **the developer's reply with its date**.
- **Search**: find apps by keyword exactly as each store shows them, with their rank.
- **Apple App Store too**: rating, number of ratings (overall and for the current version), price, version, file size, minimum iOS version, supported devices, languages, description and screenshots, plus reviews with their title, stars, date, helpful votes and app version.

### Why use it?

- 🍏🤖 **Both app stores in one tool.** Compare your iPhone and Android apps (or a competitor's) side by side. Every row has a `store` field: `googlePlay` or `appStore`.
- 📦 **Details, reviews and search in one tool.** You don't need several scrapers or have to glue their outputs together.
- ⭐ **Filter reviews by star rating.** For example, get only 1 and 2 star reviews to find complaints fast.
- 📅 **Date limit.** Get only reviews from the last N days.
- 🔁 **Only new reviews since your last run.** Put it on a schedule and pay only for reviews you haven't collected yet.
- 💬 **Developer replies included.** See how a company handles complaints, and how fast it replies.
- 🌍 **Any country and language.** Prices, availability, charts and reviews follow the country and language you pick.
- 🔒 **Privacy-friendly.** Reviewer names and profile photos are left out on purpose, so your dataset holds no personal data.
- 🚫 **No double charges.** If the same app appears twice (in your list and in a search), it's processed once.
- ⚡ **Fast and light.** It reads the same public data the Play Store website loads, with no browser and no login.

### Who uses it?

- **App developers and product managers** tracking user feedback, bugs after a release (by app version), and feature requests.
- **Customer support and community teams** monitoring new 1 and 2 star reviews and reply times.
- **Market researchers and investors** comparing ratings, installs and update frequency across competitors.
- **App marketers (ASO)** checking search rankings for keywords and how competitors describe their apps.
- **Data scientists and AI teams** building sentiment analysis and review-summary datasets.

### How to use it

1. Add apps under **Apps**, one per line, from either store:
   - Google Play: the package name (`com.spotify.music`) or the Play Store link (`https://play.google.com/store/apps/details?id=com.spotify.music`).
   - App Store: the app ID (`324684580`) or the App Store link (`https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580`).
2. Or add **Search terms**, e.g. `budget tracker`, and pick which **Stores to search** (Google Play, App Store or both). Each app found is processed like the apps you listed.
3. Choose what you want: **app details**, **reviews**, or both. Then set **Max reviews per app**, the **review order**, **star ratings**, a **date limit**, or **only new reviews**.
4. Pick a **country** (`us`, `gb`, `de`, `in`...) and **language** (`en`, `de`, `pt-BR`...).
5. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or get them through the API.

The **Apps** and **Reviews** tabs of the results show each kind separately. Every row also has a `type` field (`app` or `review`) for filtering.

### Example output

App:

```json
{
  "type": "app",
  "appId": "com.spotify.music",
  "title": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "category": "Music & Audio",
  "rating": 4.349,
  "ratingsCount": 36566935,
  "reviewsCount": 1857794,
  "histogram": { "1": 3718256, "2": 1068369, "3": 1310130, "4": 3104931, "5": 27365232 },
  "installs": "1,000,000,000+",
  "realInstalls": 3177010511,
  "free": true,
  "price": 0,
  "inAppPurchases": "$4.99 - $203.88 per item",
  "containsAds": true,
  "updatedAt": "2026-10-23T12:37:22.000Z",
  "chartRank": "#1 top free music & audio",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=us"
}
```

Review:

```json
{
  "type": "review",
  "appId": "com.spotify.music",
  "appTitle": "Spotify: Music and Podcasts",
  "rating": 1,
  "text": "too many ads",
  "reviewedAt": "2026-10-30T06:00:21.000Z",
  "thumbsUp": 0,
  "appVersion": "9.1.92.3058",
  "replyText": "Hey. We hear you and we'll pass your feedback along to the Ads team...",
  "repliedAt": "2026-10-30T15:50:08.000Z",
  "country": "us",
  "language": "en"
}
```

App Store review:

```json
{
  "type": "review",
  "store": "appStore",
  "appId": "324684580",
  "appTitle": "Spotify: Music and Podcasts",
  "rating": 5,
  "title": "Love it",
  "text": "It's a really good app to listen to music",
  "reviewedAt": "2026-10-30T04:38:49.000Z",
  "thumbsUp": 0,
  "votes": 0,
  "appVersion": "9.1.94",
  "country": "us"
}
```

A **SUMMARY** record in the run's key-value store lists what happened for every app and search term, including clear messages for typos or apps not available in the chosen country.

### How much does it cost?

You pay per result saved: one price per app and one per review. See the **Pricing** tab for current prices. Apps and reviews skipped by your filters cost nothing. To control spending, lower **Max reviews per app** or set a maximum cost per run.

### Tips

- **Big apps have huge review counts.** Start with 100 to 500 reviews per app, then raise it.
- **Scheduled monitoring:** turn on **Only new reviews since my last run** and schedule the task daily. Each run then only collects (and charges for) reviews posted since the previous one. The memory is kept per app, country, language and star filter.
- **Version can be empty** for some apps, often very large ones that ship different builds for different devices. Reviews still show the version each reviewer used.
- **Several star ratings share the limit.** With Max reviews per app = 100 and stars 1 and 2, you get up to 50 of each, never more than 100 in total.
- **Catching up.** If more new reviews arrived than your limit allows, "only new" saves the oldest ones first and picks up the rest on the next runs, so none are skipped.
- **Reviews follow the language**, not just the country. For German reviews, use language `de`.
- Google Play shows about 20 to 30 apps per search term.
- **App Store limits:** Apple shares at most an app's latest 500 reviews per country (or its 500 most helpful). For more, run the same app in several countries (`us`, `gb`, `ca`, `au`...). Apple's review list also runs about a day behind the App Store itself.
- **App Store order:** Apple offers "newest" and "most helpful" only. "Highest rating first" uses most helpful for App Store apps.
- **iPhone and Android IDs differ.** Spotify is `com.spotify.music` on Google Play but `324684580` on the App Store. If you pick only the App Store under **Stores to search**, package-style names are read as Apple bundle IDs (e.g. `com.spotify.client`).
- **Country comes from the Country setting**, not from a link. An App Store link like `apps.apple.com/gb/...` still uses the country you picked.
- **Developer replies** are only available for Google Play reviews; Apple doesn't publish them in its public review data.

### FAQ

**Is it legal to scrape Google Play and the App Store?**
This tool only reads public store pages and Apple's public data feeds that anyone can open without logging in, and it leaves out reviewers' names and photos. You're responsible for how you use the data, so check Google Play's and Apple's terms and the laws that apply to you (such as GDPR) for your use case.

**Why are reviewer names missing?**
They're personal data. Leaving them out keeps your dataset privacy-friendly. Each review keeps its unique `reviewId`.

**Can I get every review an app has ever had?**
On Google Play, yes: it serves reviews 100 at a time, and the tool keeps reading pages until it reaches your limit or Google has no more to give. On the App Store, Apple shares up to 500 per app and country.

**Something doesn't work?**
Open an issue on the **Issues** tab with the app and settings you used. The stores sometimes change their pages, and fixes usually ship quickly.

# Actor input Schema

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

One per line. Google Play: the package name (com.spotify.music) or Play Store link. App Store: the app ID (324684580) or App Store link (https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580). Each app goes to the store its ID or link belongs to.

## `searchTerms` (type: `array`):

Find apps by keyword, e.g. "budget tracker". Runs in each store picked under "Stores to search". Every app found is processed like the apps above.

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

Which stores your search terms run in. Apps you list above always go to the store their ID or link belongs to. If you pick only App Store, package names above are read as Apple bundle IDs (e.g. com.spotify.client).

## `maxSearchResults` (type: `integer`):

Google Play shows about 20 to 30 apps per search. The App Store gives up to 50 here.

## `includeAppDetails` (type: `boolean`):

Rating, number of ratings, price, version, last update, developer, category, description, screenshots and more. Google Play adds installs and the 1 to 5 star breakdown; the App Store adds file size, minimum iOS version and supported devices.

## `includeReviews` (type: `boolean`):

Review text, stars, date, helpful votes and the app version. Google Play adds the developer's reply; the App Store adds the review title. Reviewer names and photos are left out (personal data).

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

Google Play serves up to tens of thousands of reviews for big apps. The App Store shares at most 500 per app and country. Start small to keep costs down.

## `reviewSort` (type: `string`):

Which reviews come first. A date limit or "Only new reviews" always uses newest first. The App Store has no highest-rating order, so it uses most helpful instead.

## `reviewRatings` (type: `array`):

E.g. 1 and 2 for complaints only. Leave empty for all ratings.

## `reviewsWithinDays` (type: `integer`):

0 means any date.

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

Remembers the newest review saved for each app (per country, language and star filter), so scheduled runs only collect and charge for new ones.

## `country` (type: `string`):

Two-letter country code (us, gb, de, in, br...). Affects prices, availability, charts and which reviews you get.

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

Google Play only: language code (en, de, es, pt-BR...). Google Play reviews are shown in this language. App Store reviews come from the chosen country's store.

## Actor input object example

```json
{
  "apps": [
    "com.spotify.music",
    "324684580"
  ],
  "searchTerms": [],
  "stores": [
    "googlePlay",
    "appStore"
  ],
  "maxSearchResults": 30,
  "includeAppDetails": true,
  "includeReviews": true,
  "maxReviewsPerApp": 100,
  "reviewSort": "newest",
  "reviewRatings": [],
  "reviewsWithinDays": 0,
  "onlyNewReviews": false,
  "country": "us",
  "language": "en"
}
```

# Actor output Schema

## `apps` (type: `string`):

App details and search results. Rows have type "app".

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

Reviews from both stores (Google Play includes developer replies). Rows have type "review".

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

What happened for each app and search term you entered.

# 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": [
        "com.spotify.music",
        "324684580"
    ],
    "stores": [
        "googlePlay",
        "appStore"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrtrelock/google-play-app-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": [
        "com.spotify.music",
        "324684580",
    ],
    "stores": [
        "googlePlay",
        "appStore",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("mrtrelock/google-play-app-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": [
    "com.spotify.music",
    "324684580"
  ],
  "stores": [
    "googlePlay",
    "appStore"
  ]
}' |
apify call mrtrelock/google-play-app-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrtrelock/google-play-app-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/S9bcznpwEiWHc1nnu/builds/lo4PZBbqrWGzSOPax/openapi.json
