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

Apps from Google Play by link, keyword search, top chart or developer, with installs, rating histogram, price and last update. Charts go 200 places deep in 54 categories, and saved tasks show how each app's rank moved.

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

## Pricing

from $0.40 / 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.
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

Google Play Scraper returns one row per app: name, developer, rating with the star histogram, installs (the rounded band and the more precise count), price, in-app purchases, current version, last update and release notes. It finds apps four ways, which can be mixed: apps you list, keyword search with each app's position, top charts up to 200 places deep, and a developer's apps. The form comes prefilled with the search `photo editor` and the top free chart, ready to **Start**. Developer email and postal addresses are not collected. It costs $0.80 per 1,000 apps on the Free plan ($0.40 on Business), and the $5 of monthly credit in Apify's Free plan covers about 6,200 apps.

### What data does it return?

| Field | Description |
|---|---|
| `name`, `appId` | App name in the chosen language and the package name, for example `com.whatsapp`. |
| `developer`, `developerId` | Developer as Google Play shows it, and the name or numeric ID from the developer link, which also works in **Developers**. |
| `rating`, `ratingCount`, `histogram` | Average stars rounded to two decimals, number of ratings, and the ratings per star under the keys `1` to `5`. |
| `installs`, `minInstalls`, `exactInstalls` | The band Google Play shows, such as `10,000,000,000+`, the same band as a number, and the more precise count Google Play also publishes. |
| `price`, `currency`, `free` | Price in the currency of the country, `0` for free apps. |
| `inAppPurchases`, `inAppPriceRange`, `containsAds` | Whether the app sells in-app items, their price range such as `$0.40 - $199.99 per item`, and whether Google Play marks it as containing ads. |
| `version`, `androidVersion` | Current version and the lowest Android version, or `Varies with device`. |
| `updatedAt`, `releasedAt` | Last update and first release, ISO 8601 UTC. |
| `whatsNew` | Release notes of the latest update. |
| `category`, `categoryId`, `contentRating` | Category name and key, such as `COMMUNICATION`, and the age rating for the country, such as `Everyone`. |
| `searchTerm`, `searchRank` | The search term and the app's position in its results, counted from 1. |
| `chart`, `chartCategory`, `chartRank` | Chart key (`topselling_free`, `topselling_paid` or `topgrossing`), its category and the app's place in it. |
| `previousRank`, `rankChange`, `newInRanking` | Place in the previous run of the same task or watch name, places gained (positive) or lost, and whether the app is new in that ranking. |
| `summary`, `description` | Short description, and the long one cut to 300 characters unless **Include the full description** is on. |
| `website`, `privacyPolicy`, `icon`, `url` | Developer website, privacy policy link, icon and the app page for the country and language. |

### How to scrape Google Play

1. Fill any of **Apps** (links or package names), **Search terms**, **Top charts** with **Chart categories**, and **Developers** (the name exactly as Google Play shows it, such as `Spotify AB`, a developer page link or a numeric ID). One run can combine all four.
2. Set **Countries** as two-letter codes (`us` when empty) and the **Language** of names and descriptions (`en` when empty). Prices, charts and search results differ by country, and each country is read separately.
3. Set **Places per chart** and **Results per search term** to the depth you need.
4. Leave **Add full app details** on for the histogram, exact installs, version, dates and release notes of apps found by search, chart or developer. The price per row is the same with it on or off.
5. Click **Start**. The **Output** tab has an **Apps** view and a **Search and chart ranks** view, and the rows can be exported as CSV, Excel or JSON or read through the API.

An API input that reads two searches and two charts in two categories and two countries, and remembers the ranks:

```json
{
  "searchTerms": ["photo editor", "habit tracker"],
  "charts": ["topselling_free", "topgrossing"],
  "chartCategories": ["GAME", "PRODUCTIVITY"],
  "countries": ["us", "de"],
  "chartLimit": 200,
  "watchName": "my-keywords"
}
```

### Example output

One chart row from a run on 28 September 2026: WhatsApp at place 6 of the top free chart in the US. The rank fields are `null` because that run had no earlier run to compare with, `description` holds its first 300 characters, and `screenshots` is empty because **Include screenshot links** was off.

```json
{
  "key": "chart:us:en:topselling_free:APPLICATION:com.whatsapp",
  "source": "chart",
  "country": "us",
  "language": "en",
  "searchTerm": null,
  "searchRank": null,
  "chart": "topselling_free",
  "chartCategory": "All apps",
  "chartRank": 6,
  "previousRank": null,
  "rankChange": null,
  "newInRanking": null,
  "appId": "com.whatsapp",
  "name": "WhatsApp Messenger",
  "url": "https://play.google.com/store/apps/details?id=com.whatsapp&hl=en&gl=us",
  "developer": "WhatsApp LLC",
  "developerId": "WhatsApp LLC",
  "developerUrl": "https://play.google.com/store/apps/developer?id=WhatsApp+LLC",
  "website": "http://www.whatsapp.com/",
  "privacyPolicy": "https://www.whatsapp.com/legal/privacy-policy",
  "price": 0,
  "currency": "USD",
  "free": true,
  "inAppPurchases": true,
  "inAppPriceRange": "$0.40 - $199.99 per item",
  "containsAds": false,
  "rating": 4.62,
  "ratingCount": 244610726,
  "reviewCount": 1952723,
  "histogram": {
    "1": 10890423,
    "2": 3478159,
    "3": 8944498,
    "4": 21870391,
    "5": 199427177
  },
  "installs": "10,000,000,000+",
  "minInstalls": 10000000000,
  "exactInstalls": 12346892753,
  "version": "Varies with device",
  "androidVersion": "Varies with device",
  "updatedAt": "2026-09-19T00:49:04.000Z",
  "releasedAt": "2010-10-18T00:00:00.000Z",
  "whatsNew": "• You can now choose to share recent group history with new members when you add them to a group\n• Group calls now include the ability to transfer calls between mobile and desktop, add a waiting room for call links, and pin a participant to a bigger tile.\n\nThese features will roll out over the coming weeks. Thanks for using WhatsApp!",
  "category": "Communication",
  "categoryId": "COMMUNICATION",
  "contentRating": "Everyone",
  "contentDescriptors": null,
  "summary": "Simple. Reliable. Private.",
  "description": "WhatsApp from Meta is a FREE messaging and video calling app. It’s used by over 2B people in more than 180 countries. It’s simple, reliable, and private, so you can easily keep in touch with your friends and family. WhatsApp works across mobile and desktop even on slow connections, with no subscript...",
  "icon": "https://play-lh.googleusercontent.com/Gqxk4T0uZsDwFp07DE-508hkyvcNmgFuRwPiwTEfF7D7OzGv1FdHDzEyMxNsSBZLOJlGpe3ULvVM2RgrRAlBqA",
  "headerImage": "https://play-lh.googleusercontent.com/eLX_xvno2Kq_zvpkkP8yPBRfo2TEQSrv7m7WrQ6xloPsDRJ85XQ28kGYuoR-_EBWh2Uoq2GMlDvlBEIxHRyhuSg",
  "video": null,
  "screenshots": [],
  "detailed": true
}
```

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

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 apps | $0.80 | $0.64 | $0.52 | $0.40 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Checking the top 200 free apps of one country costs $0.16 per run on the Free plan and $0.08 on Business, full details included. Each row is charged once, so an app found by two search terms, or in two countries, counts as two rows. Searches, charts and developers that return nothing are not charged.

### Limits

- Google Play shows at most 30 apps for a search term, so **Results per search term** stops at 30.
- Charts end at 200 places and some are shorter: in September 2026 the top grossing Productivity chart in Germany had 117 apps.
- For large developers such as `Google LLC` the developer page lists 20 apps, and those 20 are what the actor returns.
- `releasedAt` comes from the date text on the app page. It is read in English (`en` or `en-GB`) and from numeric dates such as `05.03.2012` in `de`, `5. 3. 2012` in `cs` or `2012/03/05` in `ja`. In other languages that write the month as a word, such as `it`, `pt-BR`, `pl` or `ru`, it is often empty; `updatedAt` is not affected.
- Switching **Add full app details** off makes a run quicker, but `ratingCount`, `histogram`, `exactInstalls`, `version` and the dates then stay empty and `detailed` is `false`.
- A run stops at **Maximum rows**, 1,000 by default. Apps it did not reach keep their old ranks in the snapshot, so they are not reported as having left a ranking.

### Tracking keyword and chart ranks

Save the input as a task, or give it a **Watch name** such as `my-keywords`, and schedule it daily. From the second run on, every search and chart row carries `previousRank`, `rankChange` (positive when the app moved up) and `newInRanking`. The **Changes since the last run** record lists apps that entered or left each search and chart and apps whose rank, version or price changed. In the **Output** tab, the **Search and chart ranks** view puts the old and new positions side by side.

### FAQ

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

The actor reads app pages, search results, charts and developer pages that Google Play shows to every visitor. It describes apps and their publishers and does not collect contact details, because many Google Play developers are private individuals. You are responsible for how you use the data.

#### Which chart categories can I use?

The form lists 54: `APPLICATION` (all apps), `GAME` (all games), 35 app categories such as `PRODUCTIVITY` and 17 game genres such as `GAME_PUZZLE`. The **Chart categories** field accepts these keys or the names shown in the form, such as `Games: Puzzle`, and skips an unknown category with a warning.

#### Does it return reviews?

No. Rows carry the rating summary: `rating`, `ratingCount`, `reviewCount` and `histogram`. For the review texts, run the Google Play Reviews Scraper on the same package names.

### Related scrapers

- [Google Play Reviews Scraper](https://apify.com/deriverge/google-play-reviews-scraper)
- [App Store Reviews Scraper](https://apify.com/deriverge/app-store-reviews-scraper)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/google-play-scraper/changelog.md

# Actor input Schema

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

Google Play links or package names such as com.spotify.music, one per line. Each app returns one row per country.

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

Keywords to search Google Play for, as a user would. Each term returns up to 30 apps, the most Google Play shows, with their position in searchRank.

## `charts` (type: `array`):

Google Play charts to read, with the position in chartRank.

## `chartCategories` (type: `array`):

Categories for the charts above, for example All games or Productivity. Leave empty for all apps.

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

Developer names exactly as shown on Google Play (Spotify AB), developer page links, or numeric developer IDs. Returns the developer's apps.

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

Two-letter country codes, for example us, gb, de or in. Prices, charts and search results differ between countries. Leave empty for us.

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

Language of names and descriptions, as a two-letter code such as en, de or es.

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

How many apps to return for each search term in each country. Google Play shows at most 30.

## `chartLimit` (type: `integer`):

How many places to read from each chart, from the top, up to 200.

## `fullDetails` (type: `boolean`):

Opens each app found by search, chart or developer to add the rating count and histogram, exact installs, version, Android version, update date, what's new, website and more. Turn off for faster runs with list fields only; the price is the same.

## `includeDescription` (type: `boolean`):

Adds the full Google Play description. Off, each row carries the first 300 characters.

## `includeScreenshots` (type: `boolean`):

Adds the screenshot image links.

## `watchName` (type: `string`):

Name of the snapshot that remembers ranks between runs, for example "my-keywords". Runs from a saved task get one automatically. With it, rows show previousRank and rankChange.

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

Hard cap on returned rows in the run.

## Actor input object example

```json
{
  "searchTerms": [
    "photo editor"
  ],
  "charts": [
    "topselling_free"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "maxSearchResults": 30,
  "chartLimit": 20,
  "fullDetails": true,
  "includeDescription": false,
  "includeScreenshots": false,
  "maxItems": 50
}
```

# Actor output Schema

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

One row per app per country and per search term or chart, with up to 50 fields.

## `changes` (type: `string`):

Apps that entered or left each search and chart, and apps whose rank, version or price changed, compared with the previous run of the same task or watch name.

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

Rows by source, countries, warnings about inputs that found nothing, and request counts.

# 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 = {
    "searchTerms": [
        "photo editor"
    ],
    "charts": [
        "topselling_free"
    ],
    "countries": [
        "us"
    ],
    "chartLimit": 20,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/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 = {
    "searchTerms": ["photo editor"],
    "charts": ["topselling_free"],
    "countries": ["us"],
    "chartLimit": 20,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/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 '{
  "searchTerms": [
    "photo editor"
  ],
  "charts": [
    "topselling_free"
  ],
  "countries": [
    "us"
  ],
  "chartLimit": 20,
  "maxItems": 50
}' |
apify call deriverge/google-play-scraper --silent --output-dataset

```

## MCP server setup

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