# Google Play Store Scraper (`muhammad4hmed/google-play-scraper`) Actor

Scrape Google Play app details and search across storefronts: exact rating, install counts, price, in-app purchase range, developer, description and screenshots. Recovers fields when Google changes its layout.

- **URL**: https://apify.com/muhammad4hmed/google-play-scraper.md
- **Developed by:** [Muhammad Ahmed](https://apify.com/muhammad4hmed) (community)
- **Categories:** E-commerce, Developer tools
- **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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Play Store Scraper

Scrape **app details** and **search results** from Google Play — across storefronts and languages.

### What you get

29 fields per app, including the ones most tools miss:

- **Rating and rating count** — the precise score (`4.625394`), not the rounded star.
- **Install counts** — both the display string (`10,000,000,000+`) and a numeric floor for sorting.
- **Pricing done right** — `price`, a real `free` boolean, and the **in-app purchase range** (`$0.40 - $199.99 per item`).
- **Developer, description, genre, content rating, version, last-updated date**, icon and up to 24 screenshots.
- **Per-storefront data.** Ratings differ by country — Spotify is ⭐4.343 in the US and ⭐4.260 in the UK — so each country is scraped separately.
- **Search** — turn a keyword into apps, then scrape them in full.

Accepts a Play URL or a bare package name (`com.whatsapp`).

### Built to survive Google's layout changes

Google Play embeds its data as unnamed nested arrays. Every scraper reads them by position, and when Google reshuffles the payload those scrapers quietly start returning nulls.

This one reads each field by its known position **first**, then re-derives it from the data's shape if that fails — and tells you when it did, via a `parseWarnings` array on the record and a warning in the log. You find out that Google changed something from the data itself, not from a silently empty column three weeks later.

### Input

| Field | Type | Description |
|---|---|---|
| `apps` | array | Play URLs or package names |
| `searchTerms` | array | Each returns up to `searchLimit` apps, then scraped in full |
| `countries` | array | Two-letter storefront codes (default `["us"]`) |
| `language` | string | Interface language for returned text (default `en`) |
| `searchLimit` | integer | Apps per search term (default `10`) |
| `maxItems` | integer | Total cap (`0` = no limit) |
| `concurrency` / `requestDelayMs` | integer | Throughput controls |
| `proxyConfiguration` | object | Optional |

#### Example

```json
{
  "apps": ["com.whatsapp", "com.spotify.music"],
  "searchTerms": ["habit tracker"],
  "countries": ["us", "gb"],
  "language": "en"
}
```

### Output

```json
{
  "type": "app",
  "appId": "com.whatsapp",
  "country": "US",
  "title": "WhatsApp Messenger",
  "developer": "WhatsApp LLC",
  "developerUrl": "https://play.google.com/store/apps/developer?id=WhatsApp+LLC",
  "score": 4.625394,
  "ratingsCount": 241319638,
  "installs": "10,000,000,000+",
  "installsMin": 10000000000,
  "price": null,
  "free": true,
  "inAppPurchases": "$0.40 - $199.99 per item",
  "contentRating": "Everyone",
  "genre": "Communication",
  "version": "1.26.44.3",
  "updatedAt": "Aug 15, 2026",
  "icon": "https://play-lh.googleusercontent.com/…",
  "screenshots": ["https://…"],
  "parseWarnings": []
}
```

Apps that do not exist in a storefront produce an item with `error` rather than vanishing.

### Notes and limits

- **Reviews are not included.** Google Play serves reviews through a private RPC whose payload format changes without notice; shipping a review scraper that breaks weekly would be worse than not shipping one. App metadata and search are stable and are what this Actor does well. For reviews, the Apple App Store Actor covers iOS fully.
- **`version` is often absent** — many large apps ship per-device builds and Google shows no single version. That is a genuine absence, not a scrape failure.
- **Install counts are buckets**, not exact figures. Google only publishes thresholds.
- **Check `parseWarnings`** if a field looks wrong; a non-empty array means Google moved that field and it was recovered heuristically.

### Local development

```bash
npm install
npm run build
node dist/main.js     # reads storage/key_value_stores/default/INPUT.json
```

# Actor input Schema

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

Google Play URLs or package names such as `com.whatsapp`.

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

Each term returns up to "Apps per search" results, which are then scraped in full.

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

Two-letter country codes. Ratings, install counts and pricing differ per storefront.

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

Two-letter interface language for the returned text, e.g. `en`, `de`, `es`.

## `searchLimit` (type: `integer`):

How many apps each search term contributes before they are scraped.

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

Stop after this many apps. 0 means no limit.

## `concurrency` (type: `integer`):

How many app pages to fetch in parallel.

## `requestDelayMs` (type: `integer`):

Raise if you see rate-limit warnings.

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

Optional. Google Play pages load without a proxy, but one helps on large runs.

## Actor input object example

```json
{
  "apps": [
    "com.whatsapp"
  ],
  "searchTerms": [],
  "countries": [
    "us"
  ],
  "language": "en",
  "searchLimit": 10,
  "maxItems": 0,
  "concurrency": 3,
  "requestDelayMs": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped Google Play apps.

# 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.whatsapp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammad4hmed/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 = { "apps": ["com.whatsapp"] }

# Run the Actor and wait for it to finish
run = client.actor("muhammad4hmed/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 '{
  "apps": [
    "com.whatsapp"
  ]
}' |
apify call muhammad4hmed/google-play-scraper --silent --output-dataset

```

## MCP server setup

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