# Google Play Scraper | Reviews, Apps & Search | $0.09 / 1K (`hridayrungta/google-play-scraper`) Actor

Google Play scraper and Play Store API alternative: app reviews with star filters and an only-new-reviews monitoring mode, full app details, keyword search and developer apps, in any country and language. No API key, no login.

- **URL**: https://apify.com/hridayrungta/google-play-scraper.md
- **Developed by:** [Hriday Rungta](https://apify.com/hridayrungta) (community)
- **Categories:** Developer tools, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

Google Play Scraper collects **Google Play app reviews**, **app details**, **keyword search results** and **all apps of a developer** for any country and language, as clean JSON, CSV or Excel. It is a **Google Play API alternative** for **app review monitoring**, competitor research and app store data: paste a package ID such as `com.spotify.music`, press Start, and get reviews at **$0.09 per 1,000** within seconds. No API key, no Google account, no browser.

- **App reviews** with star rating, text, date, helpful votes, app version and the **developer reply**, sorted by newest, most relevant or rating.
- **Star filter** (for example only 1 and 2 star reviews) and a **"reviews since" date**.
- **Only new reviews since the last run**: schedule it daily and get just the new reviews, never paying twice for the same review.
- **Full app details**: rating, ratings count, star histogram, exact install count, price, genre, content rating, version, updated date, developer email, website, address and phone, screenshots.
- **Keyword search** (Google Play's ranking, up to 30 apps per keyword) and **developer pages** (all apps of a publisher).
- **Any country and language**: prices in local currency, reviews in the local language.
- Runs on the Apify platform: **API**, **scheduling**, **webhooks**, integrations with **Make, n8n, Zapier and Google Sheets**, and an **MCP server** for AI agents. Requests rotate to fresh proxy sessions automatically if Google throttles.

Need the iPhone side too? Our [Apple App Store Scraper](https://apify.com/hridayrungta/apple-app-store-scraper) covers the App Store with the same field names, so you can track both stores in one sheet.

### What data can you extract from Google Play?

| Data | Where it comes from | Example fields |
|---|---|---|
| Reviews | Each app's review list | `rating`, `text`, `date`, `thumbsUpCount`, `appVersion`, `replyText`, `replyDate`, `userName`, `reviewUrl` |
| App details | The app's Google Play page | `title`, `developer`, `rating`, `ratingsCount`, `histogram`, `installs`, `realInstalls`, `price`, `currency`, `genre`, `contentRating`, `version`, `updated`, `developerEmail`, `developerWebsite`, `screenshots` |
| Search results | Google Play keyword search | `rank`, `appId`, `title`, `developer`, `rating`, `installs`, `price`, `genre` |
| Developer apps | Developer page (name or numeric ID) | Same as search results, in Google Play's order |

Every row has a `type` field (`review`, `app`, `listing` or `status`) plus `language`, `country` and `scrapedAt`, so one dataset can hold reviews and apps side by side. The dataset has ready-made views: Reviews, App details, Search and developer results, All rows, and Problems.

### How to use Google Play Scraper

1. Open the Actor and add one or more apps in **Apps**: a package ID (`com.duolingo`) or the Google Play URL of the app.
2. Optional: add **Search terms** (for example `meditation`) or **Developers** (for example `Spotify AB`).
3. Set **Max reviews per app**, the **Review sort** and, if you like, a **star filter** or **Reviews since** date.
4. Pick the **Language** and **Country** (default English, United States).
5. For monitoring, turn on **Only new reviews since the last run** and give the monitor a name.
6. Press **Start**, then download the results as JSON, CSV or Excel, or read them through the API.
7. To monitor, open **Schedules** in Apify Console and run the same input daily or hourly.

### Input

| Field | Type | What it does |
|---|---|---|
| `appIds` | list | Package IDs or Google Play URLs. A URL with `hl=` and `gl=` uses that language and country for that app. |
| `searchTerms` | list | Keyword searches, up to 30 apps each. |
| `developers` | list | Developer name, numeric developer ID or developer page URL. |
| `includeAppDetails` | boolean | One full app row per app in `appIds` (default on). |
| `maxReviewsPerApp` | number | Reviews per app (per star when filtered). 0 = no reviews. Default 100. |
| `reviewSort` | select | `newest` (default), `relevant` or `rating`. |
| `reviewStars` | list | Only these star ratings, for example `["1","2"]`. Empty = all. |
| `reviewsSince` | date | Only reviews on or after a date (`2026-10-01`) or relative (`7 days`). |
| `onlyNewReviews` | boolean | Skip reviews delivered by earlier runs of the same monitor. |
| `monitorName` | text | Separate memory per monitor. |
| `language`, `country` | text | Google Play `hl` and `gl` codes, for example `de` and `de`. |
| `maxSearchResults`, `maxAppsPerDeveloper` | number | Caps for search and developer lists. |
| `detailsForFoundApps` | boolean | Full app rows (instead of short rows) for apps found by search or developer. |
| `reviewsForFoundApps` | boolean | Also fetch reviews for apps found by search or developer. |
| `maxItems` | number | Hard cap on billed rows for the whole run. |

#### Input example: daily negative-review monitor

```json
{
  "appIds": ["com.spotify.music", "https://play.google.com/store/apps/details?id=com.duolingo&hl=de&gl=de"],
  "includeAppDetails": false,
  "maxReviewsPerApp": 200,
  "reviewStars": ["1", "2"],
  "onlyNewReviews": true,
  "monitorName": "negative-reviews"
}
```

### Output example

A review row (real output from a test run, Calm in the UK store):

```json
{
  "type": "review",
  "status": "ok",
  "reviewId": "69a907c1-476e-4331-b745-b05154596493",
  "appId": "com.calm.android",
  "userName": "Christina Kurucz",
  "userImage": "https://play-lh.googleusercontent.com/a/ACg8ocLX4NYZVMZg2WUOyY7EKIGcOEnlHTWmMqV8rDGk9XNylYsMuLw=mo",
  "rating": 1,
  "text": "I like the idea of this app, but didn't get to use it at all because you need a subscription to do anything. I couldn't find any meditations, practices, etc. that were free to use and I'm not buying a subscription.",
  "date": "2026-09-13T11:26:29.000Z",
  "timestamp": 1789298789,
  "thumbsUpCount": 7,
  "appVersion": "7.0",
  "replyText": "Sorry for the confusion. You do not need a Premium subscription to enjoy Calm! We offer a variety of free mindfulness tools, meditations, and Sleep Stories for our users. You can find the list of the free content available in the app here: https://support.calm.com/hc/en-us/articles/360044707294-What-Free-Content-is-Available-on-the-Calm-App",
  "replyDate": "2026-09-17T11:02:32.000Z",
  "criteria": [],
  "reviewUrl": "https://play.google.com/store/apps/details?id=com.calm.android&reviewId=69a907c1-476e-4331-b745-b05154596493",
  "language": "en",
  "country": "gb",
  "starFilter": 1,
  "searchTerm": null,
  "developerQuery": null,
  "scrapedAt": "2026-11-02T15:17:00.644Z"
}
```

An app details row from the same run (description, screenshot list and a few fields shortened here):

```json
{
  "type": "app",
  "status": "ok",
  "appId": "com.calm.android",
  "title": "Calm - Sleep, Meditate, Relax",
  "summary": "Tackle everyday stress and anxiety. Self-care and sound sleep through meditation",
  "description": "Calm is the #1 app for sleep, meditation, and relaxation. Find anxiety relief, stress relief, and better sleep through breathing exercises, sleep sounds, deep s...",
  "developer": "Calm.com, Inc.",
  "developerId": "6775342773831033959",
  "developerUrl": "https://play.google.com/store/apps/developer?id=Calm.com,+Inc.",
  "developerEmail": "android@calm.com",
  "developerWebsite": "http://www.calm.com",
  "developerAddress": "555 Bryant St Ste 262\nPalo Alto, CA 94301\nUnited States",
  "developerPhone": "+1 415-237-1054",
  "privacyPolicyUrl": "https://www.calm.com/privacy",
  "rating": 4.41843,
  "ratingsCount": 616970,
  "reviewsCount": 11613,
  "histogram": { "1": 49886, "2": 12612, "3": 23920, "4": 73523, "5": 456986 },
  "installs": "50,000,000+",
  "minInstalls": 50000000,
  "realInstalls": 70595554,
  "free": true,
  "price": 0,
  "currency": "GBP",
  "priceText": "Free",
  "offersInAppPurchases": true,
  "inAppPurchaseRange": "£0.61 - £299.99 if billed through Play",
  "containsAds": false,
  "genre": "Health & Fitness",
  "genreId": "HEALTH_AND_FITNESS",
  "categories": ["Health & Fitness"],
  "contentRating": "PEGI 3",
  "released": "2014-07-31T05:50:57.000Z",
  "updated": "2026-10-23T09:58:35.000Z",
  "version": "Varies with device",
  "androidVersion": "8.0",
  "icon": "https://play-lh.googleusercontent.com/Xkdn4M50zGD8JQk4jsNSAu_s5XaaPJDDTifjTi52R3lnKYYhva9mnNsxKG3rE2Ib-yspI90WWXrIqneMHlL0ag",
  "screenshots": ["https://play-lh.googleusercontent.com/AlFfZBelya6w9iJ35Q_m2mUUDOujQLQVw9lWJAKoDHJlSNPvoU8NZX_J0bAkRDWKL91KKGAX1f_7VJUbVu00gg"],
  "url": "https://play.google.com/store/apps/details?id=com.calm.android",
  "language": "en",
  "country": "gb",
  "scrapedAt": "2026-11-02T15:17:00.644Z"
}
```

Search and developer rows (`type: "listing"`) carry `rank`, `appId`, `title`, `developer`, `rating`, `installs`, `price`, `currency`, `genre`, `icon` and `url`. Rows with `type: "status"` explain what could not be scraped (for example an app ID that does not exist in that country) and are never charged.

### How much does it cost to scrape Google Play?

Pay per result, no monthly fee. The price drops on higher Apify plans:

| Event | Free plan | Bronze | Silver | Gold, Platinum, Diamond |
|---|---|---|---|---|
| Review (per 1,000) | $0.09 | $0.081 | $0.072 | $0.063 |
| App details (per 1,000) | $0.25 | $0.225 | $0.20 | $0.175 |
| App from search or developer list (per 1,000) | $0.15 | $0.135 | $0.12 | $0.105 |
| Start fee (per run) | $0.002 | $0.002 | $0.002 | $0.002 |

Worked examples at the Free plan price:

- **1,000 reviews of one app**: $0.002 + $0.09 = **$0.092**.
- **10,000 reviews**: about **$0.90**.
- **Details for 100 competitor apps**: $0.002 + $0.025 = **$0.027**.
- **Daily monitor of 5 apps** that finds about 50 new reviews per app per day: about $0.025 per day, roughly **$0.75 per month**.
- The **$5 monthly credit on Apify's free plan** covers about **55,000 reviews** or about 20,000 full app rows.

Already-seen reviews in monitoring mode, apps that do not exist and failed pages are never charged. Set a maximum charge per run in the run options and the Actor stops exactly at it.

### Integrations, scheduling and API

- **Apify API and SDKs**: start runs and read the dataset from any language. The [Apify API docs](https://docs.apify.com/api/v2) show every endpoint.
- **Schedules**: run the monitor daily or hourly from Apify Console. Combined with **Only new reviews**, each run returns just what changed. One monitoring run covers up to 250 apps; use one schedule per batch for more.
- **Webhooks**: get a call when a run finishes, for example to post new 1-star reviews to Slack.
- **Make, n8n, Zapier**: use the Apify app or node to push new reviews into a help desk, a CRM or a sheet.
- **Google Sheets**: export a dataset view straight into a spreadsheet.
- **MCP for AI agents**: Claude, ChatGPT and other agents can call this Actor through Apify's MCP server to pull reviews and summarise complaints.

### FAQ

#### Why not use the official Google Play API?

Google's official Play Developer API only returns reviews for apps you own, and only from the last week. It cannot read competitors' apps, search results or developer pages. This Actor reads the public Google Play website, the same pages any visitor sees, so it works for any app.

#### Can I monitor new Google Play reviews automatically?

Yes. Turn on **Only new reviews since the last run**, name your monitor and schedule the Actor. It remembers which reviews it has delivered for each app, language, country and star filter, and returns only new ones. The first run returns up to "Max reviews per app". One monitoring run checks at most **250 apps** (app x star combinations); the rest get one free status row listing them. For bigger lists, split them into several scheduled runs or tasks, each with its own monitor name.

#### How do I get only negative reviews?

Set **Only these star ratings** to 1 and 2 stars. "Max reviews per app" then applies to each star separately.

#### What are the alternatives to this Google Play scraper?

Google Play's own developer console (your apps only), paid app intelligence suites, open-source libraries you host yourself, and other Actors on the Apify Store. This Actor combines reviews, app details, search and developer pages in one place at a lower per-result price than the Google Play Actors we compared on 2 November 2026.

#### How do I scrape Google Play reviews with ChatGPT or Claude?

Connect the Apify MCP server to your AI assistant and ask it to run Google Play Scraper for an app, or run it here and paste the CSV into the chat for analysis of complaints, feature requests and sentiment.

#### Is it legal to scrape Google Play?

The Actor reads publicly visible data without logging in. Reviews contain user names and profile pictures, which are personal data in some laws (for example GDPR), so only collect what you need and have a legitimate reason to process it. Google's terms of service apply to how you use the data. This is not legal advice; ask a lawyer if you are unsure.

#### Why does an app return no reviews or "not found"?

The package ID may be wrong, or the app is not available in the chosen country. Open `https://play.google.com/store/apps/details?id=<package>` in a browser to check, or try another country. Status rows in the dataset explain each case and are free.

#### Why are the newest reviews about a day old?

Google Play's website shows new reviews with a delay, usually around a day, and for a few large apps it lags longer. The Actor returns exactly what Google Play shows at run time.

#### What can it not do?

It does not download APK files, read private developer console data, see the reviewer's email or log in. Google Play's web search shows at most 30 apps per keyword, so search results stop there. Top charts are not included.

### Limits

- Search returns up to 30 apps per keyword, because that is what Google Play shows.
- Only-new (monitoring) mode checks at most 250 apps (app x star combinations) per run; split bigger lists into several scheduled runs or tasks.
- Reviews appear on Google Play's website with a delay of about a day; for some very large apps the public list lags further.
- Review text and app texts come in the language you choose; reviews written in other languages are mostly not included.
- Very large review pulls (hundreds of thousands per app) take longer: our tests ran at about 800 reviews per second.
- If Google throttles the run's IP address, the Actor retries through fresh proxy sessions, then writes a free status row for anything it could not read.

### Related Actors

- [Apple App Store Scraper](https://apify.com/hridayrungta/apple-app-store-scraper): the same app data for iPhone apps.
- [Google Trends Scraper](https://apify.com/hridayrungta/google-trends-scraper): search interest for app names and keywords.
- [Reddit Scraper](https://apify.com/hridayrungta/reddit-scraper): what users say about apps outside the store.
- [Contact Info Scraper](https://apify.com/hridayrungta/contact-info-scraper): emails and social links from developer websites.
- [Google Search Results Scraper](https://apify.com/apify/google-search-scraper): Google search rankings for your app keywords.
- [Website Content Crawler](https://apify.com/apify/website-content-crawler): turn app landing pages into text for AI.

# Actor input Schema

## `appIds` (type: `array`):

One app per line: the package ID (com.spotify.music) or the app's Google Play URL (https://play.google.com/store/apps/details?id=com.spotify.music). A URL with hl= and gl= uses that language and country for this app.

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

Google Play app search, one keyword per line, e.g. "meditation" or "photo editor". Returns the apps in Google Play's ranking order (Google Play shows up to 30 apps per search).

## `developers` (type: `array`):

All apps of a developer: the developer name exactly as on Google Play ("Spotify AB"), the numeric developer ID, or the developer page URL.

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

One full app row per app in "Apps": title, developer and contacts, rating, ratings count, star histogram, installs, price, genre, content rating, version, updated date, description, screenshots.

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

Reviews to fetch for each app in "Apps" (and for found apps if you turn that on below). 0 = no reviews. With a star filter, this applies per star.

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

Newest first (best for monitoring), Most relevant (Google Play's default) or Rating.

## `reviewStars` (type: `array`):

Leave empty for all reviews. Pick 1 and 2 to collect only negative reviews, 5 for praise.

## `reviewsSince` (type: `string`):

Only reviews posted on or after this date: an absolute date (2026-10-01) or a relative one (7 days, 2 weeks, 3 months). Uses the Newest sort and stops paging at the first older review.

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

Remembers the reviews delivered for each app and returns only reviews that are new since the previous run of the same monitor. Schedule it daily or hourly for review monitoring. Already-seen reviews are never charged. One only-new run checks at most 250 apps (app x star combinations); split bigger lists into several scheduled runs or tasks with their own monitor names.

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

Keeps separate memory per monitor, so different schedules do not mix. Letters, numbers, - and \_ only.

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

Google Play language code (hl), e.g. en, de, fr, es, pt-BR, ja. Reviews come in this language; app texts are translated where the developer provides it.

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

2-letter Google Play country code (gl), e.g. us, gb, de, in, br. Sets prices, currency, availability and search ranking.

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

Up to 30 (Google Play shows at most 30 apps per search).

## `maxAppsPerDeveloper` (type: `integer`):

Cap on apps returned per developer (big publishers have hundreds).

## `detailsForFoundApps` (type: `boolean`):

Off: one short row per found app (title, developer, rating, installs, price, genre), charged as "app-listing". On: the full app row for each found app instead, charged as "app-details".

## `reviewsForFoundApps` (type: `boolean`):

Also fetch reviews ("Max reviews per app") for every app found by your search terms and developers, e.g. the reviews of the top 10 meditation apps.

## `maxItems` (type: `integer`):

Hard cap on billed rows (reviews + app rows) for the whole run. Status rows are free and not counted.

## `maxRetries` (type: `integer`):

How many times a blocked or failed request is retried on a fresh proxy session.

## Actor input object example

```json
{
  "appIds": [
    "com.spotify.music",
    "com.duolingo"
  ],
  "includeAppDetails": true,
  "maxReviewsPerApp": 20,
  "reviewSort": "newest",
  "onlyNewReviews": false,
  "monitorName": "default",
  "language": "en",
  "country": "us",
  "maxSearchResults": 30,
  "maxAppsPerDeveloper": 100,
  "detailsForFoundApps": false,
  "reviewsForFoundApps": false,
  "maxItems": 100000,
  "maxRetries": 4
}
```

# 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 = {
    "appIds": [
        "com.spotify.music",
        "com.duolingo"
    ],
    "maxReviewsPerApp": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("hridayrungta/google-play-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 = {
    "appIds": [
        "com.spotify.music",
        "com.duolingo",
    ],
    "maxReviewsPerApp": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("hridayrungta/google-play-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 '{
  "appIds": [
    "com.spotify.music",
    "com.duolingo"
  ],
  "maxReviewsPerApp": 20
}' |
apify call hridayrungta/google-play-scraper --silent --output-dataset

```

## MCP server setup

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