# Google Play Scraper — App Details, Ratings & Installs (`yugenox/google-play-scraper`) Actor

Scrape Google Play app pages by package name, developer, category or similar apps: title, developer, category, rating with 1–5 star counts, installs, price, ads, in-app purchases, last update, version, Data safety summary, permissions, screenshots. Any country and language. No login.

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

## Pricing

from $0.70 / 1,000 apps

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

## Google Play Scraper: app details, ratings and installs

Scrape **Google Play** app pages in any country and language for **$0.70 per 1,000 apps**. Every app comes with Google Play's **exact install count** (not just the "10M+" band), the **Data safety** declaration (what the app shares and collects, encryption, deletion requests) and the full **permissions** list, plus the title, developer, category, star rating with the 1–5 star breakdown, number of ratings and reviews, price, ads, in-app purchases, release and last-update dates, version, minimum Android version, icon, screenshots and promo video.

Every app row also carries a **free review snapshot**: the reviews Google Play shows on the app page (up to about 20) with their rating, date, text, helpful count, app version and the developer's reply. No reviewer names or avatars.

Find apps by **package name**, by **developer**, by **category** (every list on Google Play's category page, plus each list's "see more" page), or by following each app's **Similar apps** and **More by this developer** lists. No login, no cookies, no Google account.

### What you get

| | |
|---|---|
| **App** | Title, package name, Google Play URL, short and full description (plain text and HTML), "What's new" notes |
| **Developer** | Developer name, developer ID, developer page on Google Play, website, privacy policy URL |
| **Category** | Main category and its ID (e.g. `GAME_PUZZLE`), extra game tags ("Match 3", "Multiplayer"…), content rating and descriptors |
| **Ratings** | Average rating, number of ratings, number of written reviews, **count of 1, 2, 3, 4 and 5-star ratings** |
| **Review snapshot** (free) | Up to ~20 reviews from the app page: stars, date, text, helpful count, app version, developer reply and its date. No reviewer names, avatars or ids |
| **Installs** | Install band ("10,000,000+"), its lower bound as a number, and Google Play's **unrounded install count** |
| **Price** | Free or paid, price, sale price, currency, "Contains ads", in-app purchases and their price range |
| **Versions** | First release date, last update date, current version, minimum Android version and API level |
| **Charts** | Top chart rank when the app has one, e.g. `#1 top free music & audio` |
| **Data safety** | Whether the app shares or collects data, which data types, encryption in transit, deletion requests |
| **Permissions** | Every permission Google Play lists, with its group |
| **Media** | Icon, feature graphic, screenshots, promo video and its thumbnail |
| **Related apps** | Package names in the app's "Similar apps" and "More by …" lists |

### How to use it

1. Put package names (like `com.spotify.music`, the `id=` part of a Google Play link) or Google Play app links into **App IDs or URLs**.
2. Or add **Developers** (name as Google Play shows it, e.g. `Spotify AB`, or a developer ID) and/or **Categories**.
3. Pick the **Country** and **Language** of the store. They set the currency, price, ratings and the language of the text.
4. Set **Max apps** and run.

#### Input examples

Two apps, US store:

```json
{
  "appIds": ["com.spotify.music", "com.duolingo"],
  "country": "US",
  "language": "en"
}
```

Puzzle games in the UK store, 200 apps:

```json
{
  "categories": ["GAME_PUZZLE"],
  "country": "GB",
  "maxItems": 200
}
```

Competitor research: your app, its 20 closest competitors and the developer's other apps, German store:

```json
{
  "appIds": ["com.duolingo"],
  "similarApps": 20,
  "includeMoreByDeveloper": true,
  "country": "DE",
  "language": "de"
}
```

Every app by a developer:

```json
{
  "developers": ["Spotify AB", "4772240228547998649"]
}
```

You can also paste any Google Play page with apps into **Other Google Play URLs**: developer pages, category pages, "see more" lists (`/store/apps/collection/cluster?…`), or the apps and games home pages.

### Output example

```json
{
  "appId": "com.mojang.minecraftpe",
  "title": "Minecraft: Dream it, Build it!",
  "url": "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe&hl=en&gl=US",
  "developer": "Mojang",
  "developerId": "4772240228547998649",
  "developerUrl": "https://play.google.com/store/apps/dev?id=4772240228547998649",
  "developerWebsite": "http://help.mojang.com",
  "summary": "Millions of crafters have smashed billions of blocks! Now you can join the fun!",
  "category": "Arcade",
  "categoryId": "GAME_ARCADE",
  "isGame": true,
  "tags": ["Simulation", "Sandbox", "Casual", "Multiplayer", "Single player"],
  "contentRating": "Everyone 10+",
  "contentRatingDescription": "Fantasy Violence",
  "interactiveElements": "Users Interact, In-Game Purchases",
  "rating": 4.3070726,
  "ratingCount": 5848849,
  "reviewCount": 635027,
  "ratingHistogram": { "1": 620571, "2": 178603, "3": 269102, "4": 496505, "5": 4284056 },
  "reviewSnapshot": [
    {
      "rating": 4,
      "date": "2024-12-30T22:46:38.000Z",
      "text": "Great game, but the world keeps running when the app is closed…",
      "helpfulCount": 312,
      "appVersion": "1.21.51.02",
      "developerReply": null
    }
  ],
  "installs": "50,000,000+",
  "minInstalls": 50000000,
  "realInstalls": 98010064,
  "free": false,
  "price": 6.99,
  "currency": "USD",
  "priceText": "$6.99",
  "containsAds": false,
  "inAppPurchases": true,
  "inAppPriceRange": "$0.99 - $49.99 per item",
  "releasedDate": "2011-08-16T06:17:21.000Z",
  "updatedDate": "2026-09-25T17:26:28.000Z",
  "version": "1.26.52.3",
  "minAndroidVersion": "8.0",
  "minAndroidSdk": 26,
  "topChart": "top paid arcade",
  "topChartRank": 1,
  "dataShared": true,
  "dataSharedTypes": "Location, Personal info, and App activity",
  "dataCollected": true,
  "dataCollectedTypes": "Location, Personal info and 5 others",
  "dataEncryptedInTransit": true,
  "dataDeletionRequest": true,
  "permissions": [{ "group": "Photos/Media/Files", "permission": "read the contents of your USB storage" }],
  "videoUrl": "https://www.youtube.com/watch?v=BLtLrFNRE-E",
  "similarApps": ["com.roblox.client", "com.sandboxol.blockymods"],
  "moreByDeveloper": ["com.mojang.minecraftedu", "com.mojang.minecraftedu_preview"],
  "country": "US",
  "language": "en",
  "source": "app id",
  "position": 1,
  "parseMode": "full",
  "scrapedAt": "2026-10-01T23:58:10.000Z"
}
```

Shortened here: every row also has `description`, `descriptionHtml`, `whatsNew`, `iconUrl`, `headerImageUrl`, `screenshots`, `privacyPolicyUrl`, `dataSafety` and the other columns, and `reviewSnapshot` usually holds about 20 reviews. Every row has the same columns; a value Google Play doesn't show is `null`.

Exporting to CSV or Excel? `reviewSnapshot` is a list, so a spreadsheet export spreads it over many columns. Download JSON, or leave it out of a spreadsheet with **Omit fields: reviewSnapshot** in the export dialog (`&omit=reviewSnapshot` in the API).

### Use cases

- **App store optimization (ASO)**: track titles, short descriptions, ratings, installs and update dates of your app and its competitors.
- **Competitor research**: start from your app and pull its "Similar apps" with full details, and read what their users complain about in each review snapshot.
- **Market research**: scan a category in several countries and compare prices, ads, in-app purchases and ratings.
- **Privacy audits**: compare Data safety declarations and permissions across many apps.
- **Lead lists for app businesses**: developers of games or apps in a niche, with their websites.
- **Monitoring**: schedule a daily run to catch new versions, rating changes or price drops.

### FAQ

**Do I need a Google account, cookies or a login?** No. The scraper reads the same public Google Play pages any visitor sees. It never logs in.

**Can it search Google Play by keyword?** No. Google Play's robots.txt does not allow crawlers on its search pages, and this Actor only reads pages that robots.txt allows. Use package names, developers, categories or **Similar apps per app** instead. Search links you paste are skipped, and the run's status message says so.

**Does it scrape reviews?** Each app row includes a free snapshot of the reviews Google Play shows on the app page: up to about 20, in Google Play's order, each with its stars, date, text, helpful count, app version and the developer's reply. They come in the store language you pick. Reviewer names, avatars and ids are never collected, and a reviewer's name is blanked out of the review and reply text (`Hi [name removed]`). It does not page through all of an app's reviews: that needs Google Play's internal review API, which its robots.txt does not allow crawlers to use.

**Which countries and languages work?** Any Google Play store. Set **Country** (e.g. `US`, `GB`, `DE`, `IN`, `BR`) and **Language** (e.g. `en`, `de`, `pt_BR`). The country sets the currency, price, ratings and availability. The language sets the text when the developer provides a translation.

**How many apps does a developer or category give?** Google Play's developer pages show roughly the first 10–20 apps of a developer. Category pages show several lists of 5–20 apps each, and the scraper opens each list's "see more" page (up to about 50 apps) while you still need apps.

**What does "parseMode: basic" mean?** If Google Play changes its page layout, the scraper still saves the title, developer, rating, price, category and icon from the page's summary block, marks those rows `basic`, and warns in the run's status message.

**How fast is it?** At the default 256 MB of memory, about one app every two seconds: 100 apps take around 3 minutes. Each Google Play app page is over 1 MB of HTML, so reading it takes processor time. Set the run's memory to 1 GB (Run options) to go about twice as fast; the price per app is the same.

**Which proxy should I use?** Keep the default (Apify Proxy, datacenter). It comes with every Apify plan, including the free one. If Google Play keeps refusing datacenter IPs, the run switches to residential proxies when your account has them. Each app read through residential proxies costs an extra fee (see below). To never pay it, turn off **Fall back to residential proxies**: the run then stays on datacenter and stops with what it has if Google Play keeps refusing.

**What does a run cost?** $0.70 per 1,000 apps ($0.0007 per app saved) plus $0.002 per run. The review snapshot is included. Apps that aren't found, fail or are over your **Max apps** limit are never charged. Residential proxies cost us much more than datacenter ones, so an app whose page had to come through residential proxies costs $0.0035 more. That happens only when Google Play keeps refusing datacenter IPs and the fallback is on, or when you pick RESIDENTIAL in the Proxy input yourself. Apps read on datacenter or on your own proxies never cost extra. The run's status message tells you how many apps went through residential proxies. The run stops at your spending limit, and apps the limit doesn't cover are never saved.

**Is it legal to scrape Google Play?** This Actor only collects publicly available data: app listings that anyone can see on Google Play without an account, such as the app's name, developer, category, price, ratings and description. Collecting publicly available data is generally legal, but you're responsible for how you use it. Many Google Play developers are individual people, so the scraper never collects developer e-mail addresses, postal addresses or phone numbers, and it removes personal e-mail addresses and phone numbers from descriptions. Reviews come without the reviewer's name, avatar or id, and with names, personal e-mail addresses and phone numbers removed from their text. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as Google Play's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. Everything comes from pages Google Play shows to any visitor without logging in. It never uses a login, never opens user profiles, never collects reviewer names or avatars, and follows Google Play's robots.txt.

This Actor is not affiliated with, endorsed by, or sponsored by Google LLC. Google Play and the Google Play logo are trademarks of Google LLC, used here only to describe the data the Actor works with.

# Actor input Schema

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

Package names such as "com.spotify.music" (the id= part of a Google Play link), or Google Play app links. One app page is read per app.

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

Developer names exactly as Google Play shows them ("Spotify AB"), numeric developer ids, or developer page links. Scrapes the apps on that developer's Google Play page (Google Play lists roughly the first 10–20 apps there).

## `categories` (type: `array`):

Apps from Google Play's category pages: every list on the page first, then each list's "see more" page while you still need apps. "All apps" / "All games" use the apps and games home pages.

## `startUrls` (type: `array`):

Any Google Play page with apps: app pages, developer pages, category pages, "see more" list pages (/store/apps/collection/cluster?…), the apps or games home page. Search pages (/store/search) are skipped: Google Play's robots.txt does not allow crawling them.

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

Maximum number of apps for the whole run. Developer and category pages share what is left after your app IDs. 0 = everything (up to 10,000).

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

Two-letter country code of the Google Play store to read (gl), e.g. US, GB, DE, IN, BR. It sets the currency and price, the ratings shown and availability.

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

Language of the store page (hl), e.g. en, de, fr, es, pt_BR, ja. Titles and descriptions come in this language when the developer provides it.

## `similarApps` (type: `integer`):

Also scrape up to this many apps from each app's "Similar apps" list (one level deep). 0 = off. Up to 6 come from the app page itself; more opens the full "Similar apps" list (up to about 50). Good for competitor research.

## `includeMoreByDeveloper` (type: `boolean`):

Also scrape the apps in each app's "More by <developer>" list.

## `maxConcurrency` (type: `integer`):

How many Google Play pages are read at the same time.

## `residentialFallback` (type: `boolean`):

When Google Play keeps refusing datacenter IPs, carry on through residential proxies (if your Apify account has them). Each app read through residential proxies costs an extra fee (the "App via residential proxy" event on the Pricing tab); apps read on datacenter never do. Turn off to stay on datacenter only — the run then stops with what it has if Google Play keeps refusing.

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

Apify Proxy (datacenter) is the default and comes with every Apify plan. Picking RESIDENTIAL here makes every app carry the residential fee (see Pricing). Your own proxy URLs never do.

## Actor input object example

```json
{
  "appIds": [
    "com.spotify.music",
    "com.duolingo"
  ],
  "maxItems": 20,
  "country": "US",
  "language": "en",
  "similarApps": 0,
  "includeMoreByDeveloper": false,
  "maxConcurrency": 3,
  "residentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped apps.

## `run` (type: `string`):

Status and statistics for this run.

## `report` (type: `string`):

RUN_REPORT: how the run ended, counts per source, apps not found, requests and proxy use.

# 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"
    ],
    "maxItems": 20,
    "country": "US",
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/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",
    ],
    "maxItems": 20,
    "country": "US",
    "language": "en",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/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"
  ],
  "maxItems": 20,
  "country": "US",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/google-play-scraper --silent --output-dataset

```

## MCP server setup

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